version: "3.8" services: traefik: image: traefik:v2.11 container_name: traefik command: - "--api.dashboard=true" - "--api.insecure=true" - "--providers.docker=true" - "--providers.docker.exposedbydefault=false" - "--entrypoints.web.address=:80" - "--entrypoints.websecure.address=:443" - "--certificatesresolvers.myresolver.acme.httpchallenge=true" - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web" - "--certificatesresolvers.myresolver.acme.email=nastiar.dev@gmail.com" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "80:80" - "443:443" - "8081:8080" # Dashboard access volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - traefik-letsencrypt:/letsencrypt networks: - frappe_network restart: unless-stopped backend: image: frappe/erpnext:v15.7.0 # Using a more specific version networks: - frappe_network deploy: restart_policy: condition: on-failure volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs environment: DB_HOST: db DB_PORT: "3306" MYSQL_ROOT_PASSWORD: admin MARIADB_ROOT_PASSWORD: admin configurator: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: none entrypoint: - bash - -c command: - > ls -1 apps > sites/apps.txt; bench set-config -g db_host $$DB_HOST; bench set-config -gp db_port $$DB_PORT; bench set-config -g redis_cache "redis://$$REDIS_CACHE"; bench set-config -g redis_queue "redis://$$REDIS_QUEUE"; bench set-config -g redis_socketio "redis://$$REDIS_QUEUE"; bench set-config -gp socketio_port $$SOCKETIO_PORT; environment: DB_HOST: db DB_PORT: "3306" REDIS_CACHE: redis-cache:6379 REDIS_QUEUE: redis-queue:6379 SOCKETIO_PORT: "9000" volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs create-site-1: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: none depends_on: configurator: condition: service_completed_successfully db: condition: service_healthy volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs entrypoint: ["/bin/bash", "-c"] command: - > wait-for-it -t 120 db:3306; wait-for-it -t 120 redis-cache:6379; wait-for-it -t 120 redis-queue:6379; bench new-site --no-mariadb-socket --mariadb-root-username=root --mariadb-root-password=admin --install-app erpnext --admin-password=admin --set-default erp-sb1.mitrabisnisdigital.com; bench --site erp-sb1.mitrabisnisdigital.com set-config host_name https://erp-sb1.mitrabisnisdigital.com; create-site-2: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: none depends_on: create-site-1: condition: service_completed_successfully # FIX: Ensure this runs AFTER site 1 is created volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs entrypoint: ["/bin/bash", "-c"] command: > wait-for-it -t 120 db:3306; wait-for-it -t 120 redis-cache:6379; wait-for-it -t 120 redis-queue:6379; bench new-site --no-mariadb-socket --mariadb-root-username=root --mariadb-root-password=admin --install-app erpnext --admin-password=admin erp-sb2.mitrabisnisdigital.com; bench --site erp-sb2.mitrabisnisdigital.com set-config host_name https://erp-sb2.mitrabisnisdigital.com; db: image: mariadb:10.6 networks: - frappe_network healthcheck: test: mysqladmin ping -h localhost --password=admin interval: 1s retries: 20 deploy: restart_policy: condition: on-failure command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --skip-character-set-client-handshake - --skip-innodb-read-only-compressed environment: MYSQL_ROOT_PASSWORD: admin MARIADB_ROOT_PASSWORD: admin volumes: - db-data:/var/lib/mysql frontend: image: frappe/erpnext:v15.7.0 networks: - frappe_network depends_on: - websocket - backend deploy: restart_policy: condition: on-failure command: - nginx-entrypoint.sh environment: BACKEND: backend:8000 # FRAPPE_SITE_NAME_HEADER: erp-sb1.mitrabisnisdigital.com SOCKETIO: websocket:9000 UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1 UPSTREAM_REAL_IP_HEADER: X-Forwarded-For UPSTREAM_REAL_IP_RECURSIVE: "off" PROXY_READ_TIMEOUT: 120 CLIENT_MAX_BODY_SIZE: 50m labels: - "traefik.enable=true" # FIX: Define one service for the frontend container - "traefik.http.services.erpnext-frontend.loadbalancer.server.port=8080" # FIX: Router for the first site - "traefik.http.routers.erp-sb1.rule=Host(`erp-sb1.mitrabisnisdigital.com`)" - "traefik.http.routers.erp-sb1.entrypoints=websecure" - "traefik.http.routers.erp-sb1.tls.certresolver=myresolver" - "traefik.http.routers.erp-sb1.service=erpnext-frontend" # FIX: Router for the second site - "traefik.http.routers.erp-sb2.rule=Host(`erp-sb2.mitrabisnisdigital.com`)" - "traefik.http.routers.erp-sb2.entrypoints=websecure" - "traefik.http.routers.erp-sb2.tls.certresolver=myresolver" - "traefik.http.routers.erp-sb2.service=erpnext-frontend" volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs # FIX: Removed redundant exposed port # ... (queue-long, queue-short, redis-*, scheduler, websocket services remain the same) ... queue-long: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: on-failure command: ["bench", "worker", "--queue", "long,default,short"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs redis-queue: image: redis:6.2-alpine networks: - frappe_network deploy: restart_policy: condition: on-failure volumes: - redis-queue-data:/data redis-cache: image: redis:6.2-alpine networks: - frappe_network deploy: restart_policy: condition: on-failure volumes: - redis-cache-data:/data scheduler: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: on-failure command: ["bench", "schedule"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs websocket: image: frappe/erpnext:v15.7.0 networks: - frappe_network deploy: restart_policy: condition: on-failure command: ["node", "/home/frappe/frappe-bench/apps/frappe/socketio.js"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs volumes: db-data: redis-queue-data: redis-cache-data: sites: logs: traefik-letsencrypt: networks: frappe_network: driver: bridge