SSD Nodes Learn Hosting plans →
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-27

Actual Budget को VPS पर कैसे host करें: पूरी गाइड

Actual Budget को Docker Compose के जरिए VPS पर सेटअप करना सीखें। HTTPS की अनिवार्यता, डेटा वॉल्यूम कॉन्फ़िगरेशन, बैंक इम्पोर्ट और सुरक्षित बैकअप लेने की पूरी प्रक्रिया यहाँ समझें।

आप क्या बना रहे हैं

Actual Budget एक self-hosted envelope budgeting app है। जब लोग YNAB का ऐसा विकल्प ढूंढते हैं जिसे वे स्वयं host कर सकें, तो यह सबसे आम जवाब होता है। इसका सर्वर एक container, एक data volume और एक HTTPS नाम पर आधारित है। एक सामान्य बजट के लिए आवश्यक सभी चीजें सबसे छोटे VPS पर भी आसानी से चल जाती हैं, क्योंकि सर्वर मुख्य रूप से फाइलों को स्टोर और सिंक करने का काम करता है।

कुछ भी टाइप करने से पहले इसकी architecture को समझना जरूरी है। बजट स्वयं एक SQLite database है जो आपके browser और प्रत्येक mobile app के अंदर रहता है। जिस सर्वर को आप install करने जा रहे हैं, वह एक sync endpoint है: यह account list, budget files और change log को सुरक्षित रखता है, जिससे phone और laptop के बीच तालमेल बना रहता है। यही कारण है कि सर्वर डाउन होने पर भी app काम करती रहती है, और यदि आपके पास किसी एक client में भी copy मौजूद है, तो सर्वर खो जाने पर भी आपका बजट सुरक्षित रहता है।

सर्वर के लिए HTTPS की आवश्यकता क्यों है

Actual को HTTPS की आवश्यकता होती है, और यह केवल एक औपचारिकता नहीं है। ब्राउज़र केवल Web Crypto API को expose करते हैं, जो कि Actual द्वारा अपने end-to-end encryption के लिए उपयोग किया जाने वाला इंटरफ़ेस है, और यह केवल उसी में उपलब्ध होता है जिसे specification एक secure context कहती है। एक secure context का अर्थ https:// या http://localhost है। यदि आप किसी अन्य मशीन पर ब्राउज़र में http://203.0.113.10:5006 से ऐप लोड करते हैं, तो वे सुविधाएँ उपलब्ध नहीं होंगी, क्योंकि ब्राउज़र ने उन्हें पेज तक कभी पहुँचाया ही नहीं। आधिकारिक मोबाइल बिल्ड भी plain http:// सर्वर URL को स्वीकार करने से मना कर देते हैं।

इसलिए, दो व्यावहारिक सेटअप मौजूद हैं। कंटेनर के सामने एक वास्तविक नाम पर एक वास्तविक certificate लगाएँ, जो कि यह गाइड करती है। या फिर सर्वर को ACTUAL_HTTPS_KEY और ACTUAL_HTTPS_CERT के साथ एक self-signed certificate दें, जैसा कि प्रोजेक्ट के दस्तावेज़ों में बताया गया है, और हर डिवाइस पर ब्राउज़र की चेतावनी को स्वीकार करें। Let's Encrypt से एक मुफ्त certificate प्राप्त करने में केवल पाँच मिनट लगते हैं, इसलिए पहले विकल्प को चुनें।

Docker Compose के साथ Actual Budget इंस्टॉल करें

यदि सर्वर नया है, तो पहले Docker इंस्टॉल करें। यदि Compose file का सिंटैक्स आपके लिए नया है, तो VPS के लिए Docker Compose की बुनियादी जानकारी गाइड में नीचे उपयोग किए गए fields की व्याख्या दी गई है।

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 लाइन के रूप में दिखाई देती है।

एक certificate और एक real name का उपयोग करें

VPS पर एक A record point करें, budget.example.com, और इसके resolve होने की प्रतीक्षा करें। इसके बाद nginx install करें और certificate जारी करें। Ubuntu 24.04 पर nginx के साथ Certbot गाइड में issuance और renewal timer की पूरी जानकारी दी गई है।

Proxy block:

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 वह line है जिसे लोग अक्सर भूल जाते हैं। full sync के दौरान budget file पूरी तरह upload होती है। Nginx का default request body limit 1 MB है, इसलिए जैसे ही file इससे बड़ी होती है, sync विफल हो जाता है और nginx access log में 413 Request Entity Too Large दिखाई देता है, जबकि app केवल एक सामान्य sync error दिखाता है। Server की अपनी अलग सीमाएँ होती हैं: ACTUAL_UPLOAD_FILE_SYNC_SIZE_LIMIT_MB का default 20 है और ACTUAL_UPLOAD_SYNC_ENCRYPTED_FILE_SYNC_SIZE_LIMIT_MB का default 50 है, इसलिए nginx limit को उस मान से अधिक set करें जो आप पर लागू होता है।

Reload करें और test करें:

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 आपसे पूछेगा कि क्या आप end-to-end encryption सक्षम करना चाहते हैं। हाँ चुनें, इससे सर्वर केवल ciphertext स्टोर करेगा, जो किराए की मशीन पर वित्तीय डेटा के लिए सही विकल्प है। इसकी एक कीमत है: encryption पासवर्ड कभी सर्वर तक नहीं पहुँचता, इसलिए यदि आप इसे खो देते हैं, तो फ़ाइल हमेशा के लिए नष्ट हो जाएगी और इसे रीसेट करने का कोई तरीका नहीं है। उस स्क्रीन से आगे बढ़ने से पहले इसे कहीं लिख लें।

अपने शुरुआती बैलेंस को अपने बैंक के वर्तमान आंकड़ों के आधार पर सेट करें, न कि वर्षों का पुराना इतिहास आयात करें। Envelope budgeting आपके पास मौजूद वर्तमान धन से आगे की ओर काम करती है, इसलिए इतिहास खाली होने से आपको कोई नुकसान नहीं होगा।

लेन-देन (transactions) को इम्पोर्ट करना

यहाँ उत्साह से अधिक ईमानदारी मायने रखती है, क्योंकि इम्पोर्ट की प्रक्रिया ही मुख्य कारण है कि लोग self-hosted बजटिंग का उपयोग करना क्यों छोड़ देते हैं।

मैन्युअल एंट्री आधारभूत तरीका है और यह हमेशा काम करता है। envelope method के लिए यह तर्कसंगत रूप से सबसे महत्वपूर्ण है, क्योंकि खरीदारी को टाइप करने से ही आपको उसका एहसास होता है।

File import बड़ी मात्रा में डेटा को संभालने के काम आता है। Actual, CSV, QIF, OFX और QFX फॉर्मेट को पढ़ सकता है, और हर बैंक कम से कम इनमें से एक फॉर्मेट में डेटा एक्सपोर्ट करने की सुविधा देता है। अकाउंट स्क्रीन से प्रति अकाउंट इम्पोर्ट करें, कॉलम को एक बार मैप करें, और Actual उस अकाउंट के लिए उस लेआउट को याद रखेगा।

Automatic bank sync की सुविधा मौजूद है, और इसके लिए एक third-party service की आवश्यकता होती है क्योंकि सर्वर स्वयं बैंकों से संपर्क नहीं कर सकता। Actual, उत्तरी अमेरिकी बैंकों के लिए SimpleFIN Bridge, यूरोप के लिए Enable Banking, न्यूजीलैंड के लिए Akahu और ब्राजील के लिए Pluggy.ai को सपोर्ट करता है। GoCardless अभी भी समर्थित है लेकिन नए अकाउंट स्वीकार नहीं कर रहा है। आप स्वयं प्रदाता (provider) के साथ साइन अप करें, क्रेडेंशियल्स जनरेट करें और उन्हें सर्वर में जोड़ें। जुलाई 2026 तक, SimpleFIN Bridge 25 संस्थानों तक के लिए 15 US dollars प्रति वर्ष का शुल्क लेता है, और अन्य प्रदाताओं की कीमतें अलग हैं।

इस पर निर्भर होने से पहले दो सीमाओं को स्वीकार करें। API क्रेडेंशियल्स सर्वर पर रहते हैं और end-to-end encryption के अंतर्गत नहीं आते हैं, क्योंकि सर्वर को इनका उपयोग करना होता है। और Actual डेटा को अपने आप पोल (poll) नहीं करता है: सिंकिंग एक बटन है जिसे आप दबाते हैं, यह कोई background job नहीं है।

बैकअप, क्योंकि यह केवल फाइलें हैं

आपकी सभी महत्वपूर्ण चीजें /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 --detach

Compose नए image से container को फिर बनाता है और उसी volume को दोबारा जोड़ता है, इसलिए data सुरक्षित रहता है। Clients को भी update करें। Server और app के versions में अधिक अंतर नहीं होना चाहिए। Server से काफी पुराना client version mismatch message दिखाकर sync करने से इनकार कर सकता है। Major version jump से पहले backup लें, क्योंकि migration पहली बार start होने पर चलती है और downgrade का कोई तरीका नहीं होता। Floating latest tag के साथ Actual अपेक्षाकृत forgiving है, क्योंकि उसका state files की एक directory होती है। वास्तविक database रखने वाले app के साथ ऐसा नहीं होता। Chatwoot को self-host करना pinned tags और उस प्रक्रिया के लिए आवश्यक pre-upgrade dump के बारे में बताता है।

क्या खराब होता है, और आप क्या देखेंगे

ऐप लोड होता है लेकिन सिंक कभी पूरा नहीं होता। 413 के लिए nginx एक्सेस लॉग देखें। इसका मतलब है कि client_max_body_size बहुत कम सेट है। इसके बजाय 502 का मतलब है कि nginx चालू है लेकिन कंटेनर नहीं।

एन्क्रिप्शन विकल्प गायब हैं, या मोबाइल ऐप URL को स्वीकार नहीं कर रहा है। पेज सुरक्षित संदर्भ (secure context) में नहीं है। एड्रेस बार में http:// दिखाई देगा, जिसमें IP एड्रेस या ऐसा होस्टनेम होगा जो localhost नहीं है। इसे बायपास करने के बजाय सर्टिफिकेट को ठीक करें।

एक संदेश कि बजट फ़ाइल इस वर्ज़न के साथ संगत नहीं है। क्लाइंट और सर्वर के वर्ज़न अलग-अलग हो गए हैं। दोनों को एक ही रिलीज़ पर अपडेट करें और रीलोड करें।

कंटेनर लूप में रीस्टार्ट हो रहा है। docker compose logs actual पढ़ें। /data पर परमिशन एरर का मतलब है कि माउंट की गई डायरेक्टरी कंटेनर के यूजर द्वारा राइट करने योग्य नहीं है। एड्रेस-इन-यूज़ एरर का मतलब है कि लूपबैक पर 5006 पोर्ट पहले से ही किसी अन्य प्रक्रिया द्वारा उपयोग में है।

पहली बार लोड होने में समय लगता है। जब आप बजट फ़ाइल खोलते हैं, तो पूरी फ़ाइल ब्राउज़र में डाउनलोड होती है। यह एक बड़ा ट्रांसफर है, उसके बाद स्थानीय स्तर पर रीड होता है। यह सर्वर की क्षमता की समस्या नहीं है, और RAM बढ़ाने से इसमें कोई बदलाव नहीं आएगा।

FAQ

क्या Actual Budget को काम करने के लिए HTTPS की आवश्यकता है?

हाँ, व्यावहारिक रूप से। Actual का end-to-end encryption ब्राउज़र के Web Crypto API का उपयोग करता है, और ब्राउज़र इसे केवल एक सुरक्षित context में ही expose करते हैं, जिसका अर्थ है https:// या http://localhost। किसी अन्य मशीन से plain HTTP पर ये सुविधाएँ उपलब्ध नहीं होती हैं, और आधिकारिक मोबाइल ऐप्स plain HTTP सर्वर URL को स्वीकार करने से मना कर देते हैं। एक वास्तविक hostname पर Let’s Encrypt certificate का उपयोग करें, या यदि आप केवल desktop ब्राउज़र का उपयोग करते हैं तो ACTUAL_HTTPS_KEY और ACTUAL_HTTPS_CERT के साथ self-signed certificate का उपयोग करें।

क्या Actual मेरे बैंक ट्रांजेक्शन को स्वचालित रूप से import कर सकता है?

केवल एक third-party सेवा के माध्यम से जिसके लिए आप स्वयं साइन अप करते हैं: उत्तरी अमेरिका में SimpleFIN Bridge, यूरोप में Enable Banking, न्यूज़ीलैंड में Akahu, या ब्राज़ील में Pluggy.ai। GoCardless समर्थित है लेकिन नए खाते स्वीकार नहीं कर रहा है। वे API क्रेडेंशियल्स आपके सर्वर पर रहते हैं और end-to-end encryption के अंतर्गत नहीं आते हैं। सिंक भी मैन्युअल है, इसलिए आप एक बटन दबाते हैं और बैकग्राउंड में कुछ भी पोल नहीं होता है। CSV, QIF, OFX और QFX import के लिए किसी third-party की आवश्यकता नहीं होती है।

मुझे वास्तव में किसका बैकअप लेना होगा?

माउंट की गई डेटा डायरेक्टरी का, जो इस गाइड में /opt/actual/data है। इसमें लॉगिन और सत्रों के साथ server-files/account.sqlite, और बजट फ़ाइलों के साथ user-files शामिल हैं। कॉपी करने से पहले कंटेनर को रोक दें, क्योंकि लाइव SQLite डेटाबेस को कॉपी करने से अधूरा डेटा (partial write) आ सकता है। सर्वर पर अन्य कुछ भी स्टेट (state) को होल्ड नहीं करता है।

यदि मैं एन्क्रिप्शन पासवर्ड खो दूँ तो क्या होगा?

फ़ाइल को रिकवर नहीं किया जा सकता है। पासवर्ड कभी भी सर्वर तक नहीं पहुँचता है, जो end-to-end encryption का मुख्य उद्देश्य है, इसलिए इसे रीसेट करने का कोई तरीका नहीं है और न ही कोई सपोर्ट उपलब्ध है। फ़ाइल बनाते ही इसे पासवर्ड मैनेजर में स्टोर करें, और इसकी एक कॉपी ऐसी जगह रखें जो इसी सर्वर पर निर्भर न हो।

Actual Budget को कितने सर्वर संसाधनों की आवश्यकता है?

बहुत कम। कंटेनर static एसेट्स और फ़ाइलों को सर्व करता है, और बजट की गणना ब्राउज़र में होती है। 1 GB RAM के साथ एक shared vCPU इसे बिना किसी समस्या के चलाता है, और कई वर्षों के इतिहास वाले घरेलू बजट के लिए डेटा डायरेक्टरी का आकार कुछ ही MB में रहता है। डिस्क पर दबाव आपके बैकअप और अन्य कंटेनरों से आता है, Actual से नहीं। यदि आप एक ऐसे सर्वर का आकार निर्धारित कर रहे हैं जिसे साथ में कुछ भारी एप्लिकेशन भी चलाने हैं, तो आमतौर पर फोटो सर्वर ही न्यूनतम आवश्यकता तय करता है, इसलिए PhotoPrism और Immich को वास्तव में कितनी RAM चाहिए यह देखने के बाद ही कोई प्लान चुनें। यही तर्क मीडिया स्टैक पर भी लागू होता है: transcoding प्लान तय करता है, जबकि Halcyon, जो Jellyfin लाइब्रेरी को 90 के दशक के वीडियो स्टोर जैसा बनाता है जैसा ब्राउज़र फ्रंट-एंड Actual जितना ही कम संसाधन लेता है।