From 2d4d1a7e2080730f200559b9c031f081a589e0b2 Mon Sep 17 00:00:00 2001 From: okxlin <61420215+okxlin@users.noreply.github.com> Date: Tue, 28 Jul 2026 20:34:54 +0800 Subject: [PATCH] feat: add Actual Budget app --- apps/actual-budget/26.7.0/.env.sample | 3 + apps/actual-budget/26.7.0/data.yml | 35 +++++++++++ apps/actual-budget/26.7.0/data/.gitkeep | 0 apps/actual-budget/26.7.0/docker-compose.yml | 31 ++++++++++ apps/actual-budget/26.7.0/scripts/init.sh | 55 ++++++++++++++++++ .../actual-budget/26.7.0/scripts/uninstall.sh | 2 + apps/actual-budget/26.7.0/scripts/upgrade.sh | 4 ++ apps/actual-budget/README.md | 53 +++++++++++++++++ apps/actual-budget/data.yml | 31 ++++++++++ apps/actual-budget/latest/.env.sample | 3 + apps/actual-budget/latest/data.yml | 35 +++++++++++ apps/actual-budget/latest/data/.gitkeep | 0 apps/actual-budget/latest/docker-compose.yml | 31 ++++++++++ apps/actual-budget/latest/scripts/init.sh | 55 ++++++++++++++++++ .../actual-budget/latest/scripts/uninstall.sh | 2 + apps/actual-budget/latest/scripts/upgrade.sh | 4 ++ apps/actual-budget/logo.png | Bin 0 -> 20037 bytes 17 files changed, 344 insertions(+) create mode 100644 apps/actual-budget/26.7.0/.env.sample create mode 100644 apps/actual-budget/26.7.0/data.yml create mode 100644 apps/actual-budget/26.7.0/data/.gitkeep create mode 100644 apps/actual-budget/26.7.0/docker-compose.yml create mode 100755 apps/actual-budget/26.7.0/scripts/init.sh create mode 100755 apps/actual-budget/26.7.0/scripts/uninstall.sh create mode 100755 apps/actual-budget/26.7.0/scripts/upgrade.sh create mode 100644 apps/actual-budget/README.md create mode 100644 apps/actual-budget/data.yml create mode 100644 apps/actual-budget/latest/.env.sample create mode 100644 apps/actual-budget/latest/data.yml create mode 100644 apps/actual-budget/latest/data/.gitkeep create mode 100644 apps/actual-budget/latest/docker-compose.yml create mode 100755 apps/actual-budget/latest/scripts/init.sh create mode 100755 apps/actual-budget/latest/scripts/uninstall.sh create mode 100755 apps/actual-budget/latest/scripts/upgrade.sh create mode 100644 apps/actual-budget/logo.png diff --git a/apps/actual-budget/26.7.0/.env.sample b/apps/actual-budget/26.7.0/.env.sample new file mode 100644 index 000000000..211261027 --- /dev/null +++ b/apps/actual-budget/26.7.0/.env.sample @@ -0,0 +1,3 @@ +PANEL_APP_PORT_HTTP=5006 +APP_DATA_DIR=./data +CONTAINER_NAME= diff --git a/apps/actual-budget/26.7.0/data.yml b/apps/actual-budget/26.7.0/data.yml new file mode 100644 index 000000000..5fa1df05a --- /dev/null +++ b/apps/actual-budget/26.7.0/data.yml @@ -0,0 +1,35 @@ +additionalProperties: + formFields: + - default: 5006 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-Hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: APP_DATA_DIR + labelEn: Data Directory + labelZh: 数据目录 + label: + en: Data Directory + zh: 数据目录 + zh-Hant: 資料目錄 + ja: データディレクトリ + ko: 데이터 디렉터리 + ru: Каталог данных + ms: Direktori Data + pt-br: Diretório de dados + required: true + type: text diff --git a/apps/actual-budget/26.7.0/data/.gitkeep b/apps/actual-budget/26.7.0/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/actual-budget/26.7.0/docker-compose.yml b/apps/actual-budget/26.7.0/docker-compose.yml new file mode 100644 index 000000000..2429279cc --- /dev/null +++ b/apps/actual-budget/26.7.0/docker-compose.yml @@ -0,0 +1,31 @@ +services: + actual-budget: + image: "actualbudget/actual-server:26.7.0@sha256:e18b7fbfec6157a368fad4146563f397502e9da70a120aeaeac63b4977405d1c" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + user: "1001:1001" + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:5006" + read_only: true + tmpfs: + - /tmp:size=64m,mode=1777 + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + volumes: + - "${APP_DATA_DIR}:/data" + healthcheck: + test: ["CMD-SHELL", "node scripts/health-check.js"] + interval: 60s + timeout: 10s + retries: 3 + start_period: 20s + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/actual-budget/26.7.0/scripts/init.sh b/apps/actual-budget/26.7.0/scripts/init.sh new file mode 100755 index 000000000..f53fbbc72 --- /dev/null +++ b/apps/actual-budget/26.7.0/scripts/init.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +read_env_value() { + local key="$1" + local value + + [[ -f "$ENV_FILE" ]] || return 0 + value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + printf '%s\n' "$value" +} + +raw="${APP_DATA_DIR:-}" +if [[ -z "$raw" ]]; then + raw="$(read_env_value APP_DATA_DIR)" +fi +raw="${raw:-./data}" + +[[ -n "$raw" ]] || { + printf 'APP_DATA_DIR must not be empty\n' >&2 + exit 1 +} +if [[ "$raw" = /* ]]; then + printf 'APP_DATA_DIR must be relative to the application version directory\n' >&2 + exit 1 +fi + +path="$(realpath -m -- "$ROOT_DIR/${raw#./}")" +case "$path" in + "$ROOT_DIR"/*) ;; + *) + printf 'APP_DATA_DIR must remain inside the application version directory\n' >&2 + exit 1 + ;; +esac + +install -d -m 0700 "$path" +path="$(realpath -e -- "$path")" +case "$path" in + "$ROOT_DIR"/*) ;; + *) + printf 'APP_DATA_DIR resolves outside the application version directory\n' >&2 + exit 1 + ;; +esac + +chmod 0700 "$path" +chown -R --no-dereference 1001:1001 "$path" diff --git a/apps/actual-budget/26.7.0/scripts/uninstall.sh b/apps/actual-budget/26.7.0/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/actual-budget/26.7.0/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/actual-budget/26.7.0/scripts/upgrade.sh b/apps/actual-budget/26.7.0/scripts/upgrade.sh new file mode 100755 index 000000000..692e341e2 --- /dev/null +++ b/apps/actual-budget/26.7.0/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +"$(dirname "$0")/init.sh" diff --git a/apps/actual-budget/README.md b/apps/actual-budget/README.md new file mode 100644 index 000000000..77927b1d9 --- /dev/null +++ b/apps/actual-budget/README.md @@ -0,0 +1,53 @@ +# Actual Budget + +## 产品介绍 + +Actual Budget 是隐私优先的开源个人财务应用,提供信封预算、账户与交易管理、规则、报表和多设备同步。 + +## 主要功能 + +- 信封预算与灵活预算管理 +- 账户、交易、分类、规则和报表 +- 预算导入导出、本地备份与多设备同步 + +## 访问说明 + +安装后通过 `http://<服务器 IP>:<端口>` 访问,实际端口以 `PANEL_APP_PORT_HTTP` 为准。首次打开时应立即设置服务器密码;在完成密码设置和反向代理 HTTPS 配置前,不要将端口暴露到不可信网络。 + +## 数据持久化 + +`APP_DATA_DIR` 保存服务器账户数据库、预算文件和同步数据。该路径必须位于应用版本目录内;初始化脚本会拒绝绝对路径、路径穿越和符号链接逃逸,并为上游容器用户 `1001:1001` 准备权限。卸载不会删除该目录,请定期独立备份。 + +## 安全与部署风险 + +- 容器以 UID/GID `1001:1001` 运行,丢弃全部 Linux capabilities,并启用只读根文件系统和 `no-new-privileges`。 +- 当前官方 `26.7.0` 镜像的新鲜 Trivy 扫描仍包含上游未修复漏洞。其中两份受 `CVE-2026-59873` 影响的 `node-tar` 分别属于 npm CLI 和仅由 `node-gyp` 导入的构建链;Actual 的运行时导入、备份和同步上传路径使用 `AdmZip` 或限长后原样存储,未调用 `node-tar`。该结论是默认运行路径例外,不代表镜像中不存在漏洞。 +- 如果在容器内手动运行 npm/node-gyp、增加执行外部命令的插件或改变官方入口,上述可达性结论将不再成立。镜像摘要变更时必须重新扫描。 + +## Introduction + +Actual Budget is a privacy-focused open-source personal finance app with envelope budgeting, account and transaction management, rules, reports, and multi-device synchronization. + +## Features + +- Envelope and flexible budgeting +- Accounts, transactions, categories, rules, and reports +- Budget import/export, local backups, and multi-device synchronization + +## Usage Notes + +- Access the service at `http://:` and set the server password immediately on first use. Do not expose it to an untrusted network before password setup and HTTPS reverse-proxy configuration are complete. +- `APP_DATA_DIR` stores the account database, budget files, and synchronization data. It must remain inside the application version directory and should be backed up independently. +- The container runs as UID/GID `1001:1001`, drops all Linux capabilities, and uses a read-only root filesystem plus `no-new-privileges`. + +## Security Note + +The current official image contains upstream vulnerabilities. Two `node-tar` copies affected by `CVE-2026-59873` belong to the npm CLI and the `node-gyp` build chain; Actual's runtime import, backup, and sync-upload paths use `AdmZip` or bounded opaque storage and do not invoke them. This is a default-path reachability exception, not a claim that the packages are absent. Running npm/node-gyp inside the container or replacing the official entrypoint invalidates the exception. + +## References + +- Project: +- Docker installation: +- Official Compose: +- License: (MIT) +- Security advisory: diff --git a/apps/actual-budget/data.yml b/apps/actual-budget/data.yml new file mode 100644 index 000000000..9109f6d6d --- /dev/null +++ b/apps/actual-budget/data.yml @@ -0,0 +1,31 @@ +name: Actual Budget +tags: + - 财务 +title: 隐私优先的开源个人财务应用 +description: 隐私优先的开源个人财务应用 +additionalProperties: + key: actual-budget + name: Actual Budget + tags: + - Tool + shortDescZh: 隐私优先的开源个人财务应用 + shortDescEn: Privacy-focused open-source personal finance app + description: + en: Privacy-focused open-source personal finance app + zh: 隐私优先的开源个人财务应用 + zh-Hant: 隱私優先的開源個人理財應用程式 + ja: プライバシー重視のオープンソース個人資産管理アプリ + ko: 개인정보 보호를 중시하는 오픈소스 개인 재무 앱 + ru: Конфиденциальное приложение с открытым кодом для личных финансов + ms: Aplikasi kewangan peribadi sumber terbuka yang mengutamakan privasi + pt-br: Aplicativo de finanças pessoais de código aberto com foco em privacidade + type: website + crossVersionUpdate: true + limit: 0 + recommend: 0 + website: https://actualbudget.org/ + github: https://github.com/actualbudget/actual + document: https://actualbudget.org/docs/install/docker/ + architectures: + - amd64 + - arm64 diff --git a/apps/actual-budget/latest/.env.sample b/apps/actual-budget/latest/.env.sample new file mode 100644 index 000000000..211261027 --- /dev/null +++ b/apps/actual-budget/latest/.env.sample @@ -0,0 +1,3 @@ +PANEL_APP_PORT_HTTP=5006 +APP_DATA_DIR=./data +CONTAINER_NAME= diff --git a/apps/actual-budget/latest/data.yml b/apps/actual-budget/latest/data.yml new file mode 100644 index 000000000..5fa1df05a --- /dev/null +++ b/apps/actual-budget/latest/data.yml @@ -0,0 +1,35 @@ +additionalProperties: + formFields: + - default: 5006 + edit: true + envKey: PANEL_APP_PORT_HTTP + labelEn: Port + labelZh: 端口 + label: + en: Port + zh: 端口 + zh-Hant: 埠 + ja: ポート + ko: 포트 + ru: Порт + ms: Port + pt-br: Porta + required: true + rule: paramPort + type: number + - default: ./data + edit: true + envKey: APP_DATA_DIR + labelEn: Data Directory + labelZh: 数据目录 + label: + en: Data Directory + zh: 数据目录 + zh-Hant: 資料目錄 + ja: データディレクトリ + ko: 데이터 디렉터리 + ru: Каталог данных + ms: Direktori Data + pt-br: Diretório de dados + required: true + type: text diff --git a/apps/actual-budget/latest/data/.gitkeep b/apps/actual-budget/latest/data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/apps/actual-budget/latest/docker-compose.yml b/apps/actual-budget/latest/docker-compose.yml new file mode 100644 index 000000000..cc2cb8343 --- /dev/null +++ b/apps/actual-budget/latest/docker-compose.yml @@ -0,0 +1,31 @@ +services: + actual-budget: + image: "actualbudget/actual-server:latest@sha256:e18b7fbfec6157a368fad4146563f397502e9da70a120aeaeac63b4977405d1c" + container_name: ${CONTAINER_NAME} + restart: unless-stopped + user: "1001:1001" + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:5006" + read_only: true + tmpfs: + - /tmp:size=64m,mode=1777 + security_opt: + - no-new-privileges:true + cap_drop: + - ALL + volumes: + - "${APP_DATA_DIR}:/data" + healthcheck: + test: ["CMD-SHELL", "node scripts/health-check.js"] + interval: 60s + timeout: 10s + retries: 3 + start_period: 20s + labels: + createdBy: "Apps" + +networks: + 1panel-network: + external: true diff --git a/apps/actual-budget/latest/scripts/init.sh b/apps/actual-budget/latest/scripts/init.sh new file mode 100755 index 000000000..f53fbbc72 --- /dev/null +++ b/apps/actual-budget/latest/scripts/init.sh @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)" +ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}" + +read_env_value() { + local key="$1" + local value + + [[ -f "$ENV_FILE" ]] || return 0 + value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + case "$value" in + \"*\") value="${value#\"}"; value="${value%\"}" ;; + \'*\') value="${value#\'}"; value="${value%\'}" ;; + esac + printf '%s\n' "$value" +} + +raw="${APP_DATA_DIR:-}" +if [[ -z "$raw" ]]; then + raw="$(read_env_value APP_DATA_DIR)" +fi +raw="${raw:-./data}" + +[[ -n "$raw" ]] || { + printf 'APP_DATA_DIR must not be empty\n' >&2 + exit 1 +} +if [[ "$raw" = /* ]]; then + printf 'APP_DATA_DIR must be relative to the application version directory\n' >&2 + exit 1 +fi + +path="$(realpath -m -- "$ROOT_DIR/${raw#./}")" +case "$path" in + "$ROOT_DIR"/*) ;; + *) + printf 'APP_DATA_DIR must remain inside the application version directory\n' >&2 + exit 1 + ;; +esac + +install -d -m 0700 "$path" +path="$(realpath -e -- "$path")" +case "$path" in + "$ROOT_DIR"/*) ;; + *) + printf 'APP_DATA_DIR resolves outside the application version directory\n' >&2 + exit 1 + ;; +esac + +chmod 0700 "$path" +chown -R --no-dereference 1001:1001 "$path" diff --git a/apps/actual-budget/latest/scripts/uninstall.sh b/apps/actual-budget/latest/scripts/uninstall.sh new file mode 100755 index 000000000..6e877466e --- /dev/null +++ b/apps/actual-budget/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +set -euo pipefail diff --git a/apps/actual-budget/latest/scripts/upgrade.sh b/apps/actual-budget/latest/scripts/upgrade.sh new file mode 100755 index 000000000..692e341e2 --- /dev/null +++ b/apps/actual-budget/latest/scripts/upgrade.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail + +"$(dirname "$0")/init.sh" diff --git a/apps/actual-budget/logo.png b/apps/actual-budget/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..dd6e1c54b7664463ab8ed60a487cacd522673a02 GIT binary patch literal 20037 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