Skip to content

Docker Deployment ​

Plan AI is designed to be easily deployed to any VPS or cloud provider (like Railway, Render, or DigitalOcean) using Docker.

The Data Layer ​

Plan AI requires three stateful data stores:

  1. PostgreSQL (Relational Data)
  2. Redis (Message Queues via BullMQ)
  3. Qdrant (Vector Embeddings)

If you are running locally or on a single VPS, plan-ai/backend/docker-compose.yml starts these three. yarn docker runs it from the repository root.

bash
# Start all required databases
yarn docker

Postgres is published on port 5433, not 5432, so it doesn't collide with another project's Postgres on the same machine. DATABASE_URL in .env.template already points there.

Every port is published on 127.0.0.1 only, so the databases are not reachable from the network. The passwords in the compose file are development defaults. On a server, set POSTGRES_PASSWORD, REDIS_PASSWORD and QDRANT_API_KEY in plan-ai/backend/.env before the first start (see Docker Compose Variables).

The same file has an optional whisper service (port 8010) for self-hosted transcription. It's behind a Compose profile, so it only runs with yarn docker:whisper, and the backend only uses it with STT_PROVIDER=whisper. See Speech-to-Text.

If you are deploying to a production environment (like Railway), you should provision these three databases as separate managed services and pass their connection strings via the environment variables (DATABASE_URL, REDIS_URL, QDRANT_URL).

Building the Production Services ​

Plan AI has multiple Dockerfiles for different services.

1. The Backend API ​

The main Node.js backend should be built from the root of the repository so it can correctly compile the shared workspaces.

bash
docker build -f plan-ai/backend/Dockerfile -t plan-ai-backend .
docker run -p 8080:8080 --env-file plan-ai/backend/.env plan-ai-backend

2. The Voice Biometrics Service ​

The Python voice service requires system-level dependencies like ffmpeg to process audio files. It has its own dedicated Dockerfile.

bash
docker build -f plan-ai/voice-ai/Dockerfile -t plan-ai-voice .
docker run -p 8001:8001 --env-file plan-ai/voice-ai/.env plan-ai-voice

3. The Web Frontend ​

The Vite frontend compiles to static HTML/JS/CSS. We provide a multi-stage Dockerfile that builds the React app and serves it securely using Nginx.

bash
docker build -f plan-ai/frontend/Dockerfile -t plan-ai-frontend .
docker run -p 3000:80 --env-file plan-ai/frontend/.env plan-ai-frontend

Reverse Proxy Consideration ​

When deploying to production, ensure that your reverse proxy (e.g., Traefik, Nginx, or Railway's built-in router) is configured to allow large payload uploads.

Meeting recordings can be hundreds of megabytes in size. If you are using Nginx, you must set client_max_body_size 500M; to prevent the Desktop Recorder from receiving 413 Payload Too Large errors.