Cú sốc đăng ký lúc 2 giờ sáng
Đó là lúc 2 giờ sáng khi tôi nhận được thông báo: gói đăng ký YNAB của tôi sắp gia hạn với mức phí 109 USD mỗi năm. Việc phải trả hơn một trăm đô la hàng năm chỉ để quản lý số tiền mình đang có cảm thấy thật vô lý. Tôi có một tủ server (server rack) ở góc phòng xử lý mọi thứ từ giải trí đến nhà thông minh. Tại sao tôi lại phải gửi dữ liệu tài chính nhạy cảm nhất của mình cho một bên thứ ba?
Tôi cần một công cụ quản lý ngân sách theo phương pháp Zero-Based Budgeting (ZBB) chạy trên phần cứng của riêng mình. Nó phải nhanh, riêng tư và đáng tin cậy. Actual Budget đáp ứng hoàn hảo những yêu cầu đó. Đây là một ứng dụng ưu tiên dữ liệu cục bộ (local-first), được mã hóa và tích hợp mượt mà vào HomeLab dựa trên Docker. Việc chuyển sổ cái tài chính về máy chủ riêng không chỉ là để tiết kiệm tiền; đó còn là về quyền tự chủ kỹ thuật số.
Bắt đầu nhanh: Triển khai trong 5 phút
Chúng ta sẽ không tốn thời gian với các bộ cài đặt phức tạp. Docker Compose là tiêu chuẩn vàng ở đây vì nó sạch sẽ và dễ dàng di chuyển giữa các máy chủ. Tôi giả định rằng bạn đã cài đặt Docker và Compose trên một máy Linux, Raspberry Pi hoặc Synology NAS.
Bắt đầu bằng cách tạo một thư mục riêng cho stack này:
mkdir -p ~/homelab/actual-budget
cd ~/homelab/actual-budget
Tiếp theo, tạo file docker-compose.yml của bạn:
services:
actual_server:
image: actualbudget/actual-server:latest
container_name: actual_budget
ports:
- 5006:5006
volumes:
- ./data:/data
restart: unless-stopped
Khởi chạy container chỉ với một lệnh:
docker compose up -d
Mở trình duyệt và truy cập http://[IP-CUA-SERVER]:5006. Bạn sẽ thấy màn hình thiết lập ngay lập tức. Đây là khoảnh khắc “Hello World” cho tài chính cá nhân của bạn. Tuy nhiên, đừng vội nhập chi tiết ngân hàng ngay. Việc để ứng dụng chạy trên cổng HTTP không mã hóa là một rủi ro bảo mật lớn.
Kiến trúc hoạt động như thế nào
Actual Budget khác với hầu hết các ứng dụng web vì nó sử dụng triết lý “local-first” (ưu tiên cục bộ). Trình duyệt hoặc điện thoại của bạn sẽ giữ cơ sở dữ liệu SQLite thực tế. Container Docker mà chúng ta vừa triển khai đóng vai trò như một trạm trung chuyển đồng bộ. Khi bạn ghi chép một ly cà phê giá 5 USD trên điện thoại, ứng dụng sẽ gửi thay đổi đó đến máy chủ, sau đó máy chủ sẽ đẩy nó về máy tính để bàn của bạn. Thiết kế này giúp ứng dụng vẫn hoạt động bình thường ngay cả khi máy chủ ngoại tuyến tạm thời.
Bảo vệ Data Volume của bạn
Việc ánh xạ ./data:/data là trái tim trong thiết lập của bạn. Thư mục này lưu trữ các file ngân sách đã mã hóa. Docker container có tính chất tạm thời; nếu bạn xóa container mà không có ánh xạ volume, dữ liệu của bạn sẽ biến mất. Hãy đảm bảo sao lưu thư mục này. Actual rất nhẹ, thường tiêu thụ ít hơn 150MB RAM, vì vậy nó sẽ không làm chậm hệ thống của bạn.
Khắc phục lỗi phân quyền
Nếu log của container hiển thị EACCES: permission denied, cách khắc phục rất đơn giản. Image của Actual thường chạy dưới quyền UID 1000. Bạn có thể sửa lỗi phân quyền trên máy host bằng cách chạy lệnh chown -R 1000:1000 ./data. Điều này đảm bảo container có quyền ghi các thay đổi ngân sách vào ổ đĩa.
Bảo mật và Truy cập từ xa
Để thực sự thay thế YNAB, bạn cần truy cập vào ngân sách của mình khi đang đi mua sắm. Gửi dữ liệu tài chính thô qua Wi-Fi công cộng bằng giao thức HTTP là một ý tưởng tồi. Bạn cần một đường truyền mã hóa.
SSL qua Nginx Proxy Manager
Nếu bạn sử dụng Nginx Proxy Manager (NPM), hãy trỏ một subdomain như finance.yourdomain.com về IP máy chủ của bạn tại cổng 5006. Luôn bật “Force SSL” và “HTTP/2”. Nếu bạn thích một phương án riêng tư hơn, Tailscale là một lựa chọn thay thế tuyệt vời. Nó cho phép bạn truy cập máy chủ qua một mạng VPN mesh bảo mật mà không cần mở bất kỳ cổng nào ra internet.
Trải nghiệm trên di động
Actual sử dụng Progressive Web App (PWA) thay vì tải xuống ứng dụng gốc từ kho ứng dụng. Sau khi bạn đã thiết lập HTTPS, hãy mở URL của mình trong Safari trên iPhone hoặc Chrome trên Android. Nhấn “Thêm vào màn hình chính” (Add to Home Screen). Nó sẽ có giao diện và cảm giác như một ứng dụng gốc, hoạt động ngoại tuyến và đồng bộ ngay khi bạn có kết nối trở lại.
Đồng bộ ngân hàng
Nhập thủ công là cách tốt nhất để kiểm soát chi tiêu, nhưng tự động hóa giúp tiết kiệm thời gian. Actual hỗ trợ SimpleFIN cho các ngân hàng Bắc Mỹ và GoCardless cho các ngân hàng Châu Âu. Các dịch vụ này thường tốn một khoản phí nhỏ hàng tháng (khoảng 2 USD), nhưng chúng giữ cho thông tin đăng nhập của bạn được mã hóa và tách biệt khỏi ứng dụng chính.
Mẹo chuyên nghiệp để tự quản lý ngân sách
Chuyển từ một dịch vụ SaaS bóng bẩy sang phần mềm tự lưu trữ đòi hỏi một vài thay đổi trong thói quen. Đây là cách tôi giữ cho hệ thống của mình hoạt động trơn tru:
- Giữ khóa mã hóa an toàn: Actual yêu cầu mật khẩu để mã hóa dữ liệu của bạn trong quá trình thiết lập. Không có nút “quên mật khẩu” ở đây. Nếu bạn mất khóa này, dữ liệu của bạn sẽ mất vĩnh viễn. Hãy lưu trữ nó trong một trình quản lý như Bitwarden.
- Tự động hóa việc sao lưu: Sử dụng một cron job để rsync thư mục dữ liệu của bạn sang một vị trí dự phòng. Tôi đẩy các bản sao lưu của mình sang một chiếc Raspberry Pi ở vị trí khác vào mỗi đêm lúc 3 giờ sáng.
- Chiến lược “Chờ phân loại”: Đừng quá cầu toàn trong lần nhập dữ liệu đầu tiên. Hãy đổ tất cả vào một nhóm chung và phân loại chúng mỗi tuần một lần bên tách cà phê.
Thiết lập Actual Budget là một dự án cuối tuần xứng đáng. Tôi mất khoảng 30 phút để đồng bộ hóa hoạt động hoàn hảo với reverse proxy của mình. Giờ đây, tôi có một công cụ quản lý ngân sách chuyên nghiệp mà không tốn đồng phí hàng tháng nào. Sự an tâm khi biết rằng dữ liệu lương bổng và nợ vay của mình không bị khai thác cho quảng cáo là hoàn toàn xứng đáng với công sức bỏ ra.
Nếu bạn thấy lỗi 502 Bad Gateway sau khi cập nhật image Docker, đừng hoảng sợ. Kiểm tra log bằng lệnh docker logs -f actual_budget. Thông thường, máy chủ chỉ đang thực hiện chuyển đổi cơ sở dữ liệu (migration). Hãy đợi khoảng 60 giây, tải lại trang và quay lại với bảng cân đối thu chi của bạn.

