So sánh app quản lý ngân sách tự host: Actual, Firefly III
So sánh Actual, Firefly III, Fava và Wallos: app nào tự lấy giao dịch ngân hàng, app nào phải import thủ công, cùng các yêu cầu về aggregator.
Câu trả lời ngắn
Các ứng dụng quản lý ngân sách tự host khác nhau ở một điểm quyết định phần lớn quá trình cài đặt: phần mềm tự lấy giao dịch của bạn, hay bạn phải nhập chúng. Actual Budget là lựa chọn mặc định tốt nhất cho ngân sách gia đình. Ứng dụng này dùng phương pháp phong bì và chạy dưới dạng một container duy nhất. Khi bạn yêu cầu, ứng dụng cũng có thể lấy giao dịch từ một nhà cung cấp dữ liệu ngân hàng.
Firefly III phù hợp khi bạn muốn dùng hệ thống tài khoản ghi sổ kép, hoặc muốn các lần import chạy theo lịch mà không cần ai theo dõi. Beancount kết hợp với Fava phù hợp với người muốn lưu sổ cái dưới dạng file văn bản thuần trong hệ thống version control. Wallos chỉ tập trung vào một việc: theo dõi các khoản chi định kỳ trừ khỏi tài khoản của bạn mỗi tháng.
Không ứng dụng nào trong số này tự kết nối với ngân hàng của bạn. Mọi ứng dụng hiển thị giao dịch ngân hàng đều lấy dữ liệu từ một aggregator bên thứ ba, và việc đăng ký tài khoản với aggregator là bước khiến nhiều người dừng lại. Hãy đọc phần đồng bộ trước khi cài đặt bất kỳ ứng dụng nào.
Mỗi ứng dụng chạy những gì, so sánh trực tiếp
Dữ liệu đằng sau biểu đồ này
[
{
"tool": "Actual Budget",
"services": 1,
"storage": "SQLite files",
"bank_sync": "Aggregators, manual pull",
"multi_user": "Needs OpenID",
"encryption": "Optional end to end"
},
{
"tool": "Firefly III",
"services": 3,
"storage": "MariaDB",
"bank_sync": "Importer, cron capable",
"multi_user": "Built in accounts",
"encryption": "None at rest"
},
{
"tool": "Beancount + Fava",
"services": 1,
"storage": "Text file",
"bank_sync": "Import scripts only",
"multi_user": "No login at all",
"encryption": "File level, your choice"
},
{
"tool": "Wallos",
"services": 1,
"storage": "SQLite file",
"bank_sync": "Manual entry only",
"multi_user": "Extra logins via admin page",
"encryption": "None at rest"
}
]Actual Budget chạy 1 service chạy lâu dài. Firefly III chạy 3, vì file compose chính thức của nó khởi động app, một database MariaDB và một cron helper trong các container riêng biệt. Đó là toàn bộ bức tranh tài nguyên của 4 app này: database server là thành phần duy nhất cần nhiều tài nguyên trong nhóm, còn lại chỉ là một process nhỏ lưu một file nhỏ.
Ứng dụng budgeting tự host nào có thể lấy giao dịch từ ngân hàng?
Không có ứng dụng tự host nào kết nối trực tiếp với ngân hàng. Ngân hàng cung cấp giao dịch thông qua open banking API, và các API đó được truy cập qua một aggregator: công ty duy trì quan hệ với ngân hàng và bán lại quyền truy cập. Vì vậy, câu hỏi thực tế có hai phần. Ứng dụng có hỗ trợ aggregator không, và bạn có thể tạo tài khoản với một aggregator có hỗ trợ ngân hàng của mình không?
Actual Budget hỗ trợ một số aggregator. Tính đến tháng 10 năm 2026, tài liệu của ứng dụng liệt kê Akahu cho New Zealand, Enable Banking cho châu Âu, GoCardless Bank Account Data cho châu Âu, SimpleFIN Bridge cho Bắc Mỹ và Pluggy.ai cho Brazil. Bạn tự đăng ký với nhà cung cấp, tạo key và secret, rồi nhập chúng vào server của mình. Có hai giới hạn cần lưu ý. Trong bản stable hiện tại, 26.10.0, sync chỉ chạy khi người dùng nhấn nút. Tính năng tự động sync các account đã liên kết theo khoảng thời gian được chọn đã được merge, nhưng tính đến tháng 10 năm 2026, tính năng này chỉ có trong nightly build. Ngay cả khi đó, sync chỉ chạy khi Actual đang mở trên một thiết bị. Trang này cũng ghi rõ GoCardless không nhận account mới, nên route châu Âu miễn phí mà các hướng dẫn cũ vẫn đề xuất không còn dùng được. SimpleFIN Bridge là dịch vụ subscription trả phí; nhà cung cấp tính phí trực tiếp cho bạn, không phải Actual.
Nếu muốn Actual import mà hôm nay không cần ai theo dõi, bạn có thể dùng project cộng đồng actual-auto-sync để chạy bank sync theo lịch. Đây là một container riêng, chạy cạnh Actual server và giao tiếp với server thông qua official API package của Actual. Nó không thuộc Actual, nên bạn phải cấu hình và cập nhật thêm một service.
Firefly III tách chức năng import vào một container thứ hai là Firefly III Data Importer. Cấu hình mẫu của nó có các vị trí credential cho GoCardless (Nordigen), Enable Banking, SimpleFIN và Lunch Flow, cùng với import file CSV và CAMT.053. Thiết lập CAN_POST_AUTOIMPORT=true, đặt một giá trị ngẫu nhiên dài vào AUTO_IMPORT_SECRET, rồi dùng cron job trên host để trigger import mà không cần mở browser. Đây là cơ chế unattended sync duy nhất được tích hợp sẵn trong các app ở phần so sánh này; Actual chỉ làm được việc đó khi dùng thêm service cộng đồng nêu trên.
Beancount không có sync. Bạn tải file CSV hoặc OFX từ ngân hàng rồi chạy importer script do mình viết hoặc lấy từ nơi khác. Wallos cũng không có sync, theo thiết kế: bạn nhập một subscription một lần và nó tự lặp theo lịch riêng.
Manual import là cách luôn hoạt động và không bị ảnh hưởng khi ngân hàng đổi nhà cung cấp. Nếu khả năng kết nối với ngân hàng là yếu tố quyết định, hãy kiểm tra aggregator có hỗ trợ đúng ngân hàng của bạn hay không trước khi cài đặt. Việc kiểm tra này mất 10 phút nhưng có thể giúp bạn tiết kiệm cả cuối tuần.
Actual Budget: lập ngân sách theo phong bì trên một container
Lập ngân sách theo phong bì nghĩa là phân bổ số tiền bạn đang có vào các danh mục trước khi chi tiêu. Bạn phân bổ 300 cho thực phẩm, 80 cho đi lại, và phương pháp này yêu cầu tổng số tiền đã phân bổ không được vượt quá số tiền trong các tài khoản của bạn. Actual không áp dụng đây là giới hạn cứng: bạn có thể phân bổ nhiều hơn số tiền hiện có, khi đó tháng sẽ hiển thị là vượt ngân sách, và phần vượt sẽ được trừ vào tiền của tháng sau cho đến khi bạn bù đủ. Actual triển khai phương pháp này, đồng thời app ưu tiên hoạt động cục bộ: trình duyệt hoặc desktop client giữ một bản sao đầy đủ của ngân sách và đồng bộ với server, nên app vẫn hoạt động khi server ngừng chạy.
services:
actual_server:
image: actualbudget/actual-server:latest
ports:
- '5006:5006'
volumes:
- ./actual-data:/data
restart: unless-stoppedKhởi động bằng docker compose up -d. Tài liệu cài đặt Actual bằng Docker yêu cầu bạn mở app từ một máy tính khác trong mạng cục bộ bằng http://your-server:5006 thuần, nên app tải mà không cần HTTPS. Trang hướng dẫn HTTPS cho biết bạn cần HTTPS để sử dụng an toàn tất cả tính năng của Actual, đồng thời nêu 2 trường hợp có thể bỏ qua bước này: server chạy trên chính máy tính của bạn và bạn chỉ truy cập qua localhost, hoặc nhà cung cấp cloud xử lý HTTPS cho bạn. Data volume tạo thêm 2 thư mục là server-files và user-files. Các thư mục này chứa ngân sách của bạn. Nếu dùng VPS có thể truy cập qua Internet, hãy đặt reverse proxy với TLS (bảo mật tầng truyền tải) ở phía trước trước khi sử dụng lần đầu, rồi mở app tại địa chỉ HTTPS do proxy cung cấp. Self-signed certificate cũng hoạt động, nhưng trình duyệt sẽ cảnh báo certificate không hợp lệ. Xem hướng dẫn đầy đủ tại hướng dẫn cài đặt Actual Budget của chúng tôi, còn các mẫu compose dùng trong file đó có tại Docker Compose trên VPS.
Nhiều người dùng. Mặc định, server có một password dùng chung cho tất cả mọi người. Muốn dùng các account riêng, bạn cần OpenID Connect; server hỗ trợ kết nối với các provider như Authentik, Keycloak, Google và GitHub. Người đầu tiên đăng nhập qua OpenID sẽ trở thành chủ sở hữu server, còn ACTUAL_USER_CREATION_MODE quyết định các lần đăng nhập sau có tự tạo account hay không. Hai người có thể mở và chỉnh sửa cùng một file ngân sách cùng lúc. Tài liệu cho biết cách này hoạt động nếu các thay đổi không xung đột, nhưng khuyến nghị tránh cùng lúc sử dụng cùng một file để an toàn. Vì vậy, hai người dùng chung một ngân sách nên thay phiên nhau sử dụng.
Mã hóa. Actual cung cấp mã hóa đầu cuối cho từng file ngân sách. Khi bật tính năng này, server lưu dữ liệu mà nó không thể đọc; đây là điều bạn muốn khi dùng một máy chủ thuê. Có 2 hệ quả. Nếu mất password mã hóa, bạn không thể khôi phục bản sao trên server. Cách duy nhất để truy cập lại là reset key từ một thiết bị vẫn giữ bản sao cục bộ của ngân sách; thao tác này thay dữ liệu trên server bằng bản sao đó. Ngoài ra, các token đồng bộ ngân hàng được lưu riêng và không được mã hóa bằng cơ chế này, nên bất kỳ ai có quyền truy cập database trên server đều có thể đọc chúng.
Firefly III: hạch toán kép và lần import tự động duy nhất ở đây
Hạch toán kép nghĩa là mỗi giao dịch có một tài khoản nguồn và một tài khoản đích. Khi mua hàng tạp hóa, tiền được chuyển từ tài khoản thanh toán sang tài khoản chi phí, nên không có khoản tiền nào tự nhiên xuất hiện. Khoản tiền không giải thích được sẽ làm tài khoản mất cân đối thay vì bị che trong tổng của một category. Đó là lý do nên chọn Firefly III: nó gần với phần mềm kế toán hơn là công cụ lập ngân sách.
Cài đặt từ các file do project cung cấp:
mkdir -p /srv/firefly
curl -fsSL -o /srv/firefly/docker-compose.yml https://raw.githubusercontent.com/firefly-iii/docker/main/docker-compose.yml
curl -fsSL -o /srv/firefly/.env https://raw.githubusercontent.com/firefly-iii/firefly-iii/main/.env.example
curl -fsSL -o /srv/firefly/.db.env https://raw.githubusercontent.com/firefly-iii/docker/main/database.envChỉnh sửa .env trước lần khởi động đầu tiên. APP_KEY phải là một chuỗi có đúng 32 ký tự, và project cung cấp sẵn command để tạo chuỗi này:
head /dev/urandom | LC_ALL=C tr -dc 'A-Za-z0-9' | head -c 32 && echoSTATIC_CRON_TOKEN cần một chuỗi 32 ký tự thứ hai. Cron container trong compose file gọi app mỗi ngày một lần. Nếu không có token hợp lệ, request sẽ bị từ chối, khiến recurring transaction và lời nhắc hóa đơn không bao giờ chạy. Đặt SITE_OWNER thành địa chỉ email của bạn, đặt mật khẩu database trong .env giống với mật khẩu trong .db.env, rồi khởi động:
docker compose up -d
docker compose logs -f appLần khởi động đầu tiên thành công sẽ kết thúc bằng việc app phục vụ trên port 8080 bên trong container. Compose file publish port này trên port 80 của host, và log sẽ ổn định dần. Một vòng lặp gồm các lỗi kết nối database có nghĩa là mật khẩu trong .env và .db.env không khớp, nên app không thể đăng nhập vào MariaDB.
Import tự động. Data Importer chạy trong một container riêng và xác thực với Firefly III bằng personal access token trong FIREFLY_III_ACCESS_TOKEN. Cấu hình một import theo cách tương tác, lưu file cấu hình mà nó cung cấp, rồi để cron gửi request đến auto import endpoint theo lịch. Đây là ý nghĩa của việc nói Firefly III đồng bộ: aggregator giữ kết nối với ngân hàng, importer lấy dữ liệu từ đó, còn server của bạn xử lý mọi việc trong khi bạn ngủ.
Nhiều người dùng. Firefly III lưu các tài khoản thực trong database riêng của nó. Đây là chức năng được chọn bởi AUTHENTICATION_GUARD=web. Trỏ nó đến remote_user_guard thay vào đó, rồi để một proxy có xác thực như Authelia xử lý việc đăng nhập và truyền username trong một header. LDAP không còn được hỗ trợ. Trên instance có thể truy cập từ internet, hãy mở trang administration sau lần đăng nhập đầu tiên và kiểm tra thiết lập single user mode. Thiết lập này quyết định người khác có thể đăng ký hay không.
Mã hóa. Dữ liệu không được mã hóa khi lưu trữ. Các giao dịch nằm trong MariaDB ở dạng có thể đọc được, nên bất kỳ ai có database password hoặc một bản sao của volume đều có lịch sử tài chính của bạn. Hãy terminate TLS ở phía trước app, tránh để app trên open internet nếu có thể, và mã hóa các bản backup.
Beancount và Fava: sổ cái của bạn là một file text
Beancount là cú pháp kế toán kép dạng text thuần. Một giao dịch chỉ gồm vài dòng trong file do bạn quản lý:
2026-08-19 * "Supermarket" "Weekly shop"
Expenses:Food:Groceries 42.10 EUR
Assets:Bank:CheckingFava là web interface cho file đó. Nó tạo biểu đồ, bảng cân đối kế toán và báo cáo kết quả kinh doanh, đồng thời có thể chỉnh sửa source. Cài đặt Fava trong virtual environment:
sudo apt update && sudo apt install -y python3-venv
python3 -m venv ~/.venvs/fava
~/.venvs/fava/bin/pip install fava
~/.venvs/fava/bin/fava --read-only ~/ledger/main.beancountLệnh pip3 install fava đơn giản sẽ fail trên Ubuntu 24.04 với error: externally-managed-environment vì apt quản lý Python hệ thống. Vì vậy, virtual environment là cách xử lý đúng chứ không phải workaround.
Theo mặc định, Fava listen trên localhost port 5000. -H thay đổi host và -p thay đổi port, nhưng hãy cân nhắc trước khi mở rộng phạm vi truy cập: Fava không có login. CLI không có tùy chọn user hoặc password, nên bất kỳ máy nào truy cập được port này đều có thể đọc toàn bộ giao dịch do bạn quản lý. Giữ host mặc định và truy cập qua SSH tunnel, VPN hoặc proxy có authentication. Flag --read-only chặn thao tác ghi từ browser. Nên bật flag này khi bạn chỉnh sửa file trên laptop rồi commit file đó.
Nhiều người dùng và mã hóa. Fava hoàn toàn không có user model. Một instance phục vụ một ledger duy nhất và không gắn với identity nào, nên chia sẻ có nghĩa là chia sẻ thông tin đăng nhập của proxy. Cách mã hóa tùy thuộc vào phương thức bạn áp dụng cho file, chẳng hạn bản sao được mã hóa bằng age hoặc gpg, hoặc một backup repository được mã hóa. Ưu điểm của text ledger là git cung cấp sẵn history, blame và một bản sao remote.
Wallos: bản nhỏ gọn cho các khoản chi định kỳ
services:
wallos:
image: bellamy/wallos:latest
ports:
- "8282:80/tcp"
volumes:
- './db:/var/www/html/db'
- './logos:/var/www/html/images/uploads/logos'
restart: unless-stoppedWallos lưu mọi dữ liệu trong một file SQLite tại db/wallos.db. Công cụ này hỗ trợ nhiều loại tiền tệ và tự quy đổi, đồng thời có thể cảnh báo qua email, Discord, Telegram, Gotify, Pushover hoặc webhook khi sắp đến hạn gia hạn. Admin tạo thêm login trên trang quản trị. Trang này cũng có thể mở đăng ký hoặc bật đăng nhập OpenID Connect. Mỗi login có một danh sách riêng. Các thành viên trong hộ gia đình được thêm trong phần cài đặt chỉ là nhãn cho người thanh toán, không phải các login riêng.
Cần hiểu rõ Wallos không làm được gì. Wallos không theo dõi chi tiêu hằng ngày và không có khái niệm ngân sách. Nó trả lời một câu hỏi: mỗi tháng tôi đang trả những khoản nào, và tuần sau khoản nào sẽ gia hạn? Nhiều người chạy Wallos cùng với Actual đúng vì mục đích này. Nếu các khoản định kỳ bạn quan tâm là khoản bạn gửi đi thay vì khoản bạn thanh toán, hãy xem phần mềm lập hóa đơn tự host.
Còn Maybe thì sao?
Maybe Finance thường được đề xuất trong nhiều thread, nên cần có câu trả lời. README của dự án cho biết repository không còn được actively maintained, bản release cuối cùng là v0.6.0 và mã nguồn sử dụng giấy phép AGPLv3. Repository được chuyển sang chế độ chỉ đọc và archive vào ngày 27 July 2025. Phần mềm này vẫn chạy. Dữ liệu budgeting là loại dữ liệu bạn lưu trong một thập kỷ, còn phần mềm không được maintain nhưng lại chứa database schema và thông tin xác thực ngân hàng là nơi lưu trữ không phù hợp. Đến October 2026, đây vẫn là đánh giá hiện tại, vì vậy hãy tự kiểm tra repository trước khi quyết định sử dụng.
Cần bao nhiêu tài nguyên máy chủ?
Tất cả các ứng dụng này đều nhỏ. Bạn nên tự đo thay vì tin vào một con số trên blog. Chạy lệnh này trên máy của bạn sau một ngày sử dụng bình thường:
docker stats --no-streamĐọc cột MEM USAGE. Actual, Wallos và Fava mỗi ứng dụng chỉ giữ một file nhỏ phía sau một process nhỏ, nên chúng vẫn chạy thoải mái trên một VPS khiêm tốn cùng các service khác. Firefly III khác ở chỗ stack có MariaDB, và database server vẫn giữ bộ nhớ dù bạn có đang truy vấn hay không. Hãy dự trù phần headroom cho database, không chỉ cho các giao dịch của bạn. Tuy vậy, một ứng dụng quản lý ngân sách hiếm khi là thành phần làm đầy VPS. Nếu bạn định dùng một máy cho toàn bộ stack, mức RAM tối thiểu của PhotoPrism và Immich có khả năng quyết định dung lượng RAM bạn cần mua nhiều hơn.
Dữ liệu gần như không tăng đáng kể. Giao dịch của một hộ gia đình trong 10 năm chỉ chiếm một file tính bằng megabyte, nên disk không phải yếu tố giới hạn. Hệ quả thực sự của việc lưu dữ liệu lâu dài này nằm ở phần tiếp theo.
Khía cạnh mobile và những điểm gây thất vọng
Đây là điểm các ứng dụng tài chính tự host kém hơn ứng dụng thương mại. Vì vậy, hãy cân nhắc thực tế trước khi chuyển cả gia đình sang một ứng dụng như vậy.
Tài liệu chính thức hiện cho biết các ứng dụng mobile đã deprecated. Thay vào đó, bạn dùng phiên bản web. Tài liệu của dự án mô tả đây là progressive web app responsive, có thể cài vào home screen và sử dụng như app native. Nó hoạt động tốt. Tuy nhiên, đây không phải app trên app store, dù cộng đồng vẫn duy trì các native client không chính thức.
Firefly III cũng không phát hành app chính thức. API của nó đã tạo điều kiện cho 2 app không chính thức có đầy đủ tính năng. Waterfly III là app Android, được phát hành trên Google Play và F-Droid. Abacus chạy trên iPhone, iPad và Android, đăng nhập bằng OAuth2, đồng thời lưu token trong iOS keychain. Cả hai đều yêu cầu instance của bạn có thể truy cập được từ điện thoại.
Fava và Wallos chỉ cung cấp một trang web responsive. Chúng không có gì khác. Đọc ledger trên điện thoại thì ổn. Nhập một transaction Beancount bằng bàn phím điện thoại thì không.
Một điểm áp dụng cho tất cả các ứng dụng này: điện thoại dùng mobile data không nằm trong home network. Bạn phải publish app trên một domain có TLS và authentication mạnh, hoặc kết nối điện thoại vào VPN. Không nên publish một app tài chính lên open internet rồi chỉ bảo vệ bằng một password dùng chung. Nếu cả hai cách trên đều không phù hợp, đặt instance phía sau onion service v3 là một cách thứ ba để truy cập. Cách này không cần public DNS record và không cần mở port với internet bên ngoài, nhưng bạn phải truy cập qua Tor Browser trên điện thoại.
Sao lưu: phần quan trọng nhất trong danh mục này
Mất một thư viện media chỉ khiến bạn phải tải lại. Mất dữ liệu giao dịch đã phân loại của 5 năm khiến bạn mất thứ không thể tải lại. Hãy thiết lập việc này ngay từ ngày đầu tiên.
Những gì cần sao chép cho từng app:
- Actual Budget: toàn bộ data volume, cả
server-filesvàuser-files. - Firefly III: database dump, cùng với
.env,.db.envvà upload volume. - Beancount: file sổ cái, tốt nhất là đặt trong git repository có remote.
- Wallos:
db/wallos.dbvà thư mục logo đã upload.
Sao chép một file SQLite đang được sử dụng là cách kinh điển để tạo ra một bản backup không thể restore. SQLite lưu các lần ghi gần đây trong một write ahead log file riêng, nên bản sao chỉ có file .sqlite có thể thiếu các giao dịch mới nhất hoặc hoàn toàn không mở được. Hãy stop container trong vài giây cần thiết để sao chép:
cd /srv/actual
docker compose stop actual_server
tar czf /srv/backups/actual-$(date +%F).tgz -C /srv/actual actual-data
docker compose start actual_serverFirefly III cần database dump thay vì sao chép file. Hãy tạo dump từ bên trong database container để password không xuất hiện trong shell history:
cd /srv/firefly
docker compose exec -T db sh -c 'mariadb-dump -u firefly -p"$MYSQL_PASSWORD" firefly' > /srv/backups/firefly-$(date +%F).sqlCác MariaDB image cũ cung cấp cùng công cụ đó dưới tên trước đây là mysqldump. Hãy lưu .env và .db.env cùng với dump, vì restore database vào một install mà bạn không còn configuration là một bài toán phải giải vào ngày tệ nhất.
Bản sao trên cùng VPS bảo vệ bạn khỏi một lần chỉnh sửa sai. Nó không bảo vệ bạn khỏi việc mất server hoặc server bị breach. Hãy dùng restic để đẩy backup directory lên object storage. restic mã hóa repository trước khi dữ liệu rời khỏi server:
export RESTIC_REPOSITORY=s3:s3.example.com/money-backups
export RESTIC_PASSWORD_FILE=/root/.restic-pass
restic init
restic backup /srv/backups
restic forget --keep-daily 7 --keep-weekly 8 --keep-monthly 12 --prunerestic snapshots hiện phải liệt kê một snapshot có timestamp là ngày hôm nay. Cách lập lịch, credential và systemd timer được trình bày trong guide về encrypted restic backup trên VPS của chúng tôi.
Một bản backup mà bạn chưa từng restore chỉ là phỏng đoán. Hãy test ngay một lần, khi mọi thứ vẫn đang hoạt động:
restic restore latest --target /tmp/restore-testGiải nén Actual archive vào một scratch directory, start container thứ hai sử dụng directory đó trên một port khác, rồi mở app. Bạn phải thấy các account cùng số dư tại thời điểm backup được tạo. Với Firefly III, hãy load dump vào một scratch database và đếm số row trong bảng transactions. Nếu các con số khớp với instance đang chạy, bản backup là bản backup thực. Sau đó xóa các scratch copy, vì một test instance bị bỏ quên với dữ liệu tài chính thật cũng là một vấn đề riêng.
Hãy chọn một app, chạy app đó trong 1 tháng với dữ liệu thật trước khi migrate bất kỳ history nào, và hoàn tất backup trong cùng tuần. Nếu bạn vẫn đang cân nhắc phần nào trong cuộc sống nên được self-host trên server của mình, bài tổng hợp về những gì đáng self-host trong 2026 của chúng tôi trình bày các phần còn lại của stack.
FAQ
Ứng dụng lập ngân sách tự host nào có thể kết nối với ngân hàng của tôi?
Actual Budget và Firefly III đều có thể làm vậy thông qua một aggregator bên thứ ba, thay vì kết nối trực tiếp với ngân hàng. Actual hỗ trợ các provider như SimpleFIN Bridge cho Bắc Mỹ, Enable Banking cho châu Âu, Akahu cho New Zealand và Pluggy.ai cho Brazil. Trong bản stable hiện tại, thao tác sync chỉ chạy khi bạn nhấn nút. Tính đến tháng 10 năm 2026, tính năng sync tự động theo khoảng thời gian đã chọn chỉ có trong các bản nightly và chỉ chạy khi Actual đang mở. Một community service có tên actual-auto-sync có thể chạy sync theo lịch dưới dạng container bổ sung. Firefly III dùng một container Data Importer riêng có thể được kích hoạt bằng cron, nên đây là ứng dụng duy nhất có sẵn tính năng import không cần giám sát. Beancount và Wallos hoàn toàn không có kết nối ngân hàng. Hãy kiểm tra aggregator có hỗ trợ đúng ngân hàng của bạn trước khi chọn, vì phạm vi hỗ trợ thường quyết định nhiều hơn tính năng.
Tôi có thể dùng các ứng dụng lập ngân sách này trên điện thoại không?
Có, nhưng không có app chính thức. Tài liệu của Actual cho biết các ứng dụng mobile chính thức đã deprecated và hướng người dùng đến phiên bản web, một progressive web app responsive có thể cài vào home screen. Firefly III có 2 client không chính thức nhưng hoạt động tốt: Waterfly III trên Android và Abacus trên iOS và Android. Fava và Wallos chỉ là các trang web responsive, không có gì khác. Actual giữ một bản local của ngân sách nên vẫn hoạt động khi không có kết nối, nhưng điện thoại phải truy cập được server để sync và lấy dữ liệu ngân hàng. Các ứng dụng còn lại cần server cho mọi thao tác. Dù dùng cách nào, hãy chuẩn bị một domain có TLS và authentication mạnh, hoặc đưa điện thoại vào một VPN.
Làm thế nào để backup ứng dụng lập ngân sách tự host mà không làm hỏng database?
Không bao giờ chỉ copy một file SQLite đang được sử dụng. SQLite lưu các ghi mới trong một write ahead log riêng, nên bản copy được tạo giữa lúc đang ghi có thể thiếu giao dịch hoặc không mở được. Hãy stop container, copy data directory rồi start lại container. Với các ứng dụng nhỏ như vậy, thao tác này chỉ mất vài giây. Với Firefly III, hãy chạy mariadb-dump bên trong database container, đồng thời giữ các environment file cùng với dump. Đưa kết quả ra ngoài máy vào một encrypted restic repository, rồi restore một lần để xác nhận bản backup hoạt động.
Firefly III có quá nặng đối với một VPS nhỏ không?
Đây là lựa chọn nặng nhất trong số này, chỉ vì compose file chính thức của nó chạy một MariaDB server cùng với các app và cron container. Dữ liệu tài chính cá nhân rất nhỏ, nên memory chủ yếu dành cho database process đang idle chứ không phải các giao dịch của bạn. Hãy chạy docker stats --no-stream trên máy của bạn sau một ngày sử dụng bình thường và đọc cột MEM USAGE thay vì tin vào một con số được công bố. Nếu muốn footprint nhỏ nhất có thể, Actual Budget và Wallos đều chỉ chạy một process với một file.