From bc2e002a4972b005b7dcdaf8620d02cf620fe0d4 Mon Sep 17 00:00:00 2001 From: Divarion-D Date: Wed, 26 Nov 2025 20:53:47 +0300 Subject: [PATCH] moving docs to a separate repository --- README.md | 91 ++-- docs/en/api/playlist.md | 126 ------ docs/en/api/system_api.md | 211 --------- docs/en/api/xtreamcodes_api.md | 456 -------------------- docs/en/builds/build_binaries.md | 321 -------------- docs/en/builds/build_ffmpeg.md | 320 -------------- docs/en/faq.md | 78 ---- docs/en/main-page.md | 53 --- docs/en/migration_guide.md | 118 ------ docs/en/update.md | 90 ---- docs/en/updates_checklist.md | 142 ------- docs/img/update1.png | Bin 26074 -> 0 bytes docs/img/update2.png | Bin 43075 -> 0 bytes docs/img/update3.png | Bin 18034 -> 0 bytes docs/img/update4.png | Bin 33070 -> 0 bytes docs/img/update5.png | Bin 37967 -> 0 bytes docs/ru/administration/ssl-generation.md | 160 ------- docs/ru/administration/update-system.md | 177 -------- docs/ru/api/playlist.md | 124 ------ docs/ru/api/system_api.md | 164 ------- docs/ru/api/xtreamcodes_api.md | 518 ----------------------- docs/ru/builds/build_binaries.md | 320 -------------- docs/ru/builds/build_ffmpeg.md | 400 ----------------- docs/ru/info/faq.md | 87 ---- docs/ru/info/migration_guide.md | 119 ------ docs/ru/info/update.md | 90 ---- docs/ru/main-page.md | 62 --- docs/ru/updates_checklist.md | 142 ------- 28 files changed, 59 insertions(+), 4310 deletions(-) delete mode 100644 docs/en/api/playlist.md delete mode 100644 docs/en/api/system_api.md delete mode 100644 docs/en/api/xtreamcodes_api.md delete mode 100644 docs/en/builds/build_binaries.md delete mode 100644 docs/en/builds/build_ffmpeg.md delete mode 100644 docs/en/faq.md delete mode 100644 docs/en/main-page.md delete mode 100644 docs/en/migration_guide.md delete mode 100644 docs/en/update.md delete mode 100644 docs/en/updates_checklist.md delete mode 100644 docs/img/update1.png delete mode 100644 docs/img/update2.png delete mode 100644 docs/img/update3.png delete mode 100644 docs/img/update4.png delete mode 100644 docs/img/update5.png delete mode 100644 docs/ru/administration/ssl-generation.md delete mode 100644 docs/ru/administration/update-system.md delete mode 100644 docs/ru/api/playlist.md delete mode 100644 docs/ru/api/system_api.md delete mode 100644 docs/ru/api/xtreamcodes_api.md delete mode 100644 docs/ru/builds/build_binaries.md delete mode 100644 docs/ru/builds/build_ffmpeg.md delete mode 100644 docs/ru/info/faq.md delete mode 100644 docs/ru/info/migration_guide.md delete mode 100644 docs/ru/info/update.md delete mode 100644 docs/ru/main-page.md delete mode 100644 docs/ru/updates_checklist.md diff --git a/README.md b/README.md index 6bd3bd6dc..4299f9df7 100644 --- a/README.md +++ b/README.md @@ -14,18 +14,43 @@

+--- + +# 📑 Table of Contents + +
+📘 Contents + +* 🏁 [Overview](#-overview) +* ⚠️ [Status](#️-status) +* 📚 [Documentation](#-documentation) +* 🧱 [Technology Stack](#-technology-stack) +* 🧩 [Ubuntu Support](#-supported-ubuntu-versions) +* 📥 [Quick Install](#-quick-install) +* 🧰 [Service Management](#-service-management) +* 📂 [Project Structure](#-project-structure) +* 🧮 [Server Requirements & Sizing](#-server-requirements--sizing) +* ⭐ [Features](#-features) +* 🐞 [Known Limitations](#-known-limitations) +* 🤝 [Contributing](#-contributing) +* 📜 [License](#-license) +* ⚖️ [Legal Disclaimer](#-legal-disclaimer) + +
+ + --- ## 🚀 Overview -**XC_VM** is an open-source IPTV platform based on Xtream Codes. +**XC_VM** is an open-source IPTV platform based on Xtream Codes. It enables: -- 📺 Live & VOD streaming -- 🔀 Load balancing -- 📊 Full user/reseller control -- 🎚️ Transcoding & EPG -- 🔐 Hardened security fixes +* 📺 Live & VOD streaming +* 🔀 Load balancing +* 📊 Full user/reseller control +* 🎚️ Transcoding & EPG +* 🔐 Hardened security fixes > ✅ 100% free. No license checks. No server locks. @@ -33,20 +58,30 @@ It enables: ## ⚠️ Status -> **BETA SOFTWARE** — actively developed +> **BETA SOFTWARE** — actively developed + +--- + +## 📚 Documentation + +* 🇬🇧 **English Guide** + [https://vateron-media.github.io/XC_VM_Docs/#/en-us/](https://vateron-media.github.io/XC_VM_Docs/#/en-us/) + +* 🇷🇺 **Руководство на русском** + [https://vateron-media.github.io/XC_VM_Docs/#/ru-ru/](https://vateron-media.github.io/XC_VM_Docs/#/ru-ru/) --- ## 🧱 Technology Stack -| Component | Version | Description | -|------------|---------|---------------------------------| -| PHP | 8.2 | Backend runtime | -| Nginx | 1.24 | Web server & reverse proxy | -| FFmpeg | 8.0 | Media transcoding & processing | -| MariaDB | 10.6+ | SQL database engine | -| KeyDB | 6.3.4 | Cache & session storage (Redis) | -| yt-dlp | 2025.07.21 | Audio/Video downloader | +| Component | Version | Description | +| --------- | ---------- | ------------------------------- | +| PHP | 8.2 | Backend runtime | +| Nginx | 1.24 | Web server & reverse proxy | +| FFmpeg | 8.0 | Media transcoding & processing | +| MariaDB | 10.6+ | SQL database engine | +| KeyDB | 6.3.4 | Cache & session storage (Redis) | +| yt-dlp | 2025.07.21 | Audio/Video downloader | --- @@ -83,7 +118,7 @@ wget "https://github.com/Vateron-Media/XC_VM/releases/download/${latest_version} # 4. Unpack and install unzip XC_VM.zip sudo python3 install -```` +``` --- @@ -100,21 +135,13 @@ journalctl -u xc_vm -f # Live logs --- -## 📚 Documentation - -* 🇬🇧 [English Guide](docs/en/main-page.md) -* 🇷🇺 [Руководство на русском](docs/ru/main-page.md) - ---- - ## 📂 Project Structure ```text. - ├─ docs/ # 📚 Project documentation ├─ lb_configs/ # ⚙️ Configurations for building Load Balancer (LB) └─ src/ # 💻 Main project code -```` +``` --- @@ -155,18 +182,18 @@ HD bitrate = 4 Mbps | Resource | Load per Stream | | ---------------- | --------------- | | RAM | 50–100 MB | -| CPU (transcoded) | \~1 core | +| CPU (transcoded) | ~1 core | --- ## ✅ Features -* ✅ **No server restrictions** -* ✅ **EPG importer** -* ✅ **VOD management** -* ✅ **User/reseller panel** -* ✅ **Security patches** -* ✅ **Clean UI** +* ✅ No server restrictions +* ✅ EPG importer +* ✅ VOD management +* ✅ User/reseller panel +* ✅ Security patches +* ✅ Clean UI --- diff --git a/docs/en/api/playlist.md b/docs/en/api/playlist.md deleted file mode 100644 index d6a6e0f47..000000000 --- a/docs/en/api/playlist.md +++ /dev/null @@ -1,126 +0,0 @@ -

📺 Get Playlist

- -

- This API provides authentication and playlist generation features for XC_VM. - Clients can authenticate using a username/password or token, after which a personalized playlist is generated. -

- -

- ⬅️ Back to main page -

- ---- - -## 📚 Navigation - -* [📂 File Location](#file-location) -* [🔑 Authentication](#authentication) -* [🚀 Endpoints](#endpoints) -* [❌ Error Codes](#error-codes) -* [🧾 Notes](#notes) - ---- - -## 📂 File Location - -The main API file is located at: - -```bash -/home/xc_vm/wwwdir/playlist.php -``` - ---- - -## 🔑 Authentication - -The API requires authentication either via username and password or via token. -This ensures secure access to the content. - -### Base URL - -```http -http://:80/playlist -``` - ---- - -## 🚀 Endpoints - -### 1. Authentication and Playlist Generation - -**Method & Endpoint:** - -```http -GET / -``` - -**Query Parameters:** - -| Parameter | Type | Required | Description | -| --------- | ------- | -------- | ------------------------------------------------------------------------------------------------- | -| username | string | Yes* | Username for authentication (required if `token` is not used). | -| password | string | Yes* | Password for authentication (required if `token` is not used). | -| token | string | Yes* | Authentication token (required if username and password are not used). | -| type | string | No | Device type (default: `m3u_plus`). | -| key | string | No | Content type (`live` — live TV, `movies` — movies, `radio_streams` — radio, `series` — TV shows). | -| output | string | No | Output format (`hls` or `m3u`). | -| nocache | boolean | No | If true, disables caching. | - -> 💡 *Yes* — one option is required: either username/password or token. - -**Example Requests:** - -```bash -curl -X GET "http://:80/playlist/username/password/type&output=hls&key=live" -``` - -```bash -curl -X GET "http://:80/playlist/token/type&output=hls&key=live" -``` - -**Response:** - -* Playlist file in the requested format (M3U or HLS). - ---- - -## ❌ Error Codes - -If an error occurs, the API returns the corresponding error codes for easier troubleshooting. - -| Error Code | Description | -| ------------------------ | ------------------------------------- | -| NO_CREDENTIALS | Missing authentication data. | -| INVALID_CREDENTIALS | Invalid username, password, or token. | -| BLOCKED_USER_AGENT | User agent is blocked. | -| EXPIRED | Account has expired. | -| DEVICE_NOT_ALLOWED | Device type is not allowed. | -| BANNED | User is banned. | -| DISABLED | Account is disabled. | -| EMPTY_USER_AGENT | User agent is required but missing. | -| NOT_IN_ALLOWED_IPS | IP address is not allowed. | -| NOT_IN_ALLOWED_COUNTRY | Country is not allowed. | -| NOT_IN_ALLOWED_UAS | User agent is not allowed. | -| ISP_BLOCKED | ISP is blocked. | -| ASN_BLOCKED | ASN restriction applied. | -| DOWNLOAD_LIMIT_REACHED | Too many requests. | -| GENERATE_PLAYLIST_FAILED | Failed to generate playlist. | - -> ⚠️ **Tip:** Check server logs for more details if errors occur. - ---- - -## 🧾 Notes - -* **Query Parameters:** Make sure all parameters are provided correctly to avoid authentication errors. -* **Restrictions:** The API applies filters by user agent, IP address, and country to enhance security. -* **Rate Limiting:** Request limits are enforced to prevent server overload. -* **Recommendations:** Use tools like cURL or Postman for testing. In production, integrate this API into your application for automated playlist generation. - -> 💬 If you have integration questions, open an issue in the [repository](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Back to main page -

diff --git a/docs/en/api/system_api.md b/docs/en/api/system_api.md deleted file mode 100644 index 0cb0d2bef..000000000 --- a/docs/en/api/system_api.md +++ /dev/null @@ -1,211 +0,0 @@ -

📡 System API (Method Verification Required)

- -

- This API provides various system functionalities, including log viewing, video-on-demand (VOD) and stream management, statistics retrieval, background command execution, and more. -

- -

- ⬅️ Back to main page -

- ---- - -## File Location - -``` -/home/xc_vm/wwwdir/api.php -``` - -## API Architecture Overview - -**Base URI:** `http://:25461/api.php` -**Authentication:** `password` parameter matching the `live_streaming_pass` configuration -**Example:** -`http://:25461/api.php?&password=` - ---- - -## Main API Endpoints - -### 1. VOD Management - -#### **GET** `/api.php?action=vod` - -**Description:** Starts or stops Video-on-Demand (VOD) streams. -**Parameters:** - -| Parameter | Type | Required | Description | -| ---------- | ----------------- | -------- | -------------------------------------- | -| stream_ids | array of integers | yes | List of stream IDs. | -| function | string | yes | Action to perform (`start` or `stop`). | - ---- - -### 2. Live Stream Management - -#### **GET** `/api.php?action=stream` - -**Description:** Starts or stops live streams. -**Parameters:** - -| Parameter | Type | Required | Description | -| ---------- | ----------------- | -------- | -------------------------------------- | -| stream_ids | array of integers | yes | List of stream IDs. | -| function | string | yes | Action to perform (`start` or `stop`). | - ---- - -### 3. System Telemetry - -#### **GET** `/api.php?action=stats` - -**Description:** Retrieves system statistics. -**Response:** - -```json -{ - "cpu": 8.32, - "cpu_cores": 56, - "cpu_avg": 8.86, - "cpu_name": "Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz", - ... -} -``` - ---- - -### 4. Process Lifecycle Check - -#### **GET** `/api.php?action=pidsAreRunning` - -**Description:** Checks whether specified process IDs (PIDs) are currently running. -**Parameters:** - -| Parameter | Type | Required | Description | -| --------- | ----------------- | -------- | ----------------------- | -| pids | array of integers | yes | List of PIDs to verify. | -| program | string | yes | Program name. | - ---- - -### 5. Get File - -#### **GET** `/api.php?action=getFile` - -**Description:** Downloads the specified file. -**Parameters:** - -| Parameter | Type | Required | Description | -| --------- | ------ | -------- | ----------------- | -| filename | string | yes | Path to the file. | - -**Response:** - -* File contents. - ---- - -### 6. Directory Listing - -#### **GET** `/api.php?action=viewDir` - -**Description:** Retrieves a directory listing. -**Parameters:** - -| Parameter | Type | Required | Description | -| --------- | ------ | -------- | ---------------------- | -| dir | string | yes | Path to the directory. | - -**Response:** - -```html - -``` - ---- - -### 7. Connection Redirection - -#### **GET** `/api.php?action=redirect_connection` - -**Description:** Redirects a connection based on the activity ID and stream ID. -**Parameters:** - -| Parameter | Type | Required | Description | -| ----------- | ------- | -------- | ------------ | -| activity_id | integer | yes | Activity ID. | -| stream_id | integer | yes | Stream ID. | - ---- - -### 8. Send Signal - -#### **GET** `/api.php?action=signal_send` - -**Description:** Sends a signal message to trigger an action. -**Parameters:** - -| Parameter | Type | Required | Description | -| ----------- | ------- | -------- | ------------------- | -| message | string | yes | Message or command. | -| activity_id | integer | yes | Activity ID. | - ---- - -### 9. Clear Temporary Folder - -#### **GET** `/api.php?action=free_temp` - -**Description:** Deletes temporary files and executes a caching script. - ---- - -### 10. Clear Streams Folder - -#### **GET** `/api.php?action=free_streams` - -**Description:** Clears the streams directory. - ---- - -### 11. Get Free Disk Space - -#### **GET** `/api.php?action=get_free_space` - -**Description:** Returns information about available disk space. - ---- - -### 12. Get Process PIDs - -#### **GET** `/api.php?action=get_pids` - -**Description:** Returns a list of running process IDs. - ---- - -### 13. Kill Process by PID - -#### **GET** `/api.php?action=kill_pid` - -**Description:** Terminates a process by its PID. - ---- - -## Error Codes - -| Code | Description | -| -------------------- | --------------------------- | -| INVALID_API_PASSWORD | Invalid API password. | -| API_IP_NOT_ALLOWED | IP address not allowed. | -| INVALID_REQUEST | Invalid request parameters. | - ---- - -## Notes - -* All requests must be authenticated using the correct API password. -* Some actions may require additional permissions or may be restricted depending on the server configuration. diff --git a/docs/en/api/xtreamcodes_api.md b/docs/en/api/xtreamcodes_api.md deleted file mode 100644 index 803ec4d7a..000000000 --- a/docs/en/api/xtreamcodes_api.md +++ /dev/null @@ -1,456 +0,0 @@ -

📡 XtreamCodes API

- -

- The API provides access to IPTV streams (Live TV, Radio), VOD (Movies), Series, and EPG (TV guide) for applications compatible with XtreamCodes. - It is a core component for integration with XC_VM. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [📂 File Location](#file-location) -* [📑 Overview](#overview) -* [🔑 Authorization](#authorization) -* [📺 Live TV (TV & Radio)](#live-tv-tv--radio) -* [🎬 VOD (Movies)](#vod-movies) -* [📽 Series](#series) -* [🎞 Media Access](#media-access) -* [🧾 Notes](#notes) - ---- - -## 📂 File Location - -The main API file is located at: - -``` -/home/xc_vm/wwwdir/player_api.php -``` - ---- - -## 📑 Overview - -The API is divided into key sections for easier integration. -Each endpoint includes example requests and responses. - ---- - -## 🔑 Authorization - -Authorization is the first step to access content. -It validates user credentials and returns server information. - -### Request - -```http -GET /player_api?username={username}&password={password} -``` - -### Example Response - -```json -{ - "user_info": { - "username": "testxc", - "password": "testxc", - "message": "Welcome to XC_VM", - "auth": 1, - "status": "Active", - "exp_date": null, - "is_trial": 0, - "created_at": 1757353729, - "max_connections": 1, - "allowed_output_formats": [ - "m3u8", - "ts", - "rtmp" - ] - }, - "server_info": { - "xui": true, - "version": "1.1.0", - "url": "176.124.192.118", - "port": "80", - "https_port": "443", - "server_protocol": "http", - "rtmp_port": "8880", - "timestamp_now": 1757442189, - "time_now": "2025-09-09 19:23:09", - "timezone": "Europe/London" - } -} -``` - -> 💡 **Tip:** Use the obtained data for subsequent requests to avoid repeated authentication. - ---- - -## 📺 Live TV (TV & Radio) - -Endpoints for working with live streams, including categories, streams, and EPG. - -### Get All Live Categories - -```http -GET /player_api?username={username}&password={password}&action=get_live_categories -``` - -**Example Response** - -```json -[ - { - "category_id": "1", - "category_name": "News", - "parent_id": 0 - }, - { - "category_id": "2", - "category_name": "Sports", - "parent_id": 0 - } -] -``` - -### Get All Live Streams - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams -``` - -**Example Response** - -```json -[ - { - "num": 1, - "name": "BBC News", - "stream_type": "live", - "stream_id": 101, - "stream_icon": "http://176.124.192.118/images/bbc.png", - "epg_channel_id": "bbc.news.uk", - "added": "1660568200", - "category_id": "1", - "custom_sid": "", - "tv_archive": 0, - "direct_source": "", - "tv_archive_duration": 0 - } -] -``` - -### Get Streams by Category - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams&category_id={id} -``` - -### Get Channel Short EPG - -```http -GET /player_api?username={username}&password={password}&action=get_short_epg&stream_id={id}&limit={N} -``` - -**Example Response** - -```json -{ - "epg_listings": [ - { - "id": 1, - "title": "Morning News", - "start": "2022-08-15 07:00:00", - "end": "2022-08-15 08:00:00", - "description": "Daily morning news update." - } - ] -} -``` - -### Get Full Channel Schedule - -```http -GET /player_api?username={username}&password={password}&action=get_simple_data_table&stream_id={id} -``` - -### Get EPG for All Channels (XMLTV) - -```http -GET /xmltv.php?username={username}&password={password} -``` - -**Example Response (XMLTV)** - -```xml - - - BBC News - - - Morning News - Daily morning news update. - - -``` - ---- - -## 🎬 VOD (Movies) - -Endpoints for Video on Demand, including categories and movie details. - -### Get Movie Categories - -```http -GET /player_api?username={username}&password={password}&action=get_vod_categories -``` - -**Example Response** - -```json -[ - { - "category_id": "10", - "category_name": "Action", - "parent_id": 0 - }, - { - "category_id": "11", - "category_name": "Drama", - "parent_id": 0 - } -] -``` - -> ⚠️ **Note:** The full list of categories may be large; only fragments are shown in examples. - -### Get All VOD Streams - -```http -GET /player_api?username={username}&password={password}&action=get_vod_streams -``` - -**Example Response** - -```json -[ - { - "num": 1, - "name": "The Dark Knight (2008)", - "title": "The Dark Knight", - "year": 2008, - "stream_type": "movie", - "stream_id": 1, - "stream_icon": "http://176.124.192.118:80/images/...jpg", - "rating": 8.5, - "rating_5based": 4.3, - "added": 1757343129, - "plot": "Batman raises the stakes in his war on crime. With the ...", - "cast": "Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine, Maggie Gyllenhaal", - "director": "Christopher Nolan, Christopher Nolan, Steve Gehrke", - "genre": "Drama, Action, Crime", - "release_date": "2008-07-16", - "youtube_trailer": "kmJLuwP3MbY", - "episode_run_time": "152", - "category_id": "1", - "category_ids": [1, 2], - "container_extension": "mp4", - "custom_sid": "", - "direct_source": "" - } -] -``` - -### Get Movies by Category - -```http -GET /player_api?username={username}&password={password}&action=get_vod_streams&category_id={id} -``` - -### Get Movie Info - -```http -GET /player_api?username={username}&password={password}&action=get_vod_info&vod_id={id} -``` - ---- - -## 📽 Series - -Endpoints for managing TV shows, including categories, seasons, and episodes. - -### Get Series Categories - -```http -GET /player_api?username={username}&password={password}&action=get_series_categories -``` - -### Get All Series - -```http -GET /player_api?username={username}&password={password}&action=get_series -``` - -**Example Response** - -```json -[ - { - "num": 1, - "name": "Braceface (2001)", - "title": "Braceface", - "year": 2001, - "stream_type": "series", - "series_id": 1, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljpT6mCZeHa4zLXMQZ2eaTpGZUSOucptPKyuP5tgpEZm0.jpg", - "plot": "The show, set in Elkford, British Columbia, is based around Sharon Spitz, who is a junior high school student with braces that get in her way of leading a normal teenage life. In the first season, she is enrolled at Mary Pickford Junior High.", - "cast": "Stacey DePass", - "director": "Charles E. Bastien", - "genre": "Drama, Animation, Comedy", - "release_date": "2001-06-02", - "releaseDate": "2001-06-02", - "last_modified": "1757348651", - "rating": "7", - "rating_5based": 3.5, - "backdrop_path": [ - "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeATBaSzxZEgi9EPIvh5kU_50ecbH2L-yDt1PIfqijKTIMg.jpg" - ], - "youtube_trailer": null, - "episode_run_time": 25, - "category_id": "4", - "category_ids": [4] - } -] -``` - ---- - -### Series by Category - -```http -GET /player_api?username={username}&password={password}&action=get_series&category_id={id} -``` - -### Get Series Info - -```http -GET /player_api?username={username}&password={password}&action=get_series_info&series_id={id} -``` - -**Example Response** - -```json -{ - "seasons": [ - { - "air_date": "2001-06-02", - "episode_count": 26, - "id": 4937, - "name": "Season 1", - "overview": "", - "season_number": 1, - "vote_average": 4.5, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljJBrZ7sNEJHE6hlqofFOJSRKiMRvSj08-T6iTQVWvj2I.jpg", - "cover_big": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljJBrZ7sNEJHE6hlqofFOJSRKiMRvSj08-T6iTQVWvj2I.jpg" - } - ], - "info": { - "name": "Braceface (2001)", - "title": "Braceface", - "year": 2001, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljpT6mCZeHa4zLXMQZ2eaTpGZUSOucptPKyuP5tgpEZm0.jpg", - "plot": "The show, set in Elkford, British Columbia, is based around Sharon Spitz, who is a junior high school student with braces that get in her way of leading a normal teenage life. In the first season, she is enrolled at Mary Pickford Junior High.", - "cast": "Stacey DePass", - "director": "Charles E. Bastien", - "genre": "Drama, Animation, Comedy", - "release_date": "2001-06-02", - "releaseDate": "2001-06-02", - "last_modified": "1757348651", - "rating": "7", - "rating_5based": 3.5, - "backdrop_path": [ - "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeATBaSzxZEgi9EPIvh5kU_50ecbH2L-yDt1PIfqijKTIMg.jpg" - ], - "youtube_trailer": null, - "episode_run_time": 25, - "category_id": "4", - "category_ids": [4] - }, - "episodes": { - "1": [ - { - "id": "2", - "episode_num": "1", - "title": "Braceface - S01E01 - Brace Yourself", - "container_extension": "mp4", - "info": { - "release_date": "2001-06-02", - "plot": "Sharon Spitz, a 13-year-old 8th grader gets braces the day before picture day. During the procedure, a thunderstorm causes a power outage, and something strange happens with Sharon's braces, making her do all sorts of weird things!", - "duration_secs": 649, - "duration": "00:10:49", - "movie_image": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeARCK8Ch0a6wlNxuIHhbJ3c1Dg_AqkwSsH-qdpnCvcMsiy6U85vvi1bs1xDOddBeOEQ.jpg", - "bitrate": 2791, - "rating": "5", - "season": "1", - "tmdb_id": "105800", - "cover_big": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeARCK8Ch0a6wlNxuIHhbJ3c1Dg_AqkwSsH-qdpnCvcMsiy6U85vvi1bs1xDOddBeOEQ.jpg" - }, - "subtitles": [], - "custom_sid": "", - "added": 1757348651, - "season": 1, - "direct_source": "" - } - ] - } -} -``` - ---- - -## 🎞 Media Access - -After authorization, you can access direct links to media files. - -* **Live TV (channel):** - -```http -http://176.124.192.118/live/{username}/{password}/{stream_id}.ts -``` - -* **Movie (VOD):** - -```http -http://176.124.192.118/movie/{username}/{password}/{vod_id}.mp4 -``` - -* **Episode:** - -```http -http://176.124.192.118/series/{username}/{password}/{episode_id}.mp4 -``` - -> ⚠️ **Important:** On the first request, a redirect occurs to `/auth/...` for authentication before content is served. - ---- - -## 🧾 Notes - -* **Output Formats:** Supported formats — `m3u8`, `ts`, `rtmp`. Choose based on your device. -* **Security:** All requests require valid authorization; monitor logs for access errors. -* **Integration:** Use tools like Postman for testing. - Implement response caching in your application for better performance. - -> 💬 If you have integration issues, please open an issue in the [repository](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Back to Main Page -

diff --git a/docs/en/builds/build_binaries.md b/docs/en/builds/build_binaries.md deleted file mode 100644 index 7c189f9ea..000000000 --- a/docs/en/builds/build_binaries.md +++ /dev/null @@ -1,321 +0,0 @@ -

🧱 XC_VM — Building Binary Files

- -

- This guide explains how to build binary files for XC_VM. - It is intended for developers and system administrators who want to customize the system. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [🔧 Prerequisites](#prerequisites) -* [🌐 Building NGINX](#building-nginx) -* [📺 Building NGINX with RTMP](#building-nginx-with-rtmp) -* [🐘 Building PHP-FPM](#building-php-fpm) -* [📦 Installing PHP Extensions](#installing-php-extensions) -* [⚙️ Building the `network` Binary](#building-the-network-binary) -* [✅ Conclusion](#conclusion) - ---- - -## 🔧 Prerequisites - -> ⚠️ **Warning:** All steps should be performed **on the server** where `xc_vm` is installed. - -### 1. Install Dependencies - -Install the necessary packages for building. This ensures all required tools and libraries are available. - -```bash -sudo apt-get install -y \ - build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \ - libssl-dev libgd-dev libxml2 libxml2-dev uuid-dev libxslt1-dev \ - unzip wget curl git -``` - ---- - -## 🌐 Building NGINX - -### 1. Download Source Files - -#### OpenSSL - -```bash -wget https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz -tar -xzvf openssl-3.5.1.tar.gz -``` - -#### Zlib - -```bash -wget https://zlib.net/zlib-1.3.1.tar.gz -tar -xzvf zlib-1.3.1.tar.gz -``` - -#### PCRE - -```bash -wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz -tar -xzvf pcre-8.45.tar.gz -``` - -#### FLV Module - -```bash -wget https://github.com/winshining/nginx-http-flv-module/archive/refs/tags/v1.2.12.zip -unzip v1.2.12.zip -``` - -#### Nginx - -```bash -wget https://nginx.org/download/nginx-1.28.0.tar.gz -tar -zxvf nginx-1.28.0.tar.gz -cd nginx-1.28.0 -``` - -### 2. Configure Build - -Configure a static build with required modules: - -```bash -./configure \ - --prefix=/home/xc_vm/bin/nginx \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' \ - --with-pcre=../pcre-8.45 \ - --with-pcre-jit \ - --with-zlib=../zlib-1.3.1 \ - --with-openssl=../openssl-3.5.1 \ - --with-openssl-opt=no-nextprotoneg -``` - -### 3. Build and Install - -```bash -make -make install -``` - ---- - -## 📺 Building NGINX with RTMP - -### 1. Download RTMP Module - -```bash -wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz -tar -xzvf v1.2.2.tar.gz -``` - -### 2. Configure Build - -```bash -cd nginx-1.28.0 -./configure \ - --prefix=/home/xc_vm/bin/nginx_rtmp \ - --add-module=../nginx-http-flv-module-1.2.12 \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' -``` - -### 3. Build and Install - -```bash -make -make install -``` - -### 4. Rename Executable - -```bash -mv /home/xc_vm/bin/nginx_rtmp/sbin/nginx /home/xc_vm/bin/nginx_rtmp/sbin/nginx_rtmp -``` - ---- - -## 🐘 Building PHP-FPM - -### 1. Install Dependencies - -```bash -sudo apt-get install -y \ - libcurl4-gnutls-dev libbz2-dev libzip-dev autoconf automake \ - libtool m4 gcc make pkg-config libmaxminddb-dev libssh2-1-dev -``` - -### 2. Download PHP Source - -```bash -wget -O php-8.1.33.tar.gz http://php.net/get/php-8.1.33.tar.gz/from/this/mirror -tar -xzvf php-8.1.33.tar.gz -cd php-8.1.33 -``` - -### 3. Configure Build - -```bash -./configure \ - --prefix=/home/xc_vm/bin/php \ - --with-fpm-user=xc_vm \ - --with-fpm-group=xc_vm \ - --enable-gd \ - --with-jpeg \ - --with-freetype \ - --enable-static \ - --disable-shared \ - --enable-opcache \ - --enable-fpm \ - --without-sqlite3 \ - --without-pdo-sqlite \ - --enable-mysqlnd \ - --with-mysqli \ - --with-curl \ - --disable-cgi \ - --with-zlib \ - --enable-sockets \ - --with-openssl \ - --enable-shmop \ - --enable-sysvsem \ - --enable-sysvshm \ - --enable-sysvmsg \ - --enable-calendar \ - --disable-rpath \ - --enable-inline-optimization \ - --enable-pcntl \ - --enable-mbregex \ - --enable-exif \ - --enable-bcmath \ - --with-mhash \ - --with-gettext \ - --with-xmlrpc \ - --with-xsl \ - --with-libxml \ - --with-pdo-mysql \ - --disable-mbregex \ - --with-pear -``` - -### 4. Build and Install - -```bash -make -make install -``` - ---- - -## 📦 Installing PHP Extensions - -Use the built-in `pecl` to install extensions: - -```bash -/home/xc_vm/bin/php/bin/pecl install maxminddb -/home/xc_vm/bin/php/bin/pecl install ssh2 -/home/xc_vm/bin/php/bin/pecl install igbinary -/home/xc_vm/bin/php/bin/pecl install redis -``` - -### Configuring Redis Extension - -During PECL installation, you will be prompted: - -``` -enable igbinary serializer support? [no] : yes -enable lzf compression support? [no] : -enable zstd compression support? [no] : -enable msgpack serializer support? [no] : -enable lz4 compression? [no] : -use system liblz4? [yes] : -``` - -Recommended answers: `yes` for igbinary, others optional. - ---- - -## ⚙️ Building the `network` Binary - -### 1. Install `PyInstaller` (one-time) - -```bash -pip install -U pyinstaller -``` - -### 2. Build Binary - -```bash -cd /home/xc_vm/bin -pyinstaller --onefile network.py -``` - -The executable will be located in: - -```bash -/home/xc_vm/bin/dist/network -``` - -### 3. Move Binary to Final Location - -```bash -mv /home/xc_vm/bin/dist/network /home/xc_vm/bin/network -``` - -### 4. Clean Temporary Directories - -```bash -rm -rf build dist network.spec __pycache__ -``` - ---- - -## ✅ Conclusion - -After completing all steps, you will have your own statically built binaries: - -* `nginx` -* `nginx_rtmp` -* `php-fpm` -* `pecl` extensions -* `network` (Python script binary) - -> 💡 **Tip:** If issues occur, check build logs or open an [issue](https://github.com/Vateron-Media/XC_VM/issues). - -

- ⬅️ Back to Main Page -

- ---- \ No newline at end of file diff --git a/docs/en/builds/build_ffmpeg.md b/docs/en/builds/build_ffmpeg.md deleted file mode 100644 index 53e0fafc1..000000000 --- a/docs/en/builds/build_ffmpeg.md +++ /dev/null @@ -1,320 +0,0 @@ -Вот английский перевод руководства по сборке FFmpeg для XC_VM: - ---- - -

🚀 XC_VM — FFmpeg Build Guide

- -

- This guide explains how to build FFmpeg with NVIDIA hardware acceleration (NVENC/CUVID) and statically link libraries for full portability within the XC_VM project. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [📋 Requirements](#requirements) -* [🔧 Configuration](#configuration) -* [🛠 Install Build Tools](#install-build-tools) -* [🎶 Compile and Include Codecs](#compile-and-include-codecs) -* [🖥 NVIDIA & CUDA Installation](#nvidia--cuda-installation) -* [🔨 FFmpeg Build](#ffmpeg-build) -* [📦 Installation](#installation) -* [✅ Verification](#verification) -* [🧾 Notes](#notes) -* [🔄 Version Compatibility](#version-compatibility) - ---- - -## 📋 Requirements - -* **Ubuntu 22.04 or newer** — recommended OS for a stable build. -* NVIDIA GPU with **NVENC support** (optional but recommended for hardware acceleration). -* ~15 GB of free disk space for sources and temporary files. -* Stable internet connection to download dependencies. - -> 💡 **Tip:** Ensure your system is updated before starting to avoid package conflicts. - ---- - -## 🔧 Configuration - -Set environment variables to customize the build, allowing easy adjustments to versions and paths: - -```bash -# FFmpeg version to build -export FFMPEG_VERSION="8.0" - -# Installation directory -export INSTALL_DIR="/home/xc_vm/bin/ffmpeg_bin" - -# Build directory -export BUILD_DIR="$HOME/ffmpeg_sources" - -# CUDA version -export CUDA_VERSION="12-2" - -# NVIDIA driver version -export NVIDIA_DRIVER_VERSION="535" -``` - ---- - -## 🛠 Install Build Tools - -Update the system and install essential development packages: - -```bash -sudo apt-get update -qq && sudo apt-get -y install \ - autoconf automake build-essential cmake git-core \ - libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev \ - libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev \ - libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \ - meson ninja-build pkg-config texinfo wget yasm \ - zlib1g-dev mercurial nasm libssl-dev software-properties-common -``` - ---- - -## 🎶 Compile and Include Codecs - -Build libraries from source for static integration into FFmpeg, supporting popular formats without external dependencies. - -### 2.1 Create Build Directory - -```bash -mkdir -p ${BUILD_DIR:-~/ffmpeg_sources} && cd ${BUILD_DIR:-~/ffmpeg_sources} -``` - -### 2.2 H.264 (libx264) - -```bash -git clone https://code.videolan.org/videolan/x264.git -cd x264 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.3 H.265 (libx265) - -```bash -git clone https://bitbucket.org/multicoreware/x265_git.git -cd x265_git/build -cmake ../source -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" -DENABLE_SHARED=OFF -make -j$(nproc) -sudo make install -cd ../.. -``` - -### 2.4 VP8/VP9 (libvpx) - -```bash -git clone https://chromium.googlesource.com/webm/libvpx -cd libvpx -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.5 Opus Audio (libopus) - -```bash -wget https://downloads.xiph.org/releases/opus/opus-1.5.2.tar.gz -tar -xvzf opus-1.5.2.tar.gz -cd opus-1.5.2 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.6 Additional Libraries - -* **libass** (subtitles) -* **libfreetype** (fonts) -* **libvorbis** (audio) -* **libmp3lame** (MP3) -* **libtheora** (Theora) -* **librtmp** (RTMP) -* **libunistring** (required by gnutls and librtmp) -* **bzip2** - -*(Use the same build commands as in the Russian version, adjusting paths as needed.)* - ---- - -## 🖥 NVIDIA & CUDA Installation - -Install NVIDIA drivers and CUDA for hardware acceleration. - -### 3.1 NVIDIA Driver Installation - -```bash -sudo add-apt-repository ppa:graphics-drivers/ppa -sudo apt update -sudo apt install nvidia-driver-${NVIDIA_DRIVER_VERSION:-535} -``` - -> ⚠️ **Important:** Reboot after installation and verify GPU compatibility. - -### 3.2 CUDA Toolkit Installation - -```bash -wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb -sudo dpkg -i cuda-keyring_1.0-1_all.deb -sudo apt update -sudo apt install -y cuda-toolkit-${CUDA_VERSION:-12-2} -``` - -### 3.3 NVENC Headers - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git -cd nv-codec-headers -make -sudo make PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" install -cd .. -``` - -### 3.4 Optional NVIDIA Tools - -```bash -sudo apt install -y nvidia-cuda-toolkit nvidia-cuda-dev -``` - ---- - -## 🔨 FFmpeg Build - -### 4.1 Download Source - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -wget https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -tar xjvf ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -cd ffmpeg-${FFMPEG_VERSION:-8.0} -``` - -### 4.2 Configuration - -```bash -export PATH="${INSTALL_DIR:-$HOME/bin}:$PATH" -export PKG_CONFIG_PATH="${INSTALL_DIR:-$HOME/ffmpeg_build}/lib/pkgconfig" - -./configure \ - --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" \ - --pkg-config-flags="--static" \ - --extra-cflags="-I${INSTALL_DIR:-$HOME/ffmpeg_build}/include -I/usr/local/cuda/include" \ - --extra-ldflags="-L${INSTALL_DIR:-$HOME/ffmpeg_build}/lib -L/usr/local/cuda/lib64 -Wl,-Bstatic -lcrypto -lssl -Wl,-Bdynamic" \ - --extra-version=XCVM \ - --extra-libs="-lsupc++ -lgmp -lz -lunistring -lpthread -lm -lrt -ldl" \ - --bindir="${INSTALL_DIR:-$HOME/bin}" \ - --enable-gpl \ - --enable-gnutls \ - --enable-libass \ - --enable-libfreetype \ - --enable-libmp3lame \ - --enable-libopus \ - --enable-libvorbis \ - --enable-libvpx \ - --enable-libx264 \ - --enable-libx265 \ - --enable-librtmp \ - --enable-libtheora \ - --enable-bzlib \ - --enable-fontconfig \ - --enable-zlib \ - --enable-nvenc \ - --enable-ffnvcodec \ - --enable-cuvid \ - --enable-version3 \ - --enable-nonfree \ - --enable-pthreads \ - --enable-runtime-cpudetect \ - --enable-gray \ - --disable-alsa \ - --disable-indev=alsa \ - --disable-outdev=alsa \ - --disable-ffplay \ - --disable-doc \ - --disable-debug \ - --disable-autodetect \ - --enable-static \ - --enable-muxer=hls \ - --enable-muxer=dash \ - --enable-demuxer=hls \ - --extra-cflags=--static \ - --target-os=linux -``` - -### 4.3 Compile - -```bash -make -j$(nproc) -``` - ---- - -## 📦 Installation - -```bash -mkdir -p ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -cp ffmpeg ffprobe ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -``` - ---- - -## ✅ Verification - -Check version and NVIDIA support: - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -version -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffprobe -version -``` - -Check NVENC and CUVID support: - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -encoders | grep nvenc -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -decoders | grep cuvid -``` - ---- - -## 📝 Notes - -1. All libraries are statically linked into the FFmpeg binary, ensuring full portability. -2. The NVIDIA driver must be compatible with your GPU. -3. A **reboot** may be required after installing drivers. -4. Building FFmpeg is CPU- and memory-intensive. -5. The resulting binary will be large due to included dependencies. -6. Adjust environment variables to match your system. -7. Configuration flags may need adjustments for different FFmpeg versions. - ---- - -## 🔄 Version Compatibility - -| FFmpeg Version | Recommended CUDA | Notes | -|----------------|------------------|------------------| -| 8.x | 12.2+ | Latest features | -| 7.x | 12.0+ | Stable | -| 6.x | 11.8+ | Outdated | - -Check the [FFmpeg documentation](https://ffmpeg.org/) for specific version requirements. - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/en/faq.md b/docs/en/faq.md deleted file mode 100644 index a43ed2cf8..000000000 --- a/docs/en/faq.md +++ /dev/null @@ -1,78 +0,0 @@ -

❓ FAQ — Frequently Asked Questions

- -

- Here you’ll find answers to the most common questions and issues when working with XC_VM. -

- ---- - -## ⚙️ Stream Issues - -
-❌ My stream doesn’t start on MAIN or LB - ---- - -### 🔍 Diagnostics - -Connect to your server console and run the following command: - -```bash -sudo -u xc_vm /home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/monitor.php 291 -```` - -> 🧩 Where `291` is your **stream ID** (replace it with your own). - ---- - -### 📄 What the command does - -The **monitor.php** script tries to start the stream manually and displays an error if it fails. - ---- - -### ⚠️ Possible causes - -#### 1️⃣ Missing system libraries - -If the output contains an error like: - -``` -error while loading shared libraries: libxyz.so.1: cannot open shared object file -``` - -Install the missing library with: - -```bash -sudo apt install -``` - -After installation, rerun the test. - -> 💬 Let me know if a library needs to be added to the installation script. - ---- - -#### 2️⃣ Error not related to libraries - -If the error is of another type — send its output so I can help diagnose it. - ---- - -### 🧾 Summary - -1. Run the diagnostic command. -2. Check for any errors. -3. Install missing libraries if necessary. -4. Report any other errors for further analysis. - ---- - -
- ---- - -📘 *This page is updated over time. If you discover a new common issue — please suggest it in [Issues](https://github.com/Vateron-Media/XC_VM/issues).* - ---- - diff --git a/docs/en/main-page.md b/docs/en/main-page.md deleted file mode 100644 index 9a0fdb70e..000000000 --- a/docs/en/main-page.md +++ /dev/null @@ -1,53 +0,0 @@ -

📚 XC_VM Documentation

- -

- Welcome to the official XC_VM documentation!
- Here you’ll find everything you need to work with the project — from API guides to build and update instructions. -

- ---- - -## 🔌 API Reference - -| Section | Description | -|:---------|:-------------| -| [System API](api/system_api.md) | Core system endpoints and utilities. | -| [Get Playlist](api/playlist.md) | Generate and download user playlists. | -| [XtreamCodes API](api/xtreamcodes_api.md) | Integration with XtreamCodes-compatible systems. | - ---- - -## 🛠 Build & Compilation - -| Section | Description | -|:---------|:-------------| -| [Binaries](builds/build_binaries.md) | Instructions for building core binary components. | -| [FFmpeg](builds/build_ffmpeg.md) | Guide to building and configuring FFmpeg for XC_VM. | - ---- - -## 🔄 Update & Release - -| Section | Description | -|:---------|:-------------| -| [Panel Update](update.md) | Step-by-step guide for upgrading XC_VM to the latest version. | -| [Pre-Release Checklist](updates_checklist.md) | A checklist to follow before publishing a new release. | - ---- - -## 📦 Additional Resources - -| Section | Description | -|:---------|:-------------| -| [Migration Guide](migration_guide.md) | Step-by-step guide for migrating from XUI, Xtream Codes, and similar panels. | -| [FAQ](faq.md) | Frequently asked questions and troubleshooting. | - ---- - -

- - 🔗 Back to Repository - -

- ---- diff --git a/docs/en/migration_guide.md b/docs/en/migration_guide.md deleted file mode 100644 index a6712f969..000000000 --- a/docs/en/migration_guide.md +++ /dev/null @@ -1,118 +0,0 @@ -

🧭 XC_VM Migration Guide

- -

- Easily migrate from compatible IPTV systems using the built-in XC_VM migration tool. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [⚙️ Before You Start](#before-you-start) -* [🚀 Migration Steps](#migration-steps) -* [🔑 Restoring Access After Migration](#restoring-access-after-migration) -* [🧩 Post-Migration](#post-migration) -* [🖥️ Load Balancer Preparation](#load-balancer-preparation) - ---- - -## ⚙️ Before You Start - -> 💡 **Recommendation:** -> It’s best to perform migration on a **fresh XC_VM installation**. - -If you decide to use an **existing installation**, note the following: - -* XC_VM **will delete all tables** in your main database that match the data found in your migration database. -* Always **create backups** before performing migration. - ---- - -## 🚀 Migration Steps - -### 1. Upload Backup - -Upload your existing database backup to the XC_VM server via **SFTP**. -In this example, it is located at: - -``` -/tmp/backup.sql -``` - -### 2. Restore Backup to Migration Database - -Use the tools script to clear the existing migration database and restore the backup: - -```bash -/home/xc_vm/tools migration "/tmp/backup.sql" -``` - -### 3. Start Migration - -If the restoration completed without errors, you can start the migration using one of two methods: - -#### 🧩 Option 1 — Command Line (Recommended) - -Run the migration manually: - -```bash -/home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/migrate.php -``` - -#### 🌐 Option 2 — Web Installer - -If you prefer not to use the command line, you can return to the **web installer** via the link provided during panel setup. -Select the **“Migration”** option and follow the on-screen instructions to complete the process interactively. - -You will see real-time progress updates while XC_VM migrates your data. -Once complete, you will be able to log in to your system. - ---- - -## 🔑 Restoring Access After Migration - -If you cannot log in (e.g., due to missing username/password or invalid access code), you can use **rescue tools**: - -### Create a Rescue Access Code - -```bash -/home/xc_vm/tools access -``` - -### Create an Administrator to Restore Access - -```bash -/home/xc_vm/tools user -``` - -> ⚠️ After logging in, immediately **change the access code and administrator credentials**. - ---- - -## 🧩 Post-Migration - -* Load balancers will initially appear **disabled**. -* All streams will **automatically stop** for safety. - -### Next Steps - -1. Reinstall load balancers and **manually start streams** after confirming migration. -2. Review and update **XC_VM default settings**. -3. Check main server data — domains, SSL configuration, etc. -4. Ensure everything matches your environment and settings. - ---- - -## 🖥️ Load Balancer Preparation - -You will need to reinstall the OS on the load balancers. - ---- - -

- ⬅️ Back to Main Page -

diff --git a/docs/en/update.md b/docs/en/update.md deleted file mode 100644 index 21c30f32d..000000000 --- a/docs/en/update.md +++ /dev/null @@ -1,90 +0,0 @@ -

🔄 XC_VM Update Guide

- -

- This document describes the process of updating XC_VM via the web control panel. Follow these steps to safely update the system and avoid errors. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [⚙️ Before You Start](#before-you-start) -* [🪜 Step-by-Step Instructions](#step-by-step-instructions) -* [🧠 Notes and Recommendations](#notes-and-recommendations) - ---- - -## ⚙️ Before You Start - -Make sure all necessary resources are ready before updating. This helps prevent issues and data loss. - -* 🔑 **Administrator access** to the control panel. -* 🌐 **Stable internet connection**. -* 💾 **Server data backup** *(strongly recommended before starting)*. - -> ⚠️ **Important:** Do not interrupt the update process to avoid system corruption. - ---- - -## 🪜 Step-by-Step Instructions - -Follow these steps to update via the panel. Each step is illustrated with a screenshot for convenience. - -### 1️⃣ Go to the **“Servers”** Section - -* Log in to the control panel. -* Select **Servers** from the main menu. - - ![Servers](../img/update1.png) - -### 2️⃣ Select **“Manage Servers”** - -* In the **Servers** section, click **Manage Servers** to open the list of available servers. - - ![Manage Servers](../img/update2.png) - -### 3️⃣ Open the **“Actions”** Menu - -* Locate the server you want to update. -* Click the **Actions** button — usually a dropdown menu or an icon next to the server. - - ![Actions Menu](../img/update3.png) - -### 4️⃣ Go to **“Server Tools”** - -* In the **Actions** menu, select **Server Tools** to open server management utilities. - - ![Server Tools](../img/update4.png) - -### 5️⃣ Run **“Update Server”** - -* In **Server Tools**, click **Update Server**. -* Confirm the action if prompted (password may be required). -* Wait for the update to complete — **do not interrupt the process** to avoid errors. - - ![Update Server](../img/update5.png) - ---- - -## 🧠 Notes and Recommendations - -> 🕒 **Update Duration** -> Depends on server size and internet speed. Usually takes from a few minutes up to an hour. - -> ✅ **Post-Update Check** -> After completion, verify server status, restart services, and ensure everything is working correctly. - -> ⚠️ **Update Errors** -> If errors occur, check server logs (e.g., in `/home/xc_vm/logs/`). If the problem persists, create an issue in the [repository](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Back to Main Page -

- ---- \ No newline at end of file diff --git a/docs/en/updates_checklist.md b/docs/en/updates_checklist.md deleted file mode 100644 index 1fa1c06f1..000000000 --- a/docs/en/updates_checklist.md +++ /dev/null @@ -1,142 +0,0 @@ -

✅ XC_VM Release Preparation Checklist

- -

- This document describes the process of creating an XC_VM release — a step-by-step guide for developers on updating the version, building archives, and publishing on GitHub. -

- -

- ⬅️ Back to Main Page -

- ---- - -## 📚 Navigation - -* [🔢 1. Update Version](#1-update-version) -* [🧹 2. Deleted Files](#2-deleted-files) -* [⚙️ 3. Build Archives](#3-build-archives) -* [📝 4. Changelog](#4-changelog) -* [🚀 5. GitHub Release](#5-github-release) - ---- - -## 🔢 1. Update Version - -* Set the **new `XC_VM_VERSION` value** in the following files: - -**Files to edit:** - -``` -src/www/constants.php -src/www/stream/init.php -``` - -**Auto-update command:** - -```bash -find -type f -name "*.php" -exec sed -i \ -"s/define('XC_VM_VERSION', '[0-9]\+\.[0-9]\+\.[0-9]\+');/define('XC_VM_VERSION', 'X.Y.Z');/g" {} \; -``` - -**Commit the changes with a message:** - -```bash -git add . -git commit -m "Bump version to X.Y.Z" -git push -``` - -> 💡 **Tip:** Replace `X.Y.Z` with the actual version, e.g., `1.2.3`. - ---- - -## 🧹 2. Deleted Files - -* Generate a list of deleted files: - -```bash -make delete_files_list -``` - -* Open the file `dist/deleted_files.txt`. -* Copy the contents to `src/includes/cli/update.php` **after the comment** `// Update checkpoint` - -> ⚠️ **Important:** Ensure paths are correct to avoid deleting critical files. - ---- - -## ⚙️ 3. Build Archives - -* Run the following commands sequentially: - -```bash -make new -make lb -make main -make main_update -make lb_update -``` - -* Make sure the following files are created in `dist/`: - - * `loadbalancer.tar.gz` — LB installation archive - * `loadbalancer_update.tar.gz` — LB update archive - * `XC_VM.zip` — MAIN installation archive - * `update.tar.gz` — MAIN update archive - * `hashes.md5` — file with checksums - -> 🧰 **Check:** After building, verify archive integrity with `md5sum -c hashes.md5`. - ---- - -## 📝 4. Changelog - -Generate the changelog from git first: - -```bash -git log --pretty=format:"- %s (%h)" X.Y.Z..main > dist/changes.md -``` - -* **Then add current release changes** using this JSON: - -[https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json](https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json) - -* Add current release changes in JSON format: - -```json -[ - { - "version": "X.Y.Z", - "changes": [ - "Description of change 1", - "Description of change 2" - ] - } -] -``` - -> 💬 **Recommendation:** Keep descriptions concise and informative, focusing on key improvements and fixes. - ---- - -## 🚀 5. GitHub Release - -* Create a new release on [GitHub Releases](https://github.com/Vateron-Media/XC_VM/releases). - -* Attach the following files: - - * `dist/loadbalancer.tar.gz` - * `dist/XC_VM.zip` - * `dist/update.tar.gz` - * `dist/loadbalancer_update.tar.gz` - * `dist/hashes.md5` - -* Include the changelog in the release description. - -> ✅ **Completion:** After publishing, verify that all files are downloadable and checksums match. - ---- - -

- ⬅️ Back to Main Page -

diff --git a/docs/img/update1.png b/docs/img/update1.png deleted file mode 100644 index 64693ca7decf8f9a4b5323e63c8030821d3bc9c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26074 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 diff --git a/docs/img/update2.png b/docs/img/update2.png deleted file mode 100644 index 57d3995e1113ccd906b5bbd56435e102eef695cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43075 zcmeAS@N?(olHy`uVBq!ia0y~yVA{dJz-Yk1#=yW3bDD{rfq{Xuz$3Dlfr0M`2s2LA z=96Y%P+;(MaSW-5dvmukCgkbA10T;fJYdq|=_GsSkY1~n_nyQzTZS~P!z53}V zW8eI1r6-NFw^n=SUKKlSa@pwYp%AUh+F9?o7c6RNI)e)j!t zww2B4%5xmgEzg(Ft9;h;uFv{ifQEC4mF&WW3oELtv%631oOrsoNBYH%Rz7_P$H0;o zC02VxSW6ZJmpItPS;>lCXq?n9&h=feZ0)Z}SS zSpV6H@ly$xm)(NX?(O1MuE%v%<>&gbTj`64XoY=0x_pv;*P;cNU*6ew_WX5u|Jm26Jbq3-ItJ2^V)w(*8* z>k6&x?dL~t&ntX=P1p4PrGL{dJ^H5dyrHzME>(Z+?#F%BBDu#)uU}iRA~V@)Zr_3h z3R+=nR_Jcp)o++xT4Htj;EI!E6D@Jby1t+_Fd`>~#08uUEKL%eQ1FWSqBH ztGj)Q*}2U};&!gSb9deD+r{SP_V(r5(-ZEzTN}Oo#QF2#^7E|HB2!yExpi}`HIsOBbosXY1-{i?%ljU#EIU}7yL)$R z`t9N+`;<##9=F4IYJ}0hqZrk${pNp5w zYuub!@c#apxw(~1yXVihzIFQib$v^Nc?(P3cQ2}t_>~xV`Q1IMV%bk$t}R&ca?+F7 zwNYDd-a2zh&)#0XzP>(pTj;zWsrNs9Q#*ZJe7?42%%^WpZ^V|K{Ir^7*CD?Ekv8GA zD_(xuV_Kk=oB4m!AxL6Mzpcl4?oaicm9KgHx4!0aw%5wKHF53cuWxf>GtUd0c=qH; z!RKebMMXs?&YxG;*FT?C&F1RceY^S3*}KOt@Y`B7X9rx_GR<$fvW102eEenpmdK>l zvhFwT#0Rb@c+1u`UHs=%?OnCct{r$*{9yt-2;3!qEmY2QooKpa+AU+f@F|BRt+Joq z+EO^rdgt!g^6k&_-qqFhZCS3tRasg2Q$`EE#IEK-nRPbv>luJm7$5!`~3L}_hUS@yM9W=IDeQme|>z_gxRyR zudP3Q8Z{0xI!BGQ(fa!OSyxvr{qG*3QLZwuEp+1uRQ*mAGmAj|!=HXHA-n)@}C>)oHHJ8w;U z=%SHztDwePeTMq>qZdE&^j!XSN_XkjoT<^L^|@`n-hq2^t!?(tK8;iRw(VFP>uhiQ zCuh#JX}7(^k6(*D&U_`6edo@d8eKnq)@`#BiSyqQox5{&W?}WD;saLB_S#vyJhBUT zyJnSzCL}0?t_m?cS?s?1*qyucw7ni#PB~(D@bhuq*Kei43A62a_MEck*Mjw@$YfqW zFmcO6-K@t&kFC~ey!v--2P96{+1a~ZT)%j4>1(krrPmqVlNZX1na0L#pSI3?-Llrw z)G{{l1NZOGe|2^B>P-JX7i}*t+ideuhDY{n)GYyr2<_`-5#_nEoH1RSN|)6#r(d4; zXk~K6s@M-Px8LQ3-=1gomaBYAV(0GLrRCM{5?-{o&F{T@tH}A*2GcVar0f)yy}kZ4 z6_i#r;y&%xw{x9!Q1|89{(gSb>}xK|wQp%FMa!&x?y34w1}W~QKF@j4{_RrRw%n<^ zH${$ePI#%?^(<)`+n{2 z^|gy~c)Molojvu1N6+Eyt*sYda{2p|f4(ArsbG=iq%e`!#uD>xO$%|q!X}k)Z{ZwY z>CMyP#VTIytcH5(`h|Jcw@cHbkKMVuZs|9kzZ+L%mgn@|Hugz*^5n^i*O^|jeLnmtJYDsh zt*tKN%9e*erIz2_2`Z%BZ<$_r7OiDI@8{-_Jnh_Gc%f*m>GjYm>TzUL;4aBuk%5f?6EP>RSEIU9#0*hiM zGK6y|wg@;)(H45Z1!8m*xiZCo7#xA?JQ}oHKsru|au&3L7%n@N7}tRqEgIn}2SmYU zJnb4t!=`fG;!$kTI4@WCBT-3Nd1c7TN!v~+n&;g~`26f_&G)+BNmo8u48rmZ8H00y?2ftV@>~NMov?`1HRD+bP)fh~6ARb-EerQZ49hE16Mvk1+e^wzWq1({QiGm_50*(Pqpz%Z*k2t%(-D8WtMZ|P%HOV z*X>I?h1G+0m*uwcNFKVmIsNAL{Q29ug4KLyxh(gad*#d3)#08V9tnScedX&lUmAI| zOSJO+-tQHk&zg7k_Ffg6-tmaHU@vpVopr2=_v~1<6rUw9<;a#)dLoEc~I^-Vt` z)GY1lTCQaJESIa5{GOG3=w5YqXti;-oJV)isiFxBHM|@dvg5mmV}eLy*cdMnl?GvUYXTfcr=mA$%=P$Teo z^2!su-Ab!MSBn{^ok_UAuXat;)~+d2L~=#jO>%Edku*-5FmvX~eYL+k`uo*YR9f!s zt^WL|Ti+=CoXlH2*Jm$p8iHC9*K$`EKR>r6>naz6zP`R&zg+AS2Jr_E4mRi9-p1R| z(73r%lyFFdo%jZI-fXurmZSBBhb8S zhei3GQ)g9;KT1^pn;s%?;+?{)>GqN~l|p~zB+oSdm@0FEWxkZ|3u~20dAU&nVa%H* z3wQi1RMp0oKM!>XIb=fvny+7cpf@9Hz#U;eUEFTCU&Se!AzjaCHtY>?E;#_=v!ND(YFSP9n-RxKVpBKEkm!gdD`V=zGr3{w|h=jD?Bb+Zjf<7!S2@! z<$Zs@MaNaYHQoBQ>g%hI`~Uy#cWh=86c%>goOX7GMWK>y)t3jqzP^5QV`DQbx7dVf z)7TD7_P0Cv_xt_xFE1~bG)Q0&)ecj!v6)l$_LgD(J)2o3nNC$zR=dmJKU=%~o|2(q zplw)Xs`kFn!~Wi_Y}2GR2yLIW|Af)KlV242ZNEv#T9quwy1Gh5MP)Nx|R`Iw8kB)Y?w6kIv%}}r|Epw>GRZiwA@MN7-=23jH>Y1MUhLW} z_T<^Kq8AqwCl?=%`#n`V{MqAv`(p`LSA{ave7zc;b8Cy|+5L0Byt;Z?MOH?}=k~VT zpRd>N_xUt;>dcuZ@9nL=`sL%}ZG6cZB@Wvog#F6_S`VU)t58@)}%z+l3U9~E_f zzlKj{_&wR*?qM^(UBdZ!wpsUDIE6oa`({>od`15KeI;*iP2I4;KuB2l=eynSXV}$R zB_HooRab9c=-hs3TW)mP*;z~92}?0|7f}Ja^pvy{O8Vh%JV;d()PYl zu!~EUop)KV?%&NHR$iW%*lhKv_=onrSs#tO>-`q_%{T0+U&71SmKtrxXi~R8zchGp zMg6zaIzJ6NC)`Vx5Wgw$`1&=*w`|5c0?n-L>Sj*Af72moZk^8zqqaU)?&8|4(#M^h z$uB~c8+}iw8CTy_o0Rn>>C6#zu2(+}5olpFdEf-Ls zkZ*rTsVeaKm#Db;e|Un$+$TN}b$epJ+;G`ue#7{4&z}C&wtRKD^Pphq$I?go_co{d z=T18nHuLw(9=S4+kl7ZQN(;9-amz1Uc%|q=Vfx{=BlB!Bzh~UMdGpHJ=;;RzI86R? zb#?gXzu)h#e))V}b>IKr`~N@w{eJ&)_kOuIcXm!rJw5H>Vt4+neqUc*l{8M{5mxhA z;5k`M#;#^Y>FaA3_t)2N<&0B^IWL=t4lX}+amw@b~!gTG`_sNTv%NE_>GOpnYY9KFIt^+w999< z8E<`ky_kO7nNLqo?|i*(_Y8x?CeLhs+b;s@{_|2!P0`ee-6djgZ!cH<#;{M;`q-6~ z!JS=QkM32!e>%}!&hX}WvFO^nVUdxbJjli;bK-XXe&6GLvRjXav9hsU+EJKnmUkyZ z=nm77@hXuFxEk3w*?dJnwk(r^3-FQpCU7NA{zwX&t zrjOC4OgpMQ9GIPLjdv>`O>|Ko;u3gT!tiiJX?@Wnj`-;yW-|%z!T$LC9BY$k&(;nAbbaQi& z>g;dJCV4Yu+wW;R-;;SKenY?Q!Gi}|T3SB5*?j)fL3a5WQ}+J(beiGMx7+z@Ki?&* z8(k2IUiJ6c?EFthg#8y>j?~(!tE=0q=-hTAR(NaCQ!lI1S4R#uvv+oOCf?sy`{&>9 z_aLnH^;nPOVd?xm2ixWAI1X69-{ZVGY^{WGT94=5soLQ}!orJ}?f>)18&vEa?~}dy z=ilGooAd5kIqZ+q)7S4mE?*xb>odRpU*)#k+in#VJ9hD%x_*87&CThv&zv*My3)bQ zEmrX82&dm1i-R+b(^mu?{pc?rwl-?2s`oU5%1zuiXRUG z-md5A>Dln_j%nQd$o+M-pf-8G{XdVYDy!Sua+NJDXYT+1FM4gV_sKZ+F8_c4fywIr z&t6|P7Zgg*tzeR1$y11{lI_>PNqce@u8UE(vCL}2E z+k9xa`ToWAT(U?JjqfSyc5!1}*oK?US`$wyrXM zPlaLbtu2A)ouj*|@+vJ3d|jB=zR$&EeP{ks2C415ipB349|cYJu$|#>PB}LtxO{Wn z%qD*h-FI)jk6Z0yNKt>I@~Yp$=-S$fn~HnYY(mZ|Ag!1hV}Gg&X6 zxLGg%_{P=WFU`N+-(oS>;myWonLG6ji(ek|S8BgrTMk+6%-ksR+j{!J#L|zSJr#_9Y8cLB zY}xw8?Z{l-6_Jb85>0D9e!Tj>k7v_lVUM8jsviOZLE`(fIc02ew|x5%#dO>+Zb`VX zb6f6oy;vnHt63c#9Fr%XE(kh1-~RrNU9)d+h{|we_1>-hewUAZ`z`*NTQe>mTF5^W z)acxvA3w`9+s(y=Wo`8KXLHN%DQatXzr4JBbNTzYtZQpL|Ni8D&9(XS;qZ|oM=tECES56MS+TG7#xh^&SJ&2_zPUNw_gkF4J?y|FR*&)4hm67ycg zmfv+PC@`2`_iJULc0-+m36H_8Vnsv4iA$EK#8o~O6%rPH4#IeralIYIG%)-(CCg zPQ=Ef)@>)A+$q>vTYc)2Wzvq^n1loc+v;yi($CN1k++-UZ}+pM{9a|d`n-y!2@?by z_J2vaxhb_r)_Pj?`@Q1&>kn;rmVN7=u#3&yz+i&kTr0!0GZK#;JvwpXgo2ID9PjCR zD-W(c`0#N1)l`PQ58uD58yH-8v#ajI1IOjeG4AILy}!M`e?HjX)-@wTBmLZ*hbJZ~ z%h*%|M4w%>XkPR@-h$e!OBP86e{YGFEV!ex=-aW0GiQ5$+sLf)gm1a;Ypa~T?!(LP zCLHU1*ZMDnN$BB?_`(#iGhVxt7UW5o)^4(#P|5p2@yWbEpXz1$rNu#=-TkIqT-+&g z30DvOJo5F0$7k!q9Q_qdb^j}x7RT>Dy4(Kf%XFX5#fFiqrn2vBi;Qmn*&rS^EnQ^V zPm>o%TQncPkeK9q>7<3wBwhF4uhDL{d_+q0TMs`MJ4j+0S`;^s}a26Z4yG*1Na*JE+aOtL*Km zBb~xGcN8wZd3)A2o4;Q!XHDS#6&ZW@cF5D2i=T@gI6K>%lZ)$8nsC%+HLC}|wr0O* zcrqpB*_pY{&(FSeCu9*#GC#=53mf9zD7;|MMpw z>%EIKbRsr1%(JZy+MXA?tNi`B7Z(>tZcJj`|L@mo&)Dp)=T-q#66|`{RMgd(1?1$; zt&81lvUFL_*7TTZ^XKP>EP8%o=d-6zk8Vsp{^Mu*?dNT)-&!wPGfz1)Gjqw(r8B== zT(Cf4neXgl=jK{hzTJAg;_1}zAHU!4|M_zH{28{@+kWL6FXMH~y}0gRZ&z2+$w{hT z-rSu0e*gb_&wehNyXE3C-MdWw*2^NT_}^@O{K7KrWd8oY$EIqB@A&<0HzzOe(&+7Z zG5cy}S{6TBk$oXo^VH6#HyO;$J7wS79Olcln=rd*0&{1xTJ!fQ|b#?_r81Y;_!-(@6TM`sfS)%Tdtf_-JKpLt6NmO zKSW)>@%eH1n={ONm|s}@itl-SYvP6%7IPwnWG^gW?R74j5b|N6(f+93%oyeASDyG3 z6|FBcRF$6p?kp$&Ezc~+2d{)h{64eUrTi!w|FfIxB;Buy_2gWb zW9D|;aJqL|me9?qw=V3MCvP3h9j6$=ySQ@ktQqJ2-b$|lr9bPEAj@N3C!!|gF1?bt zapT5Uzg(+%fcelUUvu97l-YV18VQY;d^SL+F{w`bQJDcr5E4TQG zGiR1meSP)njJCu3dwVU*-prV_E$!~EQczF3`u*PNj?HX_g^ygezPYk8xa9S<-WM-2 zzB&c23{u@y`g&R2i8Hg}_Ev4ox~lcn^6TsC{h(5#{_pE}zq4+jl=-S%rYFB%`Abl6 z@XLF9cUN(1HlLeoJ$e58_2+6@uC3|ZK3zQf`kIU37hcXVPUpM3yIkGQZrCev2zWt~A=dWKu>*H)E7ngi_aq&+1{aQZu9S=^vc6eFz<3r-U zACI_mx6SP7;d%7vQAbZt%K3S=YWg~d4j-OrRjO6|{G6($X6KYCB2nA(d_zK}L@f_o z?8d^%I`ixfYbWWRm>mU;&(6*+{_!EPbmb)F=WV99zR8A$ouAmu&R_I?@Ap|xUY1zx zDu3TMf4=%cQgS_cJc%gxOQ3xD*r^l;16#e$wK~s!(mcm>mn2 z6&DwCav1!w;hUi&e&WFQam8 zsVS!&%av@u<>yL!@`SH-9}At_QI*f^ZrrG4_oL$H18D&VkEskyQd<-k)!R#jx1RB0 zWC=N`xZtP{|{V?PO2)Vu@~+={^3aR^%b9TMUH3q-FI)hcvih{>VIzq>G+zO1IP7S z8W`-EoTM%rCK>EK^k+xeE-psKx+fXw3%FC}_dPs+B#x&#Pb&1<`qa;v_Ez8I-PT7n z)IB<=**5v~hHslQbYg6JH|b2-m2zo`r_U@C&)ILye*XM<NRV0w&mYnH*Ia)-dTl@kA1wEK7V7uLnjf}#9Lc3P4e!{@SAG|nlLW?*}T!M zR|;H@*Zr+B%eeu{C=xam1}9IREYlC0Hf8I9u;0HwEV2LpXEJDWdc{LBYY9 zmzHqaR((;hvYHjWJ&)0#;zPnLv)oglL7aWHzca3_ku-I7`oi46SNH#MIcS_~ncv(~ z+wa$jFY9oItp(^_q`@O=HN~nl%Q*Fv$mW^R&DHOAy8r!fVSfET&#$kpW?ov->An3} z(fiT`C7#~ikGu8v8ALMYpMQ0Ab>+*Y(`Oi^a_#^B&)Uw;ZcE0+Ccn8>8_VCvnO^wu zbb35!kR;x>wf6&!4F5Ui9XM;qtV94*wtR&b_@&MNRF}0!L=E{Cj6WC2BLj z-HC4feJ5^h%?=c4b(gDbu_}E9YX7f(-llr<=1r4~3k}upcD8#>)tWeG&YKI|h0U8P z`u_ZQ-2dgpMd#Y>XCrQJ%l-NH`~98&|NYiw+rFTF`l;2=L97sK|Oq*cm6W+^5^${zjylQ=jS_1UJ4y< z=T|o|x$Iq zwRrUtrkEm6tFnfcJr7G>-=D6 zxnG&Zdqvi|?dR!Q1>3$AXX7^-)e0;==9iZ8uEy?Hs%Cy{cS^zcxSq;V5k|WSlG~fN zzW#rue!-c*%AG1M>y_I4cxGG5?|&2Wh%fKK->=dgni1z`SDSS$egDKLBS8O`Z_Eja zpib+3&HZ-&=gD^NbkK9J|I@W%f}u~vYv-DxV9O1q%=6ctOt~?E)8|y|q1V}K<|tf$ zbYsh#*iG!Nm$v^mdB*-^(yssF*ZzsP?Z0;GRNuvYbKlu;FI+u4En7EoLqg+G{+X6S zca|(&`tieI{@Z^UPQJOhd1uj6E@n2Kfc-aLy}G)3P2ApFDSO{Gv2vd{aU$Wtfksfi z`tqgZUj6@C(;Zu%Z$59Ad}fBBPSlnYD)y?Xt%--*KK}W9{`0-+_nO z+5Dy*Iey%@d-}_BU*}d<{z3TT%v#zdMvSi7Iy1!ME{a37y**WRN36EVRFApv5x9eJ@ z@#f~{_T2sdy7*3}r1*l)sDlx^L&YKfHB+zlO`zehFOWGxN~L$H#AOOlHr_%-r+u z*J~abiwT^FxS4)${4!T(=5IkmJ=YzJN-no-kejjb>a9JMn-6=7i0MQmd{f-4KEGzt{JL9< z)@q$(T#%S%7=LZ=bJ)*!_FnrLm!B7Rm*;0)U&s4mf8EuBKF~DQL}hoTUpJ*5e?8y& zX70sj&u3e&Xk6!cBs(bS#E!L+(-t@U(^Hi;&r5lHtk-XUseT^+#*G`#%(0w&u$eu0 ze_bu8FI-SyaD9Eex~b{ZZgKrh)!*~B*QBohuxC>2B85{cAMxecUf;Azf=|)w*rTJ} zD+Mzud*?bC%)!m>&>;lS_Ga>XW4P6 zSI4E%s(YvFlca9FcWIr{vxQU-tQEJNE?r#d-YxRAK1$5ERbWw!_Cr;!MSnhgS+iDH z_vXs1z-?iBLPSj%-`lXSS$`;6_IVy$#^BLlp9j9Ua2-I>e~zN2w@Q#5<@hM==v z+Yaljy)OE6{K3r9tdj4(3CJcZ^&ikYqZ8NWJ}~pt ziPp{0($%x%k1aa1AT0cYz@i;9=av5o4yupKO0V*D3g3Nj-Rs76EIXY#Zck;|aftO< z;PTgsOQ+iQZqmJKz?;##J@3)8XD*VDxBc+1R}www2f=eMqJx^Afz3vt)FGb zqKp{6ytQwhmL$Ahr1Vbjlx6kv_R|{|Dn2mfE#dZl!@4VsJ7<&36D~!UpCC6)%4EsX z=i6}RR2=KgTS3#O%UeW*KF@G1j1KNu>>Rzk$JueoK1T1;5?}hON56<4UA3 z-ePRK`p!R#I|S=YQO}YC(oy-QxMaFMOuyN|XgM$8r|63LMhnENGQ=Q{L#kaeib- z*0k($%ce+Svsbqk2mgOAI4?VL$D$XCvs;D3mhLEFIQ;YVjWv0Wv1d22mb2_^ND~+T zChpV`OIF5CFgaIhvZGXM!_}4ljgu|IIgUqI*ZVZP zJnnlGu_4>=!qy%0+nZu0zv_Fh-6F7bCd-aPcG=3iLubiyO**!-k7YX_`!=hu^=fB| zWggy&Tcz|)@6MVN8)yAx+fx7OkZp-u>$m3E$qwP|Q-8hVFJfH2np@E&Q=M_$hC?Mc zuJJv(mYF4{(p$WiZM$0}AM19v`%FvIGL3aM1)O%8rorCzr(8GVK+=bF!^>Y{%+HyM ztdL)^#ixCp!3kFG_QL!L*>R_B+&L6aNpTjm=DP9;m@x0NZi@Cz$X;%iX8Pv6LW`#N z^PWX#P58Nd&()f4R=DoAU^Uy$UoEZ6*0St$eK^gnMPO0M1cvLqP1#qKmz3G&Zu1V( zS1Ho844fV7Gly4!H-~+aD_>setN&b+!)BVi5;?xgI?Q`Y*f(X%-KJZXH+UY%-nV_> z6_X30I-#szY7fp-*skCmd|v0U(&wmWmQEaj(>xkpyR|iJS>c#>l5M+N$+P4grL$(S zdX@(07ZpTDr0t!SwqX0gqK!{u0_AT0j~2gX!2jh;u|e)7w+*YmaXNdkUrQ^V%UN_a zX>(PYq}WT1id)}Sb1Ay4Tz-0AnX_Jc-nXOS*^yt*M&)jEcI%Zm_E@<+bMsv%`4p=~ z57<7lCa-T?`j`7NSH4&Lgb?=J#}BUU==*qm=C-VRfqx@85?_7TDDgG@v3OJK=Iw6A zJFVt=PFQvRdisnr-^2{g1#|sN-_vh9?UsmB$E0UV&kDGH|8XL*N9tkCgkLx8+p2YT zl+IBL*m}@nhv~x2;ykn2w)6EZcDl3AXIFQi{ibW@&m{SM7N4;#qV~8ehvF#?&H~#b zHx&W7 z2XkibEloKf<|Gm%@^|e4o@lOJGn<-T+Ai^Z-}_o)Ypn6K^}J3TfwMdtqR)6GUAwkY zA!s?TudnE~rJM;<4_T{AJhwdZXn|Hsz{`>c4)vQvmc07CER%t!>*y{vtAbbF@;O^o zTLe@cr)f+n=3}3!7jWB5`nn18nzc8h=cdnJEbz2(+xiu?Zg(?&PgoW#reb^Zy3NgP z0!|j*Ofii&6Cw`GWITPL=_W%?d-K(n9d9jfg>R|7Q1pJ=nX3Jz%S07hG%AH2a4jfk zJ2CChL4RZC?9zZO2A5N8eu(W^n)!T#)17Zu?1DD1iLd#t>wV_*7u{LUvrky-ICU6# zF~uYvx|k3w`=#X8&FItly-`6H4yPHkT6}LUxF)oD-?E*l5so|0n)S>uRc{eU?O@q) z=OwzR- z0!~w+gdT8R-fn1G`RwJPo66zGtpC1Q`!D_QyJzzm#GNFJzf3$78S~lh)r2OtFTY<2 z-zw|5oF!lSG{T7^uu0{BsOutGhONBJi`KNnX;1epySwW{RS1XT zDILy&*7OJo->uAfiriCM1>AgocYNK~vTc=s)17H52Sls*c)O;tN7}yTopD8b#WG`_ z3!7{lIoem87UB7Oa>eOLo{~_pwCd1nzt^5>)N2Kl5u5>$X!m7q4%>8!5Z{9fxAebI%6tGZt13k+QFJL^Qe^1-mJAVh?|$NUDtfp zpJ!UX_^RDzzn$dznqTnRlC5U9)gC{-U8U!}&;C)#ZP$-qPXB-Uu+Vtx&4zzFCFJtg z-aYO8Kl1$D*xwneBd@Nhty7{7c;T2l73@~549cwybzS?Le$5dj2l~czw_31 zSr(st?jJ9)`uvpJ zYVN*#seIk5jDPR)Z+Ys(5g2w-i1ne+^Y(*HwmrnTdt-Ou zy7Kg2y|XwRwzInnTwB5`f2MMpxjL_7pvW(KJIRLW^6wq%>g>Fi^(TE=FzwEcX|BKL z{gwFig=bOyk0wk1?@ym!JuUg|eE7;Y;b(tL(BtM=d6xTg_ymdiDdzDKXWEPZcP@Hj zoOn;YBK*U_)3;|oPpfxem6xCP_qXIUA8FTjXQgd^yr|gP`ylG;kLPpxElNw|^L-=^ zgumbC^Sb(%P+htBV&$9H)*W|NnP=s8?P*DSU*?&MzeKfv2d>;C4|3GM;)xnvhhD7Y zzG`;t{NEW9Zhej1m|&FeC*@T1NONA@Pg||fkKw1ae}+EYyge@EVt0R$s_j(G{CeN7 z3ue7CRARF^_VDiQj+_6QXNBK-`MakwzNoEuYpcMboJo=~599QD=IOn8WcFM*>E`ao z?hJa%R$}gghy_<+|_p3tpxsr`~e&i`6G2zWv!1H+QA2 zbajX6`}1k97MaePweF?q3(j*#WfiL)PiIJp^-I6ozTUX}Dc>#kFOQFH)p2@d^1$BM zz1a4*7DM#)TA#ydxmORYd){z-#{`M<-*~kdcg&i3YYWe<>ZgKZ?8O-YT&Dg#B+rr%K>^DC)*B$%Se|GiFUGI{= zRxF+AU3+Bd+!ldFH4_-Vo26x*WR&pbx%uO!!OyG{!P|fFYP7yx{af=_QE8;}!Skw? zeDNoDq)a;J<9%>_lmbKjzdd4er-Zyb} z@nx0sp^ghnJ-vTM&px}9`}vB<<%~DO^@|NP9eHJV&mEOr7J8wU;mV50_9HtMt3CZ$ zSvkkP_>zkM=?!e=8`5Nze)T_^Uu^f}>&L>ze0{GwijD`v0sq`_7JOOP3i3oo5bM z>*m|!^j^VM)sr{Rv0hI0{&(vI_HI*GU9Eh+n>lM|V}0r0`(h8S1pX~*+jOXcv$3h^ zoYVP_UyPV*f8UBJ+`ZALgdncw)O;+=QW`fTsBPmkn3m_L#E zrD1~D{kf+vicRNmE&Mo9=BPI_`^C=(SJo679p4jkQSPL#&9#ES$ojahMIVkoTOax1 zkHWpVA1xXcw@Ut9^e?x_+elAUIA-@g&$zD(X8rgPW^%GP^w-hPS5`!Z&-N{N`zyxF zPeu1>K2uZnOjZlWh2<;km&e=q2dt=+HqE+rF)eaR;YS;3yISt|Ty`e8*Y7S&mMY${ zulKX6?$i9ND{GQJRbPEsVv>CyRGuzb`seJ`GbaD?Pu%s9yAo7eWAJ_ct2gE^{_lJ0 z`0>B>9UCsr{tI!}@BS1xB)sK$WT5;}fd^@u|Nkxg^1}GSmyZWL+U(7{BfIyfTz)9x z<$mKuDbv;X|5+3FYQ^8bTnqHomYw+jU; zDk}qz?w2||ue$Y(w&anV`zI#a-rhN9+My24;uVkLW#{_2x5xd>yt=d??aTJw_@eaB zWnbRdbLGG1`VqFu=l^kaOPL2uCb`x8qS~PkFSQnfO61L7buBlgTfY=P|M|j+=Zt@6 z-TAk8`G+4)uFoof6h*I>6>+8#mRhw$MUf^zTZ~cvuE$l`Xj|X)v221>ryv<-0a$7 zy7Tsm(BqQpt7A8p=+*z*)Al{B_vycf=P%`7aoMy!t?1JMy?@5VCY9TZ7$fX{N6Jb4 zw9)@tZhJNRipsYKd3E>yn4Z1;o#8=Hk<#gOd++-X&tG`|(KBSlgVXQUzP8x+pZ{yb zGzok0!@KT&=G@ruH(BcR`P0R#_No4?tkkLfn)%DttTWvHSF4oi>w=euEbS_jC+%93 z_;U5*4wAKdzCVx3{9zqpUm>!P-0TQ|Ayw{bkI<2*%eX>pIhqAefJ{9Ji@ zU)f<}-PN0J{{NSvw$@+q#le|1MoYCF@3Fd8-aL{Qb#Bl1#hxdcH@L?ozud8VWtPVG z3Ea`oK3%z8z4KOv#eAK*o&syfQolcJYQBG_DBmkLe)>0DGU$AG^ikeBztcBZY0ug; zRr36vL|Hjw_+A;B~nM--sExNq$vgop_Pvu!_1D9VGeHR|EWWn0??)MNYjyq!`cE8!x?k+99=#J(+$r#;y`$O#e4rJfE`KS0}oKRiF!C&|C zjdpn^GE{y|FHd+|0eUuqlWFu z3ipc7yE`QeX0+dKPtw#mYqh=mym_8d)_G2$PfVHD?VA1_Zoja7;{2!Gp?+MuudjLd zxp%k4B(AN}cYSxyo7f|Lr%~z^;}`2^OWq{^-K9|`YjJR*vE-8we$_pm!Mnc59a_9s z`cb~jiRY=sdEe9a-IF-`F1d5b)1SiE_K3z-@h2W(_T`EfVX$1jFa6UIf6Ge+7VrJ` zbSq1n3vPWbz!~W~^TRzGHc)-T zUmVw$Ib2!RDsb*1+k|QFi=#!}<*m0V`djq!Q=bzD`_!BU?go9{UHr@5&)Qovy`<|! zZT;tr$<`lPFa7(WKl!=q#0l&nd@3v4%rZZ=-w>(q@V))*)2r9|7q+jnTXn{>EA627 zdx5Dvb{leEct;f}x&QNcazehoDCJc4o?GkZWloqaa<)nQdcnh8`i_eGCd@nZFE{(f z{?`JT`Tu7NKCC;o^LW5iD!whEVAT` zp85S!eWxG$2h|l}8YxQ!cB{AEu-$!Q?hh?*x9ykMcUIo~^Yy2;&+k_vmJRt|9hyEF zd01@dZeiZtaqF*+cbeNQ{reWeN1LW!D^NT=eO2k}i<>Ihqpn?G-(J7AV(Q6kzn8Cn z{tDh*#P<8z-sAi3eqB)|`{9Gm&c!NML=PDXWlht0-W<8ST)=5Zpe9EF^^(^WqCOJpS`{M!ICm3UmriTe*QvlgI|%?*UB5beVd_|^K;7i>g`EI*7hen z6JIaa?(l10HFsXh$uo{7dNXqU{=KzTJKL@FZ8d+y-H*QW@?NsPZ2y^hTeC>ZJoV1( z^`9z??G@UeynS!@@@t0Pn_CB#-QYO3{Tj<1OUalOx2Ip9X6t-D%5C$#qOxsi@%!SS3ox!}cZ@~kU5hV%dVgR?VQof?fcY<$?Thly?`GIh@XX|8 zCD$@>y?UiK{!8rJ8Sd3xd2idLzUw!$=9_-Yv!P$Sh3hOQuwF?%VgGBzL0yNndd-zv zChJc)k-z)vSI(D*ytS`y`ZqaT^5PkRBfo-H$Hwov#(v_N)2@q`n7(SVUV48rQ0<`Z zlY+eOdP$!TY`<(UuWEt94%QVHy95vK5=dF`>VxUcPX{8dJmqn{6Wejy@8a({TmR~Q z|9HDI$iPlQ?waH=*2nDvi?(RW8t-^Ap)~ftX2Jba|I|)%th)9=`RyIWMg4Ohc)Za} zI{)Wvt8tsZlXR0^{GnanRFe*KE}C4vvEr1TSU8{Rp3vZ1rrBPn{k~r?wGpW0$W?j5 zCl&I2=?A8#-dA5WhOn-C_N2i0{0hB>_p)1ZA}SVF)W#|BzG7pFT%wvjVJdr!pWAqDz{iWvh_orL? zXKl(poo4oT+jQmUJg;LHKin+3MSA;$?QQonrJhv%ezbb-;j*gSRdxpDU9HJW-o_u* z{(P-q$%E6gYgV@hEpN+|HNLm+M^uLQQr-)#0;#hK9m1}NvTxVs%xdLX%<~Pl7GQ_% zlqLrA_RaM<3R;{W*11nNV=cEn;i;JQv;L=^UHgJ{hi86zBA_Jo%Q24aV!nS`*p!!l zb*9eYc{Hge)Ba23E}q)3`7`I9c=oh7a)WB?-`oFH7REc5S~htX{d;y|CXd@4(Wn{a zwsV!$gBdthiFWKa4_PDU)q85fgn#B6HE(|5F|^9?lKcxER%x%2sfDpQE*Ji*NHWcS!`5g=j=;8z=lb2@ zab_Fs|4h&PfAe&xf<}_XUujX6=Ig;7wv$r=gRv1|bc)~o3r=4MLEm-%%)YR{3CGb3Hr|D1PsWvi=r(!S@rnJpbO zVy*6bh8{5AV*7pjM|Ppe|6jwBxYJS@_1^rOceT2xq3X+r)cVH|;KqOW=KqP`TV9bc~*kv#kG)h8}`A}sZZ zweb(OatdBCTO+wv#_P0NW6ks_j$b~R&!}D^r!xQ9iHE^48XY(Ea-t8;-lu6}wTl1Y z+V?6MxAn?uzp?GMW4<5tb;aYkj!r>h0v`7n1)pudx#{qmNzd!W-+o#&J2+rJwe@y#G06x%;~7_06}xiX=_m#1MbT-DYv! zf-~kzICWn;z1b;Tv!_5XefE!{hi5qZWV|odbM)$z)&7*rU&jCV<-+pd(0Y;8tIXuj zOlB_o`0AL5+1`&#zr(LDURBPQ`CQ0zb)opff6F`euDg4B4$l;)DQ<0bD-&Mc<$s*_ z`i&9W_B*)?S#Iu6xw%%MMMGU?#^sX5uO(HE%vUn|C$jOQX25Dq!M|6BgnppO>G|+Pv}S&-;j_KeyFB+M}gb_ z-|KFb>U76TyFZV*CEFs9I{B@n$Lr10pSHh^jN0(sTF7aN|IrVjd)IBO-6-_!#{62{ zAFpEPzLc5pv98trb+*JS>3*w ztVV%HWv}+nzziKZXAj-fm%#4I}@CyB5-K(9k~amT)jCIPYFNHu1E}7y~AR*c5;irB8wfm5Q}!S2rRM*yuh~eLBs-x zjHu;-som2AobLEdX=+d2yb}~OUQQF=ElQ|+XcY4UvV7v6;(s=vY?8+R24Urlx0(nnM8nWvcjX^Fej0V}$>MfSiBj6-rzkHg8 zM}c;Wz@a%zPiFTB{+gfKBj7ZJr=2;5Gp|+PP;J(;yNBXWUQe6u_-mtsy_>}UY7y?o zZ30dr{OwFJm%FC~eGpjmX6Bv((aGZLE~PO)h~LYWzxJ;8{lxPb-KXZ9IId=t{WI-e z)b8ox;%gtiTUWa!)P?f`AYxx$~kTr)vtx#P#TPcqwmCiBJ`-Mwr!=VmP}p82)HzwTF+X8-^D zOz*NTI!1?z2~ZJopPef*Ov zHE*s^D|ur(LGL^NQorVcb8~)l>&ELpy%|3JH^gn<_zx1WgEUs zU4C-cq=naBURZ5E_qUDD-rch%*Sr(?U3dG)``P=L5+2N0c_sJ86m7}r85b9-+t+XI zx#xV$==n-J4Oa2itj2?9A~*IPz3f(`_pamYw^>`?ADoeyzd7}*krJETx$yVrlx&~o zyV=;cv-L)UhASqsmu-A^_~(=7)7!Vd;SP03Jn(h(o(WU^D&G0#8Zu0;sa+X#bow5f z*68h@PMi^Dv*Njz|WN2vOr)vO!d9lrka{(5Q9sJ)nM^~$Gr z<*KIa_n-fx{@XiizphVp4}PSVtuH=4b+2{bVslL`F&9_mu7vKUrY^%KN7v+>h{Zou z15KoMUsMrVED>lTlw-mwveYARV%?XxzUIeV<-506r~U%=|_T_IDh*8Tm8=da{949l}5Iw^aK6{>KzDO71O!X!DK4ezXXlP z`5}ewK_Ba%hFy5je{JcJ&?CD< z*xAc-)4t6P-Wah~@$I$x{S($S?`FKQzm{3jUN`l@gm?ynnlCJy_}(YJoFjR||5?$a z7mjKBzFDZM>iz$ue9SNDXj8w_HsilLfB!j{>67DrPTF#s|GlbdveIFJAv4b3TKf6M zhAhG7{Zh~4`_KP-D?Q`qt;cf;52o(<^;1pm|8H@g{m;be|8{Jg9AWmo_L|;Y_rOHE z-Ddv}Jc|7P=uTkr-(0V*xqJRjua4OM$h&JUpV``fvp&1UJzsC1e5FL>GyqiE^d}Tu6*d?g$pKYTbG;n*6#gdxJb=OeAR6$7t3esZv38* z+>%jyX8z1o@}@uaQ#zb}`Yn%X%;1>1XRWAsc#PJo^pnfqe>kyv^UtDZ(qHUKIT9ZV z=EUyqnfN&G`*u$szsCp8optm+_;BxS4Q<}D$3&ma=ctUEP~OB6tTHj_ z?>-ik{P+9+`N$KK`m(Fb70hP~O*iy2He6~fwt8xNoSENG_S?I2=kDZa=v^(gx$tU| zP_WhI|7W;&eB0*!amVS1tr=#WCo^Mg6S>0uX9#Wb`S78^dABjgIhDHqPwOi`9PRJu z>|LHc-_hmxkx!2&oo9UfHGKQNOG)DGW$8cWpZ|B=IL7YZcAFoU>Mz>nh3WrlQJwGm z{rYyd;5R#Mvd*vka%L9OHrJycLXWd-b1PqPB1?7Qnx2|&)};sDersUzz3g=F_cQSd zU9YR^Y~d#gTBTM!IUiqGcyy`Lmh!}azy$71mrWQhM@RgV)s0t@nwj=za<$Fmzt(0& z2d6%kEV$OHGy8YrPSu~5$35QNv0b8bZ<<$yONvKi=s}OTZ-GHRuNjm-*w&@UGyGKF z^x|5&!tAj6x9k01Uu!?{g706|-Nz5Fx*wY?DI)RRB6Wj32cOx4HQXNWZ_a`8-XTkO3oeanfu2g@u6VN&xg{AZ=)u+uja@* z_~XUgs5eipB&B=oWa3&IR-~KwBy#PO%&?-hiBBTeJc-nK5_LF$d%x3m)x|-R6ir!m z)!0@aZMs@ww(z0k{M>l44gXY5@G2hXP?YkG_?cY1lPPenmbGT3ee|lQpVN#UJ`~>& zq2p8k&aT+hd;g4sTesW0J=^y-Cw~8=BU8@Z`Ec9*>MN%eqMz-bY`kut`onblhOCGG zH?*}E|LiTFIAzwm{LLlje*dXDwK?V8{gZ7|yFGk-)Bo7|2ZlxQG+Yim@#^S&gMar{ z?)f~uxN{-39% zk@suQ?{!bS$7%QP`23rDpSr*KY57l4a&2hrV-wzv?-d>2D_+EY>|opR_S%HyRUsnp zj;Pppc2-QvshBkB!sMJ6C(S}8@!DESPMy`X>E?zdOBM+UZER~z+*r}>bfrVEXPUj+ zm2hjGqNfsyE|ZPVE>f_L>SfvMdns^h+-|e~4Xam7(6z4%&%42RV3%lo(#EKrf0pgu z`T6{1jWVkl|Nmuwc@tmPwei#w8S69A!S$z8AHRPztCK&8m-}&hzFqq7UsL~??R(23 zZ`(Ng-P}`+b7%i}bXR=m@0HsF?j`*C{PMiF+QW599;;CERSH@Ne zNs0;!nMCP`#r;dMU2jvf_&<}`#Y>vM9zFcJN9UXguQP+jrihyY!p-iNJxX?aeyQ*% z+1+{7_SrJsCUreN|0JbdXWP_Iw#`dnIjUvJIyJ{xRo%I3qNWQ7 zZd=z{o#1`-?~FaC;;eb*&Dz#UtxFCI`6{UHRo`FvCG}qYQ^RfRV%x4t9qZj+JxSP| z-=pAmSH`Skb>1xIOTRx_cPM7r6FGiK=4+1MKXA9t<)0i>u_IeQCS!rf!(B>_<&&Qj zPJZ%j!UMy)ZIw1EJ9_8)zn|l^<*?(DyM9v+H-^0xzwvAHt+x?x%PdMx#Dpq}N_JWs za@uMNh-lB|?LRBcqptqDIaya#^laK;DY?F7k$(=WP031yg!4ud_le%$P9)?mIXsCc z?{(3~8J#hP|MHR^J+dtPqF`;lF7ap+|H*SU33*ykI;~f;jwW5bU}AAM_LTNb_ZQ(w zJxlqv*(-G&zr1^+rV>|onqxTE(vXCjHQ&>HF9&G+`_O*;f{xU#b&IR-xLC-zSjxEE zmUX$w-C1POp`)X+Yek2~?ztY-iWkeQCzi2anZ>Cy%93qlb($2N4jB+G2f+bk)5 z>1NNyBaLqgxU?);byZojeRyUqyQ<`Thofni|dec$pj#irsyh00#`_@hUDm5Kk~w@|XWXT7HW{!if-Or~7w{p+Jy z5^K(s5W7&j_1#B_+>*N-Gxol4+cKlOOncBApYpHaTC^BP+1~Z;*8@Kui~V@2 zWNuLWgVnD!?!NdwCFsSyjR)jn+cz00?Tvh>v3ssYwW45atIMsoM=DM$zb(t3J5h6+ z$-#&u??Az6i!V5y7UP; zZSi}ne}I=WXX#-fCli~c2Ob+5tzpPMw0P&TX#0OtW*^AU%)|Tjo3)=M_)}Syduf*R=kdf|D7|pt@kfcLr#M<_zs_35+7!`$Tv|pu zzu^t{ti6ugf-+8OR@lhJGz4qj*~NZ$aq>sLsUIqON;Q{$m@-xHU5QZYcHxI-h1|u& zer-PDwjjo1NxnzxUB3v=pEJFsW`%{hMU!5PZ>B0@*ZkI8>Y z$##M`f)x;%GR!bKC4Zb6RM|9V#CM?S8sso5j=A?ug{N4>HEQ^e9gjLY>8 zgjO)e`xnf;{bT>_+?1-)yYgRl-QC9!{XM<2^l_`i+bMzpzc=mO_j5rl<3=wprF->~yjvEqsf-(Z)VnU%$6gC~;Xkw0hoRI5hXHWRPPj2y@YR9>GDN9RZ-KS0!d{`h5`GU7%@687%4jphUd#1DT zXfDf_-jhKwJx^Z*9_qhV5g&VAQke%#^Q6sD}4^CyR8x7EKjYmJOf zXlW#r?(Ti6IDzrn-ovU*+gH9mrvK*lv@~zGa4Xe@)3>j^ElcLvZxFZmS?yi9?b54H zr=~PvqO_sjnqpNcA-AeDzk+T!wK&)Y_KTcIn$|l`g;G_F-mR#lCcp0ZrA^@>1ba0g5Kkg8Sn2hV2V-ZmXlC>DBmUc<&MPuH9w6n?{lAdNi*~qZ$^PcLs zoW7RDd}mIM_)K@1lyuQTrQ5D`ahzh^ZWH&4Y>z(vc;&9knH_d3f0as9PUi}Z3cOmS zy>7*hz1ue&vI^MOJX_4dO=~Gf+<^+d6$_Z70`8|@k^Wp#<;`#*E-gpAHp8yGc*{E-qPG zx*+&DpUQH#+2X5PHZEMXEj;{SEKh9eJ5O^YW#hUVZC+1uM4* z=(gz3j{f`b%z`P0o|Xi^DVaP!x@Y2P<7Jz>dbVBKo9upyQfz_A+kl`cm5>{;Bwvb@`6xggK+>i_vHNAw=WJk1xmbV0{! zV#EuDjTaoxpLzW36_@2=rIYU^PJ6yT{KK;EPsQUxBgJWd`U;;MJw9>%4Z(CDkzM&G zT)2O}*{Zh7=v-RItn81B>vsF3pFSqDE%#*V@oP47TvMN^IdNQEC%W6_&8>OI-@W~* z)6JLsV5J$`ym?0sT%O#)!T;`AbU;e9yIWa=vdtZio>)0;?IOO-Hs1}ji~1fER6mz` zC&1SteQ{6F0*CG{*UI!s7fSMXu9JS>v99^}kI0w1K8F1?db_Xe-h5LNlUVb%NDYSf zziPjFRhnm~)G+?9ijiHUsWxx%F2OHaO9OWGE!%T4;Qi}M3{Nj^+-0k>Bj$*>Wv{}G zM3(&@UHyb&kGciKJW;wRc|s(*^!YBraa zg@@K8Y?au*MZpARN+FyTI+bXtX^n1nRnf;q{wypFg zkJa5{kA-F=V5wprn{!RPXz_ zoNMlK1WYxQIVgQ+(T9Kb0ySCpHtutij$e?albuqu_igRXs#tTTh_liO&E_k@7C2Ns zH)lH_{iCX3PfJA6UhyA4PfZPqFwxx*`#yis9l50LZqJfk9r{HRpYXOdZ$9GIc7vl& zc#hs8Z)y9&DGBzY#Xiz_{s7FYC=S zXK$UIv&J^W?AS)7ovM157AK!Q`n0k+Y3-z%&id|q3D>``b-cV+GCDu(#&p$hfA32i z&Sp977Ql6?+Hvl(cD7?u61k-pKw6^cL&yJNnQi z({RNK4wJo;%y-N!SbgmLmhI`fS_eY8!t~FlT>a$Jmu`9XsuPD|mZxUK?q?G0-)~Er z?J*YT@i#Zm3{6YTOTRWzR;EB~#_C!9@1vWqa$UQy#$eg}zl`iOHa`0%@Losl;!~B4C!__coA0wsH(Y0N(Yo!%jvwb*ZM7z)uiwqo z<$dwcnv6oj7qhkbYe{L(+{J$$$JXOG{qw191vy^-4)hBEN z&$udI^4xH>mSf86K(79j%-O!(90kVw)<4QF zI-0GuPF%NY>!T$8z`(1qz1l4TZ~KEbWJRi#RclUPd>gosH=0% zE@9oOtxDyRvWE_xJ*pdjAtEV$n#Bwz<$^EbESvTyJ}xPJf3#@V_N})cpXICGyjg-# zbKgV$eTstn8m>ye`PG!d`hYi~H&M8;$|Tv!^#1FMCcL6@ZC!m%nNf4wEVra^xz5yM z-0g8?E^IA8uJ^?^jPDlyZLRry)p1+y%A2hzR}00adNydc2!!6)^NvOJsFm{iH*VkO z$)3Hcd+OOC;XTC(#`m9_ow>QUY15=@k`Jzh1x&kPlcQv@F65s2sozJ+3+G;{of*e! z<#ymTZ^Fm8m~@w`$BL&I>FxQv&iV7z=7|@-vh8VUcMNF}{1esV{WxlKP%Qu7B*mzn zG+t1sMf`cnSeEi+=IRy!CzD08(Z!AjrzTfTxVQCHW%2COdhT(}Y}*$}?bF%Fy61lj z+hIrhX7d}Y!42KzKU$0??T~n?(R#^bLsVd*Sjdd6cRuu7JFvE7=Gz5RGqy39+i#!o zUQB+{gD?)oStt9}?sRdB+?nO0KWUQk*{f%@Ees6NAAf#l1Y!(tP~UDXbQb> zc#UbQjjh-8ME12In`>%=xTe)txAfYl&t5Ina`)bk;$NJKF3}q@W6iXur_bu1eb?Q6 zo9T%ex4WK9HT!q>pv&te4MP31lioWw-M+RulIc$9X(Q>VT~K*v#~#Pr*C+M6SD92cR42qMt`6U_ zC#O-sX-l}*!B1xmlMO!Zm*sriM+v zbHwqS7KftC*;M)RO?hVviwh^up1pOsXWkmXSxJH4>Yk;%H551Rdh_U*|CWwt3#S}3(_liNe*6Q9%L6YgpPPRWTx!e4>TE^MA=N7O4j8<+*&C`zyY<98$h@ z>^W#|Em(T5ny20U-9@{NN9))UihVCuTF)VHQYAlLIT`wp&eZ)`k0 zjeA~BG8WVI&Rp4dT=<8K$-%E%u6Td6{ZDFGw#4&zv%ble$D5)KT@XyR z`2Xp(=lepg-{m<87mr{5@pkh6NA;KIrG1{I3JTCCsq(4^uXS$tz@fBg(a(po&qtbl zul;XT#cMHn;`RHE?;V{j3coODKdV0yDIV(?_bssgfMv-MiF5mNWbXc&=av{}=KcK4 zgX!DvyuaUfRq7aMh;qxq=?UJikNuOCjG%F@L#|T>os})%%x4-*@~XT_cx} zvXTGYEvM^t%!SjZeOkZ#-I1h?29I`m^2nKW`NdWjXOy$q*L;?Iy+7U~r$(s$&-LkN zW`ESm-uG|H4i@S9AJ1+6eLf^|NO`fO<-4+d^Zw=^`0=UW<&E1fieCxHwEoPA-95)u ze!pjCXW_-?E2Q5&xij(lqy+EB7vAxJ6qn_$`c*E_yY|n#h&M%>%b$Dh`u?WFDf@{+ z_($hBF~0JZI~QF%skkUr^V-v6T#Fu>{1RYgeRI3`QjE?m#_jG8OLi7o+KO1)R@mq+ zcpUWM^QNCXHowJ>+z$GC^m(t8`?Z62pQN&@?UpzClXc9muIcILv`=52oQ|-0t(*7f z?qrv84qI9K2WPl{JXyQ{!>z^pAJymkrG8ntpZd)wS=9zW(vg-o-yZ zg|uQK*~&dbk;tG=B) zr|zD|vwh#Sg5OIV{q$4bDD9Fm&(0rGGOU$nD!;3)+x__ak=sF%_2+|gqCWFh8`XVV z&);+Z>%8=3#TD<(;;KGWrS1F1GPnB6<9X@#SQi9ezZYZsu+FajcjdBsb(*`)|DVte zp2r>8o?-dz?ML6MS9c^X2-@&2<+H!P+N`*l>w+V~yb>cd%gR@>Y+vMPn%A&e;dx7U z^Y6FMW~n_cIw`Sw*`jI@zva@)FZZ5)xonN(rf;T!kF=8RcIiu6zT>OE`QhUB4K@GT z9oHrtx#9We%UkiBxXmp|%bS~bn;HK;yE0Ne8Or^`_kgH1pAq%I~TLh{CVr~lqoy@obH#f?iA&=3q3XUt#Jz7jZeNcqODGD+p*ci-hto-yZGPj$;1 zvb|ow!a(PjP1K>}wys8J8QsYTNzeEA#n{*`N7qzFxGy zsG5CQX=hB{rarNWmo(V|dJRGx7mB>mJC%P;;c{G39&Il8M-Md55ECkLjDpa!1 zFW~MH#MhZU057@`9e>9QGfcT`r~eTJBn8=hymw+xTF%qDjhxY?kc|zq_RVuS;F@QslMV%(+fm zIC_inE{NY@`WGCtsI+MMOA*V{8d^qjsks@iwt}Yo9_{ihd3kld{PdcN z>hjp!mdKkhEJ`>R)lNgfydY`^6Dg3Xe3XLTdiCc3z|7N0$$sj_t0@7p?aKies< zn|&m5{|=#sBUeg}-Ty3-y43B$^AeFwRUg%R_LpmI{MgxGD0+kW{QiF3wX5rGOP^|O z+MM-J=a_F@)08iA3_KREo%CeOt>bII@H3o~t(4V#dAIWC!PlBvHYazS^k-Sm)bRAP z-GcispBt4NkvJgn+xp`}@g1L@RbQ}``!&yO%Jj7VKHuw>2hNy(_+HP}3^88c>?wI3 zCJl3PikIz6d}hP>&#&Tys&T=Vw54+V>ZiT_@N?$5dSCn?858_|`h4jstL>I^&gd&D zZhZKhA-8+VA^RmN1sbc%cP(?hwe=@^jB9Jo&yTx{4)ZZwTl+((`|7Eu=6BD|t)J(% z@$$hx-{Tjj|3CO_+0;{(Wiz%f`#0_MvHM3&h2@V(i5=s=Uvuu;SM9&KHMb@0s+i30 zT2E!RHvf2Zw|>$0;QWPq4t{xld4BqpuakFHzq$>I0-@=XS&i=}yuS7H-`6Y0#V^Mv zJo#E)@OrWSVKq zzq(CmXKGe=snPyPXR7vY+Od$mbIqe&b6Yb!j(2r?bQ_(U(XmQ%sfLF3{dlg6mooa4 z!kudr%~xD_qkEvZ{?Eied%Ubps!d7Zo_l{w*XC2EVSlYwohS>5LKz3lI94PzWyhTz zclWJHNobtFaDBU=Zb1w;PvD1tSNDp}QVM9hcr0V-pQro8W*MCl*Q>n~fA8LsvX`DI zAw2Eh^FB|HM4j5Ji#2`ZYGM*{;a~cNo}vRcR@ZKIi~jJo-%V1(M0bNZTiM40butm` zHzqBv{PVK-VEF0}dhcsx7wR87e|_1W0~c84XV?9hb0*0>BhlEy{A_!6)lAVm9mZVmEEGt6l8^0Kjbv-F?4 z!Vb~1imH3nzyJSQ>nB^qnQ-Q$^}l&5=U7xZG(}%rqxF8jHuut1VSxru3(W7ko>-Km z=P&tl>Cu1fEZY~EX6;bq5-o{I@R7JDRB?wZJ0dl*b=%pu7Yi-V*0+EA8MnnH`nulZ z)BXR>=?2eJR@0j&?9RWb__5T#&xe|yEpswy@UnW%wPVgzpRdbTxP}LPEPFfe*=$F} zh?(nz@A)lXqa7^wCRO+Gdj%Kg%oz;fQ_tUX3SGW(*1WrMx7HndC}w%;!q+Z-jYUr* z?ef)5KR;_C&V6ysDm&Kr*^#2B_ z`_h)L3F~h>UA9K&he^=wf3>XwrGbkxwutR|@{$$-UEiybcdkv5(7kBu66KVC^lnte6s7f7Z1Oi|WUl@mCR5RD&=!*xqPI;xs ztQ9Z~`OXmTnGqeIn!4-%xg)89t37tvdm*QeX0gqZI24;I`}vA01e{DZ-(uf!sgP6AMf=j0x!bZHz2#JNam|u{ zz~p;3kxQ{9!}W=PVoOHaR_=o6k4ICTI25I3Px{E|WFpuqMP8#Fp$75<0u}?z6z4NvBUO zj-FZjg~Qs*=U}H+YQ3YLrO;-Mi%YWR9n6jY8+!ChP+85)gLBU2DKr_JyvL>368^$* zQLIYAUG>Nv->c(JoH_bVzvn^Ey62yB=HDyX*kqe;%b#=0F|9&N_;=g^+quFWJW;Iz ziwZs1wjV3mRDa{Fdc1Y-@@X8Ctgij}4eFCy=UN&rvX0nMYgm8g%+YnO#coCU>%6yJ zbk$D1JW=${-emciR!3BM9xQwp`*LZzaq;gOIg1(Iot3dp9c=3Ig+lTMQZJ)X|v>8;_HUG)|9F!&>fBwyu zbv7y94=(LnEHP`#wEKCtPTf+Dj=WuIvA@G$Z2-r`1z9o+x8A=XcIRf~nV%07W~L_c z?ARo2tJHWy(DRWeKJk}rRum6%|MGm+Wt|*9?p zu?O42s|=&Zh1B8%o8-BHrv)uCkdVQDOfV$=*XsmN^{VY^B?lqUsU zOOsEm|4{RL-sClB&mHTV`h{=f4>zSLBIzIRdWuIRzZ6w{EZmZjvsI$`_B|_a^O^VG zKDj*g=!6-Ec(<1<_U`d3tJ6H{aI-)9=jr}usWpdQRNqZdi@P~712nq0#ZgpV@zyJg z81215Yy}Sw=IlHDx6$);@y_kf8QO|^X8txeJRZk2aqmt|)kY7SH}>1+iI?T4=1P{l zv}srv`0Oj^MXSgyzuw-jQoi?dgBWAp@1*;CruW;QKc3o|_+#x~3+<~OWyedslN|0F zeeybWUupfBK%cUGd@rU%>YU(UQ*^1m9_AdgsQSZ^21c2?+nQxtcULBUe&;av>ai#P zoOhaVy{XKuOt{Tw)VQPNpw0E=+9z{A@e01}biMpSMl@S*-DaQgghhMXf)+Du|M=+j zw3BmZo>Z4lnYgz7;`cVk7)yf!E6rWy=4y7gbXRPht~~$f@lJoIExW-L>o#4zZS0RP$D|zN zODMX2PUZ9ghl^|`DFxha-veUJgQA6+XNo@ClyNMt%tGO1Q{A0{LSClOy)$%+%Rare zoBKiT?v9_&&Z&6*+UDx@`rdTu_y2_F?*8tqIk#v2G{f(E!wamq&iF?6bgal&H_xE; z9`kvnwbk-P{jv`)%v)RYcmMVimSs2Y?1?&m_RqZkzSXnNW>1^3x+Q}p*J#(*?w)t2 zjyT57%vkrK^TnAXj&sj0b?Q)5@sujtNvmv;Qn-8CPM@l>wf{`t_W zw+nL_bOL$yzV^wpG3L5(GUlD^YU%vPucE6jZcp5Qql3*P@6+Qasq(4Ey!!uPKKF6}>#0$PR5&I_{-Td$A`6>JC%$s+<-+QQX@v%*nXN4~9 z`s#Sy_Dsb~!T(n0_I`<4xBKt+Kb4nM7l=&n-QRt=Ev`v-tu$z4=;xl9Z|>}1YhaK6 z)zQ3r+l8&?9que$`sejZ>%XrVB`W{Qy0{+y^oaR-U{ny#fooe&gZhAz|Nr1$xBvD3 z8UOD5<&h~8oGe$}>bm*g(WA*~pYEIgJF?C~3yG!h{r=L4~ZKXCSEEXjtX_i?rNL0Ptx+d04zJGVm?00j$w%avF7<}gCdw=)X z0!8t{e|-Rj1pxxzy8@%!}xkyedeAM3hD7BqT1r;KCy2wq6Wl)4aiL_W8xK zuWL%1^H*)KC|0&Nx71^|Z2eu4=xk=q7I*S-reR5^w}PI2_f6~lk9N;l_~-YP;FqfI zNs3Z2yydIQs<=*_d90>?pLbfsq(fa1e>WB~cP#1tUHo{dsl;mSS$Es(tLMbu`^3P% z?}y;E4+Y!)ZRv5{ylmp!%7)A5WF2dQwAR~{D9iOrH~f_U(|ho+Tj90V@J%`Q*csOR z$rAIno6UEib1}Q-iPO*i1U`;1d(SKseEDVdEz2|WzL^+ql(o!%5^=90Nr}BYmo4G# zrOGe1wHlx$-TVdLb7DamC3xZv7U{~H?q`oOJV}u~mb7ugggI;tN0T1b=i41!cvq64 zN5Z;u{=UD5?5}-$uRo|m_J0*+Nl1)#@OF8Hka!< z3%3=AzSsU?^;bbZC+gIjJHCJ3Mu^9~o0YIDvPEFgJ{7gqy_1AK$v9Y~=-)lr_BL

rkVBm!FZ!-Nqzl^S5_^-;i^UJ*MJl@0;7(K;3~$OT+8ILoGRT-tliMzisvZ zJbSs+!F<;@>cyU3zUJc06YlJk-nA}x!gSxF=kKP7?f!F6*CDA$irwe6-JWvk)TNEW ztC3c6U*RgTHE?-;;T;cWp6l-LM;0dzIq@IiefDt{%XWq+7Uo?%Pd^^gk+UdkX|2>- z_ezL6(00b1#q9TUtxqhwBm88Ey29eyEg2C)53V)cj`XQx40x1q*zLfz&ewTw-KI+v zdtVIdo%x01_5S!16ZhV}F?r*($(F}|T;4A}X~rD4cOR8+_&@t}C0E&rX-}iG-lG%u za{oPlmhk?!zWuYV*>&#E<^EcvACVBNFrNQYebWV7xwzUCo0-4Mf8G9Wk!qm2PU-*W z2e~tIBX)LluiG~>RFo%p$D6j@H@f`7N4DT z{$A?KIgEm+${f8fXcK>yoBXH>~IhCwi>yCapH*G=S>xV3Y`xs9gG}g-qyRg6| z)QG!TU{Rb(b2Rt5LrF1K4lL<+Z8|2_K7E^=d$0PVqMF?wrtkkt*=8*({Bxr2Ufnaf z|1)l9`rkXLpTD#J|LkoIPqySeNlpJWUwqjEjT7c;HLvjBuQ`@Kzp7i5+wRkP?gv=c zHvc$&KkWG9!q3Nqg?Iit_y6%U&HAHKX*JKbt&KjI-GA4oPW5pyBg)WB)#OP+;-Ay^ zc%A>({5RKZT~yDq%$Vxm$)JgyYa0r#>Bb*u;*aBxnk=BCq|~UF7}n9p%d*BaN!7?` zT8X#GOGCqd4=jvqW_>Bpw!FB}XmXQ4uS2oO&Q*Wna_97}-Q+n{?r-c_z9+s@8dscX)fxr?3pi`I5=9v$jwDH2rr}#wm^X9bXFTcM2$73001Badw`1JKl7$48zmA zmw6WcR{rrV^lbI}9}Dh^Y&lRTvxo0O#mln~AFK|on9l#^_zDOAhmUW&1$1rf{+ zX7u>c*=b3Cmrg$8TBn-2R6xuzg>}Dssn;p5P9F2KTOR8j&Fft8Nvd!2{@ICoLW^#e zcCM@WH(}Qat+EB?AGXScE?1B)i(VU7@;=U|a`E(?5gdxQR(>m;pdr5Cnp5lPHrEit zvoi!1*{%9eglU zrG1-LIdyDXoE*cyu4A)Pgi-hswQIkc&LxEM2Qn<#EaJowC}|1mh_;BGT$y>-voz(y zti{~I)}_neFO=E#D{cLzBL!vKH}6~?&EIzPc;KT`iGM%x{M%M-K5?&`@!oKyi9E?4 zryjN_{PB8LO2KP`S#cbSF2~?2vS8K`GtYlT_>c!LE|32;BMISD!FVDIx;`y$h zT4}5I@GN7jhUGWg{V7Rk|XunVNJ=K8OLru z^t<-lvU!@}mH$(>8ugYZvnsX-tetx&!m(r4N!`+!-LFn~U0)J6XDy#$>CYs)E!Fw) zvh&W^I@h24vBe~46Ti{>6NT$ul(L!2oqm3Ik5Ev~@{fNa(=VI8j#hhSsaaUv(bKUw zTH;OV_QRmdk6kWLy2$C&;T36Rq@&C0_wUFirThZ!fNAGHJ^tzQ=3e*a#r&IoJTQ{G zcK+GC;QR*s~JFapF*PX^>HA z5%{|B`R9kX_1$tG{oFWb{rjDhzp{rL{d{ohfm@yGx4S;En`f`Q_dGN{MXkku zXZ7jpelI@im&D%NeT7?5E3i(U(`J2nPUQL8-BrDN>l9lw{F!3FcQapHcE#Yp)cgld z9Ew_M?i`9P-oaqcfW}C!If4{r6ss)PYRS02iof9XMSrc(_owASiy?&9x`{6cz3cY* zf3Tr5C2fvv%{4c=30gSRePw0dr*&lV%z-&>a^URQIueYN1Xm+y5E*<@4k&^4Eu zU6zX06<*^go+#jSCAya>#`&x4)S1gNUA#f-Jk|!~{(65)UXf>G;=^Z3iY+U)N3rZE zojgGzQ%`8E%g>$Wtpd3-E9dw7=lpq-wfqDhM9nPL9bY?&g>r=+n3?%r&awzwr@3{@ zb!C_8iv_>qYMiF*Tp=Wyzj@ck?F@4ls~pJ95%ZnA@!X=jD?k2J@150un`_!7&0{et zuTH*LeyTid)-uz7t+icUX0cl*@b_mX`mVms?%nZiSxke_mpzC0b{#s@ptY(d$jWtg zw^sPsXIhtScP-xOaV0qQ;2PJ<7o>knD7tV5K4!Qc@LNu2?dBTm_4>Y_S=T?4Qf$ev zS(&-jJD^2QQHyWWnX2**bMeloOBXhHtaIoPFqK{uz(03)nZmN>7?%L)S!`n6&+1LS zePDhm(khS!S}E#hE+o=>)BVfq2_7*KkNdyodYc?rmHDrIX(7L$(-tq&^AE1sRdPEN zd70Q&9o=ZFd_G3CDPj%p=daP1Gg^GsFItr2Q@i=p)9V^7E4*sI&pfqXXZrn#yT8AR zIIWl_Dx;!xJ7$8Mp{(Q`!`9Hsna{KYkF1K+`2O#jBWu0tMII9cTdQ+1JPylF=jjQR z2CU}E+8GO33^%Ib;NkPO+RFq@m{)I8DHPL#+&0}!k^zMZ-39YSL^G{p0%l- zJ$IQ|w9KRnCu6R>i!|X~o%Ye*<#teHfwq*N?6+CBN}}8B{t9>Wta;e-Fn3BCUq<$S zvu&QHmT6pyv&!N-yZ9FS|KFvm*0XMHne3g)&bghr&ku{7VO(2z%1qJa?G?oXYxlmh zeJo*eBTX;wvI*~+u(SVHd^wZQeR+fal^09Swx@mmyzKJ>Z+Y0t3-ABYr}v)!*S>H0 z+~mA#ulCrPHycitGZbewsJNjKH-EO{`G4s%R=-O5up!Xq@4fOPN2J2{+kg1O9#i%> zc3Ie>!kOO{Lp>cr0wce&&6(x$eV(uR?t=>~qz~uDo;{j7i>)P7?Em4QdwcG|>zn`6t}io?rmy*5r^t}3X6v-RF+DJ3hJSlsXNiwT+Vf?mXMUddo+7sU#huS0ZhgDw zu226z`(*te_Py+LecwB#7k_PGulWDe{lSx_9j@p1?${@p2@YnJ<@=ygOH|Z*!tM_*l`K4{>V$KhAeKdgRyZ#a2f?{yW|O z>DJ=?iwxeg@bCR(_;FhZDB!LNzkB|9`~37*Z>Mjn{@j1Z=&2=x-kwitRp0C<*W3S% zj+|dqd2hh(rn`vP_5 z|5r>_vpqDSd;Q1lFHIl#n5~OCBi--+;C=m$sljaXk6+zxBM{Mf{mb)r>G!vN{kP^v z+tlvWwdZT}vZEUhWfZppCPdhUVK-QxW8d6Q4Qll}Q;%dZ(bSGgJ; zyLj!NwZmsFE}7L!R$LBTvF_Ecg_$hj{uK?Y)omOyH+DN$Z!`LP^S8#C^9#A%%09#T z=rJEx-!IH4XFL78o}*#0LjU=D|FqAai8uzzEjL~&tPB>9`~O#WiikDi4D-jKWx4+Z zvm-2)&n>k3=(%#wrwhFmHhB!s>OYvX@k<|#6puT3ZGQLykt4^{A8BpcT=I^G@9oJ0 zNgEeb-)U)e7Z8*4bj&lGzyGrh=eASp&F*h~=?>aCzkGhVW^~=3zKUqA<$QZ*ELV>| z_SF0?uR}?@h2E}T*Z2JU!NT|U9usI(Y(wd*L!svP5AS-)&0tZLAa1X3T&H*9blTCT zeu=W5yvN#B6`tI>f8{6J-!E@l!iG8I_N-XJ?YsEX&tF;FAI~k0lS=1VnYY6)^tJJ! z%Ubb4qU$`~p5*`OK6CQc<1ts2G97j-wToxFwZiJp+uO5!miw@VEoI~I2Tko{T`z39 z_;PM_VmjYD{U;UE1bMcYxTRhDu~SdB#5-^@vybnsEB>kTCmvAW{;2zc6u6kox2wDz z!;`?W_ud1s1J_n^?>yemven>8ima09UUt`SOrQGFe>F!lEETzZy_UaWZE$$fqeqor zKllEtnt$Vmi=T|`f!pWroLwRP?$LFAo8#-w+JCs}{@>+#X_)>$ma|DupRxaQ3i7g& z4%1upE#zMpt30So%lY}yT2Ib)V(;pG$3jJ3cuWquyfI>}jQt+-3{CiIkJg_Hojd)W z$t`z2eq_R?Qz75y{d{vbi|3($smL6@HETYvU$ciT$ogo(Io7H5jZAye*RHx5|N5g8 z!#dyBr;jxWLzX$u)nD-SZ`aj5!o924Nq^T1Z{EK|;OufnyE&!a{#m8(4_AGAcY^is z<+Df6s_C3@s;GEyahIRwN-nvxYxwjR@^zccda!X7L*-3(Pp`K^L2MK5?6kH#&NsRG z4~OTp{!{*c-Lvw4JkR@hSO0u2uWtCY zZ=#I-ruo0;{pA;&7^tx{;^)=ldkXGv-ShE?i%_st@$1F2I`})T8d6M%_t>5)!{b$2v3tc1DxKzmtIv&hjY*79@)V4(+bX9c2 z>+tQdf1A2@7hLT4#C~8|!p4ji_lUpzYbDdIHO}8@4*i~CxAp$6jV=i_v2U+mkePP= zcf-8D=N}weop&f{qk!=3iPG=?8N0UrToY?Gzi0lmNz-emtgfq-XAoOGH9N1iqmzGc z!|_-*T%#CLUN67c=4$Al{WtU7U%$l$_U(HmvoGpM%}U!+{YbvJ!{6)ai^jP!)_cUe zx4xRJC)YpwYPa3PZ}xl69gLlQ@|=x8(0jz<5RrVd(gTs=MK5>UUVWA?eA$hc3YHqb zqwiL$z0&)^w0YM%Z_%y$9!%1UDJZNJ=I6aW{oa*S2J>>+481%dF<<3VQqSrmUP-NF zH!i!V$y%n|iK%`6Na5(cS0E1KyNWyng>=`u01=|NBNe6h)bT+GPCm zJa=$`$dk>>6LjOx|1&TDTPd~iqo>HT`3c{)q-$uFeLAb2KY7ZmbMx=VxkOa3%=}$$ z^m@KO+x|UVy7T`tPVd{>oBG+#Ae`~T(J$hlLHs+vUYuT1_VVPxxwC&J{o>Av`rErR zvsY)f`DDY%a?if*l>8Sdva0&L3v=QHj zZ{H~78~jXf@v*wQr3#iy_4a{Qwr2&1o!w!u=HQi&-$k8Fbj}7oS@rwf3;u%F+q%vi z<`X-2_k7>lV^iC1I z_{R6CKduLVXAn=At~|f~P5k*&cYKON_qs$LcDkpv;>Y$+E4Re2-*Myi{m?a=QWw0s zp0Hw<>(#AnpWg>fPHoBPeKqeO>tf^8kMAv=gU2p#`_F1mUzo*3%PnO!;7Rj-> z%KEX@zIn4UuS_+UcYV>gk+Fqsrzoe@1hX&4S~E`n+rPKCdeY+)r+!SgU3@WilM4T~ z)SH{a_C4Z0ap(GtoQlp~UbAnF3QgkkDqGb5saGg>@N$SrH*LMncKBD_#68;4QHqh* zu1+(N@;(3M%R@zD?R@pktKP>NKVSah-Ksrv&a66R^Za#4>Dd{}PG3GRcWkwN4GX{A z-Pb~^^*016AKjU=>&Un4B?^t|-|w~WxBJJ$(4$gRKEr;4fkEN*$F+_E&!$~u(OdI7 z>)nw@`ThMi+vM&4d`ymrdiCIN`Fhq$ODow{+2EaT7u+=DRBe6J+nX|DLg1mgSqdCF zA$u+V+-}QyK5=%#{;!XW_I+=5|8U{(Zw8kC?u$=y#!f4ee0FY`QCuR^hd=**e>Cr( zduU#(Y;S&eL;#nyb@#oAybR&3-okATeoF*`zsWB)*mS_xmD^t@r?yY-cDMZBpPVul zJ6g>DEB~FgZpxucLF%^rm6MqtNK1A*DsnRh6ny`xw0BvP!iFEguICjK0_HCj`EcpG z+%fONB3{Y~IT1cp`C`PpQB4%bimX_}qWW zUiPp*&a%tC=BLJN`2|}V_*(RK&pN$rUcl>iq5BhxO0LKKxqI^d(Z##JKbF_4?bE)y z`>HUX*Vitd*o|jf*zcaX&F%DCqWeH=Q{^Hji_lpd(eg_h-v2x4T=C=L-irVA>mL1$ zk8!RqHju77mbzT`#)e?4yuYVkHR=T$2EBZp@6K2)pZCbuQ(S~ak^iQ7{yL3{V#9gP zRq>jvOBPlphci=?v?o^WpS;aUw>Tw?XmfM+ot97tYfBj zEjJ1fS|%0k+8wib`Hb7gx^DcFlv;D^S;fBtM)T}9^xU`p!4S8*jxqn9Pkt`9#4VKc3FaFU;R6F8*1ac5?243$d>FVP{Hx=)Jo5iic0U@Ruz9be}DKP%wG6urE^3~Nu}4y6Ta6h z*;riPENd#%Dx9Acz@;FoGHXlB>D8x?f4qB`|MA+{(?480d%EKHZSRPU=cCj<3k8%b zEm|+vv_VxO@WC$4z}l7U0{2%LaCLXf?)mV@D6XPVQe6Me!JV787yLUNZSntTZprmu z65-Z|W+u{fkh9Co{ZrWdZ-n{i zdD!fIZ!qs(xkP;_&yIrkeEatN);+iO-l6|@cQ+_^BL6#V3t4xdM=?h_aVpz%3E@8-lXi$+Fa7;bSa8dXt3SV8e##j3 zU{|fu`e~ZKt(V7L`rV|UvgiB3+f|2sq*>Kt)@pCwf7OR|-AVsXXa4lGtlaPa?5uzA z)o8Ef!glj*zA5rOV^0@8__}=Ad7USJrYdl}O*ycCS^}%rQtyf>rP|FEQ#2QCS^T_y z$Hu!Fu_vkyJ&?GmHDlY=M-Q|(nEcDm{rG)yPBEwFUPX=0Xb0}7|5M%V?BlUtawe|2_sJ|tsMvQ^WqizO?H#&KNi7OnCb2Ph3QSEcfx z)jQ6;xba5&?fz}qJpwJ;0+kEg1-6T&#`<#4X}Yxj?eil)xMQUM*sNiVUY;2{_0LLU zM*)jh%R+3vuhO3$+F5m}GTSEcu1)HZwW(!Fx=7u4r)fGM)=lNt$W4 z!(`eS_G^{jPGF%Rl47-wby?7x`vIOm5iH zqrf54yyo7mO)XWuSs&kO|4mGIw%k0OJ(Jm>PHAD-aJA@$GCCC^i4#JhDz@8(;FP&o9 z{Y>JPkTOf+G#)#%*V;P2TG{dwI7Ak3WNbabsugb)=RWP){8OeY6~$KO%@<%7o&D(4 zkDt2xpEVii|M;iw!0oQ|w)att_5Y;8mERvvjczmSi1v;8wW025lQgP)h3z_yJh2wNUj93C?g>}sj^?GeS)Q3Fa2|>Y)Kuv; zZ{M-g!*SRASjp_O|XM=kLTGqOK zQQoY%_`;>BG3(d=N%Ih$ea0<7Jvw`vfLqj2)l1=9y}s+N+!mYfID@%KQ{?=a7wxHD zp}{)3uZ8bTbGSPDpz!v|DKXkR*L2Q2z~1&Iaf_iF$DujK(T&^(x?&t=X4(w#4> zo>)!fR?%avdwz3O@X->zKN5WJs;b%2rIlG0%C4~1Uj5lPIOCSy);>e4HHjTkGFMlc z3a*t>b_tdGog}?5;p?}l_tqU+y}e8NmdEcW>DJYLGTQdGH@>}bm+k-kHvRZlcf~yS z8M?AhZN5#d9`ziNRGM59^Bm3(fEL>Bqe_yZI&S z){l6nzgD*IOVs|%kPB>He2l~KhS!REy%AXk*4_YqzXY*vI6NdxYuYdT$fIiPFoo?av?hrfSFF9CQ7U zsQ>Arr7f8cx%W2s6nRzHS_X>77jlP-F*wxCTlaQ)XxjaMuJ&{LS1t7Hh>mVMG3|0D z*NLv^1JhQ0*SJ}1sFb=p?8&d^i*L)^86509)p$+2wWxzEwO`JNwM zhb=9cexYPq!Er0SQ`e3Lyw%m_NS9~ez@6~q_|*}Pu1o13zZrr7fq^3c6zSWy6>lUdZJ~jSDQww*OOZf z?kR3YmcRF%zbh+^UR0UI}Yx<0H;&*=g`rogfze-s*U(7ClOQhKMz!|!Wt)G6WdgeO)TzB@1M9o= zZpuGaJp(rOXEM{iZ_ItzDtkQP`=hqZU0)28#2o}uq`6}c%((88Kup2w^n_aFTy!2RLCj*=Ct_H)? z-Ldkw=P%i(aG-Pbu8RjdqvpzS9h|g*^-@jz60P?u1z3`A`{}QjHU6@A+u~^DgjGTY z=O0~rbnD9e9Pw3`@4vBFRrE4dm}TM9GtX^zSc*v58DFnl9mBcM(#vw9_lAe6KHFO| z>oWIde-4(;n|kWn_Qrc`vDz$aE_`ieP~02uf18uFRP-nBlQym&9hMS{qXmwgw0O2Z zUs*=!--C<08{{qi4Q?czx>Z+d%3@%YGgc!a0v*Pc}l3I~BA)v{J zcHwntSsPb7T>a2{dbde#|B0NhXB#UkOAEFwZ~nxR*KBtqd5d*m(&ojYEDP6e$!5L2 zxc)Jpnf|>a&!$Gdh~M3NHviqLtDRF#1J?8Be0!|b9K1X$Yg6}?o6k;MIjJ&Tag}JZ zs0+iM|F6Q;`l_xvM^{~#nL({ipN~`dy$d2u@w-zkm(QG~UPBr1X(3O9-FJx{tAAQ;!QSre}N5+<6 zYmESd{y!(joMS%)9+j0z{C9L%&ivxvvg0p{e}?gk=YJ`9nZ`eT|J#SNMgO*IzgsK( zF89T4Q?DyenSIYi?Q~h$>lC(8&V6N#S@+2k6(<(e@~yL(Jf(FtzerAs)`yihAKm=) zv!^C(U9XzJ#Fh@WEm^GPpAVIOsrzbL6(8gHzI*k8cWx8*7o_~pSgf|}T$pd!#2rC) zE({FpJ3U<-L#%Gg%(R;M#AsR2xkT0wUKb_vRj+b(_N=mD44v@lb_jz;?AfcTFM|3%=6=7j=%JN zZBd;nyZY{j8`Jnr;x8vY&vdDsSkxIL-MS{pwlC;sj@aah-QudhWnwDTG`Yj&HEx^; zc@Vt$=;o)NC4a7ok+%F5@_(rhN2cBFbe6AX8$VuT{bIMbqxW)rW7zIO!Ne|&r)p}7 zeEOPomC?@s(^usmxufrXZ|}~A=RT#fESYs1OojKaGZyS^F1>oSuu6PV=q<}cm4mlf zKCwhz3DL=6jNkLqc-bkl9UJ)>O7dm*8pkgzf2O_SuJ?_PXAVcye3K}%spiRg-nVL6 zCL@Dm<@d+u^#5#Cd_SkGy5;-%(vSasn${HT>%RJRr@e;b3fHhq_w;q)1=sIexA&Hx zPkem2yHL#g`GLF@M_Vl_D_-rX_brRG%p_ z0b9lI?m4kmBD(9j%IxVUPpD)Y%?vaWZ1^XUH(T(TJeO;hkJgH>37xM6d~T+6v_2B^ zcpWuuUbTp|pKaSxae3wi*%LZv?ehB^y6{*$$8onCa@YS@r(gdNzd!15_48S}H8OWL zH!O8MCg42zb5Q(}m_=9I6jw*|FAlMreKbYI?smYY^9QG1ZMw-;=@6RBzOEa<_veS5mTmY+-dD<02RqyP5M!`i}2AC@Q^EK%F-F*mo*XRc4t z%oRcB3K>04g(*#ESYg4#$ntDfV9v3tT(``W%>M~WG2|}3^|83~z5VnjU#(kLGNep4 zo$14rabTnN7LMYZmKTp+47tKoRxzvR%pA@%rex+1IU21??JYWG_ty(?AD`|!scGB7 zw<^IlNxvS6edssO`!{{M`G;pSt1BL#*?Vi>ag)8i3p?-rQhF-1)Ql_gXqC*;Pd9bc zn!j$=xc&UWDPzyb9lsn7x-DaxKTCI>?)>v7(ghi3Z*s8?oOSj~ren*y^Y+JoMbA(E z{5raDoq@YX>Kq2fC5J9Z-)VZV{PqmrhS}fF=yE?{%F-!$yKVFO;3UR_TltqXUQ#c} zYAv$Nn5?Ail>Jdp**a~9Nq>cn)t1C_Y6s7;Z5DpuRyXy~jSVbsg%|$5pT6((c{oVxs?B2iN$L}qD`_ngm_ukI=bz8cw+r_2+*5vr?Ha}%**|amQ2k!2v z5YAp--_*;0?sz1#^WEMD?xKg5C@`c>IJ&->=_w4Pi z>`w(@443*B2ye6TJ?`mYk><7Q!Wp@{T;^ArzQs09@?CfS-dmAedFiy z^N9~%D8ATs!|x13{<^C6;)hlI_LcAT?pf}BCe;4qUX}dr>38B=gj)(78LDP~Hk#ft zll#uu`1s?u_Satd(VkNJ<$c*k1*US1NugJwd}f46cs*gV>S$fPGt_TZ8nbDP^2bwo zd)5}38SU*5zO(bi*S~yWFAtTe$l9tNe3_hm>!YxJ()owdJls=nJvycunqLz0<*7YB3#QOD}w@cq!WpH|G^!&~7`48sb+uO}wfA>v$O6i(4od-mZx#v%QQZMps zitFneX$PMjogMM}I{(JPUqN$Jx3Doy=!#L`2`^O=|4_PQGV{%b{APoYfFt$Wbj9^T zzdlQTJ>g&CjGy|dg;BRB2bRvY&(U&}PG>p7+s69(mvHy(3aO)yu04z1zxv-B5iz+k z?VS&&pUV`KYkvE=_4VG3UD1vbQ_uSD?BAw4Lp0{?jb)zypK|SYNKw;>Qzj;$hUxN#gh0r(E-om z`Ihc@kjE1yHuZbghwfR^o0@`l#lFgIGCQ-{eM8xdteev>$X@;tIo5` zTbp;xvx$L0fyu0@rS!8<;qACZ)divz;udkc?ElN$HCOw-g(YhG@#8(rt%+epu@kiJ zZd&lY)N38D{f*Yuo`pYe7zwa^y_dFlztpkLwl1e>7wjgTjNcz6K{px0?`>QJ_o?&2MVDNPHb6Mw<&;$UP@&(WU diff --git a/docs/img/update3.png b/docs/img/update3.png deleted file mode 100644 index 52b9dc2e31712fef32b8b2652e3816546ff3a0cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18034 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 j45O|XY}u2pG4fyj>-?9m7c🔒 Генерация SSL-сертификата для Nginx в XC_VM - -

- В этом документе описан процесс создания самоподписанного SSL-сертификата. Следуйте шагам, чтобы настроить безопасное HTTPS-соединение. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -* [📘 Введение](#-введение) -* [🧭 Расположение конфигурации](#-расположение-конфигурации) -* [🧱 Шаг 1. Создание приватного ключа](#-шаг-1-создание-приватного-ключа) -* [⚙️ Шаг 2. Создание конфигурационного файла servercnf](#️-шаг-2-создание-конфигурационного-файла-servercnf) -* [🔑 Шаг 3. Генерация самоподписанного SSL-сертификата](#-шаг-3-генерация-самоподписанного-ssl-сертификата) -* [📂 Итоговые файлы](#-итоговые-файлы) -* [✅ Результат](#-результат) -* [⚠️ Примечания](#️-примечания) - ---- - -## 📘 Введение - -**SSL (Secure Sockets Layer)** используется для шифрования соединений между клиентом и сервером, обеспечивая безопасность данных и доверие пользователей. -В этой инструкции показано, как создать **самоподписанный SSL-сертификат** для встроенного **Nginx** в проекте **XC_VM**. - ---- - -## 🧭 Расположение конфигурации - -Все SSL-файлы (ключ, сертификат и конфигурация) хранятся в директории: - -```bash -/home/xc_vm/bin/nginx/conf -``` - -Перед началом работы перейдите в неё: - -```bash -cd /home/xc_vm/bin/nginx/conf -``` - ---- - -## 🧱 Шаг 1. Создание приватного ключа - -Сгенерируйте **RSA-приватный ключ** (2048 бит): - -```bash -openssl genrsa -out server.key 2048 -``` - -📄 После выполнения появится файл `server.key`, содержащий **закрытый ключ**. -Храните его **в секрете** — этот файл используется для подписи SSL-сертификата. - ---- - -## ⚙️ Шаг 2. Создание конфигурационного файла `server.cnf` - -Создайте файл конфигурации с параметрами сертификата: - -```bash -cat > server.cnf << EOF -[req] -distinguished_name = req_distinguished_name -x509_extensions = v3_req -prompt = no - -[req_distinguished_name] -C = RU -ST = Moscow -L = Moscow -O = XC_VM -OU = XC_VM -CN = XC_VM - -[v3_req] -keyUsage = keyEncipherment, dataEncipherment -extendedKeyUsage = serverAuth -subjectAltName = @alt_names - -[alt_names] -DNS.1 = XC_VM -EOF -``` - -📘 **Описание параметров:** - -| Поле | Значение | Назначение | -| ------- | -------- | ------------------------------- | -| `C` | RU | Страна (Country) | -| `ST` | Moscow | Регион (State) | -| `L` | Moscow | Город (Locality) | -| `O` | XC_VM | Организация | -| `OU` | XC_VM | Отдел / подразделение | -| `CN` | XC_VM | Имя хоста (Common Name) | -| `DNS.1` | XC_VM | Альтернативное имя домена (SAN) | - -> 💡 **Совет:** можно указать реальное доменное имя, например `DNS.1 = example.com`, чтобы избежать предупреждений в браузере. - ---- - -## 🔑 Шаг 3. Генерация самоподписанного SSL-сертификата - -Сгенерируйте сертификат с помощью созданного ключа и конфигурации: - -```bash -openssl req -new -x509 -key server.key -out server.crt -days 3650 -config server.cnf -``` - -📆 **Пояснения:** - -* `-new -x509` — создаёт новый самоподписанный сертификат. -* `-days 3650` — срок действия сертификата (10 лет). -* `-config server.cnf` — использование конфигурационного файла. -* Результатом будет файл `server.crt`. - ---- - -## 📂 Итоговые файлы - -После всех шагов в `/home/xc_vm/bin/nginx/conf` должны находиться: - -| Файл | Назначение | -| ------------ | ------------------------------ | -| `server.key` | Приватный ключ | -| `server.crt` | Самоподписанный SSL-сертификат | -| `server.cnf` | Конфигурация сертификата | - ---- - -## ✅ Результат - -Теперь ваш **XC_VM Nginx сервер** доступен по протоколу **HTTPS**, используя созданный самоподписанный сертификат. -Браузеры могут предупреждать о «недоверенном сертификате» — это нормально для самоподписанных SSL. - ---- - -## ⚠️ Примечания - -* Самоподписанные сертификаты подходят **для внутреннего использования или тестирования**. -* Для публичных доменов используйте сертификаты от **доверенных центров** (например, [Let's Encrypt](https://letsencrypt.org/)). -* При изменении доменного имени (`CN` или `DNS.1`) необходимо **сгенерировать сертификат заново**. -* Чтобы проверить сертификат, выполните: - -```bash -openssl x509 -in server.crt -text -noout -``` - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/administration/update-system.md b/docs/ru/administration/update-system.md deleted file mode 100644 index 6c280a541..000000000 --- a/docs/ru/administration/update-system.md +++ /dev/null @@ -1,177 +0,0 @@ -

⚙️ Механизм обновлений в XC_VM

- -

- Система обновлений XC_VM реализована как многоуровневый процесс — от веб-интерфейса до системных скриптов. - Такой подход обеспечивает надёжность, автоматизацию и целостность данных при обновлении панели. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -* [🔁 1. Инициация обновления](#-1-инициация-обновления) -* [🕒 2. Запуск через CRON](#-2-запуск-через-cron) -* [🧠 3. Управление обновлением (PHP-уровень)](#-3-управление-обновлением-php-уровень) -* [🐍 4. Системное обновление (Python-уровень)](#-4-системное-обновление-python-уровень) -* [🔄 5. Завершение обновления](#-5-завершение-обновления) -* [✅ 6. Итоговая схема работы](#-6-итоговая-схема-работы) -* [🧩 Ключевые особенности](#-ключевые-особенности) - ---- - -## 🔁 1. Инициация обновления - -Процесс начинается с **нажатия кнопки "Обновить"** в веб-интерфейсе панели. - -* Создаётся сигнал `update`, который записывается в таблицу `signals` базы данных. -* Этот сигнал выступает **триггером**, запускающим дальнейший процесс обновления. - ---- - -## 🕒 2. Запуск через CRON - -Каждую **минуту** выполняется системное задание CRON: - -```bash -php /home/xc_vm/includes/cli/root_signals.php -``` - -Скрипт `root_signals.php` проверяет наличие новых сигналов и при обнаружении `update` запускает: - -```bash -/home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/update.php update -``` - -> ⚙️ Этот механизм позволяет выполнять обновления **автоматически**, без ручного вмешательства администратора. - ---- - -## 🧠 3. Управление обновлением (PHP-уровень) - -Основная логика находится в: - -``` -/home/xc_vm/includes/cli/update.php -``` - -На этом этапе выполняются следующие действия: - -1. Определение **текущей версии панели** (`MAIN` или `LB`). -2. Получение данных о новой версии с **GitHub**: - - * Ссылка на архив обновления. - * Контрольная сумма (хеш) для проверки целостности. -3. Скачивание архива во временную директорию. -4. Проверка соответствия хеш-суммы. -5. Запуск системного обновления с помощью Python: - -```bash -sudo /usr/bin/python3 /home/xc_vm/update "/home/xc_vm/tmp/.update.tar.gz" "HASH" > /dev/null 2>&1 & -``` - ---- - -## 🐍 4. Системное обновление (Python-уровень) - -После вызова передача управления переходит к скрипту: - -``` -/home/xc_vm/update -``` - -Он выполняет операции на уровне системы: - -1. **Повторная проверка контрольной суммы** архива. -2. **Остановка панели**, чтобы избежать конфликтов при обновлении. -3. **Распаковка** обновления в каталог: - - ```bash - /home/xc_vm/ - ``` -4. **Настройка прав доступа:** - - ```bash - chown -R xc_vm:xc_vm /home/xc_vm/ - ``` -5. **Запуск пост-обновления:** - - ```bash - /home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/update.php post-update - ``` -6. **Перезапуск панели** в рабочем режиме. - ---- - -## 🔄 5. Завершение обновления - -Финальные действия снова выполняются в `update.php`: - -1. Проверка, **включено ли автообновление LB**: - - * Если обновлялся `MAIN`, создаются сигналы обновления для всех Load Balancer’ов. -2. Обновление **версии панели** в базе данных. -3. Удаление устаревших файлов. -4. Повторное выравнивание прав: - - ```bash - chown -R xc_vm:xc_vm /home/xc_vm/ - ``` -5. Перезагрузка системных демонов: - - ```bash - sudo systemctl daemon-reload - ``` -6. Проверка статуса панели: - - ```bash - sudo /home/xc_vm/status - ``` -7. Завершение процесса обновления. - ---- - -## ✅ 6. Итоговая схема работы - -```text -[ Веб-интерфейс ] - │ - ▼ -[ БД: сигнал update ] - │ - ▼ -[ CRON → root_signals.php ] - │ - ▼ -[ update.php (PHP) ] - │ - ▼ -[ update (Python) ] - │ - ▼ -[ post-update → update.php ] - │ - ▼ -[ Завершение, рестарт демонов, обновление версии ] -``` - ---- - -## 🧩 Ключевые особенности - -* 🔒 **Двойная проверка целостности** (на уровне PHP и Python). -* 🧠 **Автоматическое распространение обновлений** между MAIN и LB. -* 🧹 **Очистка устаревших файлов** и выравнивание прав доступа. -* 🔄 **Безопасный перезапуск панели** после установки. -* ⚙️ **Гибкость и автономность** за счёт CRON и сигналов. - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/api/playlist.md b/docs/ru/api/playlist.md deleted file mode 100644 index a3fc17336..000000000 --- a/docs/ru/api/playlist.md +++ /dev/null @@ -1,124 +0,0 @@ -

📺 Получить список воспроизведения

- -

- Этот API предоставляет функции аутентификации и создания плейлистов для XC_VM. Клиенты могут аутентифицироваться с помощью имени пользователя/пароля или токена, после чего генерируется персонализированный плейлист. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [📂 Расположение файла](#расположение-файла) -- [🔑 Аутентификация](#аутентификация) -- [🚀 Конечные точки](#конечные-точки) -- [❌ Коды ошибок](#коды-ошибок) -- [🧾 Примечания](#примечания) - ---- - -## 📂 Расположение файла - -Основной файл API расположен по следующему пути: - -```bash -/home/xc_vm/wwwdir/playlist.php -``` - ---- - -## 🔑 Аутентификация - -API требует аутентификацию либо через имя пользователя и пароль, либо через токен. Это обеспечивает безопасность доступа к контенту. - -### Базовый URL - -```http -http://<ваш-домен>:80/playlist -``` - ---- - -## 🚀 Конечные точки - -### 1. Аутентификация и создание плейлиста - -**Метод и конечная точка:** - -```http -GET / -``` - -**Параметры запроса:** - -| Параметр | Тип | Требуется | Описание | -|------------|----------|-----------|----------| -| username | string | Yes* | Имя пользователя для аутентификации (обязательно, если не используется `token`). | -| password | string | Yes* | Пароль для аутентификации (требуется, если `token` не используется). | -| token | string | Yes* | Токен аутентификации (требуется, если имя пользователя и пароль не используются). | -| type | string | No | Тип устройства (по умолчанию: `m3u_plus`). | -| key | string | No | Тип контента (live — прямой эфир, movies — фильмы, radio_streams — радио, series — сериалы). | -| output | string | No | Формат вывода (hls или m3u). | -| nocache | boolean | No | Если true, отключается кэширование. | - -> 💡 *Yes* — обязательно один из вариантов: либо username/password, либо token. - -**Примеры запросов:** - -```bash -curl -X GET "http://:80/playlist/username/password/type&output=hls&key=live" -``` - -```bash -curl -X GET "http://:80/playlist/token/type&output=hls&key=live" -``` - -**Ответ:** - -- Файл плейлиста в указанном формате (M3U или HLS). - ---- - -## ❌ Коды ошибок - -В случае ошибок API возвращает соответствующие коды для диагностики проблем. - -| Код ошибки | Описание | -|-------------------------|----------| -| NO_CREDENTIALS | Отсутствуют данные аутентификации. | -| INVALID_CREDENTIALS | Неверное имя пользователя, пароль или токен. | -| BLOCKED_USER_AGENT | Агент пользователя заблокирован. | -| EXPIRED | Срок действия учетной записи истек. | -| DEVICE_NOT_ALLOWED | Тип устройства не разрешен. | -| BANNED | Пользователь заблокирован. | -| DISABLED | Учетная запись отключена. | -| EMPTY_USER_AGENT | Агент пользователя необходим, но отсутствует. | -| NOT_IN_ALLOWED_IPS | IP-адрес не разрешен. | -| NOT_IN_ALLOWED_COUNTRY | Страна не разрешена. | -| NOT_IN_ALLOWED_UAS | Агент пользователя не разрешен. | -| ISP_BLOCKED | Провайдер заблокирован. | -| ASN_BLOCKED | Применено ограничение ASN. | -| DOWNLOAD_LIMIT_REACHED | Слишком много запросов. | -| GENERATE_PLAYLIST_FAILED | Не удалось сгенерировать список воспроизведения. | - -> ⚠️ **Совет:** Проверьте логи сервера для дополнительных деталей при возникновении ошибок. - ---- - -## 🧾 Примечания - -- **Параметры запроса:** Убедитесь, что все параметры указаны корректно, чтобы избежать ошибок аутентификации. -- **Ограничения:** API применяет фильтры по агенту пользователя, IP-адресу и стране для повышения безопасности. -- **Защита от перегрузки:** Установлены лимиты на количество запросов, чтобы предотвратить чрезмерную нагрузку на сервер. -- **Рекомендации:** Для тестирования используйте инструменты вроде cURL или Postman. В продакшене интегрируйте с вашим приложением для автоматизированной генерации плейлистов. - -> 💬 Если возникнут вопросы по интеграции, создайте issue в [репозитории](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Назад на главную -

\ No newline at end of file diff --git a/docs/ru/api/system_api.md b/docs/ru/api/system_api.md deleted file mode 100644 index d6d968171..000000000 --- a/docs/ru/api/system_api.md +++ /dev/null @@ -1,164 +0,0 @@ -

📡 Системный API (Требуется проверка методов)

- -

- Этот API предоставляет различные функциональные возможности, включая просмотр журналов, управление видео по запросу (VOD) и потоками, получение статистики, выполнение фоновых команд и многое другое. -

- -

- ⬅️ Назад на главную -

- ---- - -## Расположение файлов -``` -/home/xc_vm/wwwdir/api.php -``` - -## Обзор архитектуры API -**Базовый URI**: `http://:25461/api.php` -**Аутентификация**: `password` параметр, соответствующий конфигурации `live_streaming_pass` -**Пример**: `http://:25461/api.php?&password=` - ---- - -## Основные конечные точки API - -### 1. Управление VOD -#### **GET** `/api.php?action=vod` -**Описание:** Запуск или остановка потоков видео по запросу (VOD). -**Параметры:** -| Параметр | Тип | Требуется | Описание | -|------------|----------|----------|-------------| -|stream_ids |массив целых чисел |yes |Список идентификаторов потоков. | -|function |string |yes |Действие, которое необходимо выполнить (`start` или `stop`)| - ---- - -### 2. Управление трансляций -#### **GET** `/api.php?action=stream` -**Описание:** Запуск или остановка прямых трансляций. -**Параметры:** -| Параметр | Тип | Требуется | Описание | -|------------|----------|----------|-------------| -|stream_ids |массив целых чисел |yes |Список идентификаторов потоков. | -|function |string |yes |Действие, которое необходимо выполнить (`start` или `stop`)| - ---- - -### 3. Телеметрия системы -#### **GET** `/api.php?action=stats` -**Описание:** Получает системную статистику. -**Ответ:** -```json -{ - "cpu": 8.32, - "cpu_cores": 56, - "cpu_avg": 8.86, - "cpu_name": "Intel(R) Xeon(R) CPU E5-2680 v4 @ 2.40GHz", - ..., -} -``` - ---- - -### 4. Проверка жизненного цикла процесса -#### **GET** `/api.php?action=pidsAreRunning` -**Описание:** Проверяет, запущены ли заданные идентификаторы процессов (PID). -| Параметр | Тип | Требуется | Описание | -|------------|----------|----------|-------------| -|pids |массив целых чисел | yes | Список PID для проверки. | -|program |string |yes |Имя программы. | - ---- - -### 5. Получение файла -#### **GET** `/api.php?action=getFile` -**Описание:** Загружает указанный файл. -**Параметры:** -| Параметр | Тип | Требуется | Описание | -|------------|----------|----------|-------------| -|filename |string |yes |Путь к файлу.| -**Ответ:** -- Содержимое файла. - ---- - -### 6. Список содержимого каталога -#### **GET** `/api.php?action=viewDir` -**Описание:** Получает список каталогов. -**Параметры:** -| Параметр | Тип | Требуется | Описание | -|------------|----------|----------|-------------| -|dir |string |yes |Путь к каталогу.| -**Ответ:** -```html - -``` - ---- - -### 7. Перенаправление соединения -#### **GET** `/api.php?action=redirect_connection` -**Описание:** Перенаправляет соединение на основе идентификатора активности и идентификатора потока. -**Параметры:** -| Параметр | Тип | Обязательный | Описание | -|------------|----------|----------|-------------| -|activity_id |целое число |да |Идентификатор активности. | -|stream_id |целое число |да |Идентификатор потока. | - ---- - -### 8. Отправить сигнал -#### **GET** `/api.php?action=signal_send` -**Описание:** Отправляет сигнальное сообщение для выполнения действия. -**Параметры:** -| Параметр | Тип | Обязательный | Описание | -|------------|----------|----------|-------------| -|message |строка |да |Предложение для отмены. | -|activity_id |целое число |да |Идентификатор активности.| - - ---- - -### 9. Очистить папку с временными файлами -#### **GET** `/api.php?action=free_temp` -**Описание:** Удаляет временные файлы и запускает скрипт для кэширования. - ---- - -### 10. Очистить папку трансляций -#### **GET** `/api.php?action=free_streams` -**Описание:** Очищает папку потоков. - ---- - -### 11. Получить свободное место -#### **GET** `/api.php?action=get_free_space` -**Описание:** Возвращает информацию о свободном дисковом пространстве. - ---- - -### 12. Получить PID -#### **GET** `/api.php?action=get_pids` -**Описание:** Возвращает список запущенных процессов. - ---- -### 13. Завершить процес по PID -#### **GET** `/api.php?action=kill_pid` -**Описание:** Убивает процесс по PID. - ---- - -## Коды ошибок -| Код | Описание | -|----------------------|-------------| -| INVALID_API_PASSWORD | Пароль API неверен | -| API_IP_NOT_ALLOWED | IP-адрес не разрешен | -| INVALID_REQUEST | Неверные параметры запроса | -## Примечания -- Все запросы должны быть аутентифицированы с помощью правильного пароля API. -- Некоторые действия могут потребовать дополнительных разрешений или ограничений в зависимости от конфигурации сервера. diff --git a/docs/ru/api/xtreamcodes_api.md b/docs/ru/api/xtreamcodes_api.md deleted file mode 100644 index b494ab29f..000000000 --- a/docs/ru/api/xtreamcodes_api.md +++ /dev/null @@ -1,518 +0,0 @@ -

📡 XtreamCodes API

- -

- API предоставляет доступ к IPTV-потокам (Live TV, Радио), VOD (фильмы), сериалам и EPG (телепрограмма) в приложениях, совместимых с XtreamCodes. Это ключевой компонент для интеграции с XC_VM. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [📂 Расположение файлов](#расположение-файлов) -- [📑 Содержание](#содержание) -- [🔑 Авторизация](#авторизация) -- [📺 Live TV (ТВ и Радио)](#live-tv-тв-и-радио) -- [🎬 VOD (Фильмы)](#vod-фильмы) -- [📽 Сериалы](#сериалы) -- [🎞 Получение медиаконтента](#получение-медиаконтента) -- [🧾 Примечания](#примечания) - ---- - -## 📂 Расположение файлов - -Основной файл API расположен по следующему пути: - -``` -/home/xc_vm/wwwdir/player_api.php -``` - ---- - -## 📑 Содержание - -API разделен на ключевые разделы для удобства интеграции. Каждый эндпоинт описан с примерами запросов и ответов. - ---- - -## 🔑 Авторизация - -Авторизация — первый шаг для доступа к контенту. Она подтверждает учетные данные пользователя и возвращает информацию о сервере. - -### Запрос - -```http -GET /player_api?username={username}&password={password} -``` - -### Пример ответа - -```json -{ - "user_info": { - "username": "testxc", - "password": "testxc", - "message": "Welcome to XC_VM", - "auth": 1, - "status": "Active", - "exp_date": null, - "is_trial": 0, - "created_at": 1757353729, - "max_connections": 1, - "allowed_output_formats": [ - "m3u8", - "ts", - "rtmp" - ] - }, - "server_info": { - "xui": true, - "version": "1.1.0", - "url": "176.124.192.118", - "port": "80", - "https_port": "443", - "server_protocol": "http", - "rtmp_port": "8880", - "timestamp_now": 1757442189, - "time_now": "2025-09-09 19:23:09", - "timezone": "Europe/London" - } -} -``` - -> 💡 **Совет:** Используйте полученные данные для последующих запросов, чтобы избежать повторной авторизации. - ---- - -## 📺 Live TV (ТВ и Радио) - -Раздел для работы с живыми трансляциями, включая категории, стримы и EPG. - -### Получить все категории Live - -```http -GET /player_api?username={username}&password={password}&action=get_live_categories -``` - -**Пример ответа** - -```json -[ - { - "category_id": "1", - "category_name": "News", - "parent_id": 0 - }, - { - "category_id": "2", - "category_name": "Sports", - "parent_id": 0 - } -] -``` - -### Получить все Live-стримы - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams -``` - -**Пример ответа** - -```json -[ - { - "num": 1, - "name": "BBC News", - "stream_type": "live", - "stream_id": 101, - "stream_icon": "http://176.124.192.118/images/bbc.png", - "epg_channel_id": "bbc.news.uk", - "added": "1660568200", - "category_id": "1", - "custom_sid": "", - "tv_archive": 0, - "direct_source": "", - "tv_archive_duration": 0 - } -] -``` - -### Получить стримы категории - -```http -GET /player_api?username={username}&password={password}&action=get_live_streams&category_id={id} -``` - -### Получить EPG канала (краткая программа) - -```http -GET /player_api?username={username}&password={password}&action=get_short_epg&stream_id={id}&limit={N} -``` - -**Пример ответа** - -```json -{ - "epg_listings": [ - { - "id": 1, - "title": "Morning News", - "start": "2022-08-15 07:00:00", - "end": "2022-08-15 08:00:00", - "description": "Daily morning news update." - } - ] -} -``` - -### Получить полную программу канала - -```http -GET /player_api?username={username}&password={password}&action=get_simple_data_table&stream_id={id} -``` - -### EPG для всех каналов (XMLTV) - -```http -GET /xmltv.php?username={username}&password={password} -``` - -**Пример ответа (XMLTV)** - -```xml - - - BBC News - - - Morning News - Daily morning news update. - - -``` - ---- - -## 🎬 VOD (Фильмы) - -Раздел для видео по запросу, включая категории и информацию о фильмах. - -### Категории фильмов - -```http -GET /player_api?username={username}&password={password}&action=get_vod_categories -``` - -**Пример ответа** - -```json -[ - { - "category_id": "10", - "category_name": "Action", - "parent_id": 0 - }, - { - "category_id": "11", - "category_name": "Drama", - "parent_id": 0 - } -] -``` - -> ⚠️ **Примечание:** Полный список категорий может быть большим; в примерах показаны только фрагменты. - -### Получить все VOD-стримы - -```http -GET /player_api?username={username}&password={password}&action=get_vod_streams -``` - -**Пример ответа** - -```json -[ - { - "num": 1, - "name": "The Dark Knight (2008)", - "title": "The Dark Knight", - "year": 2008, - "stream_type": "movie", - "stream_id": 1, - "stream_icon": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljuWhs_Jbsg3Nu1tBcV0ErgPL_v9ei3c1fI0mNI7C5eos.jpg", - "rating": 8.5, - "rating_5based": 4.3, - "added": 1757343129, - "plot": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.", - "cast": "Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine, Maggie Gyllenhaal", - "director": "Christopher Nolan, Christopher Nolan, Steve Gehrke", - "genre": "Drama, Action, Crime", - "release_date": "2008-07-16", - "youtube_trailer": "kmJLuwP3MbY", - "episode_run_time": "152", - "category_id": "1", - "category_ids": [1, 2], - "container_extension": "mp4", - "custom_sid": "", - "direct_source": "" - } -] -``` - ---- - -### Фильмы по категории - -```http -GET /player_api?username={username}&password={password}&action=get_vod_streams&category_id={id} -``` - -### Информация о фильме - -```http -GET /player_api?username={username}&password={password}&action=get_vod_info&vod_id={id} -``` - -**Пример ответа** - -```json -{ - "info": { - "kinopoisk_url": "https://www.themoviedb.org/movie/155", - "tmdb_id": 155, - "name": "The Dark Knight", - "o_name": "The Dark Knight", - "cover_big": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljuWhs_Jbsg3Nu1tBcV0ErgPL_v9ei3c1fI0mNI7C5eos.jpg", - "movie_image": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljuWhs_Jbsg3Nu1tBcV0ErgPL_v9ei3c1fI0mNI7C5eos.jpg", - "release_date": "2008-07-16", - "episode_run_time": 152, - "youtube_trailer": "kmJLuwP3MbY", - "director": "Christopher Nolan, Christopher Nolan, Steve Gehrke", - "actors": "Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine, Maggie Gyllenhaal", - "cast": "Christian Bale, Heath Ledger, Aaron Eckhart, Michael Caine, Maggie Gyllenhaal", - "description": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.", - "plot": "Batman raises the stakes in his war on crime. With the help of Lt. Jim Gordon and District Attorney Harvey Dent, Batman sets out to dismantle the remaining criminal organizations that plague the streets. The partnership proves to be effective, but they soon find themselves prey to a reign of chaos unleashed by a rising criminal mastermind known to the terrified citizens of Gotham as the Joker.", - "age": "", - "mpaa_rating": "", - "rating_count_kinopoisk": 0, - "country": "United Kingdom", - "genre": "Drama, Action, Crime", - "backdrop_path": [ - "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeATVLqPvNOO1tw6QZZproFAJRjrtA4EzIxoMJZlI2R3OlQ.jpg" - ], - "duration_secs": 9120, - "duration": "02:32:00", - "bitrate": 0, - "rating": 8.52, - "releasedate": "2008-07-16", - "subtitles": [] - }, - "movie_data": { - "stream_id": 1, - "name": "The Dark Knight (2008)", - "title": "The Dark Knight", - "year": 2008, - "added": 1757343129, - "category_id": "1", - "category_ids": [1, 2], - "container_extension": "mp4", - "custom_sid": "", - "direct_source": "" - } -} -``` - ---- - -## 📽 Сериалы - -Раздел для работы с сериалами, включая категории, сезоны и эпизоды. - -### Категории сериалов - -```http -GET /player_api?username={username}&password={password}&action=get_series_categories -``` - -**Пример ответа** - -```json -[ - { - "category_id": "20", - "category_name": "Drama", - "parent_id": 0 - } -] -``` - ---- - -### Все сериалы - -```http -GET /player_api?username={username}&password={password}&action=get_series -``` - -**Пример ответа** - -```json -[ - { - "num": 1, - "name": "Braceface (2001)", - "title": "Braceface", - "year": 2001, - "stream_type": "series", - "series_id": 1, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljpT6mCZeHa4zLXMQZ2eaTpGZUSOucptPKyuP5tgpEZm0.jpg", - "plot": "The show, set in Elkford, British Columbia, is based around Sharon Spitz, who is a junior high school student with braces that get in her way of leading a normal teenage life. In the first season, she is enrolled at Mary Pickford Junior High.", - "cast": "Stacey DePass", - "director": "Charles E. Bastien", - "genre": "Drama, Animation, Comedy", - "release_date": "2001-06-02", - "releaseDate": "2001-06-02", - "last_modified": "1757348651", - "rating": "7", - "rating_5based": 3.5, - "backdrop_path": [ - "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeATBaSzxZEgi9EPIvh5kU_50ecbH2L-yDt1PIfqijKTIMg.jpg" - ], - "youtube_trailer": null, - "episode_run_time": 25, - "category_id": "4", - "category_ids": [4] - } -] -``` - ---- - -### Сериалы по категории - -```http -GET /player_api?username={username}&password={password}&action=get_series&category_id={id} -``` - -### Информация о сериале - -```http -GET /player_api?username={username}&password={password}&action=get_series_info&series_id={id} -``` - -**Пример ответа** - -```json -{ - "seasons": [ - { - "air_date": "2001-06-02", - "episode_count": 26, - "id": 4937, - "name": "Season 1", - "overview": "", - "season_number": 1, - "vote_average": 4.5, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljJBrZ7sNEJHE6hlqofFOJSRKiMRvSj08-T6iTQVWvj2I.jpg", - "cover_big": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljJBrZ7sNEJHE6hlqofFOJSRKiMRvSj08-T6iTQVWvj2I.jpg" - } - ], - "info": { - "name": "Braceface (2001)", - "title": "Braceface", - "year": 2001, - "cover": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCLaoCzC2XshRjzbEF-0-ISX3OBAKZPN21ASjMFFF_OljpT6mCZeHa4zLXMQZ2eaTpGZUSOucptPKyuP5tgpEZm0.jpg", - "plot": "The show, set in Elkford, British Columbia, is based around Sharon Spitz, who is a junior high school student with braces that get in her way of leading a normal teenage life. In the first season, she is enrolled at Mary Pickford Junior High.", - "cast": "Stacey DePass", - "director": "Charles E. Bastien", - "genre": "Drama, Animation, Comedy", - "release_date": "2001-06-02", - "releaseDate": "2001-06-02", - "last_modified": "1757348651", - "rating": "7", - "rating_5based": 3.5, - "backdrop_path": [ - "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeATBaSzxZEgi9EPIvh5kU_50ecbH2L-yDt1PIfqijKTIMg.jpg" - ], - "youtube_trailer": null, - "episode_run_time": 25, - "category_id": "4", - "category_ids": [4] - }, - "episodes": { - "1": [ - { - "id": "2", - "episode_num": "1", - "title": "Braceface - S01E01 - Brace Yourself", - "container_extension": "mp4", - "info": { - "release_date": "2001-06-02", - "plot": "Sharon Spitz, a 13-year-old 8th grader get's braces the day before picture day. When getting braces at the ortadontist, there is a thunder storm and the power go's out. Something happens with Sharon's braces and now its making her do all sorts of weird things!", - "duration_secs": 649, - "duration": "00:10:49", - "movie_image": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeARCK8Ch0a6wlNxuIHhbJ3c1Dg_AqkwSsH-qdpnCvcMsiy6U85vvi1bs1xDOddBeOEQ.jpg", - "bitrate": 2791, - "rating": "5", - "season": "1", - "tmdb_id": "105800", - "cover_big": "http://176.124.192.118:80/images/7pQr8EhEi05VXRmZc5QfCADBzwKB171qpiTTqrZdeARCK8Ch0a6wlNxuIHhbJ3c1Dg_AqkwSsH-qdpnCvcMsiy6U85vvi1bs1xDOddBeOEQ.jpg" - }, - "subtitles": [], - "custom_sid": "", - "added": 1757348651, - "season": 1, - "direct_source": "" - } - ] - } -} -``` - ---- - -## 🎞 Получение медиаконтента - -Получите прямые ссылки на медиафайлы после авторизации. - -* **Live TV (канал):** - -```http -http://176.124.192.118/live/{username}/{password}/{stream_id}.ts -``` - -* **Фильм (VOD):** - -```http -http://176.124.192.118/movie/{username}/{password}/{vod_id}.mp4 -``` - -* **Серия:** - -```http -http://176.124.192.118/series/{username}/{password}/{episode_id}.mp4 -``` - -> ⚠️ **Важно:** При первом запросе происходит редирект на `/auth/...` для авторизации, после чего отдаётся контент. - ---- - -## 🧾 Примечания - -- **Форматы вывода:** Поддерживаются m3u8, ts, rtmp — выбирайте в зависимости от устройства. -- **Безопасность:** Все запросы требуют авторизации; мониторьте логи на предмет ошибок. -- **Интеграция:** Для тестирования используйте инструменты вроде Postman. В приложении реализуйте кэширование ответов для оптимизации. - - -> 💬 Если возникнут вопросы по интеграции, создайте issue в [репозитории](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Назад на главную -

\ No newline at end of file diff --git a/docs/ru/builds/build_binaries.md b/docs/ru/builds/build_binaries.md deleted file mode 100644 index caffeec1a..000000000 --- a/docs/ru/builds/build_binaries.md +++ /dev/null @@ -1,320 +0,0 @@ -

🧱 XC_VM — Сборка бинарных файлов

- -

- Это руководство поможет собрать бинарные файлы для XC_VM. Процесс подходит для разработчиков и администраторов, желающих настроить систему под свои нужды. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [🔧 Предварительная подготовка](#предварительная-подготовка) -- [🌐 Сборка NGINX](#сборка-nginx) -- [📺 Сборка NGINX с RTMP](#сборка-nginx-с-rtmp) -- [🐘 Сборка PHP-FPM](#сборка-php-fpm) -- [📦 Установка PHP-расширений](#установка-php-расширений) -- [⚙️ Сборка бинарника network](#сборка-бинарника-network) -- [✅ Заключение](#заключение) - ---- - -## 🔧 Предварительная подготовка - -> ⚠️ **Внимание:** Все действия выполняются **на сервере**, где установлен `xc_vm`. - -### 1. Установите зависимости - -Установите необходимые пакеты для сборки. Это обеспечит наличие всех инструментов и библиотек. - -```bash -sudo apt-get install -y \ - build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \ - libssl-dev libgd-dev libxml2 libxml2-dev uuid-dev libxslt1-dev \ - unzip wget curl git -``` - ---- - -## 🌐 Сборка NGINX - -### 1. Загрузите исходники - -#### OpenSSL - -```bash -wget https://github.com/openssl/openssl/releases/download/openssl-3.5.1/openssl-3.5.1.tar.gz -tar -xzvf openssl-3.5.1.tar.gz -``` - -#### Zlib - -```bash -wget https://zlib.net/zlib-1.3.1.tar.gz -tar -xzvf zlib-1.3.1.tar.gz -``` - -#### PCRE - -```bash -wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz -tar -xzvf pcre-8.45.tar.gz -``` - -#### FLV-модуль - -```bash -wget https://github.com/winshining/nginx-http-flv-module/archive/refs/tags/v1.2.12.zip -unzip v1.2.12.zip -``` - -#### Nginx - -```bash -wget https://nginx.org/download/nginx-1.28.0.tar.gz -tar -zxvf nginx-1.28.0.tar.gz -cd nginx-1.28.0 -``` - -### 2. Настройка сборки - -Настройте конфигурацию для статической сборки с необходимыми модулями. - -```bash -./configure \ - --prefix=/home/xc_vm/bin/nginx \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' \ - --with-pcre=../pcre-8.45 \ - --with-pcre-jit \ - --with-zlib=../zlib-1.3.1 \ - --with-openssl=../openssl-3.5.1 \ - --with-openssl-opt=no-nextprotoneg -``` - -### 3. Сборка и установка - -```bash -make -make install -``` - ---- - -## 📺 Сборка NGINX с RTMP - -### 1. Загрузите RTMP-модуль - -```bash -wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.2.tar.gz -tar -xzvf v1.2.2.tar.gz -``` - -### 2. Сконфигурируйте сборку - -```bash -cd nginx-1.28.0 -./configure \ - --prefix=/home/xc_vm/bin/nginx_rtmp \ - --add-module=../nginx-http-flv-module-1.2.12 \ - --with-compat \ - --with-http_auth_request_module \ - --with-file-aio \ - --with-threads \ - --with-http_gzip_static_module \ - --with-http_realip_module \ - --with-http_flv_module \ - --with-http_mp4_module \ - --with-http_secure_link_module \ - --with-http_slice_module \ - --with-http_ssl_module \ - --with-http_stub_status_module \ - --with-http_sub_module \ - --with-http_v2_module \ - --with-cc-opt='-static -static-libgcc -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' \ - --with-ld-opt='-static -Wl,-z,relro -Wl,-z,now -pie' -``` - -### 3. Сборка и установка - -```bash -make -make install -``` - -### 4. Переименование исполняемого файла - -```bash -mv /home/xc_vm/bin/nginx_rtmp/sbin/nginx /home/xc_vm/bin/nginx_rtmp/sbin/nginx_rtmp -``` - ---- - -## 🐘 Сборка PHP-FPM - -### 1. Установите зависимости - -```bash -sudo apt-get install -y \ - libcurl4-gnutls-dev libbz2-dev libzip-dev autoconf automake \ - libtool m4 gcc make pkg-config libmaxminddb-dev libssh2-1-dev -``` - -### 2. Загрузите исходники - -```bash -wget -O php-8.1.33.tar.gz http://php.net/get/php-8.1.33.tar.gz/from/this/mirror -tar -xzvf php-8.1.33.tar.gz -cd php-8.1.33 -``` - -### 3. Настройка сборки - -```bash -./configure \ - --prefix=/home/xc_vm/bin/php \ - --with-fpm-user=xc_vm \ - --with-fpm-group=xc_vm \ - --enable-gd \ - --with-jpeg \ - --with-freetype \ - --enable-static \ - --disable-shared \ - --enable-opcache \ - --enable-fpm \ - --without-sqlite3 \ - --without-pdo-sqlite \ - --enable-mysqlnd \ - --with-mysqli \ - --with-curl \ - --disable-cgi \ - --with-zlib \ - --enable-sockets \ - --with-openssl \ - --enable-shmop \ - --enable-sysvsem \ - --enable-sysvshm \ - --enable-sysvmsg \ - --enable-calendar \ - --disable-rpath \ - --enable-inline-optimization \ - --enable-pcntl \ - --enable-mbregex \ - --enable-exif \ - --enable-bcmath \ - --with-mhash \ - --with-gettext \ - --with-xmlrpc \ - --with-xsl \ - --with-libxml \ - --with-pdo-mysql \ - --disable-mbregex \ - --with-pear -``` - -### 4. Сборка и установка - -```bash -make -make install -``` - ---- - -## 📦 Установка PHP-расширений - -Используйте встроенный `pecl` из вашей сборки PHP для установки расширений. - -```bash -/home/xc_vm/bin/php/bin/pecl install maxminddb -/home/xc_vm/bin/php/bin/pecl install ssh2 -/home/xc_vm/bin/php/bin/pecl install igbinary -/home/xc_vm/bin/php/bin/pecl install redis -``` - -### Настройка Redis-расширения - -Во время установки PECL задаёт вопросы: - -``` -enable igbinary serializer support? [no] : yes -enable lzf compression support? [no] : -enable zstd compression support? [no] : -enable msgpack serializer support? [no] : -enable lz4 compression? [no] : -use system liblz4? [yes] : -``` - -Рекомендуемые ответы: `yes` на igbinary, остальные — по желанию. - ---- - -## ⚙️ Сборка бинарника network - -### 1. Установите `PyInstaller` (однократно) - -```bash -pip install -U pyinstaller -``` - -### 2. Соберите бинарный файл - -```bash -cd /home/xc_vm/bin -pyinstaller --onefile network.py -``` - -После сборки исполняемый файл появится в директории: - -```bash -/home/xc_vm/bin/dist/network -``` - -### 3. Переместите бинарник в нужное место - -```bash -mv /home/xc_vm/bin/dist/network /home/xc_vm/bin/network -``` - -### 4. Очистите временные директории - -```bash -rm -rf build dist network.spec __pycache__ -``` - ---- - -## ✅ Заключение - -После завершения всех шагов вы получите собственные статически собранные бинарные файлы: - -- `nginx` -- `nginx_rtmp` -- `php-fpm` -- `pecl`-расширения -- `network` (бинарник Python-скрипта) - -> 💡 **Совет:** Если возникнут проблемы, проверьте логи сборки или обратитесь в [Issues](https://github.com/Vateron-Media/XC_VM/issues). - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/builds/build_ffmpeg.md b/docs/ru/builds/build_ffmpeg.md deleted file mode 100644 index e60f9e63f..000000000 --- a/docs/ru/builds/build_ffmpeg.md +++ /dev/null @@ -1,400 +0,0 @@ -

🚀 XC_VM — Сборка FFmpeg

- -

- Это руководство по сборке FFmpeg с аппаратным ускорением NVIDIA (NVENC/CUVID) и статической интеграцией библиотек для полной переносимости в рамках проекта XC_VM. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [📋 Требования](#требования) -- [🔧 Конфигурация](#конфигурация) -- [🛠 Установка инструментов для сборки](#установка-инструментов-для-сборки) -- [🎶 Сборка и включение кодеков](#сборка-и-включение-кодеков) -- [🖥 Установка NVIDIA и CUDA](#установка-nvidia-и-cuda) -- [🔨 Сборка FFmpeg](#сборка-ffmpeg) -- [📦 Установка](#установка) -- [✅ Проверка](#проверка) -- [🧾 Примечания](#примечания) -- [🔄 Совместимость версий](#совместимость-версий) - ---- - -## 📋 Требования - -* **Ubuntu 22.04 или новее** — рекомендованная ОС для стабильной сборки. -* Видеокарта NVIDIA с поддержкой **NVENC** (опционально, но рекомендуется для аппаратного ускорения). -* ~15 ГБ свободного места на диске для исходников и временных файлов. -* Стабильное интернет-соединение для загрузки зависимостей. - -> 💡 **Совет:** Убедитесь, что система обновлена перед началом, чтобы избежать конфликтов пакетов. - ---- - -## 🔧 Конфигурация - -Установите переменные окружения для кастомизации сборки. Это позволит легко изменить версии и пути. - -```bash -# Версия FFmpeg для сборки -export FFMPEG_VERSION="8.0" - -# Директория для установки -export INSTALL_DIR="/home/xc_vm/bin/ffmpeg_bin" - -# Директория для сборки -export BUILD_DIR="$HOME/ffmpeg_sources" - -# Версия CUDA -export CUDA_VERSION="12-2" - -# Версия драйвера NVIDIA -export NVIDIA_DRIVER_VERSION="535" -``` - ---- - -## 🛠 Установка инструментов для сборки - -Обновите систему и установите базовые пакеты для разработки. Это обеспечит наличие всех необходимых инструментов. - -```bash -sudo apt-get update -qq && sudo apt-get -y install \ - autoconf automake build-essential cmake git-core \ - libass-dev libfreetype6-dev libgnutls28-dev libmp3lame-dev \ - libsdl2-dev libtool libva-dev libvdpau-dev libvorbis-dev \ - libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev \ - meson ninja-build pkg-config texinfo wget yasm \ - zlib1g-dev mercurial nasm libssl-dev software-properties-common -``` - ---- - -## 🎶 Сборка и включение кодеков - -Соберите библиотеки из исходников для статической интеграции в FFmpeg. Это обеспечит поддержку популярных форматов без внешних зависимостей. - -### 2.1 Создание директории для сборки - -```bash -mkdir -p ${BUILD_DIR:-~/ffmpeg_sources} && cd ${BUILD_DIR:-~/ffmpeg_sources} -``` - -### 2.2 H.264 (libx264) - -```bash -git clone https://code.videolan.org/videolan/x264.git -cd x264 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.3 H.265 (libx265) - -```bash -git clone https://bitbucket.org/multicoreware/x265_git.git -cd x265_git/build -cmake ../source -DCMAKE_INSTALL_PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" -DENABLE_SHARED=OFF -make -j$(nproc) -sudo make install -cd ../.. -``` - -### 2.4 VP8/VP9 (libvpx) - -```bash -git clone https://chromium.googlesource.com/webm/libvpx -cd libvpx -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared --enable-pic -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.5 Opus Audio (libopus) - -```bash -wget https://downloads.xiph.org/releases/opus/opus-1.5.2.tar.gz -tar -xvzf opus-1.5.2.tar.gz -cd opus-1.5.2 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -### 2.6 Дополнительные библиотеки - -- **libass** (субтитры): - -```bash -git clone https://github.com/libass/libass.git -cd libass -./autogen.sh -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **libfreetype** (шрифты): - -```bash -wget https://download.savannah.gnu.org/releases/freetype/freetype-2.13.2.tar.gz -tar -xvzf freetype-2.13.2.tar.gz -cd freetype-2.13.2 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **libvorbis** (аудио): - -```bash -wget https://downloads.xiph.org/releases/vorbis/libvorbis-1.3.7.tar.xz -tar -xvf libvorbis-1.3.7.tar.xz -cd libvorbis-1.3.7 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **libmp3lame** (MP3): - -```bash -wget https://downloads.sourceforge.net/project/lame/lame/3.100/lame-3.100.tar.gz -tar -xvzf lame-3.100.tar.gz -cd lame-3.100 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **libtheora** (Theora): - -```bash -git clone https://github.com/xiph/theora.git -cd theora -./autogen.sh -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **librtmp** (RTMP): - -```bash -git clone git://git.ffmpeg.org/rtmpdump -cd rtmpdump -make SYS=posix -j$(nproc) -sudo make prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" install -cd .. -``` - -- **libunistring** (для gnutls и librtmp): - -```bash -wget https://ftp.gnu.org/gnu/libunistring/libunistring-1.2.tar.gz -tar -xvzf libunistring-1.2.tar.gz -cd libunistring-1.2 -./configure --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" --enable-static --disable-shared -make -j$(nproc) -sudo make install -cd .. -``` - -- **bzip2** -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -wget https://sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz -tar -xvzf bzip2-1.0.8.tar.gz -cd bzip2-1.0.8 -make -f Makefile-libbz2_so CFLAGS="-fPIC" -j$(nproc) -make install PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" -cd .. -``` - ---- - -## 🖥 Установка NVIDIA и CUDA - -Для аппаратного ускорения установите драйверы и инструменты NVIDIA. - -### 3.1 Установка драйверов NVIDIA - -```bash -sudo add-apt-repository ppa:graphics-drivers/ppa -sudo apt update -sudo apt install nvidia-driver-${NVIDIA_DRIVER_VERSION:-535} -``` - -> ⚠️ **Важно:** Перезагрузите систему после установки и проверьте совместимость с вашей видеокартой. - -### 3.2 Установка CUDA Toolkit - -```bash -wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb -sudo dpkg -i cuda-keyring_1.0-1_all.deb -sudo apt update -sudo apt install -y cuda-toolkit-${CUDA_VERSION:-12-2} -``` - -### 3.3 Установка заголовков NVENC - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git -cd nv-codec-headers -make -sudo make PREFIX="${INSTALL_DIR:-$HOME/ffmpeg_build}" install -cd .. -``` - -### 3.4 Опциональные инструменты NVIDIA - -```bash -sudo apt install -y nvidia-cuda-toolkit nvidia-cuda-dev -``` - ---- - -## 🔨 Сборка FFmpeg - -### 4.1 Загрузка исходного кода - -```bash -cd ${BUILD_DIR:-~/ffmpeg_sources} -wget https://ffmpeg.org/releases/ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -tar xjvf ffmpeg-${FFMPEG_VERSION:-8.0}.tar.bz2 -cd ffmpeg-${FFMPEG_VERSION:-8.0} -``` - -### 4.2 Конфигурация - -```bash -export PATH="${INSTALL_DIR:-$HOME/bin}:$PATH" -export PKG_CONFIG_PATH="${INSTALL_DIR:-$HOME/ffmpeg_build}/lib/pkgconfig" - -./configure \ - --prefix="${INSTALL_DIR:-$HOME/ffmpeg_build}" \ - --pkg-config-flags="--static" \ - --extra-cflags="-I${INSTALL_DIR:-$HOME/ffmpeg_build}/include -I/usr/local/cuda/include" \ - --extra-ldflags="-L${INSTALL_DIR:-$HOME/ffmpeg_build}/lib -L/usr/local/cuda/lib64 -Wl,-Bstatic -lcrypto -lssl -Wl,-Bdynamic" \ - --extra-version=XCVM \ - --extra-libs="-lsupc++ -lgmp -lz -lunistring -lpthread -lm -lrt -ldl" \ - --bindir="${INSTALL_DIR:-$HOME/bin}" \ - --enable-gpl \ - --enable-gnutls \ - --enable-libass \ - --enable-libfreetype \ - --enable-libmp3lame \ - --enable-libopus \ - --enable-libvorbis \ - --enable-libvpx \ - --enable-libx264 \ - --enable-libx265 \ - --enable-librtmp \ - --enable-libtheora \ - --enable-bzlib \ - --enable-fontconfig \ - --enable-zlib \ - --enable-nvenc \ - --enable-ffnvcodec \ - --enable-cuvid \ - --enable-version3 \ - --enable-nonfree \ - --enable-pthreads \ - --enable-runtime-cpudetect \ - --enable-gray \ - --disable-alsa \ - --disable-indev=alsa \ - --disable-outdev=alsa \ - --disable-ffplay \ - --disable-doc \ - --disable-debug \ - --disable-autodetect \ - --enable-static \ - --enable-muxer=hls \ - --enable-muxer=dash \ - --enable-demuxer=hls \ - --extra-cflags=--static \ - --target-os=linux -``` - -### 4.3 Компиляция - -```bash -make -j$(nproc) -``` - ---- - -## 📦 Установка - -```bash -mkdir -p ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -cp ffmpeg ffprobe ${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ -``` - ---- - -## ✅ Проверка - -Проверьте версию и поддержку NVIDIA после сборки. - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -version -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffprobe -version -``` - -Проверка поддержки NVIDIA: - -```bash -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -encoders | grep nvenc -${INSTALL_DIR:-/home/xc_vm/bin/ffmpeg_bin}/${FFMPEG_VERSION:-8.0}/ffmpeg -decoders | grep cuvid -``` - ---- - -## 🧾 Примечания - -* Все библиотеки собраны статически и включены в бинарный файл FFmpeg, что обеспечивает полную переносимость. -* Драйвер NVIDIA должен быть совместим с вашей видеокартой. -* После установки драйверов может потребоваться **перезагрузка**. -* Сборка FFmpeg потребляет значительные ресурсы CPU и памяти. -* Итоговый бинарный файл будет большим из-за включения всех зависимостей. -* Настройте переменные окружения в соответствии с вашей системой. -* Для разных версий FFmpeg могут потребоваться корректировки флагов конфигурации. - -> 💬 **Совет:** Если возникнут проблемы, проверьте логи сборки или создайте issue в [репозитории](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -## 🔄 Совместимость версий - -| Версия FFmpeg | Рекомендуемая CUDA | Примечания | -|---------------|--------------------|------------| -| 8.x | 12.2+ | Новейшие функции | -| 7.x | 12.0+ | Стабильная | -| 6.x | 11.8+ | Устаревшая | - -Проверяйте [документацию FFmpeg](https://ffmpeg.org/) для конкретных требований версий. - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/info/faq.md b/docs/ru/info/faq.md deleted file mode 100644 index 87806eccd..000000000 --- a/docs/ru/info/faq.md +++ /dev/null @@ -1,87 +0,0 @@ -

❓ FAQ — Часто задаваемые вопросы

- -

- Здесь собраны ответы на наиболее частые вопросы и проблемы при работе с XC_VM. -

- -

- ⬅️ Назад на главную -

- ---- - -## ⚙️ Проблемы со стримами - -
-❌ У меня не запускается стрим на MAIN или LB - ---- - -### 🔍 Диагностика - -Подключитесь к консоли сервера и выполните команду: - -```bash -sudo -u xc_vm /home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/monitor.php 291 -``` - -> 🧩 Где `291` — это **ID вашего стрима** (замените на свой). - ---- - -### 📄 Что делает команда - -Скрипт **monitor.php** попытается запустить стрим вручную и покажет ошибку, если не сможет. - ---- - -### ⚠️ Возможные причины - -#### 1️⃣ Отсутствуют системные библиотеки - -Если вывод содержит ошибку вида: - -``` -error while loading shared libraries: libxyz.so.1: cannot open shared object file -``` - -Установите недостающую библиотеку командой: - -```bash -sudo apt install <имя_библиотеки> -``` - -После установки повторите тест. - -> 💬 Сообщите мне, если потребуется добавить библиотеку в установку. - ---- - -#### 2️⃣ Ошибка не связана с библиотеками - -Если ошибка иного типа — также пришлите её вывод, чтобы я помог с диагностикой. - ---- - -### 🧾 Резюме - -1. Выполните команду диагностики. -2. Проверьте наличие ошибок. -3. Установите недостающие библиотеки. -4. Сообщите о любых других ошибках для анализа. - ---- - -
- ---- - -📘 *Эта страница обновляется со временем. Если вы нашли новую типовую проблему — предложите её в [Issues](https://github.com/Vateron-Media/XC_VM/issues).* - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/info/migration_guide.md b/docs/ru/info/migration_guide.md deleted file mode 100644 index 73813ab28..000000000 --- a/docs/ru/info/migration_guide.md +++ /dev/null @@ -1,119 +0,0 @@ -

🧭 Руководство по миграции XC_VM

- -

- Легко переходите с совместимых систем IPTV с помощью встроенного инструмента миграции XC_VM. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [⚙️ Перед началом](#перед-началом) -- [🚀 Шаги миграции](#шаги-миграции) -- [🔑 Восстановление доступа после миграции](#восстановление-доступа-после-миграции) -- [🧩 После миграции](#после-миграции) -- [🖥️ Подготовка балансировщика нагрузки](#подготовка-балансировщика-нагрузки) - ---- - -## ⚙️ Перед началом - -> 💡 **Рекомендация:** -> Лучше всего выполнять миграцию на **чистой установке XC_VM**. - -Если вы решите использовать **существующую установку**, обратите внимание на следующее: -- XC_VM **удалит все таблицы** в вашей основной базе данных, которые соответствуют данным, найденным в вашей базе данных миграции. -- Всегда **создавайте резервные копии** перед выполнением миграции. - ---- - -## 🚀 Шаги миграции - -### 1. Загрузите резервную копию - -Загрузите существующую резервную копию базы данных на сервер XC_VM через **SFTP**. -В этом примере мы предположим, что она находится по адресу: - -``` -/tmp/backup.sql -``` - -### 2. Восстановите резервную копию в базе данных миграции - -Используйте скрипт инструментов, чтобы очистить существующую базу данных миграции и восстановить резервную копию: - -```bash -/home/xc_vm/tools migration "/tmp/backup.sql" -``` - -### 3. Запустите миграцию - -Если во время восстановления не произошло никаких ошибок, вы можете начать миграцию одним из двух способов: - -#### 🧩 Вариант 1 — командная строка (рекомендуется) - -Запустите миграцию вручную: - -```bash -/home/xc_vm/bin/php/bin/php /home/xc_vm/includes/cli/migrate.php -``` - -#### 🌐 Вариант 2 — Веб-установщик - -Если вы не хотите использовать инструменты командной строки, вы также можете вернуться к интерфейсу **веб-установщика** по ссылке, предоставленной скриптом при установке панели. -Там выберите опцию **«Миграция»** и следуйте инструкциям на экране, чтобы завершить процесс в интерактивном режиме. - -Вы будете видеть обновления прогресса в режиме реального времени, пока XC_VM мигрирует ваши данные. -По завершении вы сможете войти в свою систему. - ---- - -## 🔑 Восстановление доступа после миграции - -Если вы не можете войти в систему (например, из-за отсутствия имени пользователя/пароля или недействительного кода доступа), вы можете использовать **инструменты спасения**: - -### Создание кода доступа для спасения - -```bash -/home/xc_vm/tools access -``` - -### Создание администратора для восстановления доступа - -```bash -/home/xc_vm/tools user -``` - -> ⚠️ После входа в систему не забудьте немедленно **изменить код доступа и учетные данные администратора**. - ---- - -## 🧩 После миграции - -* Балансировщики нагрузки сначала будут отображаться как **отключенные**. -* Все потоки **автоматически остановятся** в целях безопасности. - -### Следующие шаги - -1. Переустановите балансировщики нагрузки и **вручную запустите потоки** после подтверждения миграции. -2. Просмотрите и обновите **настройки XC_VM по умолчанию**. -3. Проверьте данные **главного сервера** — доменные имена, конфигурацию SSL и т. д. -4. Убедитесь, что все соответствует вашей среде и настройкам. - ---- - -## 🖥️ Подготовка балансировщика нагрузки - -Вам необходимо будет переустановить ОС на балансировщиках нагрузки. - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/info/update.md b/docs/ru/info/update.md deleted file mode 100644 index fad2e3326..000000000 --- a/docs/ru/info/update.md +++ /dev/null @@ -1,90 +0,0 @@ -

🔄 Руководство по обновлению XC_VM

- -

- В этом документе описан процесс обновления XC_VM через веб-панель управления. Следуйте шагам, чтобы безопасно обновить систему и избежать ошибок. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [⚙️ Перед началом](#перед-началом) -- [🪜 Пошаговая инструкция](#пошаговая-инструкция) -- [🧠 Примечания и рекомендации](#примечания-и-рекомендации) - ---- - -## ⚙️ Перед началом - -Перед обновлением убедитесь, что готовы все необходимые ресурсы. Это поможет избежать проблем и потери данных. - -- 🔑 **Доступ администратора** к панели управления. -- 🌐 **Стабильное интернет-соединение**. -- 💾 **Резервная копия данных сервера** *(настоятельно рекомендуется создать перед началом)*. - -> ⚠️ **Важно:** Не прерывайте процесс обновления, чтобы избежать повреждения системы. - ---- - -## 🪜 Пошаговая инструкция - -Следуйте этим шагам для обновления через панель. Каждый этап иллюстрирован скриншотом для удобства. - -### 1️⃣ Перейдите в раздел **“Servers”** - -- Авторизуйтесь в панели управления. -- Выберите раздел **Servers** в главном меню. - - ![Servers](../img/update1.png) - -### 2️⃣ Выберите **“Manage Servers”** - -- В разделе **Servers** нажмите **Manage Servers**, чтобы открыть список доступных серверов. - - ![Manage Servers](../img/update2.png) - -### 3️⃣ Откройте меню **“Actions”** - -- Найдите сервер, который требуется обновить. -- Нажмите кнопку **Actions** — обычно это выпадающее меню или значок рядом с сервером. - - ![Actions Menu](../img/update3.png) - -### 4️⃣ Перейдите в раздел **“Server Tools”** - -- В меню **Actions** выберите пункт **Server Tools**, чтобы открыть инструменты управления сервером. - - ![Server Tools](../img/update4.png) - -### 5️⃣ Запустите **“Update Server”** - -- В разделе **Server Tools** нажмите **Update Server**. -- Подтвердите действие, если потребуется (возможно, будет запрошен пароль). -- Дождитесь завершения обновления — **не прерывайте процесс**, чтобы избежать ошибок. - - ![Update Server](../img/update5.png) - ---- - -## 🧠 Примечания и рекомендации - -> 🕒 **Время обновления** -> Зависит от размера сервера и скорости интернет-соединения. Обычно занимает от нескольких минут до часа. - -> ✅ **Проверка после обновления** -> После завершения проверьте состояние сервера, перезапустите сервисы и убедитесь, что все работает корректно. - -> ⚠️ **Ошибки при обновлении** -> В случае ошибок проверьте логи сервера (например, в `/home/xc_vm/logs/`). Если проблема persists, создайте issue в [репозитории](https://github.com/Vateron-Media/XC_VM/issues). - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file diff --git a/docs/ru/main-page.md b/docs/ru/main-page.md deleted file mode 100644 index e614d29c0..000000000 --- a/docs/ru/main-page.md +++ /dev/null @@ -1,62 +0,0 @@ -

📚 XC_VM Documentation

- -

- Добро пожаловать в официальную документацию проекта!
- Здесь собраны все материалы по работе с системой — от API до сборки и обновлений. -

- ---- - -## 🔌 API Reference - -| Раздел | Описание | -|:--------|:----------| -| [Системный API](api/system_api.md) | Основные системные эндпоинты. | -| [Получить плейлист](api/playlist.md) | Генерация и загрузка пользовательских плейлистов. | -| [XtreamCodes API](api/xtreamcodes_api.md) | Интеграция и взаимодействие с XtreamCodes совместимыми сервисами. | - ---- - -## 🛠 Сборка и Компиляция - -| Раздел | Описание | -|:--------|:----------| -| [Бинарники](builds/build_binaries.md) | Инструкции по сборке основных бинарных компонентов проекта. | -| [FFmpeg](builds/build_ffmpeg.md) | Руководство по сборке и настройке FFmpeg для работы с XC_VM. | - ---- - -## 🔄 Обновление и Релизы - -| Раздел | Описание | -|:--------|:----------| -| [Обновление панели](info/update.md) | Подробное руководство по обновлению XC_VM до последней версии. | -| [Чеклист перед публикацией релиза](updates_checklist.md) | Контрольный список задач для подготовки нового релиза. | - ---- - -## 🔐 Безопасность и SSL - -| Раздел | Описание | -|:--------|:----------| -| [Генерация SSL-сертификата](administration/ssl-generation.md) | Руководство по созданию самоподписанного SSL для Nginx в XC_VM. | - ---- - -## 📦 Дополнительно - -| Раздел | Описание | -|:--------|:----------| -| [Как работает обновление панели](administration/update-system.md) | Обьяснение принципа работы обновления. | -| [Миграция с других систем](info/migration_guide.md) | Пошаговое руководство по миграции с XUI, Xtream Codes и других панелей. | -| [FAQ](info/faq.md) | Часто задаваемые вопросы и решения распространённых проблем. | - ---- - -

- - 🔗 Перейти к репозиторию - -

- ---- diff --git a/docs/ru/updates_checklist.md b/docs/ru/updates_checklist.md deleted file mode 100644 index 9c6b5a0ad..000000000 --- a/docs/ru/updates_checklist.md +++ /dev/null @@ -1,142 +0,0 @@ -# ✅ Чеклист подготовки релиза XC_VM - -

- В этом документе описан процесс создания релиза XC_VM — пошаговое руководство для разработчиков по обновлению версии, сборке архивов и публикации на GitHub. -

- -

- ⬅️ Назад на главную -

- ---- - -## 📚 Навигация - -- [🔢 1. Обновить версию](#1-обновить-версию) -- [🧹 2. Удалённые файлы](#2-удалённые-файлы) -- [⚙️ 3. Сборка архивов](#3-сборка-архивов) -- [📝 4. Changelog](#4-changelog) -- [🚀 5. GitHub релиз](#5-github-релиз) - ---- - -## 🔢 1. Обновить версию - -* Установить **новое значение `XC_VM_VERSION`** в следующих файлах: - -**Файлы для редактирования:** - -``` -src/www/constants.php -src/www/stream/init.php -``` - -**Auto-update команда:** - -```bash -find -type f -name "*.php" -exec sed -i \ -"s/define('XC_VM_VERSION', '[0-9]\+\.[0-9]\+\.[0-9]\+');/define('XC_VM_VERSION', 'X.Y.Z');/g" {} \; -``` - -**Закоммитить изменения с сообщением:** - -```bash -git add . -git commit -m "Bump version to X.Y.Z" -git push -``` - -> 💡 **Совет:** Замените `X.Y.Z` на актуальную версию, например, `1.2.3`. - ---- - -## 🧹 2. Удалённые файлы - -* Выполнить команду для генерации списка удаленных файлов: - - ```bash - make delete_files_list - ``` - -* Открыть файл `dist/deleted_files.txt`. -* Скопировать содержимое в `src/includes/cli/update.php` **после комментария** `// Update checkpoint` - -> ⚠️ **Важно:** Убедитесь, что пути указаны корректно, чтобы избежать удаления важных файлов. - ---- - -## ⚙️ 3. Сборка архивов - -* Последовательно выполнить команды для сборки: - -```bash -make new -make lb -make main -make main_update -make lb_update -``` - -* Убедиться, что созданы следующие файлы в директории `dist/`: - - - `loadbalancer.tar.gz` — установочный архив LB - - `loadbalancer_update.tar.gz` — архив обновления LB - - `XC_VM.zip` — установочный архив MAIN - - `update.tar.gz` — архив обновления MAIN - - `hashes.md5` — файл с хеш-суммами - -> 🧰 **Проверка:** После сборки проверьте целостность архивов с помощью `md5sum -c hashes.md5`. - ---- - -## 📝 4. Changelog - -Сначала сгенерируйте файл с изменениями из git: - -```bash -git log --pretty=format:"- %s (%h)" X.Y.Z..main > dist/changes.md -``` - -* **Перейдите по ссылке и добавьте изменения текущего релиза:** - [https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json](https://github.com/Vateron-Media/XC_VM_Update/blob/main/changelog.json) - -* Добавить изменения текущего релиза в формате JSON: - - ```json - [ - { - "version": "X.Y.Z", - "changes": [ - "Описание изменения 1", - "Описание изменения 2" - ] - } - ] - ``` - -> 💬 **Рекомендация:** Держите описания изменений краткими и информативными, фокусируясь на ключевых улучшениях и фиксах. - ---- - -## 🚀 5. GitHub релиз - -* Создать новый релиз на [GitHub Releases](https://github.com/Vateron-Media/XC_VM/releases). -* Прикрепить следующие файлы к релизу: - - - `dist/loadbalancer.tar.gz` - - `dist/XC_VM.zip` - - `dist/update.tar.gz` - - `dist/loadbalancer_update.tar.gz` - - `dist/hashes.md5` - -* Указать changelog в описании релиза. - -> ✅ **Завершение:** После публикации проверьте, что все файлы доступны для скачивания и хеш-суммы совпадают. - ---- - -

- ⬅️ Назад на главную -

- ---- \ No newline at end of file