Actual Budget स्वतःच्या VPS वर कसे होस्ट करावे?
Docker Compose वापरून Actual Budget सेटअप करण्याची संपूर्ण प्रक्रिया जाणून घ्या. HTTPS कॉन्फिगरेशन, डेटा व्हॉल्यूम मॅनेजमेंट, बँक इम्पोर्ट आणि बॅकअप घेण्याचे अचूक मार्ग येथे दिले आहेत.
तुम्ही काय तयार करत आहात
Actual Budget हे एक स्वतः होस्ट केलेले (self-hosted) एन्वलप बजेटिंग ॲप आहे. जेव्हा लोक YNAB ला पर्याय शोधतात आणि तो स्वतः होस्ट करू इच्छितात, तेव्हा हे एक सामान्य उत्तर असते. या सर्व्हरमध्ये एक कंटेनर, एक डेटा व्हॉल्यूम आणि एक HTTPS नाव असते. सामान्य बजेटसाठी आवश्यक असलेल्या सर्व गोष्टी तुम्ही भाड्याने घेऊ शकता अशा सर्वात लहान VPS वर आरामात चालतात, कारण सर्व्हर प्रामुख्याने फाइल्स साठवण्याचे आणि त्या सिंक करण्याचे काम करतो.
काहीही टाइप करण्यापूर्वी त्याचे आर्किटेक्चर समजून घेणे महत्त्वाचे आहे. बजेट स्वतः एक SQLite डेटाबेस आहे, जो तुमच्या ब्राउझरमध्ये आणि प्रत्येक मोबाइल ॲपमध्ये असतो. तुम्ही आता जो सर्व्हर इंस्टॉल करणार आहात, तो एक सिंक एंडपॉइंट (sync endpoint) आहे: तो अकाउंट लिस्ट, बजेट फाइल्स आणि चेंज लॉग साठवतो, ज्यामुळे फोन आणि लॅपटॉपमधील डेटा सुसंगत राहतो. म्हणूनच सर्व्हर बंद असतानाही ॲप काम करते आणि म्हणूनच जर तुमच्याकडे एका क्लायंटकडेही कॉपी असेल, तर सर्व्हर गमावल्यामुळे तुमचे बजेट नष्ट होत नाही.
सर्व्हरला HTTPS ची गरज का आहे
Actual साठी HTTPS आवश्यक आहे आणि ही केवळ एक औपचारिकता नाही. ब्राउझर केवळ Web Crypto API उघड करतात, जे Actual द्वारे एंड-टू-एंड एन्क्रिप्शनसाठी वापरले जाणारे इंटरफेस आहे, आणि ते केवळ अशा संदर्भात उपलब्ध असते ज्याला स्पेसिफिकेशनमध्ये सुरक्षित संदर्भ (secure context) म्हटले जाते. सुरक्षित संदर्भ म्हणजे https:// किंवा http://localhost. जर तुम्ही दुसऱ्या मशीनवरील ब्राउझरमध्ये http://203.0.113.10:5006 वरून ॲप लोड केले, तर ते फीचर्स तिथे उपलब्ध नसतात, कारण ब्राउझरने ते पेजला दिलेले नसतात. अधिकृत मोबाईल बिल्ड्स देखील साध्या http:// सर्व्हर URL ला नाकारतात.
त्यामुळे दोन कार्यक्षम सेटअप उपलब्ध आहेत. कंटेनरच्या समोर एका खऱ्या नावावर खरे प्रमाणपत्र (certificate) लावा, जे या मार्गदर्शकामध्ये दिले आहे. किंवा ACTUAL_HTTPS_KEY आणि ACTUAL_HTTPS_CERT वापरून सर्व्हरला सेल्फ-साइंड प्रमाणपत्र द्या, ज्याची माहिती प्रकल्पाच्या दस्तऐवजात आहे, आणि प्रत्येक डिव्हाइसवर ब्राउझरची चेतावणी स्वीकारा. Let's Encrypt कडून मोफत प्रमाणपत्र मिळवण्यासाठी पाच मिनिटे लागतात, त्यामुळे पहिला पर्याय निवडा.
Docker Compose वापरून Actual Budget इन्स्टॉल करणे
जर सर्व्हर नवीन असेल, तर आधी Docker इन्स्टॉल करा. जर तुम्हाला Compose फाईलचे सिंटॅक्स नवीन वाटत असेल, तर VPS साठी Docker Compose ची मूलभूत माहिती या मार्गदर्शिकेमध्ये खाली वापरलेल्या फील्ड्सची माहिती दिली आहे.
sudo install -d -m 755 /opt/actual
sudo install -d -m 700 /opt/actual/data/opt/actual/docker-compose.yml लिहा:
services:
actual:
image: actualbudget/actual-server:latest
container_name: actual
restart: unless-stopped
ports:
- '127.0.0.1:5006:5006'
volumes:
- ./data:/dataया फाईलमधील तीन तपशील महत्त्वाचे आहेत.
इमेज actualbudget/actual-server:latest आहे, जी प्रोजेक्टद्वारे Docker Hub वर प्रकाशित केली जाते आणि ghcr.io/actualbudget/actual वर मिरर केली जाते. कमी क्षमतेच्या मशीनसाठी latest-alpine टॅग उपलब्ध आहे.
कंटेनर सर्व माहिती /data अंतर्गत लिहितो. त्यामध्ये तुम्हाला server-files मिळते, ज्यामध्ये तुमचे लॉगिन आणि सेशन टोकन्स असलेली account.sqlite फाईल असते, आणि user-files असते, ज्यामध्ये प्रत्यक्ष बजेट फाईल्स असतात. तो पाथ माउंट करा, अन्यथा पुढील docker compose pull मुळे तुमचे बजेट नष्ट होईल. ACTUAL_DATA_DIR वापरून तुम्ही ते हलवू शकता, परंतु डीफॉल्ट सेटिंग योग्य आहे.
पोर्ट फक्त 127.0.0.1 वर प्रकाशित केला आहे. साधा 5006:5006 सर्व इंटरफेसवर प्रकाशित होतो आणि Docker स्वतःचे नियम ufw च्या आधी लिहितो, त्यामुळे 'deny-all' फायरवॉल असूनही ॲप इंटरनेटसाठी खुले राहील. हा प्रकार Docker चे प्रकाशित पोर्ट्स ufw ला बायपास का करतात यामध्ये स्पष्ट केला आहे. लूपबॅकवर बाइंड केल्यामुळे फक्त त्याच सर्व्हरवरील रिव्हर्स प्रॉक्सी त्यापर्यंत पोहोचू शकते.
ते सुरू करा:
cd /opt/actual
docker compose up --detach
docker compose logs -f actualजेव्हा सर्व्हर पोर्ट 5006 वर लिसनिंग करत असल्याचे रिपोर्ट करतो, तेव्हा लॉग स्थिर होतो. DNS ला स्पर्श करण्यापूर्वी ते स्थानिक पातळीवर तपासा:
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5006/200 चा अर्थ ॲप सर्व्ह होत आहे असा होतो. curl: (7) Failed to connect चा अर्थ कंटेनर चालू नाही असा होतो आणि docker compose ps मध्ये तो बंद झाल्याचे दिसेल. याचे सामान्य कारण माउंट केलेल्या व्हॉल्यूमवर परमिशनची समस्या असणे हे असते, जे लॉगमध्ये EACCES ओळीमध्ये दिसते.
प्रमाणपत्र आणि प्रत्यक्ष नाव सेट करणे
तुमच्या VPS वर एक A रेकॉर्ड पॉइंट करा, budget.example.com, आणि ते रिझॉल्व्ह होण्याची प्रतीक्षा करा. त्यानंतर nginx इन्स्टॉल करा आणि प्रमाणपत्र जारी करा. Ubuntu 24.04 वर nginx सह Certbot मार्गदर्शिका प्रमाणपत्र जारी करणे आणि नूतनीकरण टायमरची संपूर्ण माहिती देते.
प्रॉक्सी ब्लॉक:
server {
listen 443 ssl;
http2 on;
server_name budget.example.com;
ssl_certificate /etc/letsencrypt/live/budget.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/budget.example.com/privkey.pem;
client_max_body_size 100m;
location / {
proxy_pass http://127.0.0.1:5006;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}client_max_body_size ही ती ओळ आहे जी लोक विसरतात. पूर्ण सिंक (full sync) करताना बजेट फाईल पूर्णपणे अपलोड केली जाते. Nginx ची डीफॉल्ट रिक्वेस्ट बॉडी 1 MB असते, त्यामुळे फाईल त्यापेक्षा मोठी झाल्यावर, nginx ॲक्सेस लॉगमध्ये 413 Request Entity Too Large एरर येते आणि ॲपमध्ये फक्त एक सामान्य सिंक एरर दिसते. सर्व्हरच्या स्वतःच्या स्वतंत्र मर्यादा आहेत: ACTUAL_UPLOAD_FILE_SYNC_SIZE_LIMIT_MB ची डीफॉल्ट किंमत 20 आहे आणि ACTUAL_UPLOAD_SYNC_ENCRYPTED_FILE_SYNC_SIZE_LIMIT_MB ची डीफॉल्ट किंमत 50 आहे, त्यामुळे nginx ची मर्यादा तुमच्यासाठी लागू असलेल्या मर्यादेपेक्षा जास्त सेट करा.
रीलोड करा आणि चाचणी करा:
sudo nginx -t && sudo systemctl reload nginx
curl -fsS -o /dev/null -w '%{http_code}\n' https://budget.example.com/पहिली वेळ: पासवर्ड आणि तुमची पहिली बजेट फाईल
ब्राउझरमध्ये https://budget.example.com उघडा. पहिली स्क्रीन तुम्हाला सर्व्हर पासवर्ड सेट करण्यास सांगते. हा एकच पासवर्ड संपूर्ण सर्व्हरचे संरक्षण करतो, म्हणून एक लांब आणि यादृच्छिक (random) पासवर्ड तयार करा आणि तो अशा ठिकाणी जतन करा जिथे तो तुम्हाला पुन्हा मिळेल, जसे की self-hosted Vaultwarden पासवर्ड मॅनेजर. येथे तयार करण्यासाठी कोणतेही युजर अकाउंट्स नाहीत. Actual चा सर्व्हर डिझाइननुसार सिंगल-पासवर्डवर आधारित आहे, त्यामुळे बजेट शेअर करणे म्हणजे तो पासवर्ड शेअर करणे होय.
त्यानंतर एक बजेट फाईल तयार करा. Actual तुम्हाला एंड-टू-एंड एन्क्रिप्शन सक्षम करायचे आहे का, असे विचारेल. हो म्हणा, कारण सर्व्हर फक्त सायफरटेक्स्ट (ciphertext) साठवतो, जे भाड्याने घेतलेल्या मशीनवरील आर्थिक डेटासाठी योग्य आहे. याची किंमत मोठी आहे: एन्क्रिप्शन पासवर्ड कधीही सर्व्हरपर्यंत पोहोचत नाही, त्यामुळे जर तुम्ही तो गमावला तर फाईल कायमची नष्ट होईल आणि ती पुन्हा मिळवण्याचा कोणताही मार्ग नाही. त्या स्क्रीनच्या पुढे जाण्यापूर्वी तो पासवर्ड लिहून ठेवा.
तुमच्या बँकेच्या सध्याच्या आकडेवारीवरून तुमची सुरुवातीची शिल्लक (starting balances) सेट करा, त्याऐवजी अनेक वर्षांचा इतिहास इम्पोर्ट करू नका. एनव्हलप बजेटिंग (Envelope budgeting) तुमच्याकडे सध्या असलेल्या पैशांपासून पुढे काम करते, त्यामुळे इतिहास रिकामा असण्याने तुमचे काहीही नुकसान होत नाही.
व्यवहारांची नोंद करणे
येथे उत्साहापेक्षा प्रामाणिकपणा महत्त्वाचा आहे, कारण स्व-होस्ट केलेल्या बजेटिंग प्रणालीवरून लोक बाहेर पडण्याचे मुख्य कारण 'इम्पोर्ट' प्रक्रिया आहे.
मॅन्युअल एन्ट्री हा पाया आहे आणि तो नेहमीच काम करतो. 'एनव्हलप' पद्धतीसाठी हेच महत्त्वाचे आहे, कारण खरेदीची नोंद टाइप केल्यामुळेच तुम्हाला त्या खर्चाची जाणीव होते.
फाईल इम्पोर्ट मोठ्या प्रमाणात व्यवहार हाताळते. Actual हे CSV, QIF, OFX आणि QFX फॉरमॅट वाचू शकते आणि प्रत्येक बँक यापैकी किमान एक फॉरमॅट एक्सपोर्ट करते. अकाउंट स्क्रीनवरून प्रति अकाउंट इम्पोर्ट करा, कॉलम्स एकदा मॅप करा आणि Actual ते लेआउट त्या अकाउंटसाठी लक्षात ठेवते.
ऑटोमॅटिक बँक सिंकची सुविधा उपलब्ध आहे, परंतु त्यासाठी थर्ड-पार्टी सर्व्हिसची आवश्यकता असते कारण सर्व्हर स्वतःहून बँकांशी संवाद साधू शकत नाही. Actual उत्तर अमेरिकन बँकांसाठी SimpleFIN Bridge, युरोपसाठी Enable Banking, न्यूझीलंडसाठी Akahu आणि ब्राझीलसाठी Pluggy.ai ला सपोर्ट करते. GoCardless अजूनही सपोर्टेड आहे, परंतु ते नवीन अकाउंट्स स्वीकारत नाही. तुम्ही स्वतः प्रोव्हायडरकडे साइन अप करा, क्रेडेंशियल्स तयार करा आणि ती सर्व्हरमध्ये ॲड करा. जुलै 2026 पर्यंतच्या माहितीनुसार, SimpleFIN Bridge 25 संस्थांपर्यंतच्या सेवेसाठी दरवर्षी 15 US डॉलर्स आकारते, तर इतरांचे दर वेगळे आहेत.
यावर अवलंबून राहण्यापूर्वी दोन मर्यादा लक्षात घ्या. API क्रेडेंशियल्स सर्व्हरवर असतात आणि ते एंड-टू-एंड एन्क्रिप्शनच्या कक्षेत येत नाहीत, कारण सर्व्हरला त्यांचा वापर करावा लागतो. तसेच, Actual मध्ये पोलिंग होत नाही: सिंकिंग हे एक बटण आहे जे तुम्हाला दाबावे लागते, हे बॅकग्राउंड जॉब नाही.
बॅकअप, कारण हे फक्त फाइल्स आहेत
तुम्हाला आवश्यक असलेली सर्व माहिती /opt/actual/data अंतर्गत आहे. यासाठी कोणतीही एक्सपोर्ट प्रक्रिया किंवा डेटाबेस डंप स्क्रिप्ट करण्याची गरज नाही.
एक महत्त्वाची गोष्ट म्हणजे SQLite. सर्व्हर जेव्हा account.sqlite मध्ये लिहित असतो, तेव्हा त्याची प्रत घेतल्यास अर्धवट व्यवहार (transaction) कॉपी होऊ शकतो. रिस्टोर करताना तुम्हाला ही त्रुटी लक्षात येईल. कॉपी करण्यासाठी लागणाऱ्या काही सेकंदांसाठी कंटेनर थांबवा:
cd /opt/actual
docker compose stop
restic -r sftp:backup@backup.example.com:/srv/restic backup /opt/actual/data
docker compose startrestic बॅकअप्स VPS वर मध्ये दिलेल्या पद्धतीचा वापर करून हे शेड्युल करा. यामध्ये रिपॉझिटरी सेटअप, रिटेंशन आणि रिस्टोर सरावाचा समावेश आहे. रिस्टोरचा सराव नक्की करा. ज्या बॅकअपची तुम्ही कधीही रिस्टोर चाचणी केली नाही, तो केवळ एक अंदाज आहे.
Actual चे स्वतःचे क्लायंट-साइड बॅकअप्स वेगळे आहेत आणि त्याबद्दल माहिती असणे फायदेशीर आहे. ब्राउझर बजेट फाइलच्या अलीकडील प्रती जतन करतो, ज्या फाइल मेनूमधून मिळवता येतात. यामुळे सर्व्हरला स्पर्श न करता "मी चुकून एखादी कॅटेगरी डिलीट केली" अशा समस्या सोडवता येतात.
सर्व्हर अपडेट करणे
cd /opt/actual
docker compose pull
docker compose up --detachCompose नवीन इमेजमधून कंटेनर पुन्हा तयार करते आणि तोच व्हॉल्यूम पुन्हा जोडते, त्यामुळे डेटा सुरक्षित राहतो. क्लायंट देखील अपडेट करा. सर्व्हर आणि ॲपच्या आवृत्त्या एकमेकांच्या जवळ असणे अपेक्षित आहे, आणि सर्व्हरपेक्षा खूप जुना असलेला क्लायंट आवृत्तीमधील तफावतीचा संदेश (version mismatch message) दाखवून सिंक करण्यास नकार देऊ शकतो. मोठ्या आवृत्तीच्या बदलापूर्वी (major version jump) बॅकअप घ्या, कारण पहिल्यांदा सुरू करताना मायग्रेशन प्रक्रिया चालते आणि त्यानंतर मागील आवृत्तीवर परत जाण्याचा (downgrade) कोणताही मार्ग नसतो.
काय बिघडते आणि तुम्हाला काय दिसेल
ॲप लोड होते पण सिंक कधीच पूर्ण होत नाही. 413 साठी nginx ॲक्सेस लॉग तपासा. याचे कारण client_max_body_size खूप कमी असणे हे आहे. 502 चा अर्थ असा की nginx सुरू आहे पण कंटेनर नाही.
एनक्रिप्शन पर्याय दिसत नाहीत किंवा मोबाईल ॲप URL नाकारते. पेज सुरक्षित संदर्भात (secure context) नाही. ॲड्रेस बारमध्ये http:// दिसेल, ज्यामध्ये IP ॲड्रेस किंवा होस्टनेम असेल जे localhost नाही. यावर उपाय शोधण्याऐवजी प्रमाणपत्र (certificate) दुरुस्त करा.
बजेट फाईल या आवृत्तीशी सुसंगत नसल्याचा संदेश. क्लायंट आणि सर्व्हरच्या आवृत्त्यांमध्ये तफावत निर्माण झाली आहे. दोन्ही एकाच रिलीजवर अपडेट करा आणि पुन्हा लोड करा.
कंटेनर लूपमध्ये रीस्टार्ट होतो. docker compose logs actual वाचा. /data वर परमिशन एरर असण्याचा अर्थ असा की माउंट केलेली डिरेक्टरी कंटेनरच्या युजरसाठी राईटेबल नाही. ॲड्रेस-इन-युज एररचा अर्थ असा की लूपबॅकवर 5006 पोर्ट आधीच दुसऱ्या कशाने तरी व्यापले आहे.
पहिले लोड होणे संथ वाटते. तुम्ही बजेट फाईल उघडता तेव्हा ती पूर्णपणे ब्राउझरमध्ये डाउनलोड होते. हे एक मोठे ट्रान्सफर आहे, त्यानंतर स्थानिक वाचन (local reads) होते. ही सर्व्हरच्या आकाराची समस्या नाही आणि RAM वाढवल्याने यात कोणताही बदल होणार नाही.
FAQ
Actual Budget ला काम करण्यासाठी HTTPS ची गरज आहे का?
हो, व्यवहारात गरज आहे. Actual चे एंड-टू-एंड एन्क्रिप्शन ब्राउझरच्या Web Crypto API चा वापर करते आणि ब्राउझर हे केवळ सुरक्षित संदर्भातच उपलब्ध करून देतात, ज्याचा अर्थ https:// किंवा http://localhost असा होतो. दुसऱ्या मशीनवरून साध्या HTTP द्वारे हे फिचर्स उपलब्ध नसतात आणि अधिकृत मोबाईल ॲप्स साध्या HTTP सर्व्हर URL ला नाकारतात. जर तुम्ही फक्त डेस्कटॉप ब्राउझर वापरत असाल, तर एका खऱ्या होस्टनेमवर Let's Encrypt प्रमाणपत्र वापरा किंवा ACTUAL_HTTPS_KEY आणि ACTUAL_HTTPS_CERT सह सेल्फ-साइंड प्रमाणपत्र वापरा.
Actual माझ्या बँकेचे व्यवहार आपोआप इम्पोर्ट करू शकते का?
केवळ तुम्ही स्वतः साइन-अप केलेल्या तृतीय-पक्ष सेवेद्वारे: उत्तर अमेरिकेत SimpleFIN Bridge, युरोपमध्ये Enable Banking, न्यूझीलंडमध्ये Akahu किंवा ब्राझीलमध्ये Pluggy.ai. GoCardless समर्थित आहे परंतु ते नवीन खाती स्वीकारत नाही. हे API क्रेडेंशियल्स तुमच्या सर्व्हरवर राहतात आणि ते एंड-टू-एंड एन्क्रिप्शनच्या कक्षेत येत नाहीत. सिंक देखील मॅन्युअल आहे, त्यामुळे तुम्हाला बटण दाबावे लागते आणि बॅकग्राउंडमध्ये काहीही पोल होत नाही. CSV, QIF, OFX आणि QFX इम्पोर्टसाठी कोणत्याही तृतीय पक्षाची गरज नाही.
मला नेमका कशाचा बॅकअप घ्यावा लागेल?
माउंट केलेली डेटा डिरेक्टरी, जी या मार्गदर्शिकेमध्ये /opt/actual/data आहे. यामध्ये लॉगिन आणि सेशन्ससह server-files/account.sqlite आणि बजेट फाइल्ससह user-files समाविष्ट असते. कॉपी करण्यापूर्वी कंटेनर थांबवा, कारण चालू असलेल्या SQLite डेटाबेसची कॉपी केल्यास अर्धवट लिहिलेला डेटा (partial write) कॉपी होऊ शकतो. सर्व्हरवर इतर कोणतीही गोष्ट स्टेट (state) राखून ठेवत नाही.
जर मी एन्क्रिप्शन पासवर्ड विसरलो तर काय होईल?
फाइल रिकव्हर करता येणार नाही. पासवर्ड कधीही सर्व्हरपर्यंत पोहोचत नाही, जे एंड-टू-एंड एन्क्रिप्शनचे मुख्य उद्दिष्ट आहे, त्यामुळे पासवर्ड रिसेट करण्याचा कोणताही मार्ग नाही आणि कोणतीही सपोर्ट सुविधा नाही. फाइल तयार केल्याबरोबर ती पासवर्ड मॅनेजरमध्ये सेव्ह करा आणि त्याची एक प्रत अशा ठिकाणी ठेवा जी याच सर्व्हरवर अवलंबून नाही.
Actual Budget साठी किती सर्व्हर क्षमतेची गरज आहे?
खूप कमी. कंटेनर स्टॅटिक ॲसेट्स आणि फाइल्स सर्व्ह करतो आणि बजेटची गणना ब्राउझरमध्ये होते. 1 GB RAM असलेला एक शेअर केलेला vCPU याला कोणत्याही तक्रारीशिवाय चालवतो आणि अनेक वर्षांचा इतिहास असलेल्या घरगुती बजेटसाठी डेटा डिरेक्टरी काही दहापट MB मध्येच राहते. डिस्कवरील ताण तुमच्या बॅकअपमुळे आणि इतर कंटेनर्समुळे येतो, Actual मुळे नाही.