Actual Budget कसे होस्ट करावे: संपूर्ण मार्गदर्शक
Actual Budget ला Docker Compose वापरून VPS वर कसे होस्ट करावे हे शिका. HTTPS सेटअप, डेटा व्हॉल्यूम कॉन्फिगरेशन, बँक इम्पोर्ट आणि सुरक्षित बॅकअप घेण्याच्या पद्धतींची सविस्तर माहिती.
तुम्ही काय तयार करत आहात
Actual Budget हे एक self-hosted एन्वलप बजेटिंग ॲप आहे. जेव्हा लोक YNAB ला पर्याय शोधतात आणि तो स्वतः होस्ट करू इच्छितात, तेव्हा हे ॲप एक उत्तम पर्याय ठरते. या सर्व्हरमध्ये एक कंटेनर, एक डेटा व्हॉल्यूम आणि एक HTTPS नाव असते. सामान्य बजेटसाठी लागणाऱ्या सर्व गोष्टी तुम्ही भाड्याने घेतलेल्या सर्वात लहान VPS वरही आरामात चालू शकतात, कारण सर्व्हर प्रामुख्याने फाइल्स साठवण्याचे आणि त्या सिंक करण्याचे काम करतो.
कोणतीही कमांड टाइप करण्यापूर्वी या आर्किटेक्चरची माहिती असणे आवश्यक आहे. बजेट स्वतः एक SQLite डेटाबेस आहे, जो तुमच्या ब्राउझरमध्ये आणि प्रत्येक मोबाइल ॲपमध्ये असतो. तुम्ही जो सर्व्हर इन्स्टॉल करणार आहात, तो एक सिंक एंडपॉइंट (sync endpoint) आहे: तो अकाउंट लिस्ट, बजेट फाइल्स आणि चेंज लॉग साठवतो, ज्यामुळे फोन आणि लॅपटॉपमधील डेटा एकसमान राहतो. म्हणूनच सर्व्हर बंद असतानाही ॲप काम करते आणि जोपर्यंत एका क्लायंटकडे डेटाची प्रत उपलब्ध आहे, तोपर्यंत सर्व्हर गमावल्यास तुमचे बजेट सुरक्षित राहते.
सर्व्हरला HTTPS ची गरज का आहे
Actual साठी HTTPS आवश्यक आहे आणि ही केवळ एक औपचारिकता नाही. ब्राउझर्स केवळ 'secure context' मध्येच Web Crypto API उपलब्ध करून देतात, जे Actual च्या end-to-end encryption साठी वापरले जाणारे इंटरफेस आहे. 'secure context' म्हणजे https:// किंवा http://localhost. जर तुम्ही दुसऱ्या मशीनवरील ब्राउझरमध्ये http://203.0.113.10:5006 वरून ॲप लोड केले, तर हे फीचर्स तिथे नसतात, कारण ब्राउझरने ते पेजला दिलेलेच नसतात. अधिकृत मोबाईल बिल्ड्स सुद्धा साध्या http:// सर्व्हर URL ला नाकारतात.
त्यामुळे दोन कार्यक्षम सेटअप उपलब्ध आहेत. कंटेनरच्या समोर एका खऱ्या डोमेन नावावर अधिकृत प्रमाणपत्र (certificate) लावणे, जे या मार्गदर्शकामध्ये दिले आहे. किंवा ACTUAL_HTTPS_KEY आणि ACTUAL_HTTPS_CERT वापरून सर्व्हरला self-signed प्रमाणपत्र देणे, ज्याची माहिती प्रोजेक्टच्या दस्तऐवजात आहे, आणि प्रत्येक डिव्हाइसवर ब्राउझरची चेतावणी स्वीकारणे. 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 ला का बायपास करतात यामध्ये स्पष्ट केला आहे. लूपबॅक (loopback) वर बाइंड केल्यामुळे फक्त त्याच सर्व्हरवरील रिव्हर्स प्रॉक्सी त्यापर्यंत पोहोचू शकते.
ते सुरू करा:
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 record पॉइंट करा, budget.example.com, आणि तो रिझॉल्व्ह होण्याची प्रतीक्षा करा. त्यानंतर nginx इंस्टॉल करा आणि प्रमाणपत्र जारी करा. Certbot on Ubuntu 24.04 with nginx हे मार्गदर्शक प्रमाणपत्र जारी करणे आणि नूतनीकरण टायमरची संपूर्ण माहिती देते.
प्रॉक्सी ब्लॉक:
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 ही ओळ लोक विसरतात. पूर्ण सिंक करताना बजेट फाईल पूर्णपणे अपलोड केली जाते. 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 तुम्हाला end-to-end encryption सुरू करायचे आहे का, असे विचारेल. हो म्हणा, कारण सर्व्हरवर फक्त ciphertext साठवला जातो, जो भाड्याने घेतलेल्या मशीनवरील आर्थिक माहितीसाठी योग्य पर्याय आहे. याची एक अट आहे: encryption पासवर्ड कधीही सर्व्हरपर्यंत पोहोचत नाही, त्यामुळे जर तुम्ही तो गमावला, तर फाईल कायमची नष्ट होईल आणि ती पुन्हा मिळवण्याचा कोणताही मार्ग नाही. त्या स्क्रीनच्या पुढे जाण्यापूर्वी तो पासवर्ड लिहून ठेवा.
तुमच्या बँकेच्या सध्याच्या आकडेवारीवरून तुमची सुरुवातीची शिल्लक (starting balances) सेट करा, त्याऐवजी अनेक वर्षांचा इतिहास इम्पोर्ट करू नका. Envelope budgeting हे तुमच्याकडे सध्या असलेल्या पैशांपासून पुढे काम करते, त्यामुळे जुना इतिहास नसल्याने तुमचे कोणतेही नुकसान होत नाही.
व्यवहार (transactions) समाविष्ट करणे
येथे उत्साहापेक्षा प्रामाणिकपणा अधिक महत्त्वाचा आहे, कारण बजेटिंग सॉफ्टवेअर स्वतः होस्ट (self-hosted) करताना डेटा इम्पोर्ट करण्याची प्रक्रिया हीच वापरकर्ते सोडून जाण्याचे मुख्य कारण ठरते.
मॅन्युअल एन्ट्री हा पाया आहे आणि तो नेहमीच काम करतो. 'एनव्हलप' (envelope) पद्धतीसाठी हेच महत्त्वाचे आहे, कारण खरेदीची नोंद स्वतः टाईप केल्यामुळे तुम्हाला खर्चाची जाणीव होते.
फाईल इम्पोर्टद्वारे मोठ्या प्रमाणात डेटा हाताळता येतो. 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 startयाला restic backups on a VPS मधील पद्धतीचा वापर करून शेड्यूल करा. यामध्ये रिपॉझिटरी सेटअप, रिटेंशन आणि रिस्टोर ड्रिलची माहिती दिली आहे. रिस्टोर ड्रिल नक्की करून पहा. जो बॅकअप तुम्ही कधीही रिस्टोर करून पाहिला नाही, तो केवळ एक अंदाज असतो.
Actual चे स्वतःचे क्लायंट-साइड बॅकअप्स ही एक वेगळी गोष्ट आहे आणि त्याबद्दल माहिती असणे फायदेशीर आहे. ब्राउझर बजेट फाईलच्या अलीकडील प्रती जतन करून ठेवतो, ज्या फाईल मेनूमधून मिळवता येतात. यामुळे सर्व्हरला स्पर्श न करताही "मी चुकून एखादी कॅटेगरी डिलीट केली" अशा समस्या सोडवता येतात.
सर्व्हर अपडेट करणे
cd /opt/actual
docker compose pull
docker compose up --detachCompose नवीन image मधून container पुन्हा तयार करते आणि त्याच volume ला पुन्हा जोडते. त्यामुळे डेटा टिकून राहतो. Clients देखील अद्ययावत करा. Server आणि app च्या versions मध्ये फार मोठा फरक नसणे अपेक्षित आहे. Server पेक्षा खूप जुना client version mismatch संदेश देऊन sync नाकारू शकतो. Major version वर जाण्यापूर्वी backup घ्या. पहिल्यांदा सुरू होताना migrations चालतात आणि downgrade करण्याचा मार्ग उपलब्ध नसतो. Actual मध्ये floating latest tag वापरल्यास सहसा अडचण येत नाही, कारण त्याची state ही files असलेली directory असते. प्रत्यक्ष database असलेल्या app साठी हे लागू होत नाही. self-hosting Chatwoot मध्ये pinned tags आणि upgrade करण्यापूर्वी dump घेण्याची आवश्यक पद्धत सविस्तर दिली आहे.
काय बिघडते आणि तुम्हाला काय दिसेल
अॅप लोड होते पण सिंक कधीच पूर्ण होत नाही. nginx access log मध्ये 413 तपासा. हे client_max_body_size खूप कमी सेट केल्यामुळे होते. 502 चा अर्थ असा की nginx चालू आहे पण कंटेनर नाही.
एनक्रिप्शन पर्याय दिसत नाहीत किंवा मोबाईल अॅप URL स्वीकारत नाही. पेज सुरक्षित संदर्भात (secure context) नाही. ॲड्रेस बारमध्ये http:// दिसेल, ज्यामध्ये IP ॲड्रेस किंवा असा होस्टनेम असेल जो localhost नाही. पर्यायी मार्ग शोधण्याऐवजी प्रमाणपत्र (certificate) दुरुस्त करा.
बजेट फाईल या आवृत्तीशी सुसंगत नाही असा संदेश. क्लायंट आणि सर्व्हरच्या आवृत्त्यांमध्ये तफावत आहे. दोन्ही एकाच release वर अपडेट करा आणि रीलोड करा.
कंटेनर लूपमध्ये रीस्टार्ट होत आहे. docker compose logs actual वाचा. /data वर परमिशन एरर येण्याचा अर्थ असा की माउंट केलेल्या डिरेक्टरीमध्ये कंटेनरच्या युजरला लिहिण्याची (write) परवानगी नाही. 'Address-in-use' एररचा अर्थ असा की 5006 पोर्ट आधीच दुसऱ्या प्रक्रियेने व्यापला आहे.
पहिली वेळ लोड होण्यास वेळ लागतो. तुम्ही बजेट फाईल उघडता तेव्हा ती पूर्णपणे ब्राउझरमध्ये डाउनलोड होते. हे एक मोठे ट्रान्सफर असते, त्यानंतर स्थानिक वाचन (local reads) होते. ही सर्व्हरच्या क्षमतेची समस्या नाही, त्यामुळे RAM वाढवून काहीही फरक पडणार नाही.
FAQ
Actual Budget ला काम करण्यासाठी HTTPS ची गरज आहे का?
हो, व्यवहारात गरज आहे. Actual चे end-to-end encryption ब्राउझरच्या Web Crypto API चा वापर करते आणि ब्राउझर हे API फक्त सुरक्षित संदर्भात (secure context) उपलब्ध करून देतात, म्हणजेच https:// किंवा http://localhost. दुसऱ्या मशीनवरून साध्या HTTP द्वारे हे फीचर्स उपलब्ध नसतात आणि अधिकृत मोबाईल ॲप्स साध्या HTTP सर्व्हर URL ला स्वीकारण्यास नकार देतात. खऱ्या hostname वर Let's Encrypt प्रमाणपत्र वापरा, किंवा जर तुम्ही फक्त डेस्कटॉप ब्राउझर वापरत असाल तर ACTUAL_HTTPS_KEY आणि ACTUAL_HTTPS_CERT सह self-signed प्रमाणपत्र वापरा.
Actual माझ्या बँकेचे व्यवहार आपोआप इम्पोर्ट करू शकते का?
केवळ तुम्ही स्वतःहून साइन-अप केलेल्या थर्ड-पार्टी सर्व्हिसद्वारे: उत्तर अमेरिकेत SimpleFIN Bridge, युरोपमध्ये Enable Banking, न्यूझीलंडमध्ये Akahu, किंवा ब्राझीलमध्ये Pluggy.ai. GoCardless समर्थित आहे परंतु ते नवीन खाती स्वीकारत नाही. हे API क्रेडेंशियल्स तुमच्या सर्व्हरवर राहतात आणि ते end-to-end encryption च्या कक्षेत येत नाहीत. सिंक (sync) देखील मॅन्युअल आहे, त्यामुळे तुम्हाला बटण दाबावे लागते आणि बॅकग्राउंडमध्ये कोणतीही प्रक्रिया आपोआप चालत नाही. CSV, QIF, OFX आणि QFX इम्पोर्टसाठी कोणत्याही थर्ड-पार्टीची गरज नसते.
मला नक्की कशाचा बॅकअप घ्यावा लागेल?
माउंट केलेली डेटा डिरेक्टरी, जी या मार्गदर्शिकेमध्ये /opt/actual/data आहे. यामध्ये लॉगिन आणि सेशन्स असलेली server-files/account.sqlite आणि बजेट फाइल्स असलेली user-files समाविष्ट असते. कॉपी करण्यापूर्वी कंटेनर थांबवा, कारण चालू असलेल्या SQLite डेटाबेसची कॉपी करताना अर्धवट लिहिलेला डेटा (partial write) कॉपी होऊ शकतो. सर्व्हरवर इतर कोणतीही गोष्ट स्टेट (state) साठवत नाही.
जर मी एन्क्रिप्शन पासवर्ड विसरलो तर काय होईल?
ती फाइल पुन्हा मिळवता येणार नाही. पासवर्ड कधीही सर्व्हरपर्यंत पोहोचत नाही, हेच end-to-end encryption चे मुख्य वैशिष्ट्य आहे, त्यामुळे पासवर्ड रिसेट करण्याचा कोणताही मार्ग किंवा सपोर्ट उपलब्ध नाही. फाइल तयार केल्याबरोबर ती पासवर्ड मॅनेजरमध्ये सेव्ह करा आणि त्याची एक प्रत अशा ठिकाणी ठेवा जी याच सर्व्हरवर अवलंबून नाही.
Actual Budget साठी किती क्षमतेचा सर्व्हर लागतो?
खूप कमी. कंटेनर फक्त स्टॅटिक ॲसेट्स आणि फाइल्स सर्व्ह करतो, तर बजेटची गणना ब्राउझरमध्ये होते. 1 GB RAM असलेला एक शेअर केलेला vCPU याला कोणत्याही तक्रारीशिवाय चालवू शकतो आणि अनेक वर्षांचा इतिहास असलेल्या घरगुती बजेटची डेटा डिरेक्टरी काही दहापट MB मध्येच राहते. डिस्कवरील ताण तुमच्या बॅकअप्स आणि इतर कंटेनर्समुळे येतो, Actual मुळे नाही. जर तुम्ही अशा सर्व्हरची निवड करत असाल ज्यावर अधिक संसाधने लागणारे ॲप्स चालवायचे असतील, तर फोटो सर्व्हर सहसा किमान क्षमतेची मर्यादा ठरवतो, म्हणून PhotoPrism आणि Immich ला प्रत्यक्षात किती RAM लागते हे तपासा आणि मगच प्लॅन निवडा.