# ERPNext Docker Compose - 擎添工業整合用 # 基於 frappe_docker/pwd.yml 調整 services: backend: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs - ./translations/frappe-zh-TW.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh-TW.csv:ro - ./translations/frappe-zh.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh.csv:ro - ./translations/erpnext-zh-TW.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh-TW.csv:ro - ./translations/erpnext-zh.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh.csv:ro - ./translations/locale/zh/LC_MESSAGES:/home/frappe/frappe-bench/sites/assets/locale/zh/LC_MESSAGES:ro environment: DB_HOST: db DB_PORT: "3306" MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} configurator: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: "no" networks: - erpnext_network 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: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: "no" networks: - erpnext_network volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs entrypoint: ["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; export start=`date +%s`; until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \ [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \ [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]]; do echo "Waiting for sites/common_site_config.json to be created"; sleep 5; if (( `date +%s`-start > 120 )); then echo "could not find sites/common_site_config.json with required keys"; exit 1; fi done; echo "sites/common_site_config.json found"; bench new-site ${SITE_NAME} --mariadb-user-host-login-scope='%' --admin-password=${SITE_ADMIN_PASSWORD} --db-root-username=root --db-root-password=${DB_ROOT_PASSWORD} --install-app erpnext --set-default; db: image: mariadb:10.6 restart: unless-stopped networks: - erpnext_network healthcheck: test: mysqladmin ping -h localhost --password=${DB_ROOT_PASSWORD} interval: 5s retries: 20 command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci - --skip-character-set-client-handshake - --skip-innodb-read-only-compressed environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} volumes: - db-data:/var/lib/mysql frontend: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network depends_on: - backend - websocket command: - nginx-entrypoint.sh environment: BACKEND: backend:8000 FRAPPE_SITE_NAME_HEADER: ${SITE_NAME} 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 volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs ports: - "${HTTP_PORT:-8080}:8080" queue-short: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network command: ["bench", "worker", "--queue", "short,default"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs - ./translations/frappe-zh-TW.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh-TW.csv:ro - ./translations/frappe-zh.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh.csv:ro - ./translations/erpnext-zh-TW.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh-TW.csv:ro - ./translations/erpnext-zh.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh.csv:ro - ./translations/locale/zh/LC_MESSAGES:/home/frappe/frappe-bench/sites/assets/locale/zh/LC_MESSAGES:ro environment: FRAPPE_REDIS_CACHE: redis://redis-cache:6379 FRAPPE_REDIS_QUEUE: redis://redis-queue:6379 queue-long: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network command: ["bench", "worker", "--queue", "long,default,short"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs - ./translations/frappe-zh-TW.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh-TW.csv:ro - ./translations/frappe-zh.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh.csv:ro - ./translations/erpnext-zh-TW.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh-TW.csv:ro - ./translations/erpnext-zh.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh.csv:ro - ./translations/locale/zh/LC_MESSAGES:/home/frappe/frappe-bench/sites/assets/locale/zh/LC_MESSAGES:ro environment: FRAPPE_REDIS_CACHE: redis://redis-cache:6379 FRAPPE_REDIS_QUEUE: redis://redis-queue:6379 scheduler: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network command: ["bench", "schedule"] volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs - ./translations/frappe-zh-TW.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh-TW.csv:ro - ./translations/frappe-zh.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh.csv:ro - ./translations/erpnext-zh-TW.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh-TW.csv:ro - ./translations/erpnext-zh.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh.csv:ro - ./translations/locale/zh/LC_MESSAGES:/home/frappe/frappe-bench/sites/assets/locale/zh/LC_MESSAGES:ro websocket: image: frappe/erpnext:${ERPNEXT_VERSION} platform: linux/amd64 restart: unless-stopped networks: - erpnext_network command: - node - /home/frappe/frappe-bench/apps/frappe/socketio.js environment: FRAPPE_REDIS_CACHE: redis://redis-cache:6379 FRAPPE_REDIS_QUEUE: redis://redis-queue:6379 volumes: - sites:/home/frappe/frappe-bench/sites - logs:/home/frappe/frappe-bench/logs - ./translations/frappe-zh-TW.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh-TW.csv:ro - ./translations/frappe-zh.csv:/home/frappe/frappe-bench/apps/frappe/frappe/translations/zh.csv:ro - ./translations/erpnext-zh-TW.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh-TW.csv:ro - ./translations/erpnext-zh.csv:/home/frappe/frappe-bench/apps/erpnext/erpnext/translations/zh.csv:ro - ./translations/locale/zh/LC_MESSAGES:/home/frappe/frappe-bench/sites/assets/locale/zh/LC_MESSAGES:ro redis-queue: image: redis:6.2-alpine restart: unless-stopped networks: - erpnext_network volumes: - redis-queue-data:/data redis-cache: image: redis:6.2-alpine restart: unless-stopped networks: - erpnext_network volumes: db-data: redis-queue-data: sites: logs: networks: erpnext_network: name: erpnext_network driver: bridge