feat: direct subscription fetching, URI parser, FLClashX compatibility
- Fetch subscriptions directly via httpx (mihomo UA → YAML, xray-checker → base64 URI list) - Add uri_parser.py: vless/vmess/ss/trojan/hysteria2 URI → Mihomo proxy dicts - Fix YAML quoting for Go parser (strings starting with special chars) - Remove hidden:true and proxy-providers from delivered configs - Inject all service groups into GLOBAL proxies for FLClashX group discovery - Strip placeholder proxy-providers (e.g. "subscription") not in DB - Fix Mihomo healthcheck: add Bearer auth header - Add README Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
# Mihomo Subscription Expander
|
||||
|
||||
Сервис для раздачи готовых Clash/Mihomo конфигов клиентам. Берёт ваш базовый YAML, подтягивает серверы из подписок и отдаёт полностью развёрнутый конфиг по токен-ссылке — без `proxy-providers`, с реальными прокси внутри каждой группы.
|
||||
|
||||
## Как это работает
|
||||
|
||||
1. Вы создаёте конфиг с вашими группами (`proxy-groups`) и правилами (`rules`)
|
||||
2. Добавляете подписки (URL в формате YAML или base64 URI-список)
|
||||
3. Клиент (Clash Verge, FLClashX и др.) получает конфиг по ссылке `/config/<token>.yaml`
|
||||
4. При каждом запросе подписки фетчатся свежими, серверы вставляются напрямую в группы
|
||||
|
||||
```
|
||||
Клиент → GET /config/<token>.yaml
|
||||
│
|
||||
├─ Фетч подписок (User-Agent: mihomo → YAML, fallback xray-checker → base64 URI)
|
||||
├─ Раскрытие use: в proxy-groups
|
||||
├─ Удаление proxy-providers
|
||||
└─ Готовый YAML с серверами прямо в группах
|
||||
```
|
||||
|
||||
## Стек
|
||||
|
||||
- **FastAPI** + SQLAlchemy 2.0 async (aiosqlite) — веб-интерфейс и API
|
||||
- **Mihomo** (metacubex/mihomo) — прокси-ядро
|
||||
- **Caddy** — reverse proxy с Basic Auth и автоматическим TLS
|
||||
- **Docker Compose** — оркестрация всех трёх сервисов
|
||||
|
||||
## Быстрый старт
|
||||
|
||||
```bash
|
||||
git clone <repo>
|
||||
cd mihomo_injecter
|
||||
|
||||
cp .env.example .env
|
||||
# Отредактируйте .env: задайте MIHOMO_SECRET, ADMIN_USER, ADMIN_PASSWORD, HOST_DOMAIN
|
||||
```
|
||||
|
||||
Сгенерируйте хэш пароля для Caddy:
|
||||
|
||||
```bash
|
||||
docker run --rm caddy:2-alpine caddy hash-password --plaintext 'ваш_пароль'
|
||||
```
|
||||
|
||||
Вставьте полученный хэш в `.env` как `ADMIN_PASSWORD_HASH`.
|
||||
|
||||
Запустите:
|
||||
|
||||
```bash
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
Откройте `https://your-domain.com` — веб-интерфейс для управления конфигами.
|
||||
|
||||
## Переменные окружения (.env)
|
||||
|
||||
| Переменная | По умолчанию | Описание |
|
||||
|---|---|---|
|
||||
| `MIHOMO_SECRET` | `changeme` | Bearer-токен для Mihomo API |
|
||||
| `ADMIN_USER` | `admin` | Логин для веб-интерфейса |
|
||||
| `ADMIN_PASSWORD` | `changeme` | Пароль (plaintext, используется Caddy entrypoint) |
|
||||
| `ADMIN_PASSWORD_HASH` | — | Bcrypt-хэш пароля (генерируется автоматически если задан `ADMIN_PASSWORD`) |
|
||||
| `HOST_DOMAIN` | — | Домен для Caddy (например `sub.example.com`). Пусто = слушать на всех портах |
|
||||
| `DATABASE_URL` | sqlite | Путь к базе данных |
|
||||
| `MIHOMO_API` | `http://mihomo:9090` | URL Mihomo API |
|
||||
| `MIHOMO_CONFIG_DIR` | `/data/mihomo` | Путь к конфигу Mihomo |
|
||||
|
||||
## Базовый конфиг
|
||||
|
||||
Пишите обычный Clash/Mihomo YAML. В `proxy-groups` используйте `use: [subscription]` — имя провайдера не важно, оно автоматически заменится на реальные подписки из БД.
|
||||
|
||||
```yaml
|
||||
proxy-groups:
|
||||
- name: Telegram
|
||||
type: select
|
||||
use:
|
||||
- subscription # любое имя — заменится автоматически
|
||||
proxies:
|
||||
- DIRECT
|
||||
|
||||
- name: GLOBAL
|
||||
type: select
|
||||
use:
|
||||
- subscription
|
||||
```
|
||||
|
||||
Блок `proxy-providers` в базовом конфиге не нужен — если он есть, неизвестные провайдеры удаляются автоматически.
|
||||
|
||||
## Форматы подписок
|
||||
|
||||
- **YAML** (`User-Agent: mihomo`) — стандартный Clash/Mihomo формат с `proxies:`
|
||||
- **Base64 URI-список** (`User-Agent: xray-checker`) — строки `vless://`, `vmess://`, `ss://`, `trojan://`, `hysteria2://`
|
||||
|
||||
## Доступ к конфигу
|
||||
|
||||
Ссылка для клиента (без авторизации):
|
||||
```
|
||||
https://your-domain.com/config/<token>.yaml
|
||||
```
|
||||
|
||||
Токен генерируется автоматически при создании конфига и виден в веб-интерфейсе.
|
||||
|
||||
## Структура данных
|
||||
|
||||
```
|
||||
data/
|
||||
db/app.db # SQLite: конфиги, подписки, логи экспорта
|
||||
mihomo/ # config.yaml для Mihomo (генерируется автоматически)
|
||||
```
|
||||
|
||||
## Разработка
|
||||
|
||||
```bash
|
||||
cd app
|
||||
python -m venv .venv && source .venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
pytest
|
||||
```
|
||||
Reference in New Issue
Block a user