services: rdesign-frontend: build: context: . dockerfile: frontend/Dockerfile container_name: rdesign-frontend restart: unless-stopped environment: - NEXT_PUBLIC_RDESIGN_API_URL=https://scribus.rspace.online - NEXT_PUBLIC_STUDIO_URL=https://scribus.rspace.online/vnc/vnc.html?autoconnect=true&resize=scale&path=vnc/websockify - NEXT_PUBLIC_LLM_API_URL=https://llm.jeffemmett.com - NEXT_PUBLIC_ENCRYPTID_SERVER_URL=https://auth.ridentity.online - ENCRYPTID_SERVER_URL=https://auth.ridentity.online - RSPACE_API_URL=https://rspace.online/api - HOSTNAME=0.0.0.0 labels: - "traefik.enable=true" # Catch-all for the frontend (lowest priority of our services) - "traefik.http.routers.rdesign-frontend.rule=Host(`scribus.rspace.online`) && !PathPrefix(`/vnc`) && !Path(`/health`) && !PathPrefix(`/output`) && !PathPrefix(`/templates/{path:.*}`) && !PathPrefix(`/rswag`) && !PathPrefix(`/export`) && !PathPrefix(`/convert`) && !PathPrefix(`/jobs`) && !PathPrefix(`/docs`) && !PathPrefix(`/openapi`)" - "traefik.http.routers.rdesign-frontend.entrypoints=web" - "traefik.http.routers.rdesign-frontend.priority=190" - "traefik.http.services.rdesign-frontend.loadbalancer.server.port=3000" networks: - traefik-public deploy: resources: limits: cpus: "1" memory: 1G reservations: cpus: "0.25" memory: 256M rdesign-api: build: context: . dockerfile: Dockerfile container_name: rdesign-api restart: unless-stopped volumes: - ./templates:/app/templates - ./output:/app/output - ./jobs:/app/jobs - ./scripts:/app/scripts - /opt/apps/rswag/designs:/app/rswag-designs:ro environment: - PYTHONUNBUFFERED=1 - BASE_URL=https://scribus.rspace.online - RSWAG_DESIGNS_PATH=/app/rswag-designs labels: - "traefik.enable=true" # API backend — serves /api/*, /health, /output/*, /templates/*, etc. - "traefik.http.routers.rdesign-api.rule=Host(`scribus.rspace.online`) && (Path(`/health`) || PathPrefix(`/output`) || PathPrefix(`/templates`) || PathPrefix(`/rswag`) || PathPrefix(`/export`) || PathPrefix(`/convert`) || PathPrefix(`/jobs`) || PathPrefix(`/docs`) || PathPrefix(`/openapi`))" - "traefik.http.routers.rdesign-api.entrypoints=web" - "traefik.http.routers.rdesign-api.priority=200" - "traefik.http.services.rdesign-api.loadbalancer.server.port=8080" - "traefik.http.middlewares.rdesign-cors.headers.accesscontrolallowmethods=GET,POST,OPTIONS,DELETE" - "traefik.http.middlewares.rdesign-cors.headers.accesscontrolallowheaders=*" - "traefik.http.middlewares.rdesign-cors.headers.accesscontrolalloworiginlist=https://scribus.rspace.online,https://rswag.online" - "traefik.http.middlewares.rdesign-cors.headers.accesscontrolmaxage=86400" - "traefik.http.routers.rdesign-api.middlewares=rdesign-cors" networks: - traefik-public deploy: resources: limits: cpus: "4" memory: 8G reservations: cpus: "1" memory: 2G rdesign-studio: build: context: . dockerfile: Dockerfile.studio container_name: rdesign-studio restart: unless-stopped volumes: - ./templates:/app/templates - ./output:/app/output - /opt/apps/rswag/designs:/app/rswag-designs:ro environment: - VNC_PASSWORD=changeme - DISPLAY_WIDTH=1920 - DISPLAY_HEIGHT=1080 labels: - "traefik.enable=true" - "traefik.http.routers.rdesign-studio.rule=Host(`scribus.rspace.online`) && PathPrefix(`/vnc`)" - "traefik.http.routers.rdesign-studio.entrypoints=web" - "traefik.http.routers.rdesign-studio.priority=210" - "traefik.http.services.rdesign-studio.loadbalancer.server.port=6080" - "traefik.http.routers.rdesign-studio.middlewares=rdesign-studio-strip" - "traefik.http.middlewares.rdesign-studio-strip.stripprefix.prefixes=/vnc" networks: - traefik-public deploy: resources: limits: cpus: "2" memory: 4G reservations: cpus: "0.5" memory: 1G networks: traefik-public: external: true