105 lines
3.3 KiB
YAML
105 lines
3.3 KiB
YAML
# Production / Dokploy
|
|
# دامنهها را در UIی Dokploy به سرویسها ببندید (پورت کانتینر):
|
|
# client → https://wheel.montzar.ir (80)
|
|
# api → https://api.wheel.montzar.ir (3000)
|
|
# admin → https://adm.wheel.montzar.ir (80)
|
|
#
|
|
# بیلد لوکال قبل از push:
|
|
# pnpm install && pnpm run build:release
|
|
#
|
|
# env: از .env.production.example کپی کنید و در Dokploy ست کنید.
|
|
|
|
services:
|
|
postgres:
|
|
image: postgres:15-alpine
|
|
restart: unless-stopped
|
|
environment:
|
|
POSTGRES_DB: ${POSTGRES_DB:-lucky_wheel}
|
|
POSTGRES_USER: ${POSTGRES_USER:-postgres}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-postgrespassword}
|
|
ports:
|
|
- '${EXPORT_DB_PORT:-5432}:5432'
|
|
volumes:
|
|
- pg_data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ['CMD-SHELL', 'pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB']
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
redis:
|
|
image: redis:7-alpine
|
|
restart: unless-stopped
|
|
command: ['redis-server', '--appendonly', 'yes']
|
|
volumes:
|
|
- redis_data:/data
|
|
healthcheck:
|
|
test: ['CMD', 'redis-cli', 'ping']
|
|
interval: 5s
|
|
timeout: 5s
|
|
retries: 5
|
|
|
|
api:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/api/Dockerfile
|
|
restart: unless-stopped
|
|
# بدون ports روی هاست — Dokploy با دامنه به پورت داخلی 3000 وصل میشود
|
|
expose:
|
|
- '3000'
|
|
environment:
|
|
NODE_ENV: production
|
|
PORT: 3000
|
|
DATABASE_URL: ${DATABASE_URL:-postgresql://postgres:postgrespassword@postgres:5432/lucky_wheel?schema=public}
|
|
REDIS_HOST: redis
|
|
REDIS_PORT: '6379'
|
|
REDIS_PASSWORD: ${REDIS_PASSWORD:-}
|
|
JWT_USER_SECRET: ${JWT_USER_SECRET:-change-me-user-jwt}
|
|
JWT_USER_EXPIRES_IN: ${JWT_USER_EXPIRES_IN:-7d}
|
|
JWT_ADMIN_ACCESS_SECRET: ${JWT_ADMIN_ACCESS_SECRET:-change-me-admin-access-jwt}
|
|
JWT_ADMIN_ACCESS_EXPIRES_IN: ${JWT_ADMIN_ACCESS_EXPIRES_IN:-1h}
|
|
JWT_ADMIN_REFRESH_SECRET: ${JWT_ADMIN_REFRESH_SECRET:-change-me-admin-refresh-jwt}
|
|
JWT_ADMIN_REFRESH_EXPIRES_IN: ${JWT_ADMIN_REFRESH_EXPIRES_IN:-7d}
|
|
CORS_ADMIN_ORIGIN: ${CORS_ADMIN_ORIGIN:-https://adm.wheel.montzar.ir}
|
|
CORS_CLIENT_ORIGIN: ${CORS_CLIENT_ORIGIN:-https://wheel.montzar.ir}
|
|
STORAGE_DRIVER: ${STORAGE_DRIVER:-local}
|
|
STORAGE_LOCAL_ROOT: ${STORAGE_LOCAL_ROOT:-./uploads}
|
|
STORAGE_PUBLIC_URL: ${STORAGE_PUBLIC_URL:-https://api.wheel.montzar.ir/uploads}
|
|
SMS_DRIVER: ${SMS_DRIVER:-mock}
|
|
RAYGAN_SMS_USERNAME: ${RAYGAN_SMS_USERNAME:-}
|
|
RAYGAN_SMS_PASSWORD: ${RAYGAN_SMS_PASSWORD:-}
|
|
RAYGAN_SMS_LINE_NUMBER: ${RAYGAN_SMS_LINE_NUMBER:-}
|
|
RAYGAN_SMS_API_BASE_URL: ${RAYGAN_SMS_API_BASE_URL:-https://api.raygansms.com}
|
|
volumes:
|
|
- uploads_data:/app/uploads
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
|
|
admin:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/admin/Dockerfile
|
|
restart: unless-stopped
|
|
expose:
|
|
- '80'
|
|
depends_on:
|
|
- api
|
|
|
|
client:
|
|
build:
|
|
context: .
|
|
dockerfile: apps/client/Dockerfile
|
|
restart: unless-stopped
|
|
expose:
|
|
- '80'
|
|
depends_on:
|
|
- api
|
|
|
|
volumes:
|
|
pg_data:
|
|
redis_data:
|
|
uploads_data:
|