Современные микросервисы удобно разрабатывать и тестировать «на месте»: на ноутбуке, на серверной стойке — и даже на мобильном устройстве. В этом материале мы рассмотрим подход к мобильному хостингу микросервисов на базе Termux, контейнеризации Podman и управляемого автозапуска через systemd‑unit‑ы. Для маршрутизации и масштабирования используем Traefik и раздаём сервисы в рамках локальной сети.
Подход ориентирован на разработку, отладку и демонстрации в своей инфраструктуре. Всё описанное выполняется в соответствии с применимыми нормами законодательства РФ и локальными правилами использования сетей/устройств. Мы не рассматриваем обход блокировок и не используем VPN для подобных целей — VPN допустим только для создания локальной сети.
Что потребуется
- Android‑устройство с установленным Termux
- Поддержка systemd в Termux (в терминологии Termux: обычно это достигается запуском systemd через отдельные механизмы/пакеты в рамках Termux окружения)
- Podman (контейнерный движок, совместимый по идеям с Docker, но с особенностями rootless‑запуска)
- Traefik (образ контейнера) для маршрутизации по HTTP
- Локальная сеть: подключение телефона и клиента (ПК) к одной Wi‑Fi сети, либо VPN/туннель для создания локальной сети
Для продуктивных сценариев важно помнить о ресурсах: мобильные устройства чувствительны к CPU/IO и батарее. Для стабильности — контролируйте перезапуски сервисов и логирование.
Установка пакетов в Termux
Начнём с базового обновления пакетов и установки необходимых утилит. Конкретный набор пакетов может отличаться от версии Termux и текущих репозиториев, но логика процесса сохраняется.
pkg update && pkg upgrade -y
pkg install -y wget curl nano jq procps
Дальше — установка Podman. В зависимости от доступных репозиториев могут потребоваться дополнительные пакеты (например, для rootless режима). Ниже пример общего сценария.
pkg install -y podman
Если Podman поставился не полностью или требуется зависимость (например, slirp4netns, fuse, uidmap и т.п.), нужно будет установить дополнительные пакеты по сообщениям об ошибке. Наша цель — обеспечить возможность запуска контейнеров в пользовательском пространстве (rootless) и работу сетей.
Инициализация Podman для rootless
Podman обычно работает в rootless‑режиме по умолчанию. Перед запуском контейнеров убедимся, что движок и сети создаются корректно.
podman info
Если требуется инициализация окружения (например, создание конфигурационных директорий), сделайте это автоматически при первом запуске или вручную в зависимости от ошибок. Далее подготовим каталог для конфигураций Traefik и сервисов.
mkdir -p ~/hosting/traefik ~/hosting/services ~/hosting/traefik/dynamic
Создание сети для сервисов
Чтобы несколько контейнеров видели друг друга, логично создать отдельную bridge‑сеть. Важно: сеть будет работать внутри окружения Podman на устройстве. Доступ извне — через опубликованные порты или через прокси (Traefik).
podman network create --driver=bridge micro-net || true
podman network inspect micro-net
Деплой Traefik как точка входа
Traefik будет маршрутизировать входящие HTTP‑запросы на нужные контейнеры по правилам. Для этого удобно использовать dynamic configuration в виде YAML и монтировать в контейнер.
Создадим динамический конфиг для маршрутов. В примере ниже добавим два сервиса: whoami и условный app. (Можно заменить образы на ваши.)
cat > ~/hosting/traefik/dynamic/dynamic.yml <<'YML'
http:
routers:
whoami-router:
rule: "Host(whoami.local)"
entryPoints:
- web
service: whoami-svc
app-router:
rule: "Host(app.local)"
entryPoints:
- web
service: app-svc
services:
whoami-svc:
loadBalancer:
servers:
- url: "http://whoami:80"
app-svc:
loadBalancer:
servers:
- url: "http://app:8080"
YML
Параллельно подготовим базовый конфиг статический. Здесь укажем entryPoint, провайдер файлов и включим удобные лог‑параметры.
cat > ~/hosting/traefik/traefik.yml <<'YML'
entryPoints:
web:
address: ":80"
providers:
file:
filename: "/etc/traefik/dynamic/dynamic.yml"
api:
dashboard: true
insecure: false
log:
level: INFO
accessLog: {}
YML
Запускаем Traefik контейнером. Мы подключим его к сети micro-net и опубликуем порт 80 на устройство. Для теста обычно хватает этого: клиент в локальной сети откроет http://<IP_телефона>/ с нужным Host‑заголовком, но для удобства используем DNS/hosts на клиенте.
podman rm -f traefik || true
podman run -d \
--name traefik \
--network micro-net \
-p 80:80 \
-v ~/hosting/traefik/traefik.yml:/etc/traefik/traefik.yml:ro \
-v ~/hosting/traefik/dynamic:/etc/traefik/dynamic:ro \
docker.io/traefik:v3.0 \
--configFile=/etc/traefik/traefik.yml
Проверка статуса:
podman logs -f --tail=100 traefik
Запуск контейнеров микросервисов
Теперь поднимем сервисы, которые будут доступны через Traefik. Для примера используем traefik/whoami и простой HTTP сервис.
Сервис whoami
podman rm -f whoami || true
podman run -d \
--name whoami \
--network micro-net \
docker.io/traefik/whoami:latest
Сервис app
Вместо app можно подставить ваш контейнерный образ. Для демонстрации используем небольшой HTTP сервер.
podman rm -f app || true
podman run -d \
--name app \
--network micro-net \
-e PORT=8080 \
docker.io/hashicorp/http-echo:0.2.3 \
-text="Hello from mobile app" -listen=:8080
Тестирование из локальной сети
Чтобы обратиться к Traefik по правилам Host( и whoami.local)Host(, у клиента (ПК/ноутбука) добавьте записи в app.local)/etc/hosts или используйте локальный DNS.
На клиенте (пример для Linux/macOS — зависит от ОС):
echo "<IP_телефона> whoami.local app.local" | sudo tee -a /etc/hosts
Где взять IP телефона? В Termux можно посмотреть текущий адрес в сети (способ зависит от способа доступа). Обычно удобно проверить из Android системных настроек Wi‑Fi, либо сделать запрос.
ip addr | sed -n '1,120p'
Далее открываем в браузере:
http://whoami.localhttp://app.local
Если не заработало — проверьте:
- Логи Traefik
- Подключение контейнеров к сети
micro-net - Совпадение имён в правилах маршрутов и адресов в динамическом конфиге
Автозапуск через systemd‑unit‑ы в Termux
Для стабильности мобильного стенда важно, чтобы после перезапуска Termux/сессии сервисы поднимались автоматически. Ниже — типовая схема: создаём unit‑ы для Traefik и для ваших сервисов, привязываем их к порядку старта.
Действительные пути и параметры могут зависеть от того, как именно у вас устроен systemd в Termux. Общая идея: unit‑файлы располагаются в каталоге user units, а затем их включают и запускают.
systemd‑unit для Traefik
Создадим unit файл. Предположим, что systemd в Termux использует каталог ~/.config/systemd/user/. Если у вас другой путь — используйте тот, что подходит вашей настройке.
mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/traefik.service <<'UNIT'
[Unit]
Description=Traefik (mobile microservices ingress)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
WorkingDirectory=%h
ExecStart=/data/data/com.termux/files/usr/bin/podman start -a traefik
Restart=always
RestartSec=5
[Install]
WantedBy=default.target
UNIT
Ключевой момент: мы используем podman start -a, чтобы привязаться к уже созданному контейнеру. Если вы предпочитаете пересоздавать контейнер при каждом старте — можно сделать ExecStart сценарий, который делает podman rm -f и podman run. Но для надёжности часто проще “держать” контейнер заранее.
systemd‑unit для whoami и app
cat > ~/.config/systemd/user/whoami.service <<'UNIT'
[Unit]
Description=whoami (microservice)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/data/data/com.termux/files/usr/bin/podman start -a whoami
Restart=always
RestartSec=5
[Install]
WantedBy=default.target
UNIT
cat > ~/.config/systemd/user/app.service <<'UNIT'
[Unit]
Description=app (microservice)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
ExecStart=/data/data/com.termux/files/usr/bin/podman start -a app
Restart=always
RestartSec=5
[Install]
WantedBy=default.target
UNIT
Примечание: путь к podman в ExecStart может отличаться. Узнать точный путь можно командой:
command -v podman
Далее перезагружаем конфигурацию systemd и включаем unit‑ы.
systemctl --user daemon-reload
systemctl --user enable --now traefik.service
systemctl --user enable --now whoami.service
systemctl --user enable --now app.service
Проверка состояния:
systemctl --user status traefik.service --no-pager
systemctl --user status whoami.service --no-pager
Логи unit‑ов смотрим через journald systemd (если доступен):
journalctl --user -u traefik.service -f
Если journald не настроен, используйте логи Podman:
podman logs -f traefik
Масштабирование микросервисов под Traefik
В Traefik масштабирование обычно делается через несколько инстансов сервиса и балансировщик. На мобильном стенде можно масштабировать в рамках доступных ресурсов: 2–4 инстанса часто достаточно для демонстраций.
Вариант 1: несколько контейнеров и loadBalancer
Допустим, хотим 3 инстанса сервиса app, чтобы Traefik распределял запросы. Можно запускать контейнеры с разными именами и портами внутри сети (обычно порт в контейнере одинаковый, а “адрес” — разный).
# Остановим текущий app (одиночный)
podman rm -f app || true
# Запускаем 3 инстанса
for i in 1 2 3; do
podman run -d \
--name app-$i \
--network micro-net \
docker.io/hashicorp/http-echo:0.2.3 \
-text="Hello from app-$i" -listen=:8080
done
Теперь обновим динамический конфиг Traefik, чтобы он видел несколько серверов для app-svc.
cat > ~/hosting/traefik/dynamic/dynamic.yml <<'YML'
http:
routers:
whoami-router:
rule: "Host(whoami.local)"
entryPoints:
- web
service: whoami-svc
app-router:
rule: "Host(app.local)"
entryPoints:
- web
service: app-svc
services:
whoami-svc:
loadBalancer:
servers:
- url: "http://whoami:80"
app-svc:
loadBalancer:
servers:
- url: "http://app-1:8080"
- url: "http://app-2:8080"
- url: "http://app-3:8080"
YML
Traefik с провайдером file обычно может подхватывать изменения. Проверим логи Traefik:
podman logs --tail=200 -f traefik
Далее обновляем страницу http://app.local несколько раз и убеждаемся, что ответы чередуются.
Вариант 2: “scale” через дополнительные политики
Если вы хотите более “оркестрованный” подход, можно использовать генерацию конфигов и простые скрипты (вместо сложного Kubernetes). На мобильном окружении обычно выигрывает простота: контейнеры + Traefik + обновляемый dynamic YAML.
Рекомендации по надёжности
- Restart‑политики: в unit‑файлах задавайте
Restart=alwaysиRestartSec - Ограничения ресурсов: при необходимости задавайте лимиты CPU/RAM в Podman (в зависимости от доступности cgroups на Android)
- Логи: храните логи в контейнере или выводите наружу, но учитывайте ограничение по диску
- Сеть: используйте отдельную Podman‑сеть и проксируйте внешний трафик через Traefik
Безопасность и доступ в локальную сеть
Для тестового мобильного хостинга достаточно обеспечить ограничение доступа в пределах вашей локальной сети. Например, вы можете:
- Открывать Traefik только на
localhost(если архитектура позволяет) или ограничивать firewall - Использовать внутренние имена сервисов и не публиковать порты сервисов напрямую
- Держать dashboard Traefik не в
insecureрежиме (мы оставилиinsecure: false)
Если требуется доступ “изнутри” вне вашей Wi‑Fi сети, VPN допустим для создания локальной сети и организации безопасного туннеля между устройствами, но не для обхода блокировок.
Заключение
Мобильный хостинг микросервисов в Termux с Podman и Traefik — практичный способ быстро поднять инженерный стенд, проверить архитектуру и продемонстрировать маршрутизацию и масштабирование в локальной сети. Использование systemd‑unit‑ов помогает добиться автозапуска и устойчивости после перезапусков, а Traefik берёт на себя единый вход и балансировку между инстансами сервисов.
Если вы хотите собрать готовый стенд под ваши сервисы (образы, правила маршрутизации, схемы сети, шаблоны systemd и мониторинг) — команда РыбинскЛАБ поможет с проектированием и настройкой решения под ваш сценарий.