Baby Buddy 常用 CLI 命令详解
Baby Buddy v2.11.0 命令行运维手册:manage.py 全量 46 个子命令分类速查,fake/drf_create_token/dumpdata/loaddata/axes_reset/pg_dump 备份恢复与 API 实战全部真机实测。
Baby Buddy 常用 CLI 命令详解
本文全部命令与回显来自 v2.11.0 真机实测。部署环境与进程托管见 《Baby Buddy 安装部署指南(Ubuntu 22.04 直装实录)》,参数含义见 《Baby Buddy 配置参数详解》。
一、运行身份与命令入口
manage.py 必须以应用属主执行。服务账户 shell 是 nologin,直接 su babybuddy -c 会被拒绝,统一用显式 shell 的写法(实测报错与正确姿势):
su babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py help" # ✗
实测回显:
This account is currently not available.
su -s /bin/bash babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py help" # ✓
为省事可在 /usr/local/bin/bb 放一个包装脚本:
#!/bin/bash
exec su -s /bin/bash babybuddy -c "cd /opt/babybuddy/app && venv/bin/python manage.py $*"
二、全量子命令分类速查
manage.py help 实测共 46 个子命令,按来源分类(v2.11.0 实测清单):
| 分类 | 命令 |
|---|---|
| Baby Buddy 自带(babybuddy/management/commands/) | createuser、fake、reset、migrate(覆盖版) |
| axes 登录防护(django-axes 7.1) | axes_list_attempts、axes_reset、axes_reset_failure_logs、axes_reset_ip、axes_reset_ip_username、axes_reset_logs、axes_reset_username |
| 数据导入导出(django-import-export 4.4) | export、import |
| API(DRF 3.18) | drf_create_token、generateschema |
| Django 核心·数据 | dumpdata、loaddata、flush、dbshell、inspectdb、sqlflush、sqlmigrate、sqlsequencereset、squashmigrations、optimizemigration、remove_stale_contenttypes |
| Django 核心·迁移 | makemigrations、migrate、showmigrations |
| Django 核心·账户 | changepassword、createsuperuser |
| Django 核心·工程 | check、shell、diffsettings、runserver、test、testserver、startapp、startproject、findstatic、collectstatic |
| Django 核心·i18n/杂项 | compilemessages、makemessages、clearsessions、sendtestemail、createcachetable |
| 图片(django-imagekit) | generateimages |
官方
gulp里还有 collectstatic/migrate/fake 等「管道任务」,本质是 spawnpipenv run python manage.py ...,直装环境直接用 manage.py 即可。
三、Baby Buddy 自带命令实测
3.1 createuser——带分组的用户创建
比 createsuperuser 多了角色参数(--caregiver / --read-only,实查源码 add_arguments)。创建照护者账号:
bb createuser --username nurse1 --email nurse1@example.com --caregiver
实测回显(交互输入密码后):
User "nurse1" created successfully.
3.2 fake——一键生成演示数据
开发/演示利器:随机生成儿童、喂养、睡眠、换尿布、体重身高全套记录。
bb fake
实测回显:
Successfully added fake data.
生成量实测:2 个儿童(随机英文名)、161 条睡眠记录等。生产库慎用——没有参数撤销,只能 flush。
3.3 export——资源级 CSV 导出
基于 django-import-export,格式为 export <format> <resource>,resource 用 app.Model 全名(实测写 children 报 CommandError: Cannot import 'children' as a resource class or model.):
bb export csv core.Child
实测回显(直接打 stdout):
2,Emily,Nguyen,2026-09-27,,emily-nguyen,
1,Xiaoxin,Nohara,2025-06-01,,xiaoxin-nohara,
支持 format:csv/json/yaml/tsv 等 import_export 全集;import 命令与之对偶,用于回灌。
3.4 reset——危险命令
清空所有业务数据(保留用户与组),二次确认交互。等价于界面 Settings 里的 "Delete all data"。生产执行前先做第四节备份。
3.5 generateschema——导出 OpenAPI
bb generateschema > /tmp/schema.yml && wc -l /tmp/schema.yml
实测回显:
640 /tmp/schema.yml
导出 OpenAPI 3 文档可直接导入 Postman/Apifox,配合界面 /api/schema 在线版使用。
3.6 generateimages——媒体缩略图重建
系统升级或手动替换图片后重建缩略图缓存,无参数直接跑:
bb generateimages
实测回显(无图片媒体时):
0 images generated
四、登录防护与账号命令实测
4.1 锁定与解锁闭环(axes)
连续 5 次密码错误后(AXES_FAILURE_LIMIT=5),正确密码也被拒,HTTP 429。查看失败记录:
bb axes_list_attempts --username admin
实测回显(锁定中):
admin | 172.16.11.1 | 2026-10-28 04:09:xx | username password
立即解锁:
bb axes_reset_username admin
实测回显:
1 attempts removed.
解锁后登录恢复正常(实测 login POST 302)。其余变体:axes_reset_ip <ip>(按 IP)、axes_reset(全量)、axes_reset_failure_logs --age 7(清理 7 天前失败日志)。
4.2 changepassword / createsuperuser
bb changepassword admin # 交互式改密
bb createsuperuser --noinput --username admin2 --email a@e.com # 密码经 DJANGO_SUPERUSER_PASSWORD 传入
重复创建同名用户实测报错:
CommandError: Error: That username is already taken.
五、数据备份与恢复(双通道实测)
5.1 通道一:Django dumpdata / loaddata(跨数据库可移植)
bb dumpdata --natural-foreign --natural-primary \
-e contenttypes -e auth.Permission -e authtoken -e admin.logentry -e axes \
--indent 2 -o /opt/backups/babybuddy-export.json
实测回显:无输出即成功,文件 2.29 MB(含 9236 个对象)。
-e authtoken排除 API token(敏感);恢复后 token 需重新签发(见 5.4)。
恢复演练——先清库再回灌:
bb flush --noinput
bb loaddata /opt/backups/babybuddy-export.json
实测回显:
Installed 9236 object(s) from 1 fixture(s)
数据完整性验证:
bb shell -c "from django.contrib.auth.models import User; from core.models import Child; print('users:', User.objects.count(), 'children:', Child.objects.count())"
实测回显:
users: 1 children: 2
5.2 通道二:pg_dump / psql(库级完整备份)
mkdir -p /var/backups/babybuddy && chown postgres:postgres /var/backups/babybuddy
su postgres -c "pg_dump babybuddy > /var/backups/babybuddy/babybuddy-pg.sql"
ls -la /var/backups/babybuddy/
实测回显:
-rw-rw-r-- 1 postgres postgres 598899 Oct 28 04:11 babybuddy-pg.sql
文件头自证:
--
-- PostgreSQL database dump
--
-- Dumped from database version 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1)
-- Dumped by pg_dump version 14.24 (Ubuntu 14.24-0ubuntu0.22.04.1)
恢复(目标库需已存在或先 createdb):
su postgres -c "psql babybuddy < /var/backups/babybuddy/babybuddy-pg.sql"
5.3 双通道怎么选
| 场景 | 选谁 |
|---|---|
| 每日定时备份(crontab) | pg_dump(一致性好、含全部表结构与索引) |
| SQLite→PG 迁移 / 跨库搬家 | dumpdata(数据库无关) |
| 只导业务数据给别的实例 | export csv / dumpdata + -e 排除 |
5.4 恢复后的三件事(实测清单)
- 重新签发 API token:
bb drf_create_token admin(flush 会清掉 authtoken 表); - 检查会话:
bb clearsessions(过期会话表清理); systemctl restart babybuddy后用浏览器登录验证仪表盘数据。
六、API Token 与 curl 实战
6.1 签发 token
bb drf_create_token admin
实测回显:
Generated token ddede6db18abb4a4224e3618763f8a727d5ce5aa for user admin
6.2 Token 调 API(无 Cookie、无 CSRF)
curl -s http://127.0.0.1:8147/api/children/ -H 'Authorization: Token ddede6db18abb4a4224e3618763f8a727d5ce5aa'
实测回显:
{"count":2,"next":null,"previous":null,"results":[{"id":2,"first_name":"Emily","last_name":"Nguyen","birth_date":"2026-09-27","birth_time":null,"slug":"emily-nguyen","picture":null},{"id":1,"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01","birth_time":null,"slug":"xiaoxin-nohara","picture":null}]}
带分页与过滤(limit=2 看睡眠记录,时间均为 UTC Z 结尾):
count: 161
2 2026-10-27T21:38:09.448202Z 2026-10-28T00:23:09.448202Z
2 2026-10-27T17:38:09.448202Z 2026-10-27T18:49:09.448202Z
6.3 写 API(创建儿童)
curl -s -X POST http://127.0.0.1:8147/api/children/ \
-H "Authorization: Token <token>" -H "Content-Type: application/json" \
-d '{"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01"}'
实测回显:
{"id":1,"first_name":"Xiaoxin","last_name":"Nohara","birth_date":"2025-06-01","birth_time":null,"slug":"xiaoxin-nohara","picture":null}
slug服务端自动生成(名-姓小写化),后续引用儿童都靠它。资源清单见 API root:/api/返回 bmi/changes/children/feedings/height/sleep/tags/timers/weight 等 17 组端点。
七、例行维护命令
| 命令 | 作用 | 频率 |
|---|---|---|
bb clearsessions | 清过期会话 | cron 每天 |
bb collectstatic --noinput | 升级后重建静态 | 每次升级 |
bb check | 配置健康检查 | 升级后 |
bb showmigrations core | tail | 核对迁移进度 | 升级后 |
pg_dump(5.2 节) | 库级备份 | cron 每天 |
collectstatic 实测回显(升级后重跑):
0 static files copied to '/opt/babybuddy/static', 183 unmodified, 446 post-processed.
sendtestemail(邮件链路自检,console 后端把邮件打到 stdout):
bb sendtestemail admin@example.com
实测回显(头几行):
Content-Type: text/plain; charset="utf-8"
Subject: Test email from babybuddy-server on 2026-10-28 04:10:16.822340+00:00
From: webmaster@localhost
To: admin@example.com
If you're reading this, it was successful.
八、cron 自动备份样例
# 每日 03:30 库级备份,保留 14 天
30 3 * * * postgres pg_dump babybuddy > /var/backups/babybuddy/babybuddy-$(date +\%F).sql
# 每日 04:00 清理会话
0 4 * * * babybuddy cd /opt/babybuddy/app && venv/bin/python manage.py clearsessions
媒体目录(儿童照片)单独 rsync:rsync -a /opt/babybuddy/app/media/ /var/backups/babybuddy/media/。