Files
tehran_tala/docker-compose.yml
T
s.esmaeiliandClaude Opus 5 53436ec855 chore(release): prepare release/delivery + fix docker env passthrough
DEPLOY-01: docker-compose.yml passed only DATABASE_URL and PORT to the api
service, so JWT_SECRET, JWT_CUSTOMER_SECRET, OTP_MASTER_CODE and every SMS_TREZ_*
variable were silently dropped in Docker. A deployed build would have used the
development JWT fallback and would not have had the delivery master code at all,
so the demo login would have failed with no obvious cause. All are now forwarded,
defaulting to empty (which the code treats as unset); verified with
`docker compose config`.

TEST-01: test-sales-expert-roundtrip.cjs had localhost:3077 hardcoded and could
only connect by accident. Now defaults to the repo's API_PORT. 33/33.

DELIVERY.md documents env vars (names only), run/deploy commands, how migrations
run inside the container, the verification results and the known issues.

release/delivery contains both parity branches with no conflicts (fast-forward).
build 5/5, jest 45/45, admin smoke 43/43, apps smoke 43/43, B2B scan 34/34,
B2B writes 25/25, auth-smoke 32/32, typecheck clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-23 00:30:09 +03:30

106 lines
3.4 KiB
YAML

version: '3.8'
services:
db:
image: docker.arvancloud.ir/postgres:15-alpine
container_name: goldbank_db
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${POSTGRES_DB:-goldbank}
ports:
- "${EXTERNAL_DB_PORT:-5432}:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-goldbank}"]
interval: 5s
timeout: 5s
retries: 12
api:
build:
context: ./apps/api
dockerfile: Dockerfile
container_name: goldbank_api
# Prisma connects on module init, so a not-yet-ready DB crash-loops the API.
depends_on:
db:
condition: service_healthy
environment:
- DATABASE_URL=${DATABASE_URL:-postgresql://postgres:postgres@db:5432/goldbank?schema=public}
- PORT=${PORT:-3000}
# Auth. Without these the API falls back to a well-known development
# secret, so set them in the deployment environment.
- JWT_SECRET=${JWT_SECRET:-}
- JWT_EXPIRES_IN=${JWT_EXPIRES_IN:-}
- JWT_CUSTOMER_SECRET=${JWT_CUSTOMER_SECRET:-}
- JWT_CUSTOMER_EXPIRES_IN=${JWT_CUSTOMER_EXPIRES_IN:-}
# ⚠ DELIVERY ONLY — a fixed OTP that signs in ANY active customer.
# Empty/unset disables it, which is the correct state for production.
# See ISSUES REL-01. Must be exactly 4 digits to be typable in the apps.
- OTP_MASTER_CODE=${OTP_MASTER_CODE:-}
# SMS. All blank = messages are logged, not sent; the API still boots (D20).
- SMS_PROVIDER=${SMS_PROVIDER:-}
- SMS_TREZ_URL=${SMS_TREZ_URL:-}
- SMS_TREZ_USERNAME=${SMS_TREZ_USERNAME:-}
- SMS_TREZ_PASSWORD=${SMS_TREZ_PASSWORD:-}
- SMS_TREZ_SENDER_LINE=${SMS_TREZ_SENDER_LINE:-}
# No host ports — Dokploy/Traefik routes by domain to container port 3000
expose:
- "3000"
# Uploaded files (product images, etc.) land in storage/uploads inside the
# container. Without a volume they vanish on every recreate/redeploy, and
# every UploadedFile/ProductImage row created before that would then point
# at a URL that 404s.
volumes:
- api_uploads:/app/storage/uploads
restart: unless-stopped
# The bare name "api" is ambiguous on Dokploy's shared network (other stacks
# register it too), which made nginx dial the wrong containers. Use a unique alias.
networks:
default:
aliases:
- goldbank-api
admin-panel:
build:
context: ./apps/admin-panel
dockerfile: Dockerfile
container_name: goldbank_admin_panel
# No host ports — Dokploy/Traefik routes by domain to container port 80
expose:
- "80"
restart: unless-stopped
depends_on:
- api
user-app:
build:
context: ./apps/user-app
dockerfile: Dockerfile
container_name: goldbank_user_app
# No host ports — Dokploy/Traefik routes by domain to container port 80
expose:
- "80"
restart: unless-stopped
depends_on:
- api
# Same copy-only nginx pattern as user-app; map a separate Dokploy domain to this service.
user-app-v2:
build:
context: ./apps/user-app-v2
dockerfile: Dockerfile
container_name: goldbank_user_app_v2
expose:
- "80"
restart: unless-stopped
depends_on:
- api
volumes:
postgres_data:
api_uploads: