1. 项目概述
Actual Budget 是一款开源的个人财务管理工具,它提供了比传统记账软件更专业的预算管理功能。作为一名长期使用电子表格管理财务的用户,我在尝试了市面上多款记账应用后,发现它们要么功能过于简单,要么隐私政策令人担忧。Actual 的本地部署方案完美解决了这两个痛点——既保留了专业级的预算追踪能力,又确保了财务数据完全掌握在自己手中。
这个项目的核心价值在于:通过将 Actual 部署在本地设备(如家用 NAS 或闲置电脑),配合安全的远程访问方案,实现随时随地管理财务的同时,避免将敏感数据托管在第三方服务器。我在实际部署过程中发现,虽然官方文档提供了基础指引,但针对国内网络环境和硬件配置的细节处理仍需特别注意,这也是本文重点分享的经验所在。
2. 环境准备与部署流程
2.1 硬件选择与系统配置
推荐使用 x86 架构的设备作为部署平台,实测在树莓派等 ARM 设备上运行会遇到编译依赖问题。我的部署环境是一台闲置的 Intel NUC(i3-7100U/8GB RAM),系统选择 Ubuntu Server 22.04 LTS。相比桌面版,服务器版本更节省资源,但需要熟悉基础命令行操作。
关键准备步骤:
- 更新系统基础环境:
sudo apt update && sudo apt upgrade -y sudo apt install -y curl git python3 make gcc g++ - 安装 Node.js 环境(Actual 要求 v16+):
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt install -y nodejs
注意:国内用户建议配置 npm 镜像源以加速后续安装:
npm config set registry https://registry.npmmirror.com
2.2 数据库部署
Actual 支持 SQLite(默认)和 PostgreSQL 两种数据库后端。对于个人用户,SQLite 完全够用且部署简单。如果需要多设备协同编辑,建议选择 PostgreSQL:
# PostgreSQL 安装 sudo apt install -y postgresql postgresql-contrib sudo -u postgres psql -c "CREATE USER actual WITH PASSWORD 'your_password';" sudo -u postgres psql -c "CREATE DATABASE actual OWNER actual;"2.3 Actual 服务安装
官方推荐通过 npm 直接安装:
npm install -g actual-server安装完成后创建服务配置文件/etc/systemd/system/actual.service:
[Unit] Description=Actual Budget Server After=network.target [Service] User=your_username WorkingDirectory=/home/your_username Environment="NODE_ENV=production" ExecStart=/usr/bin/actual-server --host 0.0.0.0 --port 5006 Restart=always [Install] WantedBy=multi-user.target启动服务并设置开机自启:
sudo systemctl daemon-reload sudo systemctl start actual sudo systemctl enable actual3. 安全远程访问方案
3.1 反向代理配置
直接暴露服务端口存在安全隐患,建议通过 Nginx 反向代理增加 HTTPS 支持:
安装 Nginx:
sudo apt install -y nginx配置
/etc/nginx/sites-available/actual:server { listen 443 ssl; server_name your_domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://localhost:5006; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }启用配置:
sudo ln -s /etc/nginx/sites-available/actual /etc/nginx/sites-enabled sudo nginx -t && sudo systemctl reload nginx
3.2 动态域名解析
对于家庭宽带用户,推荐使用 DDNS 服务解决动态 IP 问题。以阿里云解析为例:
创建脚本
/usr/local/bin/ddns_update.sh:#!/bin/bash CURRENT_IP=$(curl -s http://members.3322.org/dyndns/getip) ALIYUN_KEY="your_access_key" ALIYUN_SECRET="your_access_secret" DOMAIN="yourdomain.com" RR="@" curl -X POST "https://alidns.aliyuncs.com/" \ -d "Action=UpdateDomainRecord" \ -d "RecordId=your_record_id" \ -d "RR=$RR" \ -d "Type=A" \ -d "Value=$CURRENT_IP" \ -d "AccessKeyId=$ALIYUN_KEY" \ -d "Format=JSON" \ -d "SignatureMethod=HMAC-SHA1" \ -d "SignatureVersion=1.0"设置定时任务(每10分钟检查一次):
(crontab -l ; echo "*/10 * * * * /usr/local/bin/ddns_update.sh") | crontab -
4. 数据备份与迁移
4.1 自动化备份方案
财务数据无价,建议配置双重备份策略:
本地备份脚本
/usr/local/bin/actual_backup.sh:#!/bin/bash BACKUP_DIR="/mnt/backup/actual" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") # SQLite 备份 if [ -f "/home/actual/.actual-data/server-files/db.sqlite" ]; then sqlite3 /home/actual/.actual-data/server-files/db.sqlite ".backup '$BACKUP_DIR/db_$TIMESTAMP.sqlite'" fi # 配置文件备份 tar -czf "$BACKUP_DIR/config_$TIMESTAMP.tar.gz" /home/actual/.actual-data/server-files/{config.json,metadata.json}添加 Rclone 远程备份(以阿里云OSS为例):
rclone copy $BACKUP_DIR alioss:your-bucket/actual_backup --progress
4.2 跨设备数据同步
通过 Actual 的文件系统同步功能实现多终端访问:
- 在设置中启用 "File System Sync" 功能
- 配置同步目录为云存储挂载点(如 WebDAV 或 Syncthing 同步文件夹)
- 其他设备安装 Actual 客户端后,选择 "Sync with existing file" 即可实时同步
5. 常见问题排查
5.1 服务启动失败排查
现象:systemctl status actual显示服务异常
排查步骤:
- 查看完整日志:
journalctl -u actual -n 50 --no-pager - 常见错误及解决方案:
Error: listen EADDRINUSE→ 端口冲突,修改服务配置中的端口号Module not found→ 重新安装 npm 依赖:npm install -g actual-server- 数据库连接失败 → 检查
~/.actual-data/server-files/config.json中的数据库配置
5.2 客户端连接问题
现象:网页端能打开但无法连接本地服务器
解决方案:
- 检查服务器防火墙规则:
sudo ufw allow 5006/tcp - 验证客户端配置:
- 确保连接的服务器地址为
https://your_domain.com - 清除浏览器缓存后重试
- 确保连接的服务器地址为
- 如果使用移动网络访问,检查家庭宽带是否开启了IPv6(部分运营商存在兼容问题)
6. 高级配置技巧
6.1 预算模板定制
Actual 的强项在于灵活的预算规则系统。分享我的月度预算模板配置:
{ "categories": { "fixed": ["房租", "房贷", "保险"], "variable": ["餐饮", "交通", "娱乐"], "saving": ["应急基金", "旅行基金"] }, "rules": [ { "condition": "category = '餐饮' AND amount > 1500", "action": "alert", "message": "本月餐饮支出超标" } ] }6.2 报表自动化导出
通过脚本实现定期PDF报表生成:
#!/bin/bash CHROMIUM_PATH=/usr/bin/chromium-browser OUTPUT_DIR=/home/actual/reports $CHROMIUM_PATH --headless --disable-gpu --print-to-pdf="$OUTPUT_DIR/$(date +%Y-%m).pdf" \ "http://localhost:5006/reports/monthly?token=your_api_token"配合邮件发送脚本即可实现月度报表自动推送。
7. 移动端适配方案
虽然 Actual 没有官方移动应用,但通过PWA可以实现接近原生应用的体验:
- 在手机浏览器访问 Actual 网页
- 点击"添加到主屏幕"
- 配置
manifest.json增强PWA功能:{ "name": "Actual Budget", "short_name": "Actual", "start_url": "/", "display": "standalone", "icons": [ { "src": "icon-192.png", "type": "image/png", "sizes": "192x192" } ] }
实测在iOS和Android上均可实现离线记账功能,数据会在网络恢复时自动同步。