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:
2026-05-15 06:04:03 +03:00
parent 5fb1782fa5
commit 2e1c488bb9
7 changed files with 604 additions and 24 deletions
+117
View File
@@ -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
```