Refactor Docker setup to unify CLI and HTTP API under a single image. Update entrypoint to use a script for dynamic behavior based on arguments. Revise documentation to clarify usage and service distinctions.
Publish mtproxy_checker Docker image / test (push) Successful in 7s
Publish mtproxy_checker Docker image / build-and-push (push) Successful in 53s

This commit is contained in:
Denozordec
2026-04-11 01:08:10 +07:00
parent 5a66f0f2e8
commit 175136d82a
6 changed files with 31 additions and 18 deletions
+1 -1
View File
@@ -94,7 +94,7 @@ jobs:
tags: ${{ steps.prep.outputs.tags }}
labels: |
org.opencontainers.image.title=mtproxy_checker
org.opencontainers.image.description=CLI probe for MTProxy (ee Fake-TLS + dd), Telegram-style ClientHello
org.opencontainers.image.description=MTProxy checker: CLI one-shot (with args) or HTTP API daemon (no args); ee/dd, Telegram-style ClientHello
org.opencontainers.image.revision=${{ gitea.sha }}
org.opencontainers.image.source=${{ gitea.server_url }}/${{ gitea.repository }}
provenance: false
+3 -1
View File
@@ -13,5 +13,7 @@ FROM alpine:3.20
RUN apk add --no-cache ca-certificates
COPY --from=build /mtproxy_checker /usr/local/bin/mtproxy_checker
COPY --from=build /mtproxy_checkerd /usr/local/bin/mtproxy_checkerd
COPY docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
EXPOSE 8080
ENTRYPOINT ["/usr/local/bin/mtproxy_checker"]
ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
+1 -1
View File
@@ -24,7 +24,7 @@ go build -o mtproxy_checker.exe ./cmd/mtproxy_checker
Код выхода: `0` — OK, `1` — ошибка, `2` — неверные аргументы, `3` — прокси закрыл соединение после проверки, `4` — таймаут.
**Docker:** [docs/docker.ru.md](docs/docker.ru.md) — образ CLI, несколько прокси из файла, а также контейнер с **HTTP API** (`mtproxy_checkerd`, файл со списком `tg://`, интервал проверки, опциональный whitelist IP).
**Docker:** [docs/docker.ru.md](docs/docker.ru.md) — один образ: **с аргументами** после образа — CLI; **без аргументов** — HTTP API (файл со списком `tg://`, интервал, опциональный whitelist IP).
### Если в Telegram прокси «Available», а утилита падает на `read server hello`
+1 -2
View File
@@ -1,10 +1,9 @@
# HTTP API: список tg:// в файле, периодическая проверка, JSON по GET.
# HTTP API: тот же образ, что и CLI — без command запускается mtproxy_checkerd (см. docker-entrypoint.sh).
# Запуск: docker compose -f docker-compose.api.yaml up --build
services:
mtproxy-checkerd:
build: .
image: mtproxy_checker:local
entrypoint: ["/usr/local/bin/mtproxy_checkerd"]
ports:
- "8080:8080"
volumes:
+8
View File
@@ -0,0 +1,8 @@
#!/bin/sh
set -e
# Один образ: без аргументов — HTTP API (mtproxy_checkerd), иначе — разовая проверка CLI (mtproxy_checker).
if [ "$#" -eq 0 ]; then
exec /usr/local/bin/mtproxy_checkerd
else
exec /usr/local/bin/mtproxy_checker "$@"
fi
+17 -13
View File
@@ -7,36 +7,40 @@
| **База runtime** | Alpine Linux 3.20 |
| **Бинарники** | CLI: `/usr/local/bin/mtproxy_checker`. HTTP-сервис списка: `/usr/local/bin/mtproxy_checkerd` (см. ниже) |
| **Сертификаты** | Пакет `ca-certificates` (для TLS к реальным хостам при необходимости) |
| **ENTRYPOINT** | По умолчанию **CLI** — аргументы `docker run …` идут в `mtproxy_checker` |
| **Порты** | В режиме CLI ничего не слушает (только исходящий TCP). Образ объявляет **EXPOSE 8080** для режима API |
| **ENTRYPOINT** | Скрипт `docker-entrypoint.sh`: **есть аргументы** после имени образа → `mtproxy_checker` (разовая проверка); **нет аргументов** `mtproxy_checkerd` (HTTP API) |
| **Порты** | В режиме CLI ничего не слушает (только исходящий TCP). В режиме API слушает **8080** (или `MTPROXY_HTTP_ADDR`). Образ объявляет **EXPOSE 8080** |
Одна команда `docker run` с entrypoint по умолчанию = **одна** проверка одного прокси; процесс завершается с **кодом выхода** (`0``4`), что удобно в CI и скриптах.
`docker run … ИМЯ_ОБРАЗА tg://…` или с флагами — одна проверка, **код выхода** `0``4`. `docker run … ИМЯ_ОБРАЗА` **без** command — долгоживущий API (нужны volume/env к файлу со списком).
## HTTP API: `mtproxy_checkerd`
Лёгкий сервер на стандартной библиотеке Go: читает файл со списком `tg://` (как в разделе «файл — одна ссылка на строку»), **сразу после старта** выполняет первый цикл проверок, затем повторяет с интервалом. Результаты последнего цикла отдаются по HTTP в JSON.
### Запуск контейнера (смена entrypoint)
### Запуск контейнера в режиме API
**Без** `command` / аргументов после образа entrypoint сам запускает `mtproxy_checkerd`.
**Linux / macOS:**
```bash
docker run --rm -p 8080:8080 \
docker run -d --name mtproxy-api --restart unless-stopped -p 8080:8080 \
-v /path/to/proxies.txt:/data/proxies.txt:ro \
--entrypoint /usr/local/bin/mtproxy_checkerd \
-e MTPROXY_CHECK_INTERVAL=60m \
mtproxy_checker:local
```
**Windows (PowerShell):**
```powershell
docker run --rm -p 8080:8080 `
-v "${PWD}\proxies.txt:/data/proxies.txt:ro" `
--entrypoint /usr/local/bin/mtproxy_checkerd `
docker run -d --name mtproxy-api --restart unless-stopped -p 8080:8080 `
-v "${PWD}/proxies.txt:/data/proxies.txt:ro" `
-e MTPROXY_CHECK_INTERVAL=60m `
mtproxy_checker:local
```
Готовый пример с переменными окружения: репозиторий **`docker-compose.api.yaml`** — `docker compose -f docker-compose.api.yaml up --build`.
Явно указать демон (редко нужно): `--entrypoint /usr/local/bin/mtproxy_checkerd`.
Готовый пример: **`docker-compose.api.yaml`** — `docker compose -f docker-compose.api.yaml up --build`.
### Переменные окружения
@@ -83,11 +87,11 @@ cd C:\path\to\mtproxy_checker
docker build -t mtproxy_checker:local .
```
Проверка, что образ собран:
Проверка, что образ собран (нужен хотя бы один аргумент, иначе стартует API):
```bash
docker run --rm mtproxy_checker:local -timeout 5s 2>&1 | head -1
# ожидается сообщение usage (код выхода 2 — нормально без URL)
# ожидается сообщение usage CLI (код выхода 2 — нормально без URL)
```
## Запуск под Linux
@@ -107,7 +111,7 @@ docker run --rm mtproxy_checker:local \
'tg://proxy?server=example.com&port=443&secret=eeYOURHEX...'
```
Чтобы не светить секрет в истории shell, прочитайте его из файла и передайте флагами (образ запускает бинарник как `ENTRYPOINT`, отдельный `sh` без смены entrypoint использовать нельзя):
Чтобы не светить секрет в истории shell, прочитайте его из файла и передайте флагами (аргументы уходят в CLI через `docker-entrypoint.sh`):
```bash
SECRET=$(tr -d ' \n' < secret.hex)