跳到主要内容

自托管

本文说明如何在自有服务器上使用 Docker Compose 部署 Beancount-Trans,使数据与运行环境完全由您掌控。适合熟悉 Linux 与 Docker 的读者。

Compose 架构一览

主栈使用预构建镜像 dhr2333/beancount-trans-frontend:latestdhr2333/beancount-trans-backend:latest,由下列服务组成:

服务镜像要点作用
beancount-trans-frontend前端 Nginx对外映射 38001→80;静态前端根路径 /;将 /admin/api 反代至后端(与前端仓库 conf/nginx.conf 一致)
beancount-trans-backend后端 Django启动时执行 migratedocker_start.sh;挂载 ./Beancount-Trans-Backend/Assets 与命名卷 collectstatic(与前端共享 Django 静态资源)
worker同后端镜像Celery Worker:账单解析等异步任务
beancount-trans-beat同后端镜像Celery Beat:定时任务(如过期解析确认、Fava 容器清理等),调度器为 django_celery_beat.schedulers:DatabaseScheduler
beancount-trans-postgrespostgres:18.3-alpine数据库;宿主机 65432→5432
beancount-trans-redisredis:8.6.1-alpine缓存与 Celery broker;requirepass.envTRANS_REDIS_PASSWORD 提供;默认不映射宿主机端口
beancount-trans-miniominio/minio对象存储;39000(S3 API)、39001(控制台)
beancount-trans-minio-initminio/mc一次性初始化:创建存储桶后退出
beancount-trans-fava-admindhr2333/beancount-trans-assets:latest静态 Fava 示例(admin);多用户时的增删改见 「新增用户」

先决条件

项目要求检查命令
操作系统建议使用主流 Linux 发行版cat /etc/os-release
DockerDocker Engine ≥ 20.10docker --version
Docker ComposeCompose 插件 v2+docker compose version
硬件建议 ≥ 2 核 CPU、4GB 内存、20GB 磁盘(含镜像与数据卷)free -hdf -h
网络可拉取镜像;对外访问需放行端口(默认 Web 38001 等)
未安装 Docker?

请优先按 Docker 官方文档安装(不同发行版步骤不同):

安装后执行:

docker --version

docker compose version

最短路径:启动一套可访问的环境

1. 获取代码与子模块

主仓库通过子模块挂载后端资源目录(Compose 中的 ./Beancount-Trans-Backend/Assets)。至少初始化后端子模块,否则宿主机目录不完整:

git clone https://github.com/dhr2333/Beancount-Trans.git
cd Beancount-Trans
git submodule update --init Beancount-Trans-Backend

若您需要完整开发目录,可改为:

git submodule update --init --recursive

2. 下载预训练模型

当前目录为仓库根目录(含 docker-compose.yaml)。预置镜像不含权重,需本机拉取到固定路径。

git clone https://huggingface.co/google-bert/bert-base-chinese ./Beancount-Trans-Backend/pretrained_models/bert-base-chinese

3. 准备环境变量文件

Compose 使用根目录下的 .env

cp .env.example .env

自托管部署可暂用示例值,但建议继续阅读 「生产与安全」 章节,修改密钥与访问控制。

4. 启动服务

在仓库根目录(存在 docker-compose.yaml 的目录)执行:

docker compose up # 添加 -d 参数后台运行

首次启动会拉取镜像并创建命名数据卷(PostgreSQL、Redis、MinIO 等),数据默认持久保存在 Docker 卷中

5. 初始化

请在首次部署(或 docker compose down -v 清库后)手动初始化:

docker compose exec beancount-trans-backend python manage.py init_official_templates

若执行 docker compose down -v 会删除卷内数据,请谨慎使用 -v

6. 访问

your-server-ip 换为服务器 IP 或域名:

  • Web 应用http://your-server-ip:38001
  • 后台管理http://your-server-ip:38001/admin
  • API 文档http://your-server-ip:38001/api/docs

默认登录账户:用户名 admin,密码 123456(生产环境首次登录后建议立即修改密码)。

生产与安全

修改 .env 中的敏感项

务必替换或强化至少以下项。完整 环境变量参考

  • DJANGO_SECRET_KEY:随机长字符串(示例中有生成命令)。
  • DJANGO_DEBUG=False:关闭调试;并按注释配置 DJANGO_ALLOWED_HOSTSCSRF_TRUSTED_ORIGINSCORS_ALLOWED_ORIGINS,以便从域名或其它设备访问。
  • TRANS_POSTGRESQL_PASSWORDTRANS_REDIS_PASSWORDMINIO_ACCESS_KEYMINIO_SECRET_KEY:不要使用默认弱口令。

自托管无短信时的登录策略

.env.example 建议:将 PHONE_BINDING_REQUIRED=FalseSMS_ENABLED=False,以便使用用户名/邮箱与密码登录;验证码邮件可配置 SMTP,不配置时验证码会输出到后端日志(见 .env.example 中邮箱一节)。

数据保存在哪里

  • 数据库 / Redis / MinIO:由 Compose 中定义的 命名卷 持久化(卷名以 beancount-trans- 为前缀,见 docker-compose.yaml 底部 volumes)。
  • 用户解析产物与账本文件:宿主机目录 ./Beancount-Trans-Backend/Assets(与容器内 Django 资源路径一致),请纳入备份策略

新增用户

自托管默认只有 admin。需多人共用时,在 Django 管理后台 创建普通用户即可:

  1. 浏览器打开 http://your-server-ip:38001/admin,使用 admin 或您已有的超级用户登录。
  2. 进入 用户(Users)增加用户,设置用户名与密码。

若需要再增加一名超级用户(可登录 /admin),可在宿主机执行:

docker compose exec beancount-trans-backend python manage.py createsuperuser

新用户若要在平台内打开 Fava 账本报表,在建户后还须完成下面几步:

  1. 编辑 docker-compose.yaml:复制现有 Fava 服务块(可参考 beancount-trans-fava-admin),将 admin 改为新用户的用户名,并修改 container_nameportsvolumes,使挂载为 ./Beancount-Trans-Backend/Assets/<用户名>:/Assets
  2. 编辑 .env:在 FAVA_STATIC_USER_MAP 中增加一项,与后端解析一致(一般为 用户名;存在 Git 时也可能用 repo_name),为浏览器能打开的完整 URL(如 http://宿主机IP:5002)。

常用运维命令

# 停止(不删除卷)
docker compose down

# 后台启动
docker compose up -d

# 首次部署(或 down -v 后)手动初始化
docker compose exec beancount-trans-backend python manage.py init_official_templates

# 重启某一服务
docker compose restart beancount-trans-backend

# 查看日志
docker compose logs -f
docker compose logs -f beancount-trans-backend

故障排除

容器反复重启或无法连接数据库
查看后端与数据库日志:docker compose logs beancount-trans-backend。常见原因包括 .env 中数据库主机名/密码与 Postgres 服务不一致、卷权限异常等。

复用自有 PostgreSQL

  1. 在自有实例上创建 beancount-trans 空库。
  2. .envTRANS_POSTGRESQL_HOSTTRANS_POSTGRESQL_PORTTRANS_POSTGRESQL_DATABASETRANS_POSTGRESQL_USERTRANS_POSTGRESQL_PASSWORD 指向该实例(HOST 须为容器内可解析且可连通的地址)。
  3. docker-compose.yaml:删除或注释 beancount-trans-postgres;在 beancount-trans-backendworkerbeancount-trans-beat 上移除对 beancount-trans-postgresdepends_on
  4. docker compose up -d 重启栈;首次启动仍会执行 migrate 建表。

部署流程一览

下一步

  • HTTP API(线上)Beancount-Trans API;自托管:http://<主机>:38001/api/docs/(端口随映射而定)。
  • 源码与问题反馈Beancount-Trans 主仓库及 Issues
  • 环境变量说明:请参考 参考 章节。