Skip to main content

Docker Deployment

Deploy WorkForce using Docker and Docker Compose.

Prerequisites

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