Taiga 6.10 运维命令手册:服务、备份与排障

Taiga 6.10 日常运维命令手册:systemd 服务管理、pg_dump 备份恢复、RabbitMQ 队列巡检、manage.py 高频命令、升级流程与七类排障手册。

TaigaTaigaLinuxUbuntu 22.04运维2026/10/28

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 单元进程监听职责
taigagunicorn(taiga.wsgi)0.0.0.0:8001REST API + Django Admin
taiga-asynccelery worker + beat无监听异步任务(通知、导出、timeline)
taiga-eventsnode(npm run start:production):8888(WS)、:3023(内部 HTTP)实时事件推送
taiga-protectedgunicorn(server:app)0.0.0.0:8003附件令牌校验
postgresqlPostgreSQL 14127.0.0.1:5432业务库 taiga
rabbitmq-serverRabbitMQ 3.9.27:5672、:25672、*:4369任务队列 + 事件总线
nginxNginx 1.180.0.0.0:80唯一对外入口
redis-serverRedis 6.0.16127.0.0.1:6379Taiga 默认不使用,预留给缓存扩展

实测端口快照:

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/journalsystemd 日志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 系列四篇完结:选型判断 → 安装落地 → 配置精讲 → 运维兜底。祝你的敏捷团队用得顺手。