Plane AIO 容器如何通过 GUNICORN_WORKERS 调整 Gunicorn 工作进程并查看服务日志
【免费下载链接】plane🔥🔥🔥 Open-source Jira, Linear, Monday, and ClickUp alternative. Plane is a modern project management platform to manage tasks, sprints, docs, and triage.项目地址: https://gitcode.com/GitHub_Trending/pl/plane
Plane 的 Community AIO(All-In-One)Docker 镜像把 Web、Space、Admin、API、Live Server、Caddy 代理以及 Celery Worker/Beat 打进同一个容器,由 Supervisor 统一调度。其中 API Server 由 Gunicorn 承载,工作进程数量由GUNICORN_WORKERS环境变量控制。如果你发现 API 并发能力不足,需要调大工作进程数,或者需要定位 API 报错,这篇内容讲的就是这两件事:如何在 AIO 容器里生效GUNICORN_WORKERS,以及如何查看各服务的日志确认结果。
适用对象:使用 AIO 社区镜像 部署 Plane 的开发者。镜像启动前需要外部依赖就绪:PostgreSQL、Redis、RabbitMQ 和 S3 兼容存储,启动时必须提供DOMAIN_NAME、DATABASE_URL、REDIS_URL、AMQP_URL、AWS_REGION、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_S3_BUCKET_NAME等环境变量,否则 start.sh 会在check_required_env阶段直接报错退出。
GUNICORN_WORKERS 的生效链路
先看这个变量在容器里是怎么被消费的,改动才有落点:
- variables.env 中定义了默认值
GUNICORN_WORKERS=1(注释为 "Gunicorn Workers")。 - 构建镜像时,build.sh 会把
variables.env复制为dist/plane.env,再COPY dist/plane.env /app/plane.env打进镜像。 - 容器启动时 start.sh 执行
export $(grep -v '^#' plane.env | xargs),把 plane.env 里的所有键(包括GUNICORN_WORKERS)导出为环境变量。 - supervisor.conf 中
[program:api]执行./bin/docker-entrypoint-api.sh,该脚本最后执行:
exec gunicorn -w "$GUNICORN_WORKERS" -k uvicorn.workers.UvicornWorker plane.asgi:application --bind 0.0.0.0:"${PORT:-8000}" --max-requests 1200 --max-requests-jitter 1000 --access-logfile -也就是说GUNICORN_WORKERS直接作为 gunicorn 的-w参数,只有api这一个程序用它;Worker、Beat、Live 等服务不受影响。命令里还固定了--max-requests 1200 --max-requests-jitter 1000(gunicorn 的工作进程回收上限与抖动值)和--access-logfile -(访问日志写到标准输出,由 Supervisor 落到日志文件)。
另外注意 docker-entrypoint-api.sh 在 exec gunicorn 之前会顺序执行wait_for_db、wait_for_migrations、register_instance、configure_instance、create_bucket、clear_cache、collectstatic,所以每次 api 程序启动(包括重启)都要先跑完这些初始化步骤,gunicorn 才真正起来。
方式一:构建镜像前修改默认值
如果你自己构建 AIO 镜像,在 variables.env 中修改:
# Gunicorn Workers GUNICORN_WORKERS=4然后按 README 的流程构建:
cd deployments/aio/community IMAGE_NAME=myplane-aio ./build.sh --release=v0.27.1build.sh会生成dist/plane.env并打印 docker build 命令,形如:
docker build -t myplane-aio \ -f $(pwd)/Dockerfile \ --build-arg PLANE_VERSION=v0.27.1 \ $(pwd)构建出的镜像中/app/plane.env就带着新值,容器启动后对所有 api 重启生效。
方式二:在已有容器中修改 /app/plane.env
如果容器已经在运行,实际生效的值在容器内的/app/plane.env(即构建期由 variables.env 生成的那份)。可以进入容器修改:
docker exec -it <容器名> sed -i 's|^GUNICORN_WORKERS=.*|GUNICORN_WORKERS=4|' /app/plane.env修改本身没有副作用,只是改一个环境文件。真正的影响来自重启 api 程序(副作用说明:会中断正在处理的 API 请求并重建 Gunicorn 工作进程,且脚本会重跑上面列出的初始化步骤,耗时取决于数据库与迁移状态):
docker exec -it <容器名> supervisorctl restart api改完/app/plane.env后,supervisorctl restart api会先按新值重新导出环境变量再启动 api 程序。若直接重启整个容器,start.sh 会重新执行export并读取 plane.env,新值同样生效。
查看服务日志确认结果
README 指明所有服务日志都在/app/logs/下:访问日志在/app/logs/access/,错误日志在/app/logs/error/。按 supervisor.conf 的定义,各服务对应的日志文件是:
- api:
/app/logs/access/api.log(stdout)、/app/logs/error/api.err.log(stderr) - worker:
/app/logs/access/worker.log、/app/logs/error/worker.err.log - beat:
/app/logs/access/beat.log、/app/logs/error/beat.err.log - live:
/app/logs/access/live.log、/app/logs/error/live.err.log - space:
/app/logs/access/space.log、/app/logs/error/space.err.log - proxy:
/app/logs/access/proxy.log、/app/logs/error/proxy.err.log - migrator:
/app/logs/access/migrator.log、/app/logs/error/migrator.err.log
查看 API 日志(容器名为示例占位,替换为你自己的名字):
docker exec -it <容器名> tail -n 100 /app/logs/access/api.log docker exec -it <容器名> tail -n 100 /app/logs/error/api.err.loggunicorn 的启动输出(含每个工作进程的 boot 记录)和 API 运行日志都会落在 api 的这两个文件里;因为 gunicorn 用--access-logfile -把访问日志打到 stdout,访问记录在api.log中。工作进程数是否按预期生效,可以在 api 日志中数 boot 记录的条数来核对。
需要长期保留日志时,README 推荐挂载卷把/app/logs映射到宿主机:
docker run --name plane-aio --rm -it \ -p 80:80 \ -v /宿主机日志目录:/app/logs \ -e DOMAIN_NAME=your-domain.com \ -e DATABASE_URL=postgresql://user:pass@host:port/database \ -e REDIS_URL=redis://host:port \ -e AMQP_URL=amqp://user:pass@host:port/vhost \ -e AWS_REGION=us-east-1 \ -e AWS_ACCESS_KEY_ID=your-access-key \ -e AWS_SECRET_ACCESS_KEY=your-secret-key \ -e AWS_S3_BUCKET_NAME=your-bucket \ makeplane/plane-aio-community:latest其中/宿主机日志目录是读者自行指定的宿主机路径,your-domain.com等为必填环境变量的占位值。
服务状态与排查要点
确认 api 程序是否在运行、有没有崩溃重启,用 README 给出的检查命令:
docker exec -it <容器名> supervisorctl status结合 supervisor.conf 的配置可以这样判断:api 程序autorestart=true,进程异常退出后 Supervisor 会自动拉起;如果status里 api 长时间处于非 RUNNING 状态,或日志里反复出现重启,再回看/app/logs/error/api.err.log定位报错。stderr_logfile_maxbytes=50MB、stderr_logfile_backups=5表示错误日志滚动保留,排查历史问题时可以检查.1等滚动文件。
README 列出的常见故障也对应到具体依赖:数据库连接失败检查 PostgreSQL 可达性与凭据,Redis 连接失败检查服务与 URL,文件上传问题检查 S3 凭据和 bucket 权限。
最后一点边界:GUNICORN_WORKERS只作用于 api 程序的 Gunicorn 进程,不改变 Caddy 代理、Live Server 或 Celery worker 的行为;worker 数调大后 API 侧内存占用会相应上升,README 的生产建议中也提到要监控资源用量并按需调整。
【免费下载链接】plane🔥🔥🔥 Open-source Jira, Linear, Monday, and ClickUp alternative. Plane is a modern project management platform to manage tasks, sprints, docs, and triage.项目地址: https://gitcode.com/GitHub_Trending/pl/plane
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考