Actual Budget को VPS पर कैसे होस्ट करें
Docker Compose का उपयोग करके Actual Budget को अपने VPS पर सेटअप करें। डेटा वॉल्यूम कॉन्फ़िगरेशन, HTTPS की अनिवार्यता, बैंक इंपोर्ट और सुरक्षित बैकअप लेने की पूरी प्रक्रिया यहाँ जानें।
आप क्या बना रहे हैं
Actual Budget एक सेल्फ-होस्टेड एनवेलप बजटिंग ऐप है। जब लोग YNAB के ऐसे विकल्प की तलाश करते हैं जिसे वे स्वयं होस्ट कर सकें, तो यह सबसे सामान्य उत्तर होता है। इसका सर्वर एक कंटेनर, एक डेटा वॉल्यूम और एक HTTPS नाम का उपयोग करता है। एक सामान्य बजट के लिए आवश्यक सभी चीजें सबसे छोटे VPS पर भी आसानी से चल जाती हैं, क्योंकि सर्वर मुख्य रूप से फाइलों को स्टोर और सिंक करता है।
कुछ भी टाइप करने से पहले इसके आर्किटेक्चर को समझना उपयोगी है। बजट स्वयं एक SQLite डेटाबेस है जो आपके ब्राउज़र और प्रत्येक मोबाइल ऐप के अंदर रहता है। जिस सर्वर को आप इंस्टॉल करने जा रहे हैं, वह एक सिंक एंडपॉइंट है: यह अकाउंट लिस्ट, बजट फाइलें और वह चेंज लॉग रखता है जो फोन और लैपटॉप के बीच सामंजस्य बनाए रखता है। यही कारण है कि सर्वर डाउन होने पर भी ऐप काम करता रहता है, और यदि एक भी क्लाइंट के पास कॉपी मौजूद हो, तो सर्वर खो जाने पर भी आपका बजट सुरक्षित रहता है।
सर्वर को HTTPS की आवश्यकता क्यों है
Actual के लिए HTTPS अनिवार्य है, यह केवल एक औपचारिकता नहीं है। ब्राउज़र केवल 'secure context' में ही Web Crypto API को एक्सपोज़ करते हैं, जो कि वह इंटरफ़ेस है जिसका उपयोग Actual अपने एंड-टू-एंड एन्क्रिप्शन के लिए करता है। एक 'secure context' का अर्थ है https:// या http://localhost। यदि आप किसी अन्य मशीन पर ब्राउज़र में http://203.0.113.10:5006 से ऐप लोड करते हैं, तो ये सुविधाएँ उपलब्ध नहीं होंगी, क्योंकि ब्राउज़र ने उन्हें पेज को प्रदान ही नहीं किया है। आधिकारिक मोबाइल बिल्ड भी सादे http:// सर्वर URL को स्वीकार नहीं करते हैं।
इसलिए, दो व्यावहारिक सेटअप उपलब्ध हैं। पहला विकल्प यह है कि कंटेनर के सामने एक वास्तविक नाम पर एक वास्तविक सर्टिफिकेट लगाएँ, जैसा कि यह गाइड बताती है। दूसरा विकल्प यह है कि सर्वर को 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 वह लाइन है जिसे लोग भूल जाते हैं। फुल सिंक के दौरान बजट फ़ाइल पूरी तरह से अपलोड की जाती है। 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 को ब्राउज़र में खोलें। पहली स्क्रीन आपसे सर्वर पासवर्ड सेट करने के लिए कहेगी। यह एक पासवर्ड पूरे सर्वर की सुरक्षा करता है, इसलिए एक लंबा रैंडम पासवर्ड बनाएं और उसे ऐसी जगह सुरक्षित रखें जहाँ आप उसे दोबारा पा सकें, जैसे कि self-hosted Vaultwarden password manager में। इसमें बनाने के लिए कोई यूज़र अकाउंट नहीं है। Actual का सर्वर डिज़ाइन के अनुसार सिंगल-पासवर्ड वाला है, इसलिए बजट साझा करने का मतलब है पासवर्ड साझा करना।
इसके बाद एक बजट फ़ाइल बनाएं। Actual आपसे पूछेगा कि क्या आप एंड-टू-एंड एन्क्रिप्शन सक्षम करना चाहते हैं। हाँ चुनें और सर्वर केवल सिफरटेक्स्ट (ciphertext) स्टोर करेगा, जो किराए की मशीन पर वित्तीय डेटा के लिए सही विकल्प है। इसकी एक वास्तविक कीमत है: एन्क्रिप्शन पासवर्ड कभी भी सर्वर तक नहीं पहुँचता है, इसलिए यदि आप इसे खो देते हैं तो फ़ाइल हमेशा के लिए नष्ट हो जाएगी और इसे रीसेट करने का कोई तरीका नहीं है। उस स्क्रीन से आगे बढ़ने से पहले इसे कहीं लिख लें।
इतिहास के वर्षों को इम्पोर्ट करने के बजाय अपने बैंक के वर्तमान आंकड़ों से अपना शुरुआती बैलेंस सेट करें। एनवेलप बजटिंग आपके पास मौजूद वर्तमान पैसों से आगे की ओर काम करती है, इसलिए खाली इतिहास से आपको कोई नुकसान नहीं होगा।
ट्रांजेक्शन दर्ज करना
यहाँ उत्साह से अधिक ईमानदारी मायने रखती है, क्योंकि इम्पोर्ट की प्रक्रिया ही मुख्य कारण है कि लोग सेल्फ-होस्टेड बजटिंग का उपयोग करना छोड़ देते हैं।
मैन्युअल एंट्री आधारभूत तरीका है और यह हमेशा काम करता है। एनवेलप मेथड के लिए यह तर्कसंगत रूप से महत्वपूर्ण है, क्योंकि खरीदारी को टाइप करने से ही आप उसके प्रति जागरूक होते हैं।
फाइल इम्पोर्ट थोक डेटा को संभालता है। 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 को कॉपी करने से अधूरा ट्रांजेक्शन कॉपी हो सकता है, और आपको इसका पता तब तक नहीं चलेगा जब तक आप रिस्टोर करने का प्रयास नहीं करते। कॉपी करने के दौरान लगने वाले कुछ सेकंड के लिए कंटेनर को रोकें:
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 नई इमेज से कंटेनर को फिर से बनाता है और उसी वॉल्यूम को दोबारा अटैच करता है, इसलिए डेटा सुरक्षित रहता है। क्लाइंट्स को भी अपडेट करें। सर्वर और ऐप के वर्ज़न को एक-दूसरे के करीब रखना आवश्यक है, और सर्वर से काफी पुराना क्लाइंट वर्ज़न मिसमैच संदेश के साथ सिंक करने से इनकार कर सकता है। मेजर वर्ज़न जंप से पहले बैकअप लें, क्योंकि माइग्रेशन पहली बार स्टार्ट करने पर चलते हैं और डाउनग्रेड का कोई विकल्प उपलब्ध नहीं है।
क्या खराब होता है, और आप क्या देखेंगे
ऐप लोड होता है लेकिन सिंक कभी पूरा नहीं होता। 413 के लिए nginx एक्सेस लॉग की जाँच करें। इसका मतलब है कि client_max_body_size बहुत कम सेट है। 502 का मतलब है कि nginx चालू है लेकिन कंटेनर नहीं।
एन्क्रिप्शन विकल्प गायब हैं, या मोबाइल ऐप URL को स्वीकार नहीं कर रहा है। पेज सुरक्षित संदर्भ (secure context) में नहीं है। एड्रेस बार में IP एड्रेस या ऐसा होस्टनेम दिखेगा जो http:// के साथ localhost नहीं है। इसे बायपास करने के बजाय सर्टिफिकेट को ठीक करें।
एक संदेश कि बजट फ़ाइल इस वर्शन के साथ संगत नहीं है। क्लाइंट और सर्वर के वर्शन अलग-अलग हो गए हैं। दोनों को एक ही रिलीज़ पर अपडेट करें और रीलोड करें।
कंटेनर लूप में रीस्टार्ट हो रहा है। docker compose logs actual पढ़ें। /data पर परमिशन एरर का मतलब है कि माउंट की गई डायरेक्टरी कंटेनर के यूजर द्वारा राइट करने योग्य नहीं है। एड्रेस-इन-यूज़ एरर का मतलब है कि लूपबैक पर 5006 पोर्ट पहले से ही किसी और प्रक्रिया द्वारा उपयोग किया जा रहा है।
पहली बार लोड होने में देरी महसूस होती है। जब आप बजट फ़ाइल खोलते हैं, तो पूरी फ़ाइल ब्राउज़र में डाउनलोड होती है। यह एक बड़ा ट्रांसफर है, उसके बाद लोकल रीड्स होते हैं। यह सर्वर की क्षमता की समस्या नहीं है, और 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 डेटाबेस को कॉपी करने से अधूरा राइट कैप्चर हो सकता है। सर्वर पर अन्य कुछ भी स्टेट नहीं रखता है।
यदि मैं एन्क्रिप्शन पासवर्ड खो दूँ तो क्या होगा?
फ़ाइल को रिकवर नहीं किया जा सकता है। पासवर्ड कभी भी सर्वर तक नहीं पहुँचता है, जो एंड-टू-एंड एन्क्रिप्शन का मुख्य उद्देश्य है, इसलिए कोई रीसेट और कोई सपोर्ट पाथ नहीं है। फ़ाइल बनाते ही इसे पासवर्ड मैनेजर में स्टोर करें, और इसकी एक कॉपी ऐसी जगह रखें जो इसी सर्वर पर निर्भर न हो।
Actual Budget को कितने सर्वर की आवश्यकता है?
बहुत कम। कंटेनर स्टेटिक एसेट्स और फ़ाइलों को सर्व करता है, और बजट की गणना ब्राउज़र में होती है। 1 GB RAM के साथ एक साझा vCPU इसे बिना किसी समस्या के चलाता है, और कई वर्षों के इतिहास वाले घरेलू बजट के लिए डेटा निर्देशिका का आकार कुछ दसियों मेगाबाइट में रहता है। डिस्क पर दबाव आपके बैकअप और अन्य कंटेनरों से आता है, Actual से नहीं।