# Meezi — FULL platform (all 7 services in one file) # # Includes: Postgres, Redis, Main API, Admin API, # Dashboard (web), Admin Panel (admin-web), Marketing Website # # Setup: # copy .env.example .env # docker compose -f docker-compose.full.yml up -d --build # # URLs (defaults): # Dashboard http://localhost:3101/fa/login # Website http://localhost:3010/fa # Admin panel http://localhost:3102/fa/admin/login # Main API http://localhost:5080/swagger # Admin API http://localhost:5081/swagger services: # ── Infrastructure ────────────────────────────────────────────────────────── postgres: image: postgres:16-alpine container_name: meezi-db restart: unless-stopped environment: POSTGRES_DB: meezi POSTGRES_USER: meezi POSTGRES_PASSWORD: meezi_local_pass ports: - "${POSTGRES_PORT:-5434}:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U meezi -d meezi"] interval: 5s timeout: 5s retries: 10 redis: image: redis:7-alpine container_name: meezi-redis restart: unless-stopped ports: - "${REDIS_PORT:-6381}:6379" command: redis-server --appendonly yes volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 10 # ── Backend APIs ──────────────────────────────────────────────────────────── api: build: context: . dockerfile: docker/api/Dockerfile args: DOTNET_SDK_IMAGE: ${DOTNET_SDK_IMAGE:-mcr.microsoft.com/dotnet/sdk:10.0} DOTNET_ASPNET_IMAGE: ${DOTNET_ASPNET_IMAGE:-mcr.microsoft.com/dotnet/aspnet:10.0} container_name: meezi-api restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: ASPNETCORE_ENVIRONMENT: Development ASPNETCORE_URLS: http://+:8080 RUN_MIGRATIONS: "true" ConnectionStrings__DefaultConnection: Host=postgres;Port=5432;Database=meezi;Username=meezi;Password=meezi_local_pass ConnectionStrings__Redis: redis:6379 App__PublicBaseUrl: ${NEXT_PUBLIC_API_URL:-http://localhost:5080} App__QrPublicBaseUrl: http://localhost:${WEB_PORT:-3101} Cors__Origins__0: http://localhost:${WEB_PORT:-3101} Cors__Origins__1: http://localhost:${WEBSITE_PORT:-3010} Cors__Origins__2: http://localhost:${ADMIN_WEB_PORT:-3102} Auth__MaxOtpAttemptsPerHour: "100" Kavenegar__ApiKey: "" Billing__DashboardBaseUrl: http://localhost:${WEB_PORT:-3101} Snappfood__WebhookSecret: meezi-dev-snappfood-secret ZarinPal__MerchantId: "${ZARINPAL_MERCHANT_ID:-}" ZarinPal__Sandbox: "${ZARINPAL_SANDBOX:-true}" ports: - "${API_PORT:-5080}:8080" volumes: - api_uploads:/app/uploads healthcheck: test: ["CMD-SHELL", "bash -c 'cat /dev/tcp/127.0.0.1/8080' || exit 1"] interval: 10s timeout: 5s retries: 12 start_period: 40s admin-api: build: context: . dockerfile: docker/admin-api/Dockerfile args: DOTNET_SDK_IMAGE: ${DOTNET_SDK_IMAGE:-mcr.microsoft.com/dotnet/sdk:10.0} DOTNET_ASPNET_IMAGE: ${DOTNET_ASPNET_IMAGE:-mcr.microsoft.com/dotnet/aspnet:10.0} container_name: meezi-admin-api restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: ASPNETCORE_ENVIRONMENT: Development ASPNETCORE_URLS: http://+:8080 RUN_MIGRATIONS: "false" ConnectionStrings__DefaultConnection: Host=postgres;Port=5432;Database=meezi;Username=meezi;Password=meezi_local_pass ConnectionStrings__Redis: redis:6379 Cors__Origins__0: http://localhost:${ADMIN_WEB_PORT:-3102} Cors__Origins__1: http://localhost:${WEB_PORT:-3101} Kavenegar__ApiKey: "" ports: - "${ADMIN_API_PORT:-5081}:8080" healthcheck: test: ["CMD-SHELL", "bash -c 'cat /dev/tcp/127.0.0.1/8080' || exit 1"] interval: 10s timeout: 5s retries: 12 start_period: 40s # ── Frontend Services ─────────────────────────────────────────────────────── web: build: context: . dockerfile: docker/web/Dockerfile args: NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL:-http://localhost:5080} container_name: meezi-web restart: unless-stopped depends_on: api: condition: service_healthy environment: PORT: "3000" HOSTNAME: 0.0.0.0 ports: - "${WEB_PORT:-3101}:3000" admin-web: build: context: . dockerfile: docker/admin-web/Dockerfile args: NEXT_PUBLIC_ADMIN_API_URL: ${NEXT_PUBLIC_ADMIN_API_URL:-http://localhost:5081} container_name: meezi-admin-web restart: unless-stopped depends_on: admin-api: condition: service_healthy environment: PORT: "3000" HOSTNAME: 0.0.0.0 ports: - "${ADMIN_WEB_PORT:-3102}:3000" website: build: context: . dockerfile: docker/website/Dockerfile args: MEEZI_API_URL: http://api:8080 NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-http://localhost:3010} container_name: meezi-website restart: unless-stopped depends_on: api: condition: service_healthy environment: PORT: "3000" HOSTNAME: 0.0.0.0 MEEZI_API_URL: http://api:8080 NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL:-http://localhost:3010} ports: - "${WEBSITE_PORT:-3010}:3000" volumes: postgres_data: redis_data: api_uploads: