PieFed 1.8.10 常用 CLI 命令与工具详解

PieFed 1.8.10 CLI 全解:flask init-db/keys/reset-pwd/config_check/send-queue/daily-maintenance/spaceusage/lemmy-import/治理分析等 38 个子命令实测回显,daily.sh 等 cron 脚本族、supercronic 接线、psql/redis-cli 直查与运维组合场景。

PieFedPieFedFediverse论坛PythonDocker自托管2026/11/02

PieFed 1.8.10 常用 CLI 命令与工具详解

目标:以 PieFed 1.8.10 实测环境为基准,系统讲解其 CLI 体系——Flask 应用命令族(init-db / keys / reset-pwd / config_check / send-queue / daily-maintenance / spaceusage / populate_community_search / lemmy-import 等 38 个子命令)、官方维护脚本族(daily.sh / send_queue.sh / email_notifs.sh / remove_orphan_files.sh / deploy-docker2.sh / docker-dirs.sh)、supercronic 定时任务接线与数据库直查手段,全部命令给出实测回显与运维组合场景(演示账号 admin / q1w2e3r4)。

一、环境信息

  • PieFed:v1.8.10(Codeberg rimu/pyfedi),应用目录 /app(即仓库根),命令入口为 Flask CLI:export FLASK_APP=pyfedi.py 后执行 flask <命令>
  • 运行时:Python 3.13 + Flask + Gunicorn 26.2.0 + Celery;数据库 PostgreSQL 17、队列/缓存 Redis 6.2
  • 实测宿主:Ubuntu 24.04.5 LTS + Docker 29.9.2 + Compose v5.6.1,实例 127.0.0.1:8129
  • 命令实现源码:app/cli.py(register(app) 注册全部子命令,实测 38 个)
  • 进入应用环境执行命令的标准方式:docker exec -it piefed_app1 sh(官方 INSTALL-docker.md 口径;容器名以实际编排为准)

站内配套:《PieFed 1.8.10 介绍与选型指南》、《PieFed 1.8.10 Docker Compose 部署指南》、《PieFed 1.8.10 配置参数详解》。

二、工具概览

PieFed 的运维面 = 一套 Flask CLI + 四个 cron 包装脚本 + 两个部署脚本 + 内置 supercronic:

工具定位频率
flask init-db建库(Site/Instance/角色/封禁表/cron 心跳)+ 交互建管理员一次性
flask db upgradeAlembic 迁移每次升级
flask config_check配置健康自检改配置后
flask send-queue消费出站联邦队列每分钟(联邦生命线)
flask daily-maintenance每日维护(排行/清理/统计)每日
flask email_notifs 三件套通知补发/退信/清理旧活动每 6 小时
flask remove_orphan_files孤儿媒体清理每周
daily.sh 等四脚本上述命令的 cron 包装见 cron
deploy-docker2.sh升级一条龙(down→pull→up --build)升级时
supercronic(CRON=true)应用内定时自动

flask --help 实测全量清单(Commands 段原文照抄):

Commands:
  admin-keys
  archive-old-posts
  clean_up_old_activities
  config_check                 Perform basic sanity checks on site...
  daily-maintenance
  daily-maintenance-celery     Schedule daily maintenance tasks via...
  db                           Perform database migrations.
  detect_vote_manipulation
  init-db
  keys
  lemmy-import                 Import data from a Lemmy database.
  limiter                      Flask-Limiter maintenance & utility commands
  migrate_community_notifs
  migrate_post_notifs
  move-files-to-s3
  move-more-post-images-to-s3
  move-post-images-to-s3
  openapi                      OpenAPI commands.
  populate_community_search
  populate_post_reply_for_api
  process_email_bounces
  publish-scheduled-posts
  remove-unnecessary-images
  remove_orphan_files          Any user-uploaded file that does not have...
  reopen
  reset-pwd
  routes                       Show the routes for the app.
  rss-feeds
  run                          Run a development server.
  send-batched-activities
  send-queue
  send_missed_notifs
  shell                        Run a shell in the app context.
  spaceusage
  testing
  translate                    Translation and localization commands.
  voting_clusters              Find groups of accounts that vote on the...

三、前置条件

  1. 应用环境内执行(docker exec -it piefed_app1 sh),且 export FLASK_APP=pyfedi.py(官方指南同口径;入口脚本已内置该导出)。
  2. 数据库/Redis 在线(多数命令带 app_context,DB 不可达直接抛栈)。
  3. 写操作命令(init-db/reset-pwd/admin-keys)会改数据,先备份 pgdata。

四、命令族详解(实测回显)

4.1 init-db:建库与管理员

两种形态(B2 排障 10.2 有自动化方案):

flask init-db                # 官方标准:交互输入用户名/邮箱/口令(口令需 TTY)
flask init-db --interactive no   # 纯自动化:跳过建管理员

实测 --interactive no 尾部回显:

Added banned instance lemmychan.org
Manage banned instances at /admin/federation.
Initial setup is finished.

要点:前置校验 alembic 表(未迁移会提示先 flask db upgrade)与 UTF8 库编码(非 UTF8 直接拒绝并给出重建库四步指引);落库内容含本地 Instance、Site、Admin 角色权限、29 条起步封禁域名、No-QAnon 名单与 6 项 cron 心跳记录。管理员口令规则:≥8 位、用户名不得含 @ 与空格(官方建议不要用 admin,本篇演示环境例外)。

4.2 keys / admin-keys / reset-pwd:密钥与口令

flask keys          # 生成并打印 RSA 密钥对(联邦签名用,排查 actor 签名问题)
flask admin-keys    # 重新生成并写回 user id=1(管理员密钥损坏救急)
flask reset-pwd     # 交互重置 user id=1 口令:"New password for user ID 1: "

flask keys 实测输出 PEM 私钥+公钥(首行 -----BEGIN PRIVATE KEY-----)。reset-pwd 同样走 input(),非 TTY 需按 B2 10.2 方式喂入。

4.3 db:Alembic 迁移族

flask db upgrade 为启动入口自动执行(实测日志 Running upgrade 26554a31c057 -> 7c5a293ed40c, nodeinfo indexes 直至 head);手工场景:flask db current 核对版本、flask db heads 看目标。实测 head 版本 7c5a293ed40c。

4.4 populate_community_search:社区数据集

拉 data.lemmyverse.net/community.full.json 过滤(≥50 帖且周活 ≥10、剔除封禁域名与坏名)后写 app/static/tmp/all_communities.json 与 all_sfw_communities.json,供后台"从 Lemmyverse 数据加载社区"使用;顺带拉 GitHub raw 的一次性邮箱表。出站受限时该命令会抛 httpx 超时(B2 排障 10.1 实录),它不是启动必要条件,可后补。

4.5 send-queue:联邦出站心跳

flask send-queue

实测空队列静默退出(exit 0)。源码逻辑(实测核对):Redis 锁 lock:send-queue(timeout 300s)防并发 → 检查 Redis 内存超 REDIS_MEMORY_LIMIT 则打印 Redis memory is quite full - stopping send queue to avoid making it worse. 并置 pause_federation 暂停 600s → 随机延迟 0-10s 错峰 → 逐条投递到期活动。每分钟一次是官方 cron 模板的硬要求,漏跑表现为远程实例看不到本站活动。

4.6 config_check:配置自检

flask config_check

实测完整输出(九段制):

PieFed Configuration Check
========================================
1. Checking required environment variables...
   ✅ SERVER_NAME is configured: 127.0.0.1:8129
   ✅ SECRET_KEY is configured
   ✅ DATABASE_URL is configured (PostgreSQL)
   ✅ MAIL_PORT is valid: 25
   ✅ DB_POOL_SIZE is valid: 10
   ✅ DB_MAX_OVERFLOW is valid: 30
   ✅ CACHE_REDIS_URL format is valid
   ✅ CELERY_BROKER_URL format is valid
2. Checking database connection...
   ✅ Database connection successful
3. Checking Redis connection...
   ✅ Redis connection successful
4. Checking directory write permissions...
   ✅ app/static/tmp is writable
   ✅ app/static/media is writable
   ✅ logs is writable
6. Checking cache configuration...
   ✅ Cache type: RedisCache
7. Checking S3 configuration...
   ℹ️  S3 not configured (local file storage will be used)
8. Checking ActivityPub configuration...
   ✅ Admin user configured
9. Checking database migration system...
   ✅ Database migration system is initialized
========================================
CONFIGURATION CHECK SUMMARY
========================================
⚠️  2 warning(s) found:
   ⚠️  Mail server not configured - email functionality will be disabled
   ⚠️  SERVER_NAME not properly configured for federation
⚠️  Configuration has warnings but should work.

官方口径:✅ 通过、⚠️ 可容忍、❌ 必须修复。

4.7 daily-maintenance:每日维护

flask daily-maintenance

实测回显尾部(逐项任务编号 + 完成时间戳):

21 2026-11-02 08:47:26.656166
22 2026-11-02 08:47:26.656276
Finished 2026-11-02 08:47:26.658107

一次跑完帖子热度/排行重算、过期投票清理、实例统计等任务;daily-maintenance-celery 是其投递 Celery 的异步版(大实例避免阻塞 cron 窗口)。

4.8 spaceusage / remove_orphan_files:存储治理

flask spaceusage

实测:新实例无用户文件时无输出属正常——源码仅对 filesize>0 且 num_content>0 的用户打印 CSV 行 id,"ap_id",filesize,num_content。

flask remove_orphan_files

扫 app/static/media/users 下无 File 表记录的文件直接删除,并写 cron 心跳(log_cron_task_to_db)。静默完成即成功。

4.9 lemmy-import:从 Lemmy 迁移

flask lemmy-import
# 交互输入源库连接串,实测校验提示:
# Connection should be something like "postgresql://lemmy:eeeee@127.0.0.1:5434/lemmy"

直连 Lemmy PostgreSQL 库导入用户/社区/帖子(要求 postgresql:// 前缀,先 SELECT 1 探活)。跨软件迁移主通道,大库建议停写执行。

4.10 治理分析族:voting_clusters / detect_vote_manipulation

  • flask detect_vote_manipulation:按投票配额与行为特征圈出操纵嫌疑账号。
  • flask voting_clusters:源码用泊松尾概率 + 极大团算法找协同投票簇(poisson_tail_log10/maximal_cliques),输出供 /admin 处置。治理类命令只读不改数据,可放心试跑。

4.11 其余命令速览

命令用途
send_missed_notifs / process_email_bounces / clean_up_old_activities邮件通知补发 / 退信处理 / 旧活动清理(email_notifs.sh 三连)
publish-scheduled-posts定时帖发布(配合 API 排期)
archive-old-posts执行 ARCHIVE_POSTS 归档
rss-feeds拉取社区订阅的 RSS 源发帖(需 RSS_FEEDS=1)
move-files-to-s3 / move-post-images-to-s3 / move-more-post-images-to-s3存量媒体分批迁 S3(配 C1 4.6 节开关)
migrate_community_notifs / migrate_post_notifs / populate_post_reply_for_api通知与 API 索引的旧数据回填
reopen重开实例(维护模式后恢复)
remove-unnecessary-images清理冗余中图(官方注释警告 2025-06 起移动端需要中图,勿随手跑)
translate init/update/compile <lang>pybabel 翻译工作流(新增语言包)
shell / routes / openapi / limiter / testingFlask 内置:应用上下文 REPL(B2 10.2 建号即用)、路由表、API 文档生成、限流维护、测试夹具

五、官方维护脚本族

四个 cron 包装脚本内容实测(均为 source venv/bin/activate + flask <命令> 两行式;应用环境内 activate 失败静默跳过、PATH 已含解释器,不影响执行):

# daily.sh        → flask daily-maintenance
# send_queue.sh   → flask send-queue
# email_notifs.sh → flask send_missed_notifs && flask process_email_bounces && flask clean_up_old_activities
# remove_orphan_files.sh → flask remove_orphan_files

接线二选一(B2 第八节):compose 加 CRON=true 启用内置 supercronic(docker.cron 实测四条:每日 02:05 daily、每分钟 send_queue、每 30 分 email_notifs、周一 04:05 orphan),或宿主 crontab 调 docker exec piefed_app1 bash -c "cd /app && ./xxx.sh"。

部署脚本:

./docker-dirs.sh      # 建 pgdata/media/logs/tmp 并授权(B2 4.4,root 需补 chown 1000)
./deploy-docker2.sh   # 升级:DOCKER_BUILDKIT=1 → compose down → git pull → compose up -d --build

六、数据库与队列直查手段

运维排障常需绕过应用直查(实测可用):

# 业务数据(db 服务内置 postgresql-client)
docker exec piefed-v1810-stack-db-1 psql -U piefed -d piefed -c "select name,post_count from community,post where post.community_id=community.id;"
  name   | post_count
---------+------------
 techops |          1

docker exec piefed-v1810-stack-db-1 psql -U piefed -d piefed -c "select count(*) from send_queue;"   # 出站积压
docker exec piefed-v1810-stack-db-1 psql -U piefed -d piefed -c "select version_num from alembic_version;"  # 迁移位

# 队列与联邦状态
docker exec piefed-v1810-stack-redis-1 redis-cli -n 1 llen celery          # Celery 积压
docker exec piefed-v1810-stack-redis-1 redis-cli get pause_federation      # 联邦暂停位(1=暂停中)

# Celery 健康(compose 内置 healthcheck 同款)
docker exec piefed_celery1 celery -A celery_worker_docker.celery inspect ping

# 联邦元数据
curl -s http://127.0.0.1:8129/nodeinfo/2.0.json

七、运维组合场景速查

场景命令序列
升级版本git checkout v1.8.11(示例)→ ./deploy-docker2.sh → flask config_check
忘记密码flask reset-pwd(TTY)→ 登录验证
联邦停摆排查redis-cli get pause_federation → psql -c "select count(*) from send_queue" → 手动 flask send-queue 观察输出 → 检查 cron 心跳表
换域名官方口径不可行(SERVER_NAME 变更=清库重来,见 B2 第三节)
迁对象存储配 S3 变量 → flask move-files-to-s3 → move-post-images-to-s3 → move-more-post-images-to-s3 分批
从 Lemmy 搬家停写 → flask lemmy-import 按提示连源库 → flask populate_community_search → flask daily-maintenance
治理巡查flask voting_clusters → flask detect_vote_manipulation → 面板处置

八、注意事项与 FAQ

  1. 所有 flask 命令都在应用目录/环境内执行,宿主直接跑会缺依赖;官方口径 docker exec -it piefed_app1 sh 进入后执行。
  2. 口令类交互依赖 TTY(init-db 的 pwinput、reset-pwd 的 input),CI/管道场景见 B2 10.2 两条实测方案。
  3. send-queue 的随机 0-10s 延迟是设计行为(全网实例同分钟起跑的错峰保护),脚本超时设置别小于 30s。
  4. remove-unnecessary-images 不要跑:源码注释明确 2025-06 起链接帖也需要中图,官方保留命令仅为历史兼容。
  5. cron 心跳有后台告警:init-db 写入的 6 项心跳(CronJobLog)超时未更新会在 /admin 提示"维护任务没在跑",比翻日志直观。
  6. celery 队列分工:celery,background,send 三队列(入口脚本 --queues 实测),只起 web 不起 celery 会导致图片处理与后台任务堆积。

九、参考链接

PieFed 1.8.10 常用 CLI 命令与工具详解 - Quzuo