Taiga 6.10 运维命令手册:服务、备份与排障
Taiga 6.10 日常运维命令手册:systemd 服务管理、pg_dump 备份恢复、RabbitMQ 队列巡检、manage.py 高频命令、升级流程与七类排障手册。
Taiga 6.10 运维命令手册:服务、备份与排障
Taiga 单机实例由「四个自研服务 + 四个基础服务」组成,日常运维的难点不在单个命令,而在分清「哪个动作动哪个服务、日志在哪里、验证看哪里」。本文是安装(《Ubuntu 22.04 安装 Taiga 6.10 指南》)与配置(《Taiga 6.10 配置详解:五份配置文件逐段精讲》)两篇的运维续篇,全部命令在 Ubuntu 22.04 / back 6.10.2 / front-dist 6.10.3 实测环境执行,回显逐行照抄。组件背景见《Taiga 认知与选型:开源敏捷项目管理平台全景》。
一、服务与端口清单
1.1 服务拓扑速查
| systemd 单元 | 进程 | 监听 | 职责 |
|---|---|---|---|
| taiga | gunicorn(taiga.wsgi) | 0.0.0.0:8001 | REST API + Django Admin |
| taiga-async | celery worker + beat | 无监听 | 异步任务(通知、导出、timeline) |
| taiga-events | node(npm run start:production) | :8888(WS)、:3023(内部 HTTP) | 实时事件推送 |
| taiga-protected | gunicorn(server:app) | 0.0.0.0:8003 | 附件令牌校验 |
| postgresql | PostgreSQL 14 | 127.0.0.1:5432 | 业务库 taiga |
| rabbitmq-server | RabbitMQ 3.9.27 | :5672、:25672、*:4369 | 任务队列 + 事件总线 |
| nginx | Nginx 1.18 | 0.0.0.0:80 | 唯一对外入口 |
| redis-server | Redis 6.0.16 | 127.0.0.1:6379 | Taiga 默认不使用,预留给缓存扩展 |
实测端口快照:
ss -ltn | grep -E ':80 |:5432|:5672 |:6379|:8001|:8003|:8888'
回显:
LISTEN 0 244 127.0.0.1:5432 0.0.0.0:*
LISTEN 0 128 0.0.0.0:25672 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 *:5672 *:*
LISTEN 0 2048 0.0.0.0:8001 0.0.0.0:*
LISTEN 0 2048 0.0.0.0:8003 0.0.0.0:*
LISTEN 0 511 *:8888 *:*
1.2 资源占用基线(空载实测)
for s in taiga taiga-async taiga-events taiga-protected; do
printf "%s " $s; systemctl show $s -p MemoryCurrent --value
done
回显(字节):
taiga 323252224
taiga-async 314060800
taiga-events 33329152
taiga-protected 55754752
即 308 / 299 / 32 / 53 MB。监控告警阈值建议在基线 ×2 处设线。
二、systemd 日常操作
systemctl status taiga # 看主服务状态(含最近日志)
systemctl restart taiga taiga-async taiga-events taiga-protected # 全量重启
systemctl stop taiga-async # 停异步(升级数据库结构前建议先停)
systemctl enable --now taiga # 开机自启 + 立即启动
一次真实的重启回显:
systemctl restart taiga && systemctl is-active taiga
active
journalctl -u taiga --no-pager -n 3
Oct 28 02:09:20 taiga-lab systemd[1]: Stopped taiga_back.
Oct 28 02:09:20 taiga-lab systemd[1]: taiga.service: Consumed 3.693s CPU time.
Oct 28 02:09:20 taiga-lab systemd[1]: Started taiga_back.
各单元日志全部走 journal:journalctl -u taiga-async -f 跟任务、-u taiga-events -f 跟 WebSocket、-u taiga-protected -f 跟附件。Nginx 访问/错误日志单独落在 /home/taiga/logs/nginx.access.log 与 nginx.error.log。
三、数据库运维
3.1 连接与巡检
PGPASSWORD=q1w2e3r4 psql -h 127.0.0.1 -U taiga -d taiga -t -c \
"SELECT count(*) FROM pg_tables WHERE schemaname='public';"
回显:
73
PGPASSWORD=q1w2e3r4 psql -h 127.0.0.1 -U taiga -d taiga -c "\dt" | head -8
回显(节选):
List of relations
Schema | Name | Type | Owner
--------+----------------------------+-------+----------
public | auth_token | table | taiga
public | badges_badge | table | taiga
public | custom_attributes_* | table | taiga
...
Taiga 表遵循 Django 习惯:users、projects_、userstories_、tasks_、issues_、wiki_、timeline_ 等前缀按域划分。
3.2 备份(pg_dump 自定义格式,实测)
mkdir -p ~/backups
PGPASSWORD=q1w2e3r4 pg_dump -h 127.0.0.1 -U taiga -d taiga -F c \
-f ~/backups/taiga-$(date +%Y%m%d).dump
ls -lh ~/backups/
pg_restore --list ~/backups/taiga-20261028.dump | grep -c 'TABLE DATA'
回显:
total 368K
-rw-r--r-- 1 taiga taiga 368K Oct 28 02:05 taiga-20261028.dump
73
空库 368KB;-F c 自定义格式支持并行恢复与选择性恢复。附件不在数据库里:/home/taiga/taiga-back/media/ 目录要单独纳入备份(rsync 或 tar)。
3.3 恢复
# 空库场景:先重建库
sudo -u postgres psql -c "CREATE DATABASE taiga2 OWNER taiga ENCODING 'utf8' TEMPLATE template0;"
PGPASSWORD=q1w2e3r4 pg_restore -h 127.0.0.1 -U taiga -d taiga2 --no-owner ~/backups/taiga-20261028.dump
以上为「命令 + 预期结果」:恢复成功时 pg_restore 无输出退出,表数据条数应仍为 73。对已有数据的库执行恢复前,先
DROP DATABASE或用--clean参数,并务必停掉 taiga 服务避免写入竞争。
3.4 建议的备份节奏
- 数据库:每日 pg_dump,保留 7~30 天;升级前手动加一份。
- 附件:每日 rsync /home/taiga/taiga-back/media/。
- 配置:五份配置文件纳管版本库或打包随备份走。
四、RabbitMQ 运维
sudo rabbitmqctl list_queues -p taiga name messages
回显:
Timeout: 60.0 seconds ...
Listing queues for vhost taiga ...
name messages
tasks 0
celery@taiga-lab.celery.pidbox 0
celeryev.f770886b-5c78-40db-a243-e81f09cdbb44 0
三个队列的语义:tasks 是 celery 主队列(堆积说明 worker 挂了或任务变慢)、pidbox 是 worker 远程控制通道、celeryev 是事件流。巡检口径:tasks 长期 >0 需查 taiga-async 日志。
sudo rabbitmqctl list_users # 用户核对
sudo rabbitmqctl list_vhosts # vhost 核对
sudo systemctl restart rabbitmq-server
注意:RabbitMQ 重启期间 taiga-back 的异步投递会失败重试,events 断连后前端会自动重连,一般无需人工干预。
五、manage.py 高频命令
所有命令在 /home/taiga/taiga-back 下、激活虚拟环境后执行,且带 DJANGO_SETTINGS_MODULE=settings.config 前缀:
cd ~/taiga-back && source .venv/bin/activate
# 查看数据(只读巡检)
DJANGO_SETTINGS_MODULE=settings.config python manage.py shell -c \
"from taiga.users.models import User; print([u.username for u in User.objects.all()])"
回显:
['admin', 'bitbucket-d9a6e36b7d474fc280ce97cc336f9c8d', 'github-29c45bcdb0504e32b0706fa860f8b7dc', 'gitlab-81f581fc7741458e98899dbab5dbe3dc', 'gogs-76800006845d4070a817ae9c99197ed2']
(除 admin 外为 initial_project_templates 灌入的模板内置用户,属正常现象。)
| 命令 | 用途 | 备注 |
|---|---|---|
python manage.py migrate --noinput | 应用数据库结构变更 | 升级后必跑 |
python manage.py createsuperuser | 建管理员 | 配 CELERY_ENABLED=False |
python manage.py collectstatic --noinput | 重建静态文件 | 升级后必跑,Nginx 直接读产物 |
python manage.py compilemessages | 编译翻译 | 升级后建议跑 |
python manage.py loaddata initial_project_templates | 载入项目模板 | 新装必跑 |
python manage.py sample_data | 灌入演示数据 | 仅评估环境用,实测会建演示项目 |
python manage.py dumpdata > backup.json | 导出全量 JSON | 备选备份方式 |
python manage.py shell | 交互式 shell | 排查数据问题 |
重置 admin 密码(交互式):
CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py changepassword admin
六、升级流程(小版本跟随 stable)
Taiga 源码部署的升级是「拉新代码 → 装依赖 → 迁移 → 重建静态 → 重启」五步,官方脚本参考口径如下(本文环境为 stable 分支浅克隆,步骤 1 实际执行时去掉 --depth 限制或重新 clone;命令本身为官方推荐写法,预期结果按官方文档标注):
# 0) 前置:备份数据库与附件(见第三节),并记录当前版本
cd ~/taiga-back && git describe --tags # 记录,如 6.10.2
# 1) 更新 back 代码与依赖
cd ~/taiga-back
sudo -u taiga git pull
source .venv/bin/activate
pip install -r requirements.txt # 有新依赖时会增量安装
# 2) 迁移数据库(先停异步防写入竞争)
sudo systemctl stop taiga-async
CELERY_ENABLED=False DJANGO_SETTINGS_MODULE=settings.config python manage.py migrate --noinput
DJANGO_SETTINGS_MODULE=settings.config python manage.py collectstatic --noinput
DJANGO_SETTINGS_MODULE=settings.config python manage.py compilemessages
# 3) 更新 front-dist(静态产物,无构建步骤)
cd ~/taiga-front-dist && sudo -u taiga git pull
# 注意:git pull 可能覆盖你本地改过的 dist/conf.json,先备份再合并
# 4) 更新 events / protected(同样 git pull + 装依赖)
cd ~/taiga-events && sudo -u taiga git pull && sudo -u taiga npm install
cd ~/taiga-protected && sudo -u taiga git pull \
&& sudo -u taiga bash -c 'source .venv/bin/activate && pip install -r requirements.txt'
# 5) 全量重启并验证
sudo systemctl restart taiga taiga-async taiga-events taiga-protected nginx
journalctl -u taiga -n 20 --no-pager # 确认无报错
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/api/v1/ # 期望 200
升级后用安装指南 10.1 节清单回归验证。Taiga 官方另有编排式部署方案承担同样的升级动作,多机或需要快速回滚时可以迁移过去。
七、排障手册
7.1 静态页 404 而 API 正常
最常见根因:/home/taiga 家目录 750 权限挡住 Nginx worker。证据链与修复见安装指南 9.2 节(nginx.error.log 出现 Permission denied → chmod 755 /home/taiga)。同类问题还包括 SELinux/AppArmor 拦截(Ubuntu 默认不启用,可先排除)。
7.2 服务起不来 / 反复重启
systemctl status taiga --no-pager -l
journalctl -u taiga -n 50 --no-pager
高频原因:config.py Python 语法错误(缩进、引号)、数据库连不上(PG 未起或密码错)、8001 端口被占。celery 单元额外注意 CELERY_BROKER_URL 指向的 vhost 必须存在。
7.3 看板不实时刷新(WebSocket 断)
journalctl -u taiga-events -n 30 --no-pager
检查顺序:events 服务是否 active → .env 的 SECRET 与 back 是否一致(鉴权失败,握手成功但消息被拒)→ RabbitMQ 是否可达 → Nginx 的 /events 是否带 Upgrade 头。快速验证握手:
curl -s -i --max-time 3 -H 'Connection: Upgrade' -H 'Upgrade: websocket' \
-H 'Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==' -H 'Sec-WebSocket-Version: 13' \
http://127.0.0.1/events | head -1
期望:
HTTP/1.1 101 Switching Protocols
7.4 任务不执行(邮件不发、导出无产物)
sudo rabbitmqctl list_queues -p taiga name messages # tasks 堆积?
journalctl -u taiga-async -n 50 --no-pager # worker 在消费吗?
tasks 堆积且 worker 日志无 received:celery 连不上 broker。worker 正常但任务失败:看日志里的 traceback,常见是 EMAIL 配置错误导致通知任务抛异常。
7.5 附件下载 404/403
先确认 /media/ 请求确实到了 protected(journalctl -u taiga-protected 有访问日志),再核对 protected 与 back 的密钥一致(配置详解 7.2 节);Nginx 的 /_protected/ 必须带 internal 且 alias 路径指向真实 media 目录。
7.6 磁盘增长点
| 位置 | 内容 | 处理 |
|---|---|---|
| /home/taiga/taiga-back/media/ | 用户上传附件 | 定期归档,扩容或外迁 |
| /var/log/journal | systemd 日志 | journalctl --vacuum-time=30d |
| /home/taiga/backups/ | 自建备份 | 轮转策略 |
| PostgreSQL | 数据与 WAL | 正常增长,监控即可 |
7.7 忘记 admin 密码
第五节的 changepassword;若连管理员账号都丢失,用 createsuperuser 另建一个,登录后到 Django Admin(/admin/)恢复原账号。
八、下线与重装
sudo systemctl disable --now taiga taiga-async taiga-events taiga-protected
sudo rm /etc/systemd/system/taiga*.service && sudo systemctl daemon-reload
sudo apt-get purge -y rabbitmq-server redis-server # 按需
sudo -u postgres psql -c "DROP DATABASE taiga;" && sudo -u postgres psql -c "DROP USER taiga;"
sudo rm -rf /home/taiga /etc/nginx/conf.d/taiga.conf
sudo systemctl restart nginx
重装即按安装指南从第二节重来,库与附件已随 /home/taiga 清除。
至此 Taiga 系列四篇完结:选型判断 → 安装落地 → 配置精讲 → 运维兜底。祝你的敏捷团队用得顺手。