From 175136d82a8d511c624afac4a2a001e2920308a2 Mon Sep 17 00:00:00 2001 From: Denozordec Date: Sat, 11 Apr 2026 01:08:10 +0700 Subject: [PATCH] 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. --- .gitea/workflows/docker.yaml | 2 +- Dockerfile | 4 +++- README.md | 2 +- docker-compose.api.yaml | 3 +-- docker-entrypoint.sh | 8 ++++++++ docs/docker.ru.md | 30 +++++++++++++++++------------- 6 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 docker-entrypoint.sh diff --git a/.gitea/workflows/docker.yaml b/.gitea/workflows/docker.yaml index f6edc0b..392410f 100644 --- a/.gitea/workflows/docker.yaml +++ b/.gitea/workflows/docker.yaml @@ -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 diff --git a/Dockerfile b/Dockerfile index c79f09c..c02c889 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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"] diff --git a/README.md b/README.md index a8b26d4..1de8494 100644 --- a/README.md +++ b/README.md @@ -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` diff --git a/docker-compose.api.yaml b/docker-compose.api.yaml index 5e170a0..c3cefac 100644 --- a/docker-compose.api.yaml +++ b/docker-compose.api.yaml @@ -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: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000..d4599f6 --- /dev/null +++ b/docker-entrypoint.sh @@ -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 diff --git a/docs/docker.ru.md b/docs/docker.ru.md index ed5b863..ae293dd 100644 --- a/docs/docker.ru.md +++ b/docs/docker.ru.md @@ -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)