सामग्री पर जाएं
Docker Compose

Docker Compose

Markdown के रूप में देखें

Docker Compose से एक ही Linux सर्वर पर पूरा, मुफ़्त Status200 इंस्टेंस चलाएँ। यह पेज आपको एक नए सर्वर से चलते हुए इंस्टेंस तक ले जाता है, फिर HTTPS, प्रोडक्शन के लिए मज़बूती, बैकअप, अपडेट और हटाने के बारे में बताता है। इसके बजाय Status200 के अपने कोड पर काम करने के लिए देखें स्थानीय विकास।

यह कैसे काम करता है

Docker Compose, Status200 के हर हिस्से को आपके सर्वर पर कंटेनर के रूप में चलाता है। सारा ट्रैफ़िक ingress कंटेनर से आता है, जो उसे app तक भेजता है। ऐप अपना डेटा PostgreSQL, ClickHouse और Valkey में रखता है। साथ आने वाला प्रोब आपके मॉनिटरों की जाँच चलाता है और ingress के ज़रिए नतीजे वापस भेजता है।

flowchart TB Users["उपयोगकर्ता<br/>और एजेंट"] Proxy["आपकी रिवर्स<br/>प्रॉक्सी,<br/>वैकल्पिक"] Targets["आपकी मॉनिटर की<br/>जाने वाली साइटें"] subgraph Server["आपका सर्वर"] Ingress["ingress"] App["app"] Probe["probe-1"] Runner["runner"] subgraph Data["डेटा स्टोर"] direction LR PG[("postgres")] CH[("clickhouse")] VK[("valkey")] end end Users -->|HTTPS| Proxy Proxy -->|HTTP| Ingress Users -.->|"प्रॉक्सी<br/>के बिना"| Ingress Ingress --> App App --> PG App --> CH App --> VK Probe -->|नतीजे| Ingress Runner -->|जॉब| Ingress Probe -->|जाँच| Targets Data ~~~ Probe Data ~~~ Runner

Docker Compose डिप्लॉयमेंट

सेवाइमेजयह क्या करती है
ingressstatus200/nginxपोर्ट 80 और 443 पर सारा ट्रैफ़िक लेती है और उसे ऐप तक भेजती है। जब Status200 सर्टिफ़िकेट संभालता है, तब HTTPS देती है।
appstatus200/appडैशबोर्ड, API, स्टेटस पेज, टेलीमेट्री इनजेस्ट और बैकग्राउंड वर्कर।
probe-1status200/probeएक ग्लोबल प्रोब जो आपके मॉनिटरों की जाँच चलाता है। यह होस्ट का नेटवर्क इस्तेमाल करता है।
runnerstatus200/runnerइंस्टेंस का Runner, जो AI से कोड फ़िक्स चलाता है। यह होस्ट का नेटवर्क इस्तेमाल करता है।
postgrespostgres:15कॉन्फ़िगरेशन और स्थिति: मॉनिटर, इंसिडेंट, उपयोगकर्ता। postgres वॉल्यूम में रखा जाता है।
clickhouseclickhouse/clickhouse-server:26.7टेलीमेट्री: लॉग, मेट्रिक्स, ट्रेस और एक्सेप्शन। clickhouse वॉल्यूम में रखी जाती है।
valkeyvalkey/valkey:9.1-alpineकैश और कतारें। यह डिस्क पर कुछ नहीं रखती।
नोट
valkey सेवा Valkey चलाती है, जो Redis 7.2 का BSD लाइसेंस वाला फ़ोर्क है, और config.env की VALKEY_* सेटिंग्स से कॉन्फ़िगर होती है। Redis प्रोटोकॉल वाला कोई भी सर्वर काम करता है — चाहें तो VALKEY_HOST को किसी मैनेज्ड Redis की ओर करें। 13.0.0 तक इन सेटिंग्स के नाम REDIS_* थे; पुराने नाम अब भी पढ़े जाते हैं, कंटेनर अब भी होस्टनेम redis पर जवाब देता है, और npm run update उन्हें दोबारा नहीं लिखता, इसलिए पुराने config.env में बदलाव की ज़रूरत नहीं है।

बड़े पैमाने के प्रोडक्शन के लिए, या जब आपको हाई अवेलेबिलिटी चाहिए, इसके बजाय Kubernetes पर Helm चार्ट इस्तेमाल करें: Docker Compose एक सर्वर पर हर सेवा की एक ही कॉपी चलाता है।

ज़रूरतें

सर्वर का आकार इस हिसाब से चुनें कि आप उस पर क्या चलाएँगे। मेमोरी और डिस्क टेलीमेट्री (लॉग, मेट्रिक्स, ट्रेस) तय करती है; अपनी मात्रा पता चलने पर साइज़िंग और क्षमता नियोजन देखें।

सुझाया गयाहोमलैब के लिए न्यूनतम
मेमोरी16 GB8 GB
CPU8 कोर4 कोर
डिस्क400 GB20 GB
सिस्टमUbuntu 22.04, या Debian, Ubuntu या RHEL पर आधारित कोई दूसरा Linuxवही
आर्किटेक्चरx86-64 (amd64) या ARM (arm64)वही

होमलैब के लिए न्यूनतम निजी और प्रयोग वाले इस्तेमाल के लिए ठीक है — कुछ लोग Status200 को Raspberry Pi पर चलाते हैं।

आपको ये भी चाहिए:

  • Docker, Docker Compose v2 प्लगइन (docker compose कमांड) के साथ।
  • Git, Status200 लाने के लिए।
  • Node.js और npm, जो Docker Compose को लपेटने वाली npm start और npm run update स्क्रिप्ट चलाते हैं।
  • सर्वर पर ख़ाली पोर्ट 80 और 443। नीचे की तालिका होस्ट पर Status200 के इस्तेमाल किए हर पोर्ट की सूची देती है।
होस्ट पोर्टकिसके द्वारा इस्तेमालसेटिंगकिस काम का
80ingressONEUPTIME_HTTP_PORTडैशबोर्ड, API, टेलीमेट्री इनजेस्ट और Let's Encrypt सत्यापन।
443ingressSTATUS_PAGE_HTTPS_PORTजब Status200 सर्टिफ़िकेट संभालता है तब आपके इंस्टेंस के लिए HTTPS, और कस्टम डोमेन पर स्टेटस पेज और डैशबोर्ड के लिए।
5400postgresdocker-compose.yml में सेटnpm run backup और restore.sh को सर्वर से ही PostgreSQL तक पहुँचने देता है। यह सिर्फ़ 127.0.0.1 पर प्रकाशित है।
3874probe-1GLOBAL_PROBE_1_PORTप्रोब का अपना सर्वर। सर्वर के बाहर किसी को इसकी ज़रूरत नहीं।
3876runnerONEUPTIME_RUNNER_PORTRunner का अपना सर्वर। सर्वर के बाहर किसी को इसकी ज़रूरत नहीं।

इंस्टॉलेशन का एक वीडियो वॉकथ्रू भी है।

Status200 इंस्टॉल करें

  1. release ब्रांच क्लोन करें

    release ब्रांच में नवीनतम रिलीज़ की फ़ाइलें हैं।

    Bash
    git clone --depth 1 --single-branch --branch release https://git.wilix.dev/status200/status200.git
    cd oneuptime
  2. config.env बनाएँ

    Status200 की सारी सेटिंग्स config.env में हैं। उदाहरण से शुरू करें:

    Bash
    cp config.example.env config.env
  3. होस्टनेम सेट करें

    config.env खोलें और HOST को उस डोमेन नाम या IP पते पर सेट करें जिससे लोग Status200 तक पहुँचेंगे, http:// के बिना। localhost सिर्फ़ तब रखें जब आप Status200 को अपने कंप्यूटर पर आज़मा रहे हों।

    config.envINI
    HOST=status200.example.com
  4. रैंडम सीक्रेट बनाएँ

    उदाहरण फ़ाइल में प्लेसहोल्डर सीक्रेट हैं जो GitHub पर सार्वजनिक हैं। हर एक को अपने अलग रैंडम मान से बदलें:

    Bash
    while grep -q "please-change-this-to-random-value" config.env; do
      sed -i "0,/please-change-this-to-random-value/{s/please-change-this-to-random-value/$(openssl rand -hex 32)/}" config.env
    done
    grep -c "please-change-this" config.env

    आख़िरी कमांड 0 दिखाती है: कोई प्लेसहोल्डर नहीं बचा। लूप GNU sed इस्तेमाल करता है, जो हर Linux सर्वर पर होता है। यह इन सेटिंग्स को भरता है:

    सेटिंगयह किसकी सुरक्षा करती है
    ONEUPTIME_SECRETStatus200 की अपनी सेवाओं के बीच के कॉल।
    ENCRYPTION_SECRETStatus200 के रखे सीक्रेट, जैसे इंटीग्रेशन टोकन और SMTP पासवर्ड, और उसके जारी किए साइन-इन टोकन।
    DATABASE_PASSWORD, CLICKHOUSE_PASSWORD, VALKEY_PASSWORDतीनों डेटा स्टोर।
    REGISTER_PROBE_KEYआपके इंस्टेंस में प्रोब रजिस्टर करना।
    GLOBAL_PROBE_1_KEY, GLOBAL_PROBE_2_KEYवे ग्लोबल प्रोब जिन्हें Docker Compose चला सकता है (probe-1 डिफ़ॉल्ट रूप से चलता है)।
    STATUS200_RUNNER_KEYसाथ आने वाला Runner।
    GLOBAL_RUNNER_KEYसाथ आने वाला ग्लोबल Runner, जो हर प्रोजेक्ट के JavaScript चरण चलाता है।
    महत्वपूर्ण

    सीक्रेट पहली बार शुरू करने से पहले सेट करें, और बाद में उन्हें न बदलें। PostgreSQL अपना पासवर्ड सिर्फ़ डेटाबेस बनाते समय लेता है, और बाद में ENCRYPTION_SECRET बदलने से पुराने से एन्क्रिप्ट किया हर मान पढ़ा नहीं जा सकता। अगर पहली बार शुरू करते समय DATABASE_PASSWORD अब भी प्लेसहोल्डर है, तो PostgreSQL के अपना डेटाबेस बनाने से पहले npm start उसे एक रैंडम मान देता है।

  5. Status200 शुरू करें

    npm

    Bash
    npm start

    Docker CLI

    Bash
    (export $(grep -v '^#' config.env | xargs) && docker compose up --remove-orphans -d)

    पहली शुरुआत में कई मिनट लगते हैं: Docker इमेज डाउनलोड करता है और Status200 अपने डेटाबेस बनाता है। npm start हर हिस्से के जवाब देने तक रुकता है और Status200 is up! के साथ ख़त्म होता है।

  6. पहला खाता बनाएँ

    http:// के बाद अपना HOST लगाकर खोलें (उदाहरण के लिए http://localhost) और साइन अप करें। नए इंस्टेंस का पहला खाता उसका मास्टर एडमिन बनता है, जो /admin पर Admin Dashboard खोल सकता है।

    जो कोई भी पेज तक पहुँच सकता है, वह आपके बाद साइन अप कर सकता है। इसे रोकने के लिए Admin Dashboard खोलें, सेटिंग्स > प्रमाणीकरण पर जाएँ और साइन अप करने दें बंद करें। जिन लोगों को आप किसी प्रोजेक्ट में बुलाते हैं, वे फिर भी अपना खाता बना सकते हैं।

HTTPS सेट अप करें

जब तक आप HTTPS जोड़ने के दो तरीक़ों में से एक नहीं चुनते, Status200 सादा HTTP देता है:

Status200 को सर्टिफ़िकेट लेने देंअपनी ख़ुद की रिवर्स प्रॉक्सी इस्तेमाल करें
TLS कहाँ ख़त्म होता हैStatus200 के ingress पर, एक मुफ़्त Let's Encrypt सर्टिफ़िकेट के साथ जिसे वह ख़ुद रिन्यू करता हैआपकी प्रॉक्सी पर: Caddy, Nginx या कोई लोड बैलेंसर
आपको क्या चाहिएसर्वर की ओर इशारा करने वाला एक सार्वजनिक डोमेन नाम, और इंटरनेट से पहुँचने योग्य पोर्ट 80 और 443एक प्रॉक्सी, और आपके डोमेन का सर्टिफ़िकेट
सेटिंग्सPROVISION_SSL=true, HTTP_PROTOCOL=httpsPROVISION_SSL=false, HTTP_PROTOCOL=https, TRUSTED_PROXY_HOPS=2
कस्टम डोमेन पर स्टेटस पेजबिना अतिरिक्त सेटअप के काम करते हैंआपकी प्रॉक्सी को वे डोमेन भी देने होंगे

अगर आप स्टेटस पेज या डैशबोर्ड कस्टम डोमेन पर रखते हैं, तो TLS Status200 को संभालने देना ज़्यादा आसान है: ingress उन डोमेन के सर्टिफ़िकेट ख़ुद ऑर्डर करता है और देता है।

HTTP_PROTOCOL=https के साथ Status200 HTTPS लिंक बनाता है, साइन-इन कुकी को HTTPS पर रखता है और ब्राउज़र से कहता है कि वे आपके HOST तक सिर्फ़ HTTPS से पहुँचें। ब्राउज़र एक साल तक, उस नाम के हर पोर्ट पर, इसी का पालन करता है, इसलिए अगर कभी HOST को फिर से सादे HTTP पर जवाब देना हो, तो कुछ समय पहले HSTS_MAX_AGE_SECONDS=0 को config.env में सेट करें: ब्राउज़र अपनी अगली विज़िट पर यह नियम भूल जाते हैं।

Status200 को सर्टिफ़िकेट लेने दें

  1. अपने डोमेन को सर्वर की ओर करें

    अपने डोमेन के लिए एक DNS A रिकॉर्ड (IPv6 के लिए AAAA) बनाएँ, जिसका मान सर्वर का सार्वजनिक IP पता हो। AAAA रिकॉर्ड के साथ Status200 के लिए IPv6 भी चालू करें: विज़िटर के पते देखें।

  2. सर्टिफ़िकेट प्रोविज़निंग चालू करें

    config.env में ये मान सेट करें:

    config.envINI
    HOST=status200.example.com
    PROVISION_SSL=true
    HTTP_PROTOCOL=https

    HOST एक डोमेन नाम होना चाहिए: Status200 किसी IP पते या localhost के लिए सर्टिफ़िकेट नहीं ले सकता।

  3. नई सेटिंग्स के साथ फिर से शुरू करें

    Bash
    npm start
  4. अपना इंस्टेंस HTTPS पर खोलें

    https://status200.example.com खोलें। Status200 शुरू होते समय सर्टिफ़िकेट ऑर्डर करता है और फिर हर घंटे उसे जाँचता है, और 30 दिन से कम बचने पर उसे रिन्यू करता है। पहला सर्टिफ़िकेट आने तक, आम तौर पर कुछ ही मिनटों में, ingress एक अस्थायी सेल्फ़-साइन्ड सर्टिफ़िकेट देता है और आपका ब्राउज़र चेतावनी दिखाता है।

अपनी ख़ुद की रिवर्स प्रॉक्सी इस्तेमाल करें

ये चरण प्रॉक्सी को उसी सर्वर पर चलाते हैं जिस पर Status200 है। अगर आपकी प्रॉक्सी किसी दूसरी मशीन पर चलती है, तो पहला चरण छोड़ दें, प्रॉक्सी को इस सर्वर के पोर्ट 80 की ओर करें, और अपने क्लाउड प्रदाता के फ़ायरवॉल से पोर्ट 80 और 443 तक सिर्फ़ प्रॉक्सी को पहुँचने दें: जो विज़िटर प्रॉक्सी को छोड़कर Status200 तक पहुँचता है, वह वह पता चुन सकता है जिससे Status200 उसे गिनता है।

  1. ingress को पोर्ट 80 और 443 से हटाएँ

    प्रॉक्सी को पोर्ट 80 और 443 चाहिए, इसलिए ingress को दूसरे पोर्ट पर ले जाएँ और उन्हें सिर्फ़ इस सर्वर के लूपबैक पते 127.0.0.1 पर प्रकाशित करें, ताकि विज़िटर सिर्फ़ आपकी प्रॉक्सी से होकर Status200 तक पहुँचें। प्रोब और Runner होस्ट का नेटवर्क इस्तेमाल करते हैं और http://localhost के ज़रिए Status200 तक पहुँचते हैं, इसलिए वे भी साथ में बदलते हैं:

    config.envINI
    ONEUPTIME_HTTP_PORT=127.0.0.1:8080
    STATUS_PAGE_HTTPS_PORT=127.0.0.1:8443
    GLOBAL_PROBE_1_STATUS200_URL=http://localhost:8080
    ONEUPTIME_RUNNER_STATUS200_URL=http://localhost:8080
  2. Status200 को बताएँ कि वह प्रॉक्सी के पीछे है

    config.envINI
    HOST=status200.example.com
    HTTP_PROTOCOL=https
    PROVISION_SSL=false
    TRUSTED_PROXY_HOPS=2

    HTTP_PROTOCOL=https से Status200 के बनाए लिंक HTTPS इस्तेमाल करते हैं। TRUSTED_PROXY_HOPS=2 आपकी प्रॉक्सी और Status200 के ingress को गिनता है, ताकि Status200 IP अनुमति-सूची और रेट लिमिट के लिए विज़िटर का असली पता पढ़े। X-Forwarded-For में जोड़ने वाली हर अगली प्रॉक्सी, जैसे CDN या लोड बैलेंसर, के लिए एक और जोड़ें।

  3. नए पोर्ट पर Status200 फिर से शुरू करें

    Bash
    (export $(grep -v '^#' config.env | xargs) && docker compose up --remove-orphans -d)
    bash Tests/Scripts/status-check.sh localhost:8080

    npm start पोर्ट 80 पर http://localhost जाँचता है, जहाँ आपकी प्रॉक्सी होगी, इसलिए नया पोर्ट ख़ुद जाँचें। स्क्रिप्ट Status200 is up! के साथ ख़त्म होती है।

  4. प्रॉक्सी कॉन्फ़िगर करें

    Caddy

    Caddyfile
    status200.example.com {
        reverse_proxy localhost:8080
    }

    Caddy सर्टिफ़िकेट ख़ुद लेता और रिन्यू करता है, HTTP को HTTPS पर रीडायरेक्ट करता है और WebSocket कनेक्शन आगे जाने देता है। फ़ाइल बदलने के बाद Caddy को रीलोड करें, उदाहरण के लिए sudo systemctl reload caddy से।

    Nginx

    /etc/nginx/conf.d/status200.confNginx
    map $http_upgrade $status200_connection_upgrade {
        default upgrade;
        ""      close;
    }
    
    server {
        listen 80;
        server_name status200.example.com;
        return 301 https://$host$request_uri;
    }
    
    server {
        listen 443 ssl;
        server_name status200.example.com;
    
        ssl_certificate     /etc/letsencrypt/live/status200.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/status200.example.com/privkey.pem;
    
        # The limits Status200's own ingress uses.
        client_max_body_size 50M;
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $status200_connection_upgrade;
    
        location / {
            proxy_pass http://127.0.0.1:8080;
        }
    
        # MCP clients keep a stream open.
        location /mcp {
            proxy_pass http://127.0.0.1:8080;
            proxy_buffering off;
            proxy_read_timeout 86400s;
            proxy_send_timeout 86400s;
        }
    }

    सर्टिफ़िकेट के पाथ वे जगहें हैं जहाँ Certbot Let's Encrypt सर्टिफ़िकेट रखता है; अगर आपका सर्टिफ़िकेट कहीं और से आया है, तो उसके पाथ इस्तेमाल करें। sudo nginx -t && sudo systemctl reload nginx से फ़ाइल जाँचें और Nginx रीलोड करें।

    दोनों X-Forwarded-Proto भेजते हैं, जो Status200 को बताता है कि विज़िटर HTTPS से आया। कोई भी दूसरी प्रॉक्सी भी इसे भेजे, वरना आपके कस्टम डोमेन पर स्टेटस पेज और डैशबोर्ड की साइन-इन कुकी HTTPS पर नहीं रखी जातीं।

  5. प्रॉक्सी के ज़रिए अपना इंस्टेंस खोलें

    https://status200.example.com खोलें। आपको Status200 का साइन-इन पेज दिखना चाहिए, जो आपकी प्रॉक्सी के सर्टिफ़िकेट के साथ दिया गया हो।

नोट

अपनी ख़ुद की प्रॉक्सी के पीछे टेलीमेट्री OTLP/HTTP (/otlp) से भेजें। gRPC पर OTLP, Status200 तक तभी पहुँचता है जब उसका अपना ingress TLS ख़त्म करता है (PROVISION_SSL=true)।

विज़िटर के पते

Status200 हर विज़िटर को उस पते से गिनता है जिससे वह जुड़ता है: साइन-इन की सीमाएँ, प्रति पते की बाकी सीमाएँ, और स्टेटस पेज व डैशबोर्ड की IP अनुमति-सूची, सभी इसी पते को पढ़ती हैं। दो सेटअप में यह पता विज़िटर का अपना हो, इसके लिए एक सेटिंग चाहिए:

सेटअपसेटिंग
लोग IPv6 से Status200 तक पहुँचते हैं, उदाहरण के लिए AAAA रिकॉर्ड के ज़रिएStatus200 के नेटवर्क पर IPv6, docker-compose.override.yml में
Status200 के सामने आपकी अपनी रिवर्स प्रॉक्सी हैTRUSTED_PROXY_HOPS=2, और ingress 127.0.0.1 पर प्रकाशित (अपनी ख़ुद की रिवर्स प्रॉक्सी इस्तेमाल करें देखें)

Status200 के नेटवर्क पर IPv6 के बिना Docker IPv6 से आने वाले हर विज़िटर को अपने एक ही पते से Status200 तक भेजता है, और Status200 उन सभी को एक ही विज़िटर गिनता है: एक व्यक्ति के असफल साइन-इन दूसरों को बाहर कर सकते हैं। IPv6 चालू करने के लिए Docker Engine 27 या नया चाहिए (docker version आपका संस्करण दिखाता है)।

  1. IPv6 चालू करें

    docker-compose.override.yml को docker-compose.yml के बगल में बनाएँ, या जो फ़ाइल आपके पास है उसमें यह जोड़ें; npm start और npm run update उसे पढ़ते हैं:

    docker-compose.override.ymlYAML
    networks:
      oneuptime:
        enable_ipv6: true
  2. Status200 फिर से शुरू करें

    Bash
    npm stop
    npm start

    Status200 रुकता है, और अपने नेटवर्क पर IPv6 के साथ फिर से शुरू होता है। आपका डेटा बना रहता है। जिस नेटवर्क से आपका अपना कोई कंटेनर, जैसे रिवर्स प्रॉक्सी, अभी जुड़ा है, उसे Docker हटा नहीं सकता: उसे पहले Status200 के नेटवर्क से अलग करें और बाद में फिर से जोड़ें। अगर npm start has active endpoints के साथ रुक जाए, तो उसे अलग करें और npm stop व npm start फिर से चलाएँ।

  3. नेटवर्क जाँचें

    Bash
    docker network ls --quiet --filter name=_oneuptime | xargs docker network inspect | grep EnableIPv6

    यह "EnableIPv6": true, दिखाता है।

जब कई लोग एक ही निजी नेटवर्क पते से साइन इन करते हैं, तो Admin Dashboard का Status200 स्वास्थ्य पेज यह बताता है, और वह सेटिंग भी जो इसे बदलती है।

प्रोडक्शन चेकलिस्ट

Docker Compose एक सर्वर पर हर सेवा की एक ही कॉपी चलाता है, जो छोटी टीमों और होमलैब के लिए ठीक है। इस पर निर्भर होने से पहले यह सूची देख लें।

क्षेत्रक्या करें
सीक्रेटconfig.env का कोई भी मान अब please-change-this-to-random-value प्लेसहोल्डर नहीं है। देखें रैंडम सीक्रेट बनाएँ, और जो इंस्टॉलेशन प्लेसहोल्डर वाले DATABASE_PASSWORD के साथ शुरू हुआ, उसके लिए डेटाबेस पासवर्ड बदलें।
HTTPSलोग Status200 तक HTTPS से पहुँचते हैं और HTTP_PROTOCOL=https सेट है। देखें HTTPS सेट अप करें।
साइन-अपआपकी टीम के खाते बन जाने के बाद, Admin Dashboard में सेटिंग्स > प्रमाणीकरण के तहत साइन अप करने दें बंद करें।
फ़ायरवॉलइंटरनेट के लिए सिर्फ़ पोर्ट 80 और 443 (और SSH) खुले हैं। Status200 PostgreSQL का पोर्ट 5400 सिर्फ़ 127.0.0.1 पर प्रकाशित करता है। आप जो भी दूसरा पोर्ट प्रकाशित करें, उसे अपने क्लाउड प्रदाता के फ़ायरवॉल से बंद करें: ufw नियम उन पोर्ट पर लागू नहीं होते जिन्हें Docker प्रकाशित करता है।
विज़िटर के पतेAdmin Dashboard का Status200 स्वास्थ्य पेज यह नहीं बताता कि कई लोग एक ही पते से साइन इन करते हैं। विज़िटर के पते देखें।
बैकअपPostgreSQL का बैकअप हर दिन होता है और कॉपियाँ सर्वर से बाहर जाती हैं। देखें बैकअप और रीस्टोर।
ईमेलAdmin Dashboard में सेटिंग्स > सूचनाएँ > ईमेल के तहत एक मेल सर्वर सेट है, ताकि Status200 निमंत्रण और सूचनाएँ भेज सके। देखें SMTP।
डिस्कख़ाली जगह पर नज़र रखी जाती है। ClickHouse आपकी रखी टेलीमेट्री के साथ बढ़ता है (देखें साइज़िंग और क्षमता नियोजन); हर कंटेनर का लॉग 1000 MB तक सीमित है।
अपडेटStatus200 हफ़्ते में कम से कम एक बार अपडेट होता है। रिलीज़ अक्सर आती हैं। देखें Status200 अपडेट करें।
हाई अवेलेबिलिटीअगर इसकी ज़रूरत है, तो Kubernetes पर Helm चार्ट पर जाएँ।

डेटाबेस पासवर्ड बदलें

PostgreSQL वही पासवर्ड रखता है जिसके साथ उसे बनाया गया था, इसलिए config.env में सिर्फ़ DATABASE_PASSWORD बदलने से Status200 अपने डेटाबेस तक नहीं पहुँच पाता। प्लेसहोल्डर के साथ शुरू हुए इंस्टॉलेशन को उसका अपना पासवर्ड देने के लिए, उसे PostgreSQL में और config.env में एक साथ बदलें, फिर Status200 को दोबारा शुरू करें:

Bash
NEW_PASSWORD=$(openssl rand -hex 32) &&
  (export $(grep -v '^#' config.env | xargs) && docker compose exec -T postgres psql -U "$DATABASE_USERNAME" -d "$DATABASE_NAME" -c "ALTER USER \"$DATABASE_USERNAME\" PASSWORD '$NEW_PASSWORD'") &&
  sed -i "s/^DATABASE_PASSWORD=.*/DATABASE_PASSWORD=$NEW_PASSWORD/" config.env
npm start

अगर आपने DATABASE_BACKUP_PASSWORD और DATABASE_RESTORE_PASSWORD सेट किए हैं, तो उन्हें भी नया मान दें।

बैकअप और रीस्टोर

PostgreSQL में वह सब है जो आप कॉन्फ़िगर करते हैं: मॉनिटर, इंसिडेंट, स्टेटस पेज, उपयोगकर्ता। npm run backup उसका डंप Backups फ़ोल्डर की एक फ़ाइल में लिखता है।

  1. बैकअप स्क्रिप्ट को डेटाबेस पासवर्ड दें

    config.env में DATABASE_BACKUP_PASSWORD को DATABASE_PASSWORD के मान पर सेट करें। स्क्रिप्ट config.env को सादे टेक्स्ट की तरह पढ़ती है, इसलिए साथ आने वाला ${DATABASE_PASSWORD} कभी भरा नहीं जाता।

  2. बैकअप चलाएँ

    Bash
    npm run backup

    यह आपका sudo पासवर्ड माँगता है और Backups/db-<day of the month>.backup लिखता है, इसलिए रोज़ के बैकअप एक महीने पहले वालों की जगह ले लेते हैं। इसे दिन में कम से कम एक बार चलाएँ।

  3. बैकअप को सर्वर से बाहर कॉपी करें

    डेटाबेस वाली डिस्क पर रखा बैकअप उस डिस्क के ख़राब होने पर नहीं बचता।

सिर्फ़ सर्वर ही PostgreSQL तक पहुँचता है: वह 127.0.0.1 के पोर्ट 5400 पर जवाब देता है। किसी दूसरी मशीन से उसका बैकअप लेने के लिए, उस मशीन से SSH टनल खोलें, फिर उसी मशीन के अपने पोर्ट 5400 से कनेक्ट करें:

Bash
ssh -N -L 5400:127.0.0.1:5400 you@status200.example.com
PostgreSQL को किसी निजी नेटवर्क के पते पर प्रकाशित करें

अगर आपके निजी नेटवर्क के किसी टूल को बिना टनल के PostgreSQL तक पहुँचना है, तो उसे उस नेटवर्क में सर्वर के पते पर भी, एक अलग पोर्ट पर, प्रकाशित करें। docker-compose.yml के बगल में docker-compose.override.yml बनाएँ; npm start और npm run update उसे पढ़ते हैं:

docker-compose.override.ymlYAML
services:
  postgres:
    ports:
      - "10.0.0.5:5401:5432"

10.0.0.5 की जगह सर्वर का अपना निजी पता लिखें, कभी कोई सार्वजनिक पता नहीं, और पहले PostgreSQL को उसका अपना पासवर्ड दें (देखें डेटाबेस पासवर्ड बदलें)। फिर npm start चलाएँ, और PostgreSQL उस पते के पोर्ट 5401 पर भी जवाब देगा।

ClickHouse आपकी टेलीमेट्री को Docker वॉल्यूम status200_clickhouse में रखता है, और कोई स्क्रिप्ट उसका बैकअप नहीं लेती। अगर वह टेलीमेट्री रखनी है, तो clickhouse-backup जैसे ClickHouse टूल से वॉल्यूम का बैकअप लें, या Status200 रुके रहने पर उसे कॉपी करें।

PostgreSQL रीस्टोर करने के लिए, config.env में DATABASE_RESTORE_* मान सेट करें: DATABASE_RESTORE_PASSWORD को DATABASE_PASSWORD के मान पर, जैसे बैकअप के लिए, और DATABASE_RESTORE_FILENAME को रीस्टोर किए जाने वाले बैकअप पर, जैसे db-31.backup। फिर bash restore.sh चलाएँ। जिस डेटाबेस में यह रीस्टोर करता है, वह पहले से मौजूद होना चाहिए; चल रहे इंस्टॉलेशन में वह होता है।

सावधानी
restore.sh बैकअप के हर ऑब्जेक्ट को फिर से बनाने से पहले लक्ष्य डेटाबेस से हटा देता है। यह शुरू करने से पहले पूछता है; जो डेटाबेस नाम यह दिखाए, उसे जाँच लें।

Status200 अपडेट करें

पहले बैकअप लें, फिर चलाएँ:

Bash
git checkout release
git pull
npm run update

npm run update आपका sudo पासवर्ड माँगता है, config.example.env की नई सेटिंग्स आपके config.env में जोड़ता है (आपके अपने मान बने रहते हैं), नई इमेज लाता है और Status200 को फिर से शुरू करता है। npm start की तरह, यह Status200 is up! के साथ ख़त्म होता है।

नए मेजर वर्ज़न पर जाने (उदाहरण के लिए 13 से 14) में ज़्यादा काम लग सकता है: शुरू करने से पहले Status200 अपग्रेड करना पढ़ें।

config.env में APP_TAG=release हमेशा Community Edition की नवीनतम रिलीज़ लाता है। किसी एक वर्ज़न पर रहने के लिए APP_TAG को उसके नंबर पर सेट करें, जैसे 14.0.22। Enterprise Edition के लिए टैग enterprise-release और enterprise-14.0.22 हैं।

Status200 अनइंस्टॉल करें

Status200 रोकें और उसके कंटेनर और नेटवर्क हटाएँ:

Bash
npm run down

आपका डेटा status200_postgres और status200_clickhouse वॉल्यूम में बना रहता है, और oneuptime फ़ोल्डर में config.env और आपके बैकअप रहते हैं। डेटा भी मिटाने के लिए:

Bash
(export $(grep -v '^#' config.env | xargs) && docker compose down --volumes --remove-orphans)

फिर oneuptime फ़ोल्डर मिटा दें।

सावधानी
--volumes हर मॉनिटर, इंसिडेंट, उपयोगकर्ता और सारी टेलीमेट्री हमेशा के लिए मिटा देता है। अगर इनमें से किसी की ज़रूरत पड़ सकती है, तो पहले बैकअप लें।

समस्या निवारण

npm start चलाने पर Docker "permission denied" कहता है

आपका उपयोगकर्ता Docker डेमन तक नहीं पहुँच पाता। उसे docker समूह में जोड़ें, फिर साइन आउट करके दोबारा साइन इन करें:

Bash
sudo usermod -aG docker $USER
पोर्ट 80 या 443 के इस्तेमाल में होने से ingress शुरू नहीं हो पाता

सर्वर पर कोई दूसरा प्रोग्राम, अक्सर कोई वेब सर्वर, पोर्ट पकड़े हुए है। उसे रोकें, या ingress को दूसरे पोर्ट पर ले जाएँ और उस प्रोग्राम को Status200 के आगे लगाएँ, जैसा अपनी ख़ुद की रिवर्स प्रॉक्सी इस्तेमाल करें में बताया गया है।

npm start "Maximum retries reached" के साथ ख़त्म होता है

npm start के आख़िर की जाँच Status200 के जवाब देने से पहले हार मान गई। पहली शुरुआत में, जब इमेज डाउनलोड होती हैं और डेटाबेस बनते हैं, जाँच के इंतज़ार से ज़्यादा समय लग सकता है। देखें कि क्या चल रहा है और लॉग पढ़ें:

Bash
npm run ps
npm run logs

हर कंटेनर चलने लगे तो npm run status-check से जाँच फिर से चलाएँ। अगर आपने ingress को पोर्ट 80 से हटाया है, तो इसके बजाय उसका नया पोर्ट जाँचें: bash Tests/Scripts/status-check.sh localhost:8080।

कुछ पेज लोड होते हैं, लेकिन लाइव अपडेट या अपलोड विफल होते हैं

Status200 को HOST वाले पते पर खोलें। ingress अनुरोधों को होस्टनेम के हिसाब से भेजता है: पूरा ऐप्लिकेशन सिर्फ़ HOST और localhost से मिलता है, और कोई भी दूसरा नाम, जैसे सर्वर का IP पता, स्टेटस पेज का डोमेन माना जाता है। HOST को उस नाम पर सेट करें जो लोग इस्तेमाल करते हैं, फिर npm start चलाएँ।

साइन अप या साइन इन "Page not found" के साथ विफल होता है

साइन-अप पेज लोड होता है, लेकिन साइन अप Page not found - /identity/signup और साइन इन Page not found - /identity/login के साथ विफल होता है। अनुरोध Status200 तक HOST के अलावा किसी दूसरे होस्टनेम से पहुँचा, इसलिए ingress ने उसे किसी स्टेटस पेज के अपने डोमेन की तरह भेजा, जहाँ Status200 का अपना साइन अप और साइन इन नहीं मिलता। इन दोनों बातों की जाँच करें:

  • HOST वही पता है जो लोग खोलते हैं, और अगर वे कोई पोर्ट इस्तेमाल करते हैं तो उसके साथ, जैसे status200.example.com:8080। इसे बदलने के बाद npm start चलाएँ।
  • Status200 के आगे लगी प्रॉक्सी वही होस्टनेम आगे भेजती है जो ब्राउज़र ने माँगा था। Caddy ऐसा डिफ़ॉल्ट रूप से करता है, Nginx proxy_set_header Host $host; से, जैसा अपनी ख़ुद की रिवर्स प्रॉक्सी इस्तेमाल करें में है, और Apache ProxyPreserveHost On से।
PROVISION_SSL सेट करने के बाद ब्राउज़र सर्टिफ़िकेट के बारे में चेतावनी देता है

जब तक Let's Encrypt सर्टिफ़िकेट जारी नहीं करता, ingress एक अस्थायी सेल्फ़-साइन्ड सर्टिफ़िकेट देता है। अगर चेतावनी कुछ मिनट से ज़्यादा रहे, तो जाँचें कि:

  • HOST एक डोमेन नाम है, IP पता या localhost नहीं।
  • डोमेन का DNS रिकॉर्ड इस सर्वर की ओर इशारा करता है।
  • पोर्ट 80 इंटरनेट से पहुँच योग्य है, ताकि Let's Encrypt डोमेन सत्यापित कर सके।

जब कोई ऑर्डर विफल होता है, तो ऐप CoreSSL:EnsurePrimaryHostCertificate से शुरू होने वाली एक त्रुटि लॉग करता है, जिसके बाद वजह होती है:

Bash
(export $(grep -v '^#' config.env | xargs) && docker compose logs app) | grep -A 5 CoreSSL
ingress का पोर्ट बदलने के बाद साथ आने वाला प्रोब डिस्कनेक्टेड दिखाता है

Admin Dashboard प्रोब को सेटिंग्स > निगरानी > वैश्विक प्रोब के तहत दिखाता है। यह Status200 तक GLOBAL_PROBE_1_STATUS200_URL पर पहुँचता है, जो डिफ़ॉल्ट रूप से http://localhost (पोर्ट 80) है। इसे ingress के नए पोर्ट पर सेट करें, उदाहरण के लिए http://localhost:8080, ONEUPTIME_RUNNER_STATUS200_URL भी इसी तरह सेट करें, और Status200 को फिर से शुरू करें।

अगले कदम