# तैनाती

Canonical page: https://phishdestroy.github.io/TgWitness/hi/docs/reference/deployment/

Windows, Linux, macOS या Docker पर HTTPS के पीछे बैकअप और अपडेट के साथ TgWitness को एक सेवा के रूप में चलाएँ।

**अंग्रेज़ी** · [रूसी](https://github.com/phishdestroy/TgWitness/blob/main/docs/ru/DEPLOYMENT.md) · [यूक्रेनी](https://github.com/phishdestroy/TgWitness/blob/main/docs/uk/DEPLOYMENT.md) · [स्पेनिश](https://github.com/phishdestroy/TgWitness/blob/main/docs/es/DEPLOYMENT.md) · [पुर्तगाली (ब्राज़ील)](https://github.com/phishdestroy/TgWitness/blob/main/docs/pt/DEPLOYMENT.md) · [तुर्की](https://github.com/phishdestroy/TgWitness/blob/main/docs/tr/DEPLOYMENT.md) · [अरबी](https://github.com/phishdestroy/TgWitness/blob/main/docs/ar/DEPLOYMENT.md) · [फ़ारसी](https://github.com/phishdestroy/TgWitness/blob/main/docs/fa/DEPLOYMENT.md) · [उर्दू](https://github.com/phishdestroy/TgWitness/blob/main/docs/ur/DEPLOYMENT.md) · [हिंदी](https://github.com/phishdestroy/TgWitness/blob/main/docs/hi/DEPLOYMENT.md) · [बाहासा इंडोनेशिया](https://github.com/phishdestroy/TgWitness/blob/main/docs/id/DEPLOYMENT.md) · [वियतनामी](https://github.com/phishdestroy/TgWitness/blob/main/docs/vi/DEPLOYMENT.md) · [सरलीकृत चीनी](https://github.com/phishdestroy/TgWitness/blob/main/docs/zh/DEPLOYMENT.md)

## स्थापना चुनें

पोर्टेबल पैकेज के लिए, GitHub रिलीज़ से `TgWitness-<version>-windows-amd64-portable.zip` निकालें। अन्य तरीकों के लिए, स्रोत ZIP डाउनलोड और निकालें या रिपॉजिटरी क्लोन करें, फिर प्रोजेक्ट डायरेक्टरी से निम्नलिखित चलाएँ:

| स्थापना | शुरू करें | क्या यह पृष्ठभूमि में चलता है? |
| --- | --- | --- |
| विंडोज पोर्टेबल पैकेज | `TgWitness.cmd` | नहीं; विंडो खुली रखें। |
| नेटिव विंडोज | `Start.cmd` | नहीं; पृष्ठभूमि उपयोग के लिए वैकल्पिक लॉगऑन कार्य का उपयोग करें। |
| नेटिव लिनक्स/मैकओएस | `sh start.sh` | नहीं; पृष्ठभूमि उपयोग के लिए systemd/launchd का उपयोग करें। |
| किसी भी समर्थित होस्ट पर Docker | `docker compose up -d --build --wait` | हाँ, जब Docker डेमन चल रहा हो। |
| Windows पर Docker हेल्पर | `scripts\Docker.cmd` | हाँ; सहायक वेब-सर्वर की स्वास्थ्य स्थिति का इंतजार करता है। |
| Linux/macOS पर Docker सहायक | `sh scripts/docker-start.sh` | हाँ; सहायक वेब-सर्वर की स्वास्थ्य स्थिति का इंतजार करता है। |

एक क्लाउड सर्वर के लिए जिसे कोई तीसरा पक्ष सत्यापित कर सके — प्रदाता की API के माध्यम से बनाया गया, बिना SSH के, केवल Cloudflare टनल के माध्यम से पहुँचा जा सकने वाला — [उच्च-आश्वासन परिनियोजन](https://github.com/phishdestroy/TgWitness/blob/main/docs/HIGH-ASSURANCE.md) देखें।

नेटिव स्टार्टअप एक निजी `.venv` बनाता है और पिन की गई डिपेंडेंसीज़ को इंस्टॉल करता है। डॉकर उन्हें होस्ट पाइथन की आवश्यकता के बिना, इमेज के अंदर बनाता है। पहली बार सेटअप करने के लिए इंटरनेट एक्सेस की आवश्यकता होती है। जब कोई Python 3.11+ नहीं मिलता है, तो `Start.cmd` वर्तमान विंडोज उपयोगकर्ता के लिए Python 3.12 इंस्टॉल करने से पहले पूछता है (winget, अन्यथा python.org इंस्टॉलर अपने Python Software Foundation हस्ताक्षर की जांच करने के बाद); यह कभी भी प्रशासक विशेषाधिकारों का अनुरोध नहीं करता है। Docker और OS सेवाएँ पूर्व-आवश्यकताएँ बनी रहती हैं।

नेटिव और पोर्टेबल इंस्टॉलेशन अपने फ़ोल्डर के अंदर `data/live` का उपयोग करते हैं। डॉकर `tgwitness-data` नामक वॉल्यूम का उपयोग `/data` पर करता है। ये अलग-अलग इंस्टॉलेशन हैं जब तक कि आप जानबूझकर पूरी डेटा डायरेक्टरी को माइग्रेट नहीं कर देते। एक नए डॉकर कंटेनर से नेटिव अकाउंट्स को स्वचालित रूप से खोजने की उम्मीद न करें।

## स्थापना आवश्यकताएँ

नेटिव इंस्टॉलेशन के लिए Python 3.11 या बाद का संस्करण, `venv` और `ensurepip` के साथ, पहली डिपेंडेंसी इंस्टॉलेशन के लिए इंटरनेट एक्सेस, और `.venv` के लिए एक लिखने योग्य प्रोजेक्ट डायरेक्टरी की आवश्यकता होती है। बंडल किए गए पैनल के लिए Node.js या फ्रंटएंड बिल्ड की आवश्यकता नहीं है। अपने सामान्य OS खाते से लॉन्चर चलाएँ; TgWitness को प्रशासक/रूट विशेषाधिकारों की आवश्यकता नहीं है।

- **Windows:** `Start.cmd` पहले `py -3`, फिर `python`, और उसके बाद उपयोगकर्ता-विशिष्ट तथा Program Files के डिफ़ॉल्ट इंस्टॉलेशन फ़ोल्डर जाँचता है। इसके लिए संस्करण 3.11 या बाद का संस्करण आवश्यक है। यदि इनमें से कोई भी काम नहीं करता, तो यह ऊपर बताया गया स्वचालित उपयोगकर्ता-विशिष्ट इंस्टॉलेशन करने का विकल्प देता है। `py -3 start.py` भी काम करता है। पोर्टेबल पैकेज के लिए अलग से Python की आवश्यकता नहीं है।
- **Linux:** `start.sh` `python3.13`, `python3.12`, `python3.11`, `python3` और `python` को आज़माता है, और जब कोई उपयुक्त नहीं मिलता है तो apt, dnf, pacman, zypper, apk या Homebrew के लिए इंस्टॉल कमांड प्रिंट करता है। Debian/Ubuntu इंस्टॉलेशन के लिए चयनित इंटरप्रेटर से मेल खाने वाले `python3-venv` पैकेज की आवश्यकता हो सकती है। किसी डिस्ट्रीब्यूशन के पुराने डिफ़ॉल्ट पाइथन को पाइथन 3.11+ से बदलने या पूरक करने की आवश्यकता है।
- **macOS:** एक वर्तमान Python 3.11+ वितरण स्थापित करें; यह न मानें कि OS-प्रदत्त इंटरप्रेटर आवश्यकता को पूरा करता है। प्रोजेक्ट निर्देशिका से `python3 start.py` का उपयोग करें।
- **Docker:** Compose v2.20 या नए संस्करण के साथ Docker Engine/Desktop का उपयोग करें। Docker Desktop को Windows पर Linux कंटेनरों का उपयोग करना चाहिए। कंटेनर अपनी Python निर्भरताएँ स्वयं इंस्टॉल करता है; होस्ट को एक अलग Python इंस्टॉलेशन की आवश्यकता नहीं है।

डेटा निर्देशिका के लिए स्थायी स्थानीय भंडारण का उपयोग करें। संदेशों, मीडिया, WAL वृद्धि, एक्सपोर्ट और बैकअप से क्षमता की योजना बनाएँ; हर वर्कलोड के लिए साक्ष्य-आधारित कोई सार्वभौमिक न्यूनतम डिस्क/RAM विनिर्देश नहीं है। संगत निर्भरता व्हील्स के बिना CPU आर्किटेक्चर और पाइथन संस्करणों को अतिरिक्त बिल्ड टूल और अपनी योग्यता की आवश्यकता हो सकती है। "पोर्टेबल" सार्वभौमिक OS या हार्डवेयर समर्थन का दावा नहीं है।

Windows 11/Python 3.12 का स्थानीय रूप से सत्यापन किया गया है। Linux/macOS/कंटेनर परिभाषाएँ और CI प्रदान किए गए हैं, लेकिन इस विकास होस्ट पर उनका निष्पादन नहीं किया गया है। सटीक दायरे के लिए [VERIFICATION.md](https://phishdestroy.github.io/TgWitness/hi/docs/reference/verification/) देखें।

## स्थानीय कंप्यूटर

विंडोज पर `Start.cmd` या लिनक्स/मैकओएस पर `sh start.sh` का उपयोग करें। `scripts\Setup.cmd` या `sh start.sh --setup-only` वातावरण तैयार करता है। लॉन्चर पहली बार उपयोग पर निर्भरताएँ इंस्टॉल करता है; बाद में लॉन्च होने पर वातावरण का पुन: उपयोग करता है। सेटअप और टेलीग्राम संग्रह के लिए इंटरनेट एक्सेस की आवश्यकता होती है, लेकिन मौजूदा रिकॉर्ड ब्राउज़ करना और एक्सपोर्ट बनाना ऑफ़लाइन काम करता है।

सेटअप के बाद कलेक्टर शुरू किए बिना स्थानीय निर्भरताओं, Ed25519, स्टोरेज, कुंजी कॉन्फ़िगरेशन और लिसनिंग एड्रेस का निरीक्षण करने के लिए `python start.py --check` चलाएँ। संरचित आउटपुट के लिए `--json` का उपयोग करें। इच्छित `--data-dir`, `--host` और `--port` पास करें। यह जाँच पैकेज इंस्टॉल नहीं करती, जर्नल नहीं बनाती या टेलीग्राम से कनेक्ट नहीं करती; यह अखंडता या कवरेज योग्यता नहीं है। स्टार्टअप अलग से मौजूदा जर्नलों को सत्यापित करता है। `python start.py --help` भी इंस्टॉलेशन से बचता है।

विकल्प:

start.py का उपयोग करने के बाद, Windows पर `.venv\Scripts\python.exe` या Linux/macOS पर `.venv/bin/python` के साथ सहायक कमांड चलाएँ, या पहले उस वातावरण को सक्रिय करें। नीचे दिए गए `python -m ...` उदाहरण मानते हैं कि वातावरण सक्रिय है।

```
python -m tgwitness --data-dir /path/to/private/data --host 127.0.0.1 --port 8787
```

एनवायरनमेंट वेरिएबल्स: TGWITNESS_DATA, TGWITNESS_HOST, TGWITNESS_PORT, TGWITNESS_TOKEN। TGWITNESS_VAULT_KEY_FILE एक नई इंस्टॉलेशन के लिए बाहरी-कुंजी मोड चुनता है; नीचे देखें। TGWITNESS_TOKEN, यदि प्रदान किया गया है, तो उसमें कम से कम 24 वर्ण होने चाहिए; एक क्रिप्टोग्राफ़िक रूप से यादृच्छिक मान का उपयोग करें। इसके बिना, ऐप panel-token.txt में एक 256-बिट का यादृच्छिक टोकन उत्पन्न करता है। एनवायरनमेंट ओवरराइड उस फ़ाइल को फिर से नहीं लिखता है। क्रेडेंशियल्स को घुमाने के लिए ऐप को फिर से शुरू करें।

सटीक रूप से एक ही प्रक्रिया डेटा निर्देशिका की मालिक हो सकती है। एक क्रॉस-प्लेटफ़ॉर्म OS फ़ाइल लॉक आकस्मिक समवर्ती लेखकों को रोकता है। एक Uvicorn वर्कर का उपयोग करें। पैनल प्रोफाइल/<id>/ के अंतर्गत अतिरिक्त वर्कस्पेस निर्देशिकाओं के साथ किसी भी संख्या में वर्कस्पेस का प्रबंधन कर सकता है। अलग सेवा इंस्टेंस के लिए, अलग-अलग निर्देशिकाओं और पोर्ट का उपयोग करें। SQLite WAL फ़ाइलें स्थानीय स्थायी स्टोरेज पर होनी चाहिए, न कि नेटवर्क फ़ाइल सिस्टम पर। प्रतिकृतियों के बीच एक वॉल्यूम साझा न करें।

## विंडोज पोर्टेबल पैकेज

प्रत्येक GitHub रिलीज़ में `TgWitness-<version>-windows-amd64-portable.zip` और इसकी `.sha256` शामिल होती है। इसमें python.org से आधिकारिक एम्बेडेबल Python 3.12 रनटाइम (`tools/build_portable.py` में चेक्सम पिन किया गया है), TgWitness और इसकी पिन की गई डिपेंडेंसी, और तीन लॉन्चर शामिल हैं:

| फ़ाइल | उद्देश्य |
| --- | --- |
| `TgWitness.cmd` | पैनल प्रारंभ करें; अतिरिक्त विकल्प पारित किए जाते हैं, उदाहरण के लिए `TgWitness.cmd --port 8790` |
| `TgWitness-Demo.cmd` | `data\demo` में सिंथेटिक डेमो शुरू करें |
| `TgWitness-Check.cmd` | बिना शुरू किए तत्परता जाँच चलाएँ |

पूरे आर्काइव को `Documents\TgWitness` जैसे किसी लिखने योग्य फ़ोल्डर में निकालें; इसे ZIP के अंदर या Program Files से न चलाएँ। रनटाइम एक अलग मॉड्यूल पथ का उपयोग करता है, इसलिए अन्य पाइथन इंस्टॉलेशन और `PYTHONPATH` इसका प्रभावित नहीं करते। डेटा पैकेज के `data` फ़ोल्डर में रहता है। अपडेट करने के लिए, TgWitness को रोकें, नए संस्करण को एक नए फ़ोल्डर में एक्सट्रेक्ट करें और `data` फ़ोल्डर को वहीं पर कॉपी करें।

इसे स्वयं 64-बिट विंडोज पर पाइथन 3.12 के साथ बनाएं:

```
python tools/build_portable.py
```

बिल्डर रनटाइम चेकसम को सत्यापित करता है, प्रतिबंधित निर्भरताओं को पैकेज में इंस्टॉल करता है, एम्बेडेड इंटरप्रेटर के साथ तत्परता जांच चलाता है और ZIP और चेकसम को `dist/` में लिखता है।

## कंटेनर

```
docker compose up -d --build --wait
```

यह /data के लिए एक नामित स्थायी वॉल्यूम बनाता है। वेब पोर्ट को 127.0.0.1:8787 पर मैप किया गया है। यह प्रक्रिया UID 10001 के रूप में, कम की गई क्षमताओं, एक केवल-पठनीय रूट फ़ाइलसिस्टम, और लिखने योग्य /data और /tmp के साथ चलती है। `--wait` लौटने से पहले वेब-सर्वर की स्थिति की जाँच करता है; यह टेलीग्राम प्राधिकरण या डिलीवरी स्थापित नहीं करता है। सप्लाई किए गए हेल्पर्स बिल्डिंग के बाद 180-सेकंड का रेडीनेस टाइमआउट उपयोग करते हैं। शुरुआती डिपेंडेंसी डाउनलोड में उससे अधिक समय लग सकता है।

दोनों बेस कम्पोज़ फ़ाइलें प्रोजेक्ट का नाम `tgwitness` का उपयोग करती हैं, इसलिए किसी दूसरी डायरेक्टरी में एक नया रिलीज़ निकालने पर यह चुपचाप एक नया डेटा वॉल्यूम नहीं चुनता है। उस प्रोजेक्ट के लिए केवल एक ही डिप्लॉयमेंट सक्रिय रखें। स्वतंत्र इंस्टॉलेशन के लिए, एक अद्वितीय `docker compose -p NAME ...` और एक अलग होस्ट पोर्ट का उपयोग करें, और अपडेट पर दोनों को बनाए रखें। अलग प्रोजेक्ट नाम का उपयोग करने वाली पुरानी डिप्लॉयमेंट के लिए, `-p` के साथ उसका मूल नाम का उपयोग करना जारी रखें; `docker compose ls` मौजूदा प्रोजेक्ट्स को सूचीबद्ध करता है।

`deploy/env.example` की प्रतिलिपि `.env` पर बनाएँ और `TGWITNESS_PORT` को एक अलग लूपबैक पोर्ट का उपयोग करने के लिए बदलें। उदाहरण के लिए, `TGWITNESS_PORT=8788` पैनल को `http://127.0.0.1:8788` पर एक्सपोज़ करता है; कंटेनर अभी भी 8787 पर सुनता है। `.env` को Git-ignore किया गया है।

प्रारंभिक टोकन प्राप्त करें:

```
docker compose exec tgwitness cat /data/panel-token.txt
```

उपयोगी कमांड्स:

```
docker compose ps
docker compose logs --tail 100 -f
docker compose stop
docker compose up -d --wait
```

`restart: unless-stopped` क्रैश या Docker डेमन के रीस्टार्ट के बाद कलेक्टर को फिर से शुरू करता है। एक लिनक्स सर्वर पर, अपने डिस्ट्रीब्यूशन के सर्विस मैनेजर, जो आमतौर पर `sudo systemctl enable --now docker` होता है, का उपयोग करके बूट पर Docker को सक्षम करें। Windows/macOS पर, Docker Desktop की 'स्टार्ट-एट-साइन-इन' सेटिंग को सक्षम करें। डेस्कटॉप साइन-आउट, स्लीप, या एक रुका हुआ Docker डेमन संग्रहण में बाधा डाल सकता है। एक स्पष्ट रूप से रोका गया कंटेनर तब तक रुका रहता है जब तक आप इसे फिर से शुरू नहीं करते।

उदाहरण कॉन्फ़िगरेशन में /tmp वॉल्यूम को 512 MiB पर सीमित किया गया है। इसके बजाय, एक्सपोर्ट निर्माण प्रत्येक वर्कस्पेस के `temporary-exports/` का उपयोग स्थायी /data पर करता है। एक साथ होने वाले एक्सपोर्ट, जर्नल/WAL वृद्धि, मीडिया और बैकअप के लिए वहाँ जगह आरक्षित करें। लॉन्चर योग्य रनटाइम निर्भरता संस्करणों को पिन करने के लिए deploy/constraints.txt का उपयोग करता है। Docker और हाई-अश्योरेंस सर्वर deploy/requirements.lock और deploy/build.lock से pip --require-hashes के साथ इंस्टॉल करते हैं: हर पैकेज फ़ाइल का मिलान कमिट में रिकॉर्ड किए गए SHA-256 से होना चाहिए, इसलिए PyPI या मिरर पर बदली गई फ़ाइल को अस्वीकार कर दिया जाता है। पाइथन बेस इमेज और ऑपरेटिंग-सिस्टम पैकेजों को अभी भी स्वतंत्र रिलीज़ योग्यता की आवश्यकता होती है।

जब तक आप जर्नल और कुंजियों को नष्ट करने का इरादा नहीं रखते, तब तक docker compose down -v का उपयोग न करें। कंटेनर स्वास्थ्य रिपोर्ट वेब-सर्वर की उपलब्धता बताती है, न कि सफल टेलीग्राम कैप्चर की। पैनल की कलेक्टर स्थिति, हार्टबीट, त्रुटियों और कवरेज इवेंट्स का निरीक्षण करें।

### स्वतंत्र गवाह प्रोफ़ाइल

वैकल्पिक `witness` सेवा अपने स्वयं के कंटेनर में एक [स्वतंत्र गवाह](https://phishdestroy.github.io/TgWitness/hi/docs/reference/witness/) चलाती है, जिसमें `witness-data` वॉल्यूम में अपनी खुद की कुंजी और जर्नल होता है और कलेक्टर के लिए केवल एक रीड-ओनली गवाह टोकन होता है। पैनल के **गवाह** पेज पर टोकन बनाएँ, इसे एक बॉट टोकन और चैनल के साथ `.env` में जोड़ें, फिर प्रोफ़ाइल शुरू करें:

```
docker compose --profile witness up -d          # deploy/compose/compose.image.yaml: same flag
docker compose logs witness                     # witness key fingerprint
```

यह सेवा Compose नेटवर्क के अंदर कलेक्टर तक `http://tgwitness:8787` पर पहुँचती है (उदाहरण के लिए `TGWITNESS_WITNESS_COLLECTOR` इसे ओवरराइड करता है, किसी दूसरे वर्कस्पेस के लिए `/profiles/<workspace ID>` )। किसी अलग सर्वर पर चलने वाले एक विटनेस के लिए, `deploy/compose/compose.witness.yaml` का उपयोग करें और `TGWITNESS_WITNESS_COLLECTOR` को कलेक्टर के HTTPS एड्रेस पर सेट करें; उस फ़ाइल में केवल विटनेस ही होता है।

## एक प्रकाशित छवि स्थापित करें

यह एक सफल [रिलीज़ वर्कफ़्लो](https://phishdestroy.github.io/TgWitness/hi/docs/reference/deployment/#automated-github-releases) और सार्वजनिक GHCR पैकेज कॉन्फ़िगरेशन के बाद उपलब्ध होता है। रिपॉजिटरी का मालिक/नाम इस सोर्स ट्री में हार्डकोड नहीं किया गया है। उस रिलीज़ के वर्कफ़्लो सारांश में दिखाई गई छवि का उपयोग करें।

`deploy/env.example` की प्रतिलिपि `.env` पर करें। `TGWITNESS_IMAGE` को प्रकाशित संस्करण पर सेट करें, **छोटे अक्षरों वाले** रिपॉजिटरी पथ का उपयोग करके, उदाहरण के लिए:

```
TGWITNESS_IMAGE=ghcr.io/your-owner/your-repository:0.7.0
TGWITNESS_PORT=8787
```

`compose.yaml` के बजाय, इस फ़ाइल को अकेले चलाएँ:

```
docker compose --project-directory . -f deploy/compose/compose.image.yaml pull
docker compose --project-directory . -f deploy/compose/compose.image.yaml up -d --wait
docker compose --project-directory . -f deploy/compose/compose.image.yaml exec tgwitness cat /data/panel-token.txt
```

होस्ट पर किसी स्रोत बिल्ड, पाइथन, या कंपाइलर की आवश्यकता नहीं है। रिलीज़ वर्कफ़्लो लिनक्स AMD64 और ARM64 कंटेनरों को लक्षित करता है, जिसमें डॉकर डेस्कटॉप का लिनक्स वीएम भी शामिल है। वर्कफ़्लो सारांश से एक संस्करण टैग या `ghcr.io/owner/repository@sha256:...` का उपयोग करें। कोई चलता-फिरता `latest` टैग या बिना निगरानी वाला एप्लिकेशन अपग्रेड कॉन्फ़िगर नहीं किया गया है। इमेज और स्रोत वेरिएंट, जब उनके प्रोजेक्ट का नाम मेल खाता है, तो एक ही डेटा वॉल्यूम का उपयोग करते हैं।

## सर्वर पर स्वचालित HTTPS

डॉकर वाले सर्वर, आपके द्वारा नियंत्रित एक डोमेन, और स्थायी स्थानीय भंडारण का उपयोग करें। डोमेन के A/AAAA रिकॉर्ड को सर्वर पर पॉइंट करें; AAAA को केवल तभी प्रकाशित करें जब IPv6 उस तक पहुँच जाए। प्रमाणपत्र जारी करने के लिए इनबाउंड TCP 80 और 443 और आउटबाउंड DNS/HTTPS की अनुमति दें। अन्य सेवाओं के पास पहले से ही इन पोर्ट्स का स्वामित्व नहीं होना चाहिए।

`deploy/env.example` की प्रतिलिपि `.env` पर करें और बिना स्कीम या पथ के होस्टनेम सेट करें:

```
TGWITNESS_DOMAIN=watch.your-domain.org
```

HTTPS ओवरले के साथ स्रोत बिल्ड शुरू करें:

```
docker compose -f compose.yaml -f deploy/compose/compose.https.yaml up -d --build --wait
docker compose -f compose.yaml -f deploy/compose/compose.https.yaml exec tgwitness cat /data/panel-token.txt
```

```
docker compose --project-directory . -f deploy/compose/compose.image.yaml -f deploy/compose/compose.https.yaml up -d --wait
```

एक प्रकाशित छवि के लिए, इसके बजाय पहली फ़ाइल के रूप में `deploy/compose/compose.image.yaml` का उपयोग करें। `-f` के दोनों तर्कों को बाद के स्टेटस, लॉग, अपडेट, और स्टॉप कमांड्स के लिए बनाए रखें।

कैडी एक प्रमाणपत्र प्राप्त करता है और उसका नवीनीकरण करता है, HTTP को HTTPS पर पुनर्निर्देशित करता है, और निजी कम्पोज़ नेटवर्क पर कलेक्टर को अनुरोध अग्रेषित करता है। प्रमाणपत्र की स्थिति का अपना स्थायी वॉल्यूम होता है। कलेक्टर का सीधा होस्ट पोर्ट केवल लूपबैक के लिए ही रहता है। प्रदान की गई कैडी कॉन्फ़िगरेशन एक्सेस लॉगिंग को सक्षम नहीं करती है।

`https://watch.your-domain.org` खोलें और पैनल टोकन दर्ज करें। तैयारी की पुष्टि प्रमाणपत्र जारी होने या बाहरी पहुँच की पुष्टि नहीं करती है। यदि HTTPS तैयार नहीं है, तो DNS, फ़ायरवॉल नियमों का निरीक्षण करें, और:

```
docker compose -f compose.yaml -f deploy/compose/compose.https.yaml logs --tail 100 caddy
```

प्रदान की गई Caddy इमेज अपने '`2-alpine`' टैग का अनुसरण करती है। पुल करने पर वह इमेज रिफ्रेश हो जाती है; यदि आपको स्थिर इंफ्रास्ट्रक्चर संस्करणों की आवश्यकता है, तो अपनी डिप्लॉयमेंट में एक परीक्षण किया हुआ डाइजेस्ट पिन करें।

## अपडेट और बैकअप

अपडेट्स के दौरान Compose प्रोजेक्ट का नाम और डेटा वॉल्यूम संरक्षित रखें। सबसे पहले कलेक्टर को रोकें और एक पूर्ण बैकअप बनाएं। डिफ़ॉल्ट स्रोत-आधारित डिप्लॉयमेंट के लिए:

```
docker compose stop
docker compose cp tgwitness:/data ../tgwitness-backup-before-update
```

हर बार, रिपॉजिटरी के बाहर, एक नई बैकअप डेस्टिनेशन का उपयोग करें, और इसे खाता-पहुँच सामग्री के रूप में सुरक्षित रखें। उदाहरण पथ केवल स्पष्टीकरण के लिए है; अपनी निजी बैकअप स्थान का उपयोग करें। छिपी हुई फ़ाइलों, सभी वर्कस्पेस, कुंजियों, जर्नलों और मीडिया सहित पूरी निर्देशिका की प्रतिलिपि बनाएँ। यदि कॉन्फ़िगर किया गया है, तो एक बाहरी वॉल्ट मास्टर कुंजी का अलग से बैकअप लें। सबूत वाला ज़िप एक पुनर्स्थापित करने योग्य एप्लिकेशन बैकअप नहीं है। HTTPS के लिए, यदि आपको इसके प्रमाणपत्र/खाते की स्थिति को बनाए रखने की आवश्यकता है तो कैडी वॉल्यूम को भी सुरक्षित रखें।

स्रोत परिनियोजन के लिए, नई रिलीज़ फ़ाइलें प्राप्त करें और चलाएँ:

```
docker compose up -d --build --wait
```

एक इमेज डिप्लॉयमेंट के लिए, `TGWITNESS_IMAGE` को इच्छित संस्करण में बदलें, फिर चलाएँ:

```
docker compose --project-directory . -f deploy/compose/compose.image.yaml pull
docker compose --project-directory . -f deploy/compose/compose.image.yaml up -d --wait
```

पिछली स्टॉप/कॉपी कमांड के लिए अपने इंस्टॉलेशन की कम्पोज़ फ़ाइल(ओं) का भी उपयोग करें। `.env`, कस्टम कॉन्फ़िगरेशन, और उसी प्रोजेक्ट का नाम रखें। `down` नामित वॉल्यूम रखता है; **`down -v` उन्हें हटाता है**। `.venv` को ऑपरेटिंग सिस्टम या पाइथन संस्करणों के बीच कॉपी न करें। नेटिव अपडेट के लिए, TgWitness को रोकें, इसकी पूरी डेटा डायरेक्टरी का बैकअप लें, स्रोत फ़ाइलों को बदलें, और लॉन्च करने से पहले `python start.py --setup-only` चलाएँ।

अपडेट के बाद पैनल एक्सेस, खाता पहचान, अवलोकन स्थिति और कवरेज की जाँच करें। पुनः आरंभ करने से छूटे हुए टेलीग्राम अपडेट फिर से नहीं बनते हैं। यदि कोई भविष्य का संस्करण भंडारण प्रारूपों को बदलता है, तो रोलबैक के लिए पूर्व-अपडेट बैकअप की आवश्यकता हो सकती है।

## स्वचालित GitHub रिलीज़

[रिलीज़ वर्कफ़्लो](https://github.com/phishdestroy/TgWitness/blob/main/.github/workflows/release.yml) का उपयोग इस प्रोजेक्ट को Actions सक्षम किए गए GitHub रिपॉजिटरी में पुश करने के बाद किया जा सकता है। यह तब चलता है जब एक GitHub रिलीज़ **प्रकाशित** होती है, जिसमें एक प्री-रिलीज़ भी शामिल है। ड्राफ़्ट और टैग पुश अकेले पैकेज प्रकाशित नहीं करते हैं।

1. पैकेज संस्करण और चेंजलाग सेट करें, फिर `v` के साथ टैग की गई एक रिलीज़ प्रकाशित करें, साथ ही सटीक `pyproject.toml` संस्करण, जैसे `v0.7.0`।
2. यह वर्कफ़्लो टैग को मान्य करता है और साझा किए गए Windows/Linux/macOS Python, सामान्य/खाता-आयात/QR ब्राउज़र, स्रोत-पैकेज, और Docker जाँचों को चलाता है। Python 3.12 का उपयोग करके तीनों ऑपरेटिंग सिस्टम पर एक नई नेटिव इंस्टॉलेशन का भी परीक्षण किया जाता है।
3. उन जाँचों के पास होने के बाद, यह QEMU के तहत एक ARM64 इमेज का स्मोक-टेस्ट करता है, AMD64/ARM64 इमेज को `ghcr.io/<lowercase-owner>/<lowercase-repository>:<version>` पर प्रकाशित करता है, और रिलीज़ में सोर्स ZIP, चेकसम, और पाइथन व्हील संलग्न करता है। एक अलग विंडोज जॉब पोर्टेबल ZIP और इसकी चेकसम को बिल्ड और अटैच करता है।
4. पहली प्रकाशन के बाद, GHCR पैकेज सेटिंग्स खोलें और दृश्यता को **सार्वजनिक** पर सेट करें यदि अनाम छवि पुल का इरादा है। केवल एक सार्वजनिक स्रोत रिपॉजिटरी एक सार्वजनिक कंटेनर पैकेज की गारंटी नहीं देती है। संगठन की नीतियों को पैकेज प्रकाशन की अनुमति देनी चाहिए। वर्कफ़्लो `GITHUB_TOKEN` का उपयोग करता है; रिपॉजिटरी में कोई रजिस्ट्री पासवर्ड या वीपीएस क्रेडेंशियल नहीं होना चाहिए।

इस स्थानीय तैयारी से रिमोट वर्कफ़्लो की सफलता स्थापित नहीं हुई है। ARM64 इम्यूलेशन एक स्मोक चेक है, न कि नेटिव-हार्डवेयर या लाइव टेलीग्राम योग्यता। यह रिलीज़ पैकेजिंग को स्वचालित करता है; एक सर्वर शुरू करने के लिए अभी भी Compose कमांड और इसकी डोमेन/होस्ट पूर्वापेक्षाओं की आवश्यकता होती है। जब कोई रिलीज़ प्रकाशित की जाती है तो मौजूदा सर्वर चुपचाप अपग्रेड या रीस्टार्ट नहीं होते हैं।

## रिमोट सर्वर

सेवा को लूपबैक तक सीमित रखें और एक SSH टनल का उपयोग करें, या HTTPS को एक रिवर्स प्रॉक्सी पर समाप्त करें। बेस कम्पोज़ फ़ाइल केवल-स्थानीय है; वैकल्पिक `deploy/compose/compose.https.yaml` ओवरले एक कॉन्फ़िगर किए गए डोमेन के लिए कैडी प्रदान करता है। बियरर टोकन को URL और प्रॉक्सी लॉग से बाहर रखें। एक रिवर्स प्रॉक्सी को अनुरोध आकार और कनेक्शन दरों को सीमित करना चाहिए। साधारण HTTP को इंटरनेट पर एक्सपोज़ न करें।

systemd, एक Windows लॉगऑन टास्क, एक macOS यूज़र एजेंट और Caddy के लिए उदाहरण [deploy](https://github.com/phishdestroy/TgWitness/blob/main/deploy/README.md)/ में दिए गए हैं। इंस्टॉलेशन से पहले उनके पाथ की समीक्षा/अनुकूलन करें। वे प्रदान किए गए टेम्प्लेट हैं, न कि स्थानीय रूप से निष्पादित प्लेटफ़ॉर्म योग्यताएँ। सामान्य लॉन्चर द्वारा कोई बैकग्राउंड सर्विस या टास्क पंजीकृत नहीं किया जाता है।

विंडोज पर, एक विंडो रहित `pythonw.exe` लॉन्च, स्टार्टअप/सर्वर डायग्नोस्टिक्स को डेटा डायरेक्टरी में `logs/server.log` में संग्रहीत करता है (प्रति फ़ाइल 5 MiB, दो रोटेटेड बैकअप)। कंसोल लॉन्च, कंसोल लॉगिंग को बनाए रखते हैं। HTTP एक्सेस लॉगिंग दोनों मोड में अक्षम है। डेटा डायरेक्टरी के साथ लॉग्स को सुरक्षित रखें और साझा करने से पहले उनकी समीक्षा करें।

## पुनरारंभ और अंतराल

अंतिम अनुरोधित अवलोकन स्थिति को बनाए रखा जाता है। यदि अवलोकन सक्रिय था, तो स्टार्टअप चयनित स्रोतों को फिर से जोड़ने और फिर से शुरू करने का प्रयास करता है। मैन्युअल पॉज़ उस इरादे को हटा देता है। एक असफल पुनरारंभ को दर्ज किया जाता है और पैनल में दिखाया जाता है।

StringSession प्राधिकरण को बनाए रखता है लेकिन Telethon की टिकाऊ अपडेट/इकाई स्थिति को नहीं। स्टार्टअप पर डायलॉग फिर से लोड होते हैं। Telegram/Telethon चलने के दौरान कुछ ट्रांसपोर्ट रुकावटों से उबर सकता है, लेकिन TgWitness प्रक्रिया के फिर से शुरू होने पर टिकाऊ रीप्ले का दावा नहीं करता है। हर स्टार्टअप पिछले जर्नल हेड और ऑफ़लाइन सीमा को रिकॉर्ड करता है। मॉनिटर हर 10 सेकंड में कनेक्टिविटी की जांच करता है और हर मिनट एक हार्टबीट जोड़ता है (**पैरामीटर → लाइवनेस रिकॉर्ड हर**)। संक्षिप्त रुकावटें छूट सकती हैं; एक कनेक्टेड ट्रांसपोर्ट पूरी अपडेट डिलीवरी की गारंटी नहीं देता। स्नैपशॉट स्पष्ट वर्तमान-इतिहास अवलोकन होते हैं, कभी भी गैप की मरम्मत नहीं।

मीडिया कतार प्रत्येक वर्कस्पेस के SQLite डेटाबेस में संग्रहीत होती है। एक संदेश और उसका जॉब एटॉमिक रूप से कमिट किए जाते हैं। बीच में रुकी हुई चल रही जॉब्स को शुरू होने पर दोबारा प्रयास के लिए पुनर्प्राप्त किया जाता है। प्रत्येक डाउनलोड में 120-सेकंड का बेस टाइमआउट प्लस उसके आकार के लिए 256 KiB/s पर समय, और प्रति अटैचमेंट प्रकार 1–2,000 MiB की सीमा होती है; टाइमआउट, गति और पुनः प्रयास **पैरामीटर के** अंतर्गत आते हैं। कलेक्टर उन फ़ाइलों को छोड़ देता है जिनका आकार अज्ञात है। रुकने पर कतार में लगा काम बरकरार रहता है। रीट्री मूल देखे गए फ़ाइल डिस्क्रिप्टर का उपयोग करता है, न कि बाद में संपादित संदेश के नवीनतम संस्करण का। अस्थायी विफलताओं के लिए सीमित रीट्री होते हैं; मीडिया फ्लडवेट पॉज़ पुनरारंभ से बच जाते हैं। मीडिया रिकवरी टेलीग्राम अपडेट रिकवरी से अलग है और गायब हुई फ़ाइलों को फिर से नहीं बना सकती।

## बैकअप, पुनर्स्थापना, और क्षमता

**पूरे डेटा डायरेक्टरी**, जिसमें vault.key, signing.enc, credentials.enc, SQLite डेटाबेस/WAL फ़ाइलें, मीडिया, टोकन, चेकपॉइंट, और सभी प्रोफ़ाइल/उप-निर्देशिकाएँ शामिल हैं, की प्रतिलिपि बनाने से पहले प्रक्रिया को रोकें। जब गंतव्य सेवा बंद हो, तब पूरी प्रतिलिपि को पुनर्स्थापित करें। खोई हुई वॉल्ट कुंजियाँ या साइनिंग-की का मेल न खाना स्टार्टअप को विफल कर देता है; जबरदस्ती पहुँच के लिए कुंजियों को फिर से न बनाएं।

एन्क्रिप्टेड और एक्सेस-कंट्रोल वाले बैकअप गुप्त रखें। सबूतों के ज़िप पोर्टेबल होते हैं, ये एप्लिकेशन बैकअप या टेलीग्राम-सेशन बैकअप नहीं हैं। कोई स्वचालित प्रतिधारण-मिटान नहीं है। सभी संदेशों, कच्चे मेटाडेटा, मीडिया, अस्थायी एक्सपोर्ट और बैकअप के लिए डिस्क स्थान की योजना बनाएँ।

पूरे जर्नल को लोड करने के बजाय, स्टार्टअप सत्यापन और एक्सपोर्ट स्ट्रीम रिकॉर्ड्स। एक एक्सपोर्ट एक रीड स्नैपशॉट को पिन करता है जबकि नए WAL राइट्स जारी रह सकते हैं; लंबे समय तक चलने वाले एक्सपोर्ट WAL पेजों को बनाए रख सकते हैं, इसलिए डिस्क क्षमता अभी भी मायने रखती है। स्वतंत्र सत्यापक के डिफ़ॉल्ट से मेल खाने के लिए, ज़िप्स को बिना संपीड़ित किए 4 GiB पर सीमित किया गया है; **पैरामीटर → सबसे बड़ी साइन की गई ज़िप** (**Largest signed**ZIP) सीमा को बढ़ाता है, और ऐसे आर्काइव्स को `verify.py --max-gib N` के साथ सत्यापित किया जाता है। अन्य फ़ॉर्मैट में इवेंट-काउंट की कोई सीमा नहीं होती है। समर्थित ब्राउज़र उपयोगकर्ता द्वारा चुनी गई फ़ाइल में प्रतिक्रिया के टुकड़ों (chunks) को स्ट्रीम करते हैं। अन्य ब्राउज़र अधिकतम 128 MiB तक बफ़र करते हैं और बड़ी ट्रांसफ़र को प्रमाणीकृत CLI (authenticated CLI) पर निर्देशित करते हैं:

```
python -m tgwitness.download --token-file data/live/panel-token.txt --out evidence.zip
```

किसी दूसरे वर्कस्पेस के लिए **एक्सपोर्ट्स → वर्कस्पेस आईडी** से `--profile ID` का उपयोग करें, रिमोट सर्वर के लिए `--format zip|jsonl|csv|html`, `--url https://your-server`, या 5 GiB ट्रांसफर सीमा बदलने के लिए `--max-mib` का उपयोग करें। साधारण HTTP की अनुमति केवल लूपबैक के लिए है। टोकन हेडर में यात्रा करते हैं, रीडायरेक्ट अस्वीकार कर दिए जाते हैं, मौजूदा फ़ाइलें ओवरराइट नहीं की जाती हैं, और अधूरे डाउनलोड को पूरी हुई फ़ाइलों के रूप में प्रकाशित नहीं किया जाता है। यदि TGWITNESS_TOKEN उत्पन्न टोकन को ओवरराइड करता है, तो उस सक्रिय मान वाली एक अलग से सुरक्षित फ़ाइल का उपयोग करें: पैनल-टोकन.txt ओवरराइड द्वारा फिर से नहीं लिखी जाती है। कमांड का SHA-256 केवल एक ट्रांसफर चेकसम है; हस्ताक्षरित ZIP को स्वतंत्र रूप से सत्यापित करें।

सर्वर एक्सपोर्ट फ़ाइलें प्रत्येक वर्कस्पेस के निजी `temporary-exports/` के अंदर रहती हैं। सफल प्रतिक्रियाएँ अपनी फ़ाइलों को साफ़ कर देती हैं। रुकी हुई एक्सपोर्ट फ़ाइलों को अगले वर्कस्पेस स्टार्टअप पर हटा दिया जाता है, जब तक कि उसका एक्सक्लूसिव इंस्टेंस लॉक बना रहता है। यह डायरेक्टरी स्टोरेज थ्रेट/कैपेसिटी मॉडल का हिस्सा है; एक एन्क्रिप्टेड डेटा वॉल्यूम का उपयोग करें। प्रोडक्शन-स्केल मल्टी-गीगाबाइट ट्रांसफ़र के लिए अभी भी आपके टारगेट सिस्टम पर क्वालिफिकेशन की आवश्यकता होती है।

पैनल कतार में लगे/असफल मीडिया, सबसे पुराना लंबित मीडिया, खाली डिस्क, टेलीग्राम अनुरोध विराम, और उन स्रोतों को प्रदर्शित करता है जिनकी पहुंच की पुष्टि नहीं हुई है। ये निदान एक पूर्ण एंड-टू-एंड डिलीवरी मॉनिटर नहीं हैं। वर्कस्पेस एक ही प्रक्रिया साझा करते हैं; एक शोरगुल वाला खाता अभी भी दूसरों को प्रभावित कर सकता है। अलग वर्कर प्रोसेस, प्रतिधारण/परिवर्तन, टिकाऊ अपडेट रिकवरी और पूर्ण परिनियोजन योग्यता बनी रहती है। पैनल की सीमित पहुँच को [पहुँच और अनुमतियों](https://phishdestroy.github.io/TgWitness/hi/docs/reference/access/) में प्रलेखित किया गया है; स्वतंत्र चेकपॉइंट्स को [विटनेस गाइड](https://phishdestroy.github.io/TgWitness/hi/docs/reference/witness/) में शामिल किया गया है।

## कनेक्शन और सुरक्षा विकल्प

कनेक्शन मार्ग प्रत्येक वर्कस्पेस के लिए होते हैं और प्राधिकरण से पहले कॉन्फ़िगर किए जाने चाहिए। SOCKS5/HTTP CONNECT पिन किए गए python-socks निर्भरता का उपयोग करते हैं। MTProxy टेलीथॉन के प्रयोगात्मक यादृच्छिक मध्यस्थ परिवहन का उपयोग करता है; Fake TLS ee secrets समर्थित नहीं हैं। सीधा फॉलबैक चयनित [आईपी मोड](https://phishdestroy.github.io/TgWitness/hi/docs/reference/connection/#ip-modes) पर निर्भर करता है: हाइड आईपी इसे अस्वीकार करता है; एक्सप्लिसिट फॉलबैक मोड एक विलंब के बाद इसे अनुमति देता है। टनल/वीपीएन मोड सीधे रास्तों की अनुमति देता है लेकिन वीपीएन नहीं बनाता है। यह एक सिस्टम-व्यापी नेटवर्क नीति नहीं है।

नई इंस्टॉलेशन के लिए, TGWITNESS_VAULT_KEY_FILE एक अलग से सुरक्षित रैंडम मास्टर-की फ़ाइल की ओर इशारा करता है। इसे /data के बाहर एक कंटेनर में केवल-पढ़ने के लिए माउंट करें। प्रत्येक वर्कस्पेस के साथ सार्वजनिक vault.external.json सॉल्ट मेटाडेटा और मास्टर की को अलग से सुरक्षित रखें। मौजूदा स्थानीय वॉल्ट के लिए एक नियोजित माइग्रेशन की आवश्यकता है; इस वेरिएबल को सेट करने से वे चुपचाप परिवर्तित नहीं हो जाते। संदेश/मीडिया भंडारण और निर्यात एप्लिकेशन-एन्क्रिप्टेड नहीं हैं। जहाँ आवश्यक हो, एन्क्रिप्टेड वॉल्यूम और पर्याप्त निजी अस्थायी भंडारण का उपयोग करें।

विस्तृत प्रक्रियाएँ: [कनेक्शन/सुरक्षा](https://phishdestroy.github.io/TgWitness/hi/docs/reference/connection/) और [संचालन मोड](https://phishdestroy.github.io/TgWitness/hi/docs/reference/operations/)।
