diff --git a/README.md b/README.md index 0df515a..efbb86d 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ ## Kubernetes (k3s/k8s) * [Установка k3s на Orange Pi 5 Plus](raspberry-and-orange-pi/k3s.md) * [Под с Shadowsocks-клиент](kubernetes/k3s-shadowsocks-client.md) (k3s) +* [Под с 3X-UI](kubernetes/k3s-3xui-pod.md) (k3s) ## Python * [Устранение проблем при установке Python-коннектора mysqlclient (MySQL/MariaDB)](python/python-mysql.md) diff --git a/kubernetes/k3s-3xui-pod.md b/kubernetes/k3s-3xui-pod.md index 4812ae5..a64920c 100644 --- a/kubernetes/k3s-3xui-pod.md +++ b/kubernetes/k3s-3xui-pod.md @@ -1,13 +1,20 @@ # Установка 3X-UI как под в K3s (Kubernetes) -3X-UI — это симпатичный веб-интерфейс для управления VPN-серверами, такими как WireGuard, Shadowsocks, Xray, V2Ray -и тому подобное. Он позволяет настраивать и мониторить VPN-соединения и клиентов через браузер. Мы будем запускать +3x-ui — это симпатичный веб-интерфейс для управления VPN-серверами, такими как WireGuard, Shadowsocks, Xray, V2Ray +и тому подобное. Он позволяет настраивать и мониторить VPN-соединения и клиентов через браузер. Мы будем запускать его как контейнер (под) внутри K3s кластера на Orange Pi 5. +Мне нужен 3x-ui, для безопасного доступа к домашней сети из любой точки мира, а также для безопасного доступа +к интернету через домашний сервер. + ### Создание namespace (не обязательно) -Для удобства организации рекомендую создать отдельное пространство имён (`namespace`) для 3X-UI. Это как папка для -ресурсов, чтобы они не смешивались с другими приложениями. +Для удобства организации рекомендую создать отдельное пространство имён (`namespace`) для 3x-ui. Пространство имен -- +это способ организовать ресурсы в кластере. Оно работает как виртуальная "папка", которая помогает разделять +(изолировать) и управлять объектами, такими как поды, сервисы, конфигурации и т.д. Объекты в одном _namespace_ не видят +объекты из другого namespace (если не настроено обратное), что помогает избежать путаницы. Несколько приложений +с одинаковыми именами могут без проблем существовать в разных пространствах имен. Кроме того, можно настроить +права доступа (RBAC) отдельно для каждого namespace. Выполним в терминале: ```bash @@ -25,4 +32,145 @@ NAME STATUS AGE ... ... ... ... ... ... x-ui Active 6s -``` \ No newline at end of file +``` + +## Развёртывание 3X-UI + +Cоздадим манифест развертывания пода (этого YAML-файл с инструкциями для K3s, что и как запустить). Мы будем +использовать SQLite как внутреннюю базу данных 3x-ui, и пока эта бызы будет храниться внутри пода. Позже сможем +переключиться на `Longhorn` (опционально). + +Создадим `deployment.yaml` в каталоге `~/k3s/vpn/x-ui/` (см. [структуру каталогов для хранения конфигураций и манифестов](k3s-shadowsocks-client.md) +принятую в моем проекте): +```bash +mkdir -p ~/k3s/vpn/x-ui +nano ~/k3s/vpn/x-ui/deployment.yaml +``` + +Вставим в него следующий код: +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: x-ui + namespace: x-ui +spec: + replicas: 1 + selector: + matchLabels: + app: x-ui + template: + metadata: + labels: + app: x-ui + spec: + hostNetwork: true + containers: + - name: x-ui + image: ghcr.io/mhsanaei/3x-ui:latest + # image: enwaiax/x-ui:latest # альтернативный облеченный: меньше способов шифрования и интерфейс на китайском + volumeMounts: + - name: db + mountPath: /etc/x-ui/db + volumes: + - name: db + emptyDir: {} +``` +В этом манифесте примечательно следующее: +- `hostNetwork: true` — позволяет контейнеру использовать сетевой стек хоста и значит работать + с сетевыми интерфейсами и портами хоста напрямую. Это полезно для приложений, которые требуют прямого доступа + к сети, например, VPN-серверы. +- `replicas: 1` — это количество реплик (экземпляров) пода, которые будут запущены. В данном случае мы запускаем + только одну реплику, но при необходимости можно увеличить это число для обеспечения отказоустойчивости и + масштабируемости. +- `selector` — это селектор, который используется для выбора подов, которые будут управляться этим + развертыванием. Он определяет, какие поды будут обновлены или удалены при изменении конфигурации развертывания. +- `matchLabels` — это метки, которые должны совпадать с метками подов, чтобы они были выбраны селектором. + В данном случае мы используем метку `app: x-ui`, чтобы выбрать поды, которые относятся к приложению x-ui. +- `emptyDir: {}` — это временное хранилище SQLite, которое создаётся при запуске пода и удаляется при его завершении. + Оно используется для хранения настроек, включая настройки VPN-серверов и клиентских соединений ( 3x-ui. Это удобно для тестирования и разработки, но не рекомендуется + для продакшн-среды, так как данные будут потеряны при перезапуске пода. + + +Применим манифест: +```bash +sudo kubectl apply -f ~/k3s/vpn/x-ui/deployment.yaml +``` + +Проверим, что под запустился: +```bash +sudo k3s kubectl get pods -n x-ui -o wide +``` + +Увидим что-то вроде: +```text +NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES +x-ui-bb97f6894-h7zj8 1/1 Running 0 11s 10.42.1.50 opi5plus-3 + +Видим, что нода на которой запустился 3x-ui это `opi5plus-3`, а имя пода `x-ui-bb97f6894-h7zj8`. Проверим логи пода, +используя его имя: +```bash +sudo kubectl logs -n x-ui x-ui-886dbc87-hdw4h +``` + +Увидим что-то вроде: +```text +Server ready +(0x291e4e8,0x40001657b0) +2025/03/28 13:28:34 Starting x-ui 2.5.6 +(0x291e4e8,0x40001658e0) +INFO - Web server running HTTP on [::]:2053 +INFO - XRAY: infra/conf/serial: Reading config: &{Name:bin/config.json Format:json} +WARNING - XRAY: core: Xray 25.3.6 started +``` + +Теперь мы знаем порт, на котором работает 3x-ui (`2053`), и значит можем получить доступ к веб-интерфейсу через браузер +по адресу `http://opi5plus-3:2053` или `http://:2053`. Можно настаивать VPN-подключения, создавать +пользователей , менять логин и пароль на вход и т.д. Веб-интерфейс 3x-ui интуитивно понятен, так что разбираться +не составит труда. + +Но есть один минус. При рестарте пода, все настройки будут сброшены, т.к. они храняться во внутреннем хранилище пода. + +Чтобы этого избежать, нужно использовать постоянное хранилище (Persistent Volume). Для его работы нужно установить +`Longhorn` (или другой менеджер хранилищ). K3s на Orange Pi 5 поддерживает `Longhorn` из коробки, так как в операционной +системе нет поддержки `iSCSI`, и включение его потребует перекомпиляции ядра (если вы этого еще не сделали, [смотрите +инструкцию](../raspberry-and-orange-pi/opi5plus-rebuilding-linux-kernel-for-iscsi.md). + + + +-------- + +Понял. Спасибо. Теперь у меня вот такой манифест ` ~/k3s/vpn/x-ui/deployment.yaml`: +``` +apiVersion: apps/v1 +kind: Deployment +metadata: + name: x-ui + namespace: x-ui +spec: + replicas: 1 + selector: + matchLabels: + app: x-ui + template: + metadata: + labels: + app: x-ui + spec: + hostNetwork: true + containers: + - name: x-ui + image: ghcr.io/mhsanaei/3x-ui:latest +``` +В документации к 3x-ui я вижу, что для докера его надо запускать так: +``` +docker run -itd --network=host \ + -v $PWD/db/:/etc/x-ui/ \ + -v $PWD/cert/:/root/cert/ \ + --name x-ui --restart=unless-stopped \ + enwaiax/x-ui +``` +Каталог $PWD/cert/ нужен для SSL-сертификатов. С этим мы разберемся позже. А сейчас расскажи как сделать хранилище db внутри longhorn. + +----- +Привет. Можешь из этой картинки с графиком сделать другую, в которой все русские слова будут переведены на английский? \ No newline at end of file