Docker Deployment
Deploy WorkForce using Docker and Docker Compose.
Prerequisites
- Docker 20.10+
- Docker Compose v2+
Docker Compose (Recommended)
The project includes a docker-compose.yml for one-command deployment.
1. Configure Environment
Create a .env file:
DATABASE_URL="postgresql://workforce:workforce_pass@db:5432/workforce?schema=public"
NEXTAUTH_SECRET="your-64-char-random-secret"
NEXTAUTH_URL="https://your-domain.com"
POSTGRES_USER=workforce
POSTGRES_PASSWORD=workforce_pass
POSTGRES_DB=workforce
2. Start Services
docker compose up -d
This starts:
- app — WorkForce Next.js application (port 3000)
- db — PostgreSQL database (port 5432, internal only)
3. Run Migrations
docker compose exec app npx prisma migrate deploy
4. Verify
docker compose ps
curl http://localhost:3000
Dockerfile
If you need a custom build:
FROM node:20-alpine AS base
FROM base AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --only=production
FROM base AS builder
WORKDIR /app
COPY . .
COPY --from=deps /app/node_modules ./node_modules
RUN npx prisma generate
RUN npm run build
FROM base AS runner
WORKDIR /app
ENV NODE_ENV=production
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/prisma ./prisma
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
Managing Containers
# View logs
docker compose logs -f app
# Restart application
docker compose restart app
# Stop everything
docker compose down
# Stop and remove data (WARNING: deletes database)
docker compose down -v
# Rebuild after code changes
docker compose up -d --build app
Data Persistence
Database data is stored in a Docker volume. To back up:
# Backup
docker compose exec db pg_dump -U workforce workforce > backup.sql
# Restore
cat backup.sql | docker compose exec -T db psql -U workforce workforce
Production Considerations
- Use a separate, managed PostgreSQL instance for production
- Mount the
upload/directory to a persistent volume - Configure resource limits in
docker-compose.yml - Set up health checks and restart policies
- Use a reverse proxy (Caddy/Nginx) in front for HTTPS