diff --git a/Dockerfile.standalone b/Dockerfile.standalone index 6af8ee1..1db8e32 100644 --- a/Dockerfile.standalone +++ b/Dockerfile.standalone @@ -29,13 +29,15 @@ COPY --from=backend-builder /taskpool /app/taskpool # Copy nginx config (modified for localhost) COPY nginx-standalone.conf /etc/nginx/http.d/default.conf -# Copy supervisor config +# Copy supervisor config + backend wrapper (logs go to docker logs) COPY supervisord.conf /etc/supervisord.conf +COPY docker/start-backend.sh /app/start-backend.sh # Create data directories and ship example config (used when no volume config) COPY configs/config.example.ini /app/configs/config.example.ini RUN mkdir -p /app/data /app/configs /app/envs /app/logs \ - && chmod +x /app/taskpool + && chmod +x /app/taskpool /app/start-backend.sh \ + && apk add --no-cache wget ca-certificates WORKDIR /app EXPOSE 3000 8052 diff --git a/docker/start-backend.sh b/docker/start-backend.sh new file mode 100644 index 0000000..6a68564 --- /dev/null +++ b/docker/start-backend.sh @@ -0,0 +1,22 @@ +#!/bin/sh +set -eu + +cd /app + +echo "[backend-wrapper] starting taskpool server" +echo "[backend-wrapper] cwd=$(pwd)" +echo "[backend-wrapper] BH_SERVER_HOST=${BH_SERVER_HOST:-}" +echo "[backend-wrapper] BH_SERVER_PORT=${BH_SERVER_PORT:-}" +echo "[backend-wrapper] BH_DB_TYPE=${BH_DB_TYPE:-}" +echo "[backend-wrapper] BH_DB_HOST=${BH_DB_HOST:-}" +echo "[backend-wrapper] BH_DB_PORT=${BH_DB_PORT:-}" +echo "[backend-wrapper] BH_DB_USER=${BH_DB_USER:-}" +echo "[backend-wrapper] BH_DB_NAME=${BH_DB_NAME:-}" +echo "[backend-wrapper] BH_DB_PATH=${BH_DB_PATH:-}" +echo "[backend-wrapper] config.ini exists=$([ -f /app/configs/config.ini ] && echo yes || echo no)" + +# 避免空目录挂载导致权限/路径问题 +mkdir -p /app/data /app/configs /app/envs /app/logs /app/data/scripts + +# 直接前台运行,日志打到容器 stdout/stderr,方便 docker logs 排查 +exec /app/taskpool server diff --git a/internal/bootstrap/bootstrap.go b/internal/bootstrap/bootstrap.go index adbe355..564e4d3 100644 --- a/internal/bootstrap/bootstrap.go +++ b/internal/bootstrap/bootstrap.go @@ -133,7 +133,17 @@ func (a *App) initDatabase() { SSLMode: a.Config.Database.SSLMode, } + // 启动期打印有效 DB 配置(不含密码),便于 Docker 排查 + if dbCfg.Type == "sqlite" { + logger.Infof("[Database] 使用 sqlite path=%s", dbCfg.Path) + } else { + logger.Infof("[Database] 使用 %s host=%s port=%d user=%s dbname=%s", + dbCfg.Type, dbCfg.Host, dbCfg.Port, dbCfg.User, dbCfg.DBName) + } + if err := database.Init(dbCfg); err != nil { + logger.Errorf("Failed to init database: %v", err) + logger.Errorf("排查建议: 1) 确认 BH_DB_* 环境变量已注入 2) MySQL 是否允许 host.docker.internal 访问 3) configs/config.ini 是否覆盖了错误配置") logger.Fatalf("Failed to init database: %v", err) } diff --git a/supervisord.conf b/supervisord.conf index a3c39fe..d85a03a 100644 --- a/supervisord.conf +++ b/supervisord.conf @@ -1,27 +1,29 @@ [supervisord] nodaemon=true -logfile=/app/logs/supervisord.log +logfile=/dev/null pidfile=/var/run/supervisord.pid user=root +loglevel=info [program:backend] -command=/app/taskpool server +command=/bin/sh /app/start-backend.sh directory=/app autostart=true autorestart=true -startsecs=3 -startretries=10 -stderr_logfile=/app/logs/backend.err.log -stdout_logfile=/app/logs/backend.out.log -stdout_logfile_maxbytes=10MB -stderr_logfile_maxbytes=10MB -# 不写死 BH_DB_*,避免覆盖 compose 注入的 MySQL/Postgres。 -# 仅在 compose 未设置时提供默认监听参数。 -environment=BH_SERVER_PORT="8052",BH_SERVER_HOST="0.0.0.0" +startsecs=2 +startretries=20 +# 关键:把 backend 日志打到 docker logs,而不是只写文件 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +# 不在此写 environment=,完整继承 compose/container 环境变量 [program:nginx] command=nginx -g "daemon off;" autostart=true autorestart=true -stderr_logfile=/app/logs/nginx.err.log -stdout_logfile=/app/logs/nginx.out.log +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0