跳转到内容

Actual软件搭建

搭建过的服务器配置:

Terminal window
Operating System: Ubuntu 24.04 LTS
Kernel: Linux 6.8.0-40-generic
Architecture: x86-64

https://cloud.tencent.com/document/product/1207/45596?from=console_document_search

https://www.actualbudget.com/docs/install/docker

不配置证书会出现报错,也可以强制访问,但是可能会出现问题,详细信息:https://www.actualbudget.com/docs/troubleshooting/shared-array-buffer/

根据域名提供商进行配置。 Actual 中的证书配置查看:https://www.actualbudget.com/docs/config/https/

没有域名可以使用免费的反向代理。 配置参考:https://www.actualbudget.com/docs/config/reverse-proxies/

可能会存在一些防火墙之类的不常见网络问题,造成反向代理提供的域名无法使用,所以可以通过本地自签名,然后使用SSH将服务器端口映射到本地进行访问。

服务器如果有公网IP,然后只开启了反向代理,是可以通过http+IP的方式进行访问的,但是Actual会报错。

https://github.com/FiloSottile/mkcert

然后直接使用 https://IP:5006 的方式访问。

安装

Terminal window
apt install libnss3-tools
apt install mkcert

创建文件

Terminal window
vim openssl.cnf
Terminal window
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
x509_extensions = v3_ca
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = AU
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
organizationName = Organization Name (eg, company)
organizationalUnitName = Organizational Unit Name (eg, section)
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = localhost
[ req_ext ]
subjectAltName = @alt_names
[ v3_ca ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = localhost

生成证书

Terminal window
mkcert localhost

拆分出证书和key

Terminal window
awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' localhost.pem > selfhost.crt
awk '/-----BEGIN PRIVATE KEY-----/,/-----END PRIVATE KEY-----/' localhost-key.pem > selfhost.key

使用 Let’s Encrypt 签发免费的 IP 地址证书

Section titled “使用 Let’s Encrypt 签发免费的 IP 地址证书”

参考:https://www.appinn.com/letsencrypt-issue-ip-ssl-certificates/

这个是最终方案

acme.sh 是著名的自动化证书签发程序,支持 Let’s Encrypt、ZeroSSL 等不同的证书提供商。

Terminal window
curl https://get.acme.sh | sh -s email=my@example.com

如果安装过,那么升级方式:./acme.sh upgrade

使用独立方式,独立方式是服务器中本身没有 Web 服务,acme.sh 会自己运行一个 Web 服务来进行验证(myIP换成IP):

Terminal window
./.acme.sh/acme.sh --issue --server letsencrypt -d 64.23.194.105 --certificate-profile shortlived --days 3 --standalone

命令具体解析如下:

Terminal window
./acme.sh:执行 acme.sh 脚本。
--issue:申请一个新证书。
--server letsencrypt:使用 Let’s Encrypt 服务器。
-d 64.23.194.105:证书申请的目标是 IP 地址 64.23.194.105(该IP用于测试,已被删除)
--certificate-profile shortlived:申请一个短期证书(最长90天?)。
--days 3:证书的有效期是 3 天。
--standalone:使用 standalone 模式验证,不依赖现有的 Web 服务器。(需要80/443端口)

生成的证书默认保存在 /root/.acme.sh/64.23.194.105_ecc/ 路径下,你要使用的是:

Terminal window
/root/.acme.sh/64.23.194.105_ecc/64.23.194.105.key (私钥)
/root/.acme.sh/64.23.194.105_ecc/fullchain.cer (完整证书链)

将密钥的文件名称修改,data目录是本地目录/root/actual挂载在docker中的目录,所以将证书文件放在/root/actual目录下,但是config.json中要写data目录。

Terminal window
root@VM-8-10-ubuntu:~# cat /root/actual/config.json
{
"https": {
"key": "/data/64.23.194.105.key",
"cert": "/data/fullchain.cer"
}
}

crontab -e

Terminal window
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

每 2 天上午 03:00 运行一次

Terminal window
0 3 */2 * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh; sleep 60; [ -s /root/.acme.sh/64.23.194.105_ecc/64.23.194.105.key ] && [ -s /root/.acme.sh/64.23.194.105_ecc/fullchain.cer ] && cp /root/.acme.sh/64.23.194.105_ecc/64.23.194.105.key /root/actual/64.23.194.105.key && cp /root/.acme.sh/64.23.194.105_ecc/fullchain.cer /root/actual/fullchain.cer && ( docker ps -a --format '{{.Names}}' | grep -qx my_actual_budget && docker stop my_actual_budget >/dev/null 2>&1 && docker rm my_actual_budget >/dev/null 2>&1 || true ) && docker run --pull=always --restart=unless-stopped -d -p 5006:5006 -v /root/actual:/data --name my_actual_budget actualbudget/actual-server:latest

创建 SSH Key

Terminal window
ssh-keygen -t rsa

设置 Kye 公钥

Terminal window
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

示例:将本地端口 8080 映射到远程服务器的端口 80,并在后台运行

Section titled “示例:将本地端口 8080 映射到远程服务器的端口 80,并在后台运行”
Terminal window
ssh -f -N -L 8080:远程服务器IP:80 用户名@远程服务器IP -i key.pem

/root/actual为本地映射路径

Terminal window
docker stop my_actual_budget && docker container rm my_actual_budget && docker run --pull=always --restart=unless-stopped -d -p 5006:5006 -v /root/actual:/data --name my_actual_budget actualbudget/actual-server:latest