139 lines
6.3 KiB
YAML
139 lines
6.3 KiB
YAML
services:
|
|
# ============================================
|
|
# ERPNext 主服务(包含所有进程)
|
|
# ============================================
|
|
erpnext:
|
|
image: yierp:v260831
|
|
container_name: erpnext-all-in-one
|
|
user: root
|
|
restart: unless-stopped
|
|
networks:
|
|
- frappe_network
|
|
ports:
|
|
- "8080:8000"
|
|
environment:
|
|
DB_HOST: db
|
|
DB_PORT: "3306"
|
|
MYSQL_ROOT_PASSWORD: admin
|
|
MARIADB_ROOT_PASSWORD: admin
|
|
REDIS_CACHE: redis://redis-cache:6379
|
|
REDIS_QUEUE: redis://redis-queue:6379
|
|
volumes:
|
|
- sites:/home/frappe/frappe-bench/sites
|
|
- logs:/home/frappe/frappe-bench/logs
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
redis-cache:
|
|
condition: service_started
|
|
redis-queue:
|
|
condition: service_started
|
|
command: >
|
|
bash -ec "
|
|
NODE24_BIN=$$(dirname $$(ls -1 /home/frappe/.nvm/versions/node/*/bin/node 2>/dev/null | sort | tail -n1 || true)) &&
|
|
if [ -n "$$NODE24_BIN" ]; then
|
|
ln -sf "$$NODE24_BIN/node" /usr/local/bin/node &&
|
|
ln -sf "$$NODE24_BIN/npm" /usr/local/bin/npm &&
|
|
[ -x "$$NODE24_BIN/npx" ] && ln -sf "$$NODE24_BIN/npx" /usr/local/bin/npx || true;
|
|
[ -x "$$NODE24_BIN/yarn" ] && ln -sf "$$NODE24_BIN/yarn" /usr/local/bin/yarn || true;
|
|
fi &&
|
|
mkdir -p /home/frappe/frappe-bench/sites /home/frappe/frappe-bench/logs /home/frappe/frappe-bench/config/pids &&
|
|
chown -R frappe:frappe /home/frappe/frappe-bench/sites /home/frappe/frappe-bench/logs /home/frappe/frappe-bench/config &&
|
|
cd /home/frappe/frappe-bench &&
|
|
su -s /bin/bash frappe -c 'sed -i "s#air-datepicker/dist/js/datepicker.min.js#air-datepicker/air-datepicker.js#g" /home/frappe/frappe-bench/apps/frappe/frappe/public/js/controls.bundle.js && sed -i "s#~air-datepicker/dist/css/datepicker.min#air-datepicker/air-datepicker.css#g" /home/frappe/frappe-bench/apps/frappe/frappe/public/scss/common/datepicker.scss && sed -i "s#~air-datepicker/air-datepicker.css#air-datepicker/air-datepicker.css#g" /home/frappe/frappe-bench/apps/frappe/frappe/public/scss/common/datepicker.scss && sed -i "s#air-datepicker/dist/js/i18n/#air-datepicker/locale/#g" /home/frappe/frappe-bench/apps/frappe/frappe/public/js/frappe/form/controls/datepicker_i18n.js && sed -i "s#air-datepicker/locale/datepicker.#air-datepicker/locale/#g" /home/frappe/frappe-bench/apps/frappe/frappe/public/js/frappe/form/controls/datepicker_i18n.js' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && find apps -mindepth 1 -maxdepth 1 -type d | while read -r app_dir; do app_name=$$(basename "$$app_dir"); [ -f "$$app_dir/$$app_name/modules.txt" ] && echo "$$app_name"; done | sort > sites/apps.txt' &&
|
|
su -s /bin/bash frappe -c 'node -v && yarn -v' &&
|
|
echo '=== 配置数据库连接 ===' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench set-mariadb-host "'"'"'$$DB_HOST'"'"'"' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench config set-common-config -c db_port "'"'"'$$DB_PORT'"'"'"' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench set-redis-cache-host "'"'"'$$REDIS_CACHE'"'"'"' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench set-redis-queue-host "'"'"'$$REDIS_QUEUE'"'"'"' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench set-redis-socketio-host "'"'"'$$REDIS_QUEUE'"'"'"' &&
|
|
echo '=== 检查站点是否存在 ===' &&
|
|
if [ ! -d sites/frontend ]; then
|
|
echo '=== 创建新站点 frontend ===' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench new-site --mariadb-user-host-login-scope="%" --admin-password=admin --db-root-username=root --db-root-password=admin --set-default frontend';
|
|
else
|
|
echo '=== 站点已存在,跳过创建 ===';
|
|
fi &&
|
|
if ! /usr/local/bin/check-assets.sh full; then
|
|
echo '=== 前端资产完整检查失败,开始自动修复 ===' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench/apps/frappe && unset NODE_ENV npm_config_production && yarn install --check-files' &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench build --force';
|
|
else
|
|
echo '=== 前端资产完整检查通过,跳过自动修复 ===';
|
|
fi &&
|
|
/usr/local/bin/check-assets.sh full &&
|
|
su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench use frontend' &&
|
|
echo '=== 启动 ERPNext 服务 ===' &&
|
|
exec su -s /bin/bash frappe -c 'cd /home/frappe/frappe-bench && bench serve --host 0.0.0.0 --port 8000 --noreload'
|
|
"
|
|
|
|
# ============================================
|
|
# MariaDB 数据库
|
|
# ============================================
|
|
db:
|
|
image: mariadb:11.8
|
|
container_name: erpnext-db
|
|
restart: unless-stopped
|
|
networks:
|
|
- frappe_network
|
|
ports:
|
|
- "3306:3306"
|
|
healthcheck:
|
|
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
|
start_period: 10s
|
|
interval: 10s
|
|
timeout: 5s
|
|
retries: 5
|
|
command:
|
|
- --character-set-server=utf8mb4
|
|
- --collation-server=utf8mb4_unicode_ci
|
|
- --skip-character-set-client-handshake
|
|
environment:
|
|
MYSQL_ROOT_PASSWORD: admin
|
|
MARIADB_ROOT_PASSWORD: admin
|
|
volumes:
|
|
- db-data:/var/lib/mysql
|
|
|
|
# ============================================
|
|
# Redis 缓存
|
|
# ============================================
|
|
redis-cache:
|
|
image: redis:6.2-alpine
|
|
container_name: erpnext-redis-cache
|
|
restart: unless-stopped
|
|
networks:
|
|
- frappe_network
|
|
volumes:
|
|
- redis-cache-data:/data
|
|
|
|
# ============================================
|
|
# Redis 队列
|
|
# ============================================
|
|
redis-queue:
|
|
image: redis:6.2-alpine
|
|
container_name: erpnext-redis-queue
|
|
restart: unless-stopped
|
|
networks:
|
|
- frappe_network
|
|
volumes:
|
|
- redis-queue-data:/data
|
|
|
|
# ============================================
|
|
# 数据卷定义
|
|
# ============================================
|
|
volumes:
|
|
db-data:
|
|
redis-cache-data:
|
|
redis-queue-data:
|
|
sites:
|
|
logs:
|
|
|
|
# ============================================
|
|
# 网络定义
|
|
# ============================================
|
|
networks:
|
|
frappe_network:
|
|
driver: bridge
|