Edit: /opt/vitrin-clinic/docker-compose.yml (2591B)
name: vitrin-clinic
# Test deployment running ALONGSIDE other production projects on the droplet.
# Strictly additive: no ports 80/443, everything bound to 127.0.0.1 on high
# ports — the droplet's existing reverse proxy terminates TLS for the test
# subdomains and proxies to these loopback ports.
services:
postgres:
image: postgres:17-alpine
container_name: vitrin_db
restart: unless-stopped
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- postgres_data:/var/lib/postgresql/data
# Not exposed at all — only reachable from the other containers.
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 5
be:
image: vitrin-clinic-be:latest
container_name: vitrin_be
restart: unless-stopped
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}?schema=public
PORT: 4000
NODE_ENV: production
FRONTEND_URL: ${FRONTEND_URL}
JWT_SECRET: ${JWT_SECRET}
REVALIDATION_SECRET: ${REVALIDATION_SECRET}
STORAGE_PROVIDER: ${STORAGE_PROVIDER}
R2_ENDPOINT: ${R2_ENDPOINT}
R2_BUCKET: ${R2_BUCKET}
R2_PUBLIC_URL: ${R2_PUBLIC_URL}
R2_ACCESS_KEY: ${R2_ACCESS_KEY}
R2_SECRET_KEY: ${R2_SECRET_KEY}
ISBANK_MERCHANT_ID: ${ISBANK_MERCHANT_ID}
ISBANK_SECRET_KEY: ${ISBANK_SECRET_KEY}
ISBANK_API_URL: ${ISBANK_API_URL}
ADMIN_SEED_EMAIL: ${ADMIN_SEED_EMAIL}
ADMIN_SEED_PASSWORD: ${ADMIN_SEED_PASSWORD}
ADMIN_SEED_NAME: ${ADMIN_SEED_NAME}
GA4_PROPERTY_ID: ${GA4_PROPERTY_ID}
GOOGLE_SERVICE_ACCOUNT_JSON: ${GOOGLE_SERVICE_ACCOUNT_JSON}
ports:
- "127.0.0.1:${BE_HOST_PORT:-4100}:4000"
depends_on:
postgres:
condition: service_healthy
fe:
image: vitrin-clinic-fe:latest
container_name: vitrin_fe
restart: unless-stopped
environment:
# Server-side code reads this at runtime; client bundles have it baked
# in at image build time (see deploy.sh build args). Keep them in sync.
NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
NEXT_PUBLIC_R2_PUBLIC_BASE_URL: ${NEXT_PUBLIC_R2_PUBLIC_BASE_URL}
REVALIDATION_SECRET: ${REVALIDATION_SECRET}
ZOHO_API_KEY: ${ZOHO_API_KEY}
TURNSTILE_SECRET_KEY: ${TURNSTILE_SECRET_KEY}
ports:
- "127.0.0.1:${FE_HOST_PORT:-3100}:3000"
depends_on:
- be
volumes:
postgres_data: