chore: сделал

This commit is contained in:
protokey committed 2026-09-26 17:40:47 +04:00
1 parent 602199d510
commit 45e7a1d22f
25 files changed
+1164 -113

No files matched your search

+86 -72
View File
@@ -20,7 +20,9 @@
Серверу можно настроить:
- прокси на выходе (cf или свои)
- домен (можно спрятать за cf, сертификат получим у certbot)
- домен (сертификат Let's Encrypt; без домена сертификат выпускается на ip)
За Cloudflare точки не работают: reality через проксирование Cloudflare невозможен, Cloudflare сам завершает TLS. Скрыть адрес панели от клиентов можно сервером маскировки.
### Окружение
@@ -53,9 +55,8 @@
Сервер: -
Сервер маскировки: -
Домен: -
Cloudflare: -
Прокси: -
[домен][cloudflare][прокси][маскировка]
[домен][прокси][маскировка]
[отмена][установить][сервер][помощь]
```
@@ -74,32 +75,11 @@ Cloudflare: -
--->
127.0.0.1:toor
<---
Сервер: 127.0.0.1 - $(uname -a)
Сервер: 127.0.0.1
Домен: -
Cloudflare: -
Прокси: -
[домен][cloudflare][прокси]
[отмена][установить][сервер]
```
```
--->
cloudflare
<---
Если вы спрятали домен за клаудом, то нужно включить опцию тут.
[включить][отмена]
```
```
--->
включить
<---
Сервер: 127.0.0.1 - $(uname -a)
Домен: -
Cloudflare: Да
Прокси: -
[домен][cloudflare][прокси]
[отмена][установить][сервер]
[домен][прокси][маскировка]
[отмена][установить][сервер][помощь]
```
```
@@ -114,12 +94,11 @@ Cloudflare: Да
--->
http://127.0.0.1:9050
<---
Сервер: 127.0.0.1 - $(uname -a)
Сервер: 127.0.0.1
Домен: -
Cloudflare: Да
Прокси: 127.0.0.1:9050
[домен][cloudflare][прокси]
[отмена][установить][сервер]
Прокси: http://127.0.0.1:9050
[домен][прокси][маскировка]
[отмена][установить][сервер][помощь]
```
```
@@ -146,8 +125,9 @@ Cloudflare: Да
--->
/start
<---
server_name 0Mb/0Mb 0/0
[ФАК][добавить сервер][помощь][управление сервером]
point-1a2b3c активен
[ФАК][добавить сервер][помощь]
[управление сервером]
```
Чтобы перейти к управлению сервером нужно вот такой квест пройти, надо все эти id в копируемый pre сунуть.
@@ -168,16 +148,17 @@ server_name 0Mb/0Mb 0/0
<---
Сервер: NAME
Состояние: активен
Ключи: 0/0
Панель: 1.2.3.4
Маскировка: -
Ключи: 2
Домен: -
Прокси: -
[Вернуть][Переустановить]
[Домен][Прокси][Cloudflare]
[Домен][Прокси]
[Клиенты]
[главное меню]
```
Ключи отображаются онлайн/оффлайн.
Возврат сервера связан с отключением его от платформы. Доступы к серверу изымаются, ставится новый пароль рута, а данные остаются как есть. Просто отдаем сервер назад.
```
@@ -225,10 +206,9 @@ server_name 0Mb/0Mb 0/0
Позволяют маскировать ip адрес вашей точки доступа от сайтов,
которые посещаются.
X -> Cloudflare <> MyPoint <> PROXY <- Web
X <> MyPoint <> PROXY <- Web
X через домен видит ip от cloudflare, а web сайты видят ip прокси,
это позволяет вашей точке доступа оставаться инкогнито.
Сайты видят ip прокси, а не ip вашей точки доступа.
[установить][отключить]
```
@@ -241,48 +221,34 @@ X через домен видит ip от cloudflare, а web сайты вид
[cloudflare warp][отмена]
```
Еще одна полезная возможность это скрытие ip за cloudflare. И для этого тоже будет меню.
```
--->
Cloudflare
<---
Сейчас активировано: Нет
Позволяет защитить ip адрес вашей точки доступа от клиентов,
которые к ней подключаются.
X -> Cloudflare <> MyPoint <> PROXY <- Web
[установить][отключить]
```
##### Меню управления клиентами
Домен и прокси меняются на горячую, в фоне: точка на это время "настраивается", по окончании приходит уведомление. Новый прокси сначала проверяется, а сертификат на новый домен сначала выпускается. Если не вышло, точка остается активной с прежними настройками, а ошибка видна в карточке. У точки с маскировкой домен можно сменить, но не убрать. Смена домена меняет ссылки подписок: ключи нужно раздать заново. Сообщение с прокси бот удаляет из чата, пароль прокси в карточке скрыт.
```
--->
Клиенты
<---
id 0/0Mb On
[добавить][удалить][получить ключ]
Ключи point-1a2b3c
mom-phone ↓ 1.2 ГБ ↑ 80.0 МБ, в сети 26.09 14:05
laptop ↓ 0 Б ↑ 0 Б, не подключался
Пришли имя ключа, чтобы получить ссылку подписки.
[выпустить ключ][отозвать ключ]
[меню сервера]
```
```
--->
удалить
mom-phone
<---
Чтобы удалить клиента пришлите его id
[отмена]
Ключ mom-phone: ↓ 1.2 ГБ ↑ 80.0 МБ, в сети 26.09 14:05
Подписка:
https://1.2.3.4:12839/9g72PmSGAQ3V/<subId>
```
```
--->
добавить
<---
если хотите, можете сами установить id
[сгенерируй]
```
Далее пользователь либо отправляет текст, который будет использован как id для нового клиента, либо сгенерирует новый уникальный id и вернет ключ.
"выпустить ключ" просит имя (латиница, цифры, `-` и `_`), "отозвать ключ" - имя существующего. Клиенту выдается URL подписки, а не vless-ссылка: он переживает переустановку точки, ключи восстанавливаются с прежними uuid и subId. Ограничений на число ключей нет, выпускает их владелец точки.
### Настройка сервера
@@ -331,7 +297,17 @@ id 0/0Mb On
Пакет также занимается и настройкой серверов базово. И позволяет сделать из сервера прокси или панель 3x-ui. Для наших целей требуется оба и в интерфейсе добавления сервера есть пункт "Сервер маскировки" - это сервер из которого нужно сделать прозрачный прокси. В App заводим модель в которой объединяем эти 2 сервера в единую систему. Так как кнопка "Вернуть" вернет оба сервера и они связаны настройками маршрутизации.
\# TODO: дописать документацию
### Запуск
1. `cp env_example .env` и заполнить: база, RabbitMQ, `FIELD_ENCRYPTION_KEYS`, `SERVERUS_CERTIFICATES`.
2. `docker compose up -d` - Postgres, RabbitMQ, свой Bot API сервер.
3. `make sync`, `make dj_migrate`, `make dj_superuser`.
4. Три процесса: `make dj_run` (сайт и админка), `make dj_worker` (установка и возврат серверов), `make tg_run` (бот, запускать строго один экземпляр).
5. В админке добавить бота с токеном, выбрать интерфейс MyPoint и опубликовать.
Подробности: `src/App/README.md` (сценарии, секреты, ручной вход `make serve_ssh`), `src/serverus/README.md` (плейбуки, ручная проверка на сервере), `src/Telegram/README.md` (боты).
Локальный стенд: `SERVERUS_CERTIFICATES=local`, сертификаты выпускает свой CA из `extra/serverus/ca`, `ca.pem` нужно добавить в доверенные на машине с клиентом. Let's Encrypt на серых адресах не работает.
### Модель данных
@@ -344,10 +320,48 @@ id 0/0Mb On
- сервер 3x-ui - обязательно должен быть, ради него все и затевается
- сервер маскировки - если пользователь хочет особый режим, то он может добавить еще один сервер купленный в своей стране
- домен - если сервер маскировки указан, то домен обязательно нужно указать
- ssl сертификаты - если домен не указан, то сертификаты выпускаются на IP сервера 3x-ui, а сервера маскировки нет; а если домен есть то он привязывается к серверу маскировки и на него выпускаются ssl ключи, который хранятся на сервере 3x-ui, потому что сервер маскировки лишь прозрачно проксирует
- ssl сертификаты - если домен не указан, то сертификаты выпускаются на IP сервера 3x-ui, а сервера маскировки нет; а если домен есть то он привязывается к серверу маскировки и на него выпускаются ssl ключи, который хранятся на сервере 3x-ui, потому что сервер маскировки лишь прозрачно проксирует. Храним и домен, и ip, по ssh ходим только по ip
- ssh ключи - доступ к серверам, находящимся под нашей ведомостью, всегда осуществляется асимметричным способом (ключ-файл)
- прокси - можно задать свои и с авторизацией, а можно воспользоваться cf_warp прокси, которые можно регистрировать автоматически через x-ui
- ключи - клиенты панели: имя, uuid и subId, чтобы восстановить их после переустановки
Сервер - реальные сервера с ip и доступом к root. Настраиваем безопасное окружение по всем канонам.
Сервис - На серверах у нас живут сервисы. Поднимается или настраивается какой-то сервис, чтобы решить какую-то полезную задачу. И реализуют api для управления сервисом на сервере. Сейчас эту функцию выполняет Роль сервера, потому что подразумевается что сервис может быть 1.
### Что осталось
Проверено на локальном стенде (Debian 13, свой CA): установка точки из бота с маскировкой, DoT и запасной DoH, ключи и подписка, socks5 и WARP на выходе, отказ нерабочего прокси, переустановка с восстановлением ключей, возврат серверов, `serve_ssh`, шифрование секретов в Postgres.
**Функции**
- [x] Кнопки "Домен" и "Прокси" у готовой точки, смена на горячую.
- [ ] Скрипт маскировки (сейчас маскировка - перенаправление портов nftables).
- [ ] Статистика точки в главном меню и карточке: трафик и число ключей онлайн (сейчас статистика только у ключей).
- [ ] Кто может пользоваться ботом: сейчас любой, кто написал боту, может добавить сервер. Решить: белый список, инвайты или открыто.
**Надежность**
- [ ] Точка, зависшая в "устанавливается" или "возвращается", если воркер упал посреди задачи: в боте с ней ничего не сделать, а в админке статус только для чтения. Нужно действие в админке (сбросить в "ошибка") или проверка по времени.
- [ ] Периодическая проверка точек: панель отвечает, сертификат не истекает (короткий сертификат на ip продлевается каждые несколько дней).
**Проверка на настоящих серверах**
- [ ] Let's Encrypt на домен и на ip, продление по cron.
- [ ] Возврат серверов и Debian 12.
- [ ] Точка с маскировкой и настоящим доменом.
**Продакшен**
- [ ] Настройки: `SECRET_KEY`, `DEBUG`, `ALLOWED_HOSTS` из `.env` (сейчас в `base.py` небезопасные значения для разработки).
- [ ] Запуск на сервере: systemd юниты или контейнеры для сайта (gunicorn за nginx), воркера и `telegram_run` (строго один экземпляр), логи.
- [ ] Бэкапы Postgres. `FIELD_ENCRYPTION_KEYS` хранить отдельно от бэкапов: без него база бесполезна.
**Уборка**
- [ ] Удалить `django-fernet-fields` (не работает на Django 6.1, заменен своим полем) и обновить `requirements.txt`.
- [ ] Удалить `src/db.sqlite3` и `extra/db-before-encryption-*.sqlite3`: в бэкапе секреты открытым текстом.
- [ ] Контейнер Postgres называется `shop-postgres`: переименовать.
- [ ] `Key` в админке (только для чтения).
- [x] Карточка точки показывает прокси вместе с логином и паролем: маскировать пароль.
- [ ] Пароль root при переустановке уходит в задачу dramatiq открытым текстом (сообщения RabbitMQ лежат на диске): шифровать, как прокси.