*.vpn.4gain.pro через DNS-01 LE).i2p eepsites): HTTP firefly.vpn.4gain.pro:4444, HTTPS firefly.vpn.4gain.pro:4445sm2c-cloud-i2pservice-i2p-bootstrap.yml/mnt/swarm/i2p_data — config/, eepsite/net_forgaingeti2p/i2p:latestОдин сервис в стеке — роутер I2P. Web-консоль (порт 7657) проксируется через общий traefik (file-provider, без LE — *.vpn.4gain.pro пока не покрыт DNS-01 challenge).
| Порт | Протокол | Назначение | Bind |
|---|---|---|---|
| 7657 | TCP | Web-консоль | через traefik, host i2p.vpn.4gain.pro, TLS wildcard |
| 4444 | TCP | I2P HTTP browser-proxy | host:4444 (mode host), доступ ограничивать firewalld |
| 4445 | TCP | I2P HTTPS browser-proxy | host:4445 (mode host), доступ ограничивать firewalld |
| 12345 | TCP | I2NP NTCP (peer in/out) | публичный, host:12345 → container:12345 |
| 12345 | UDP | I2NP SSU (peer in/out) | публичный, host:12345 → container:12345 |
Обязательно на маршрутизаторе: проброс tcp 12345 и udp 12345 на public IP firefly (5.101.14.132). Без этого роутер уйдёт в "Firewalled" и peer-to-peer работать не будет.
В compose-template:
EXT_IP=5.101.14.132 — public IP firefly. Без этого роутер advertise'ит docker-internal IP (10.0.x.x) и пиры не достучатся.EXT_PORT=12345 — фиксирует порт.JVM_XMX=512m — heap.Образ geti2p/i2p не копирует автоматически clients.config и i2ptunnel.config в volume. Без них:
clients.config отсутствует → web-консоль не запустится (WARN: No client apps or router console configured - we are just a router в логах);i2ptunnel.config отсутствует → нет ни одного tunnel'а: HTTP-proxy 4444, HTTPS-proxy 4445, IRC, eepsite — все молча НЕ слушают.Лечение (один раз при fresh deploy):
CID=$(docker ps --filter name=i2p_i2p -q | head -1)
docker cp $CID:/i2p/clients.config /mnt/swarm/i2p_data/config/
docker cp $CID:/i2p/i2ptunnel.config /mnt/swarm/i2p_data/config/
cd /mnt/swarm/i2p_data/config/
# web-консоль на 0.0.0.0
sed -i 's|^clientApp\.0\.args=.*|clientApp.0.args=7657 0.0.0.0 ./webapps/|' clients.config
# все tunnel'ы (HTTP/HTTPS proxy и т.д.) на 0.0.0.0
sed -i 's|^tunnel\.\([0-9]*\)\.interface=.*|tunnel.\1.interface=0.0.0.0|' i2ptunnel.config
docker service update --force i2p_i2p
Default-bind на конкретный docker-IP (10.0.x.x) — этот IP меняется между перезапусками, поэтому нужен 0.0.0.0.
Дополнительно: в i2ptunnel.config.d/03-I2P webserver-i2ptunnel.config поле targetHost=10.0.x.x указывает на eepsite jetty внутри контейнера. Заменить на 127.0.0.1 — на админ-странице /i2ptunnel/ ссылка перестанет показывать docker-IP. Реальный доступ к eepsite — только через i2p-сеть (по .i2p-имени), эта ссылка чисто информационная.
В I2P нет опции «routerconsole.externalURL» или аналогичной — все cross-страницы консоли используют HTTP-заголовок Host: для построения собственных ссылок. При обращении через https://i2p.vpn.4gain.pro/ (Host корректный, traefik не подменяет) — большинство ссылок генерится правильно. Только страницы конфигурации tunnel'ов (/i2ptunnel/) показывают interface / targetHost поля как они записаны в i2ptunnel.config.d/*.config.
router.config могут разъехаться при первом запуске (i2p выбирает random для UDP). Привести к одному значению:i2np.ntcp.port=12345
i2np.udp.port=12345
i2np.udp.internalPort=12345
i2np.upnp.enable=false
i2p.vpn.4gain.pro — CNAME → firefly.vpn.4gain.pro (или A → 10.9.0.191) в DigitalOcean DNS. Завести вручную либо через service-dns-sync.yml.
Порядок (чтобы не убить файлы под live-роутером):
ssh firefly 'docker service scale i2p_i2p=0'
scp -r ~/old-i2p-keys/router.keys.dat ~/old-i2p-keys/hosts.txt firefly:/mnt/swarm/i2p_data/config/
scp -r ~/old-eepsite/* firefly:/mnt/swarm/i2p_data/eepsite/
ssh firefly 'docker service scale i2p_i2p=1'
Файлы для переноса (если есть со старого хоста):
router.keys.dat — приватный ключ роутера (identity)keyBackup/ — резервы ключейhosts.txt, userhosts.txt — адресная книгаi2ptunnel.config — туннелиeepsite/ — контент собственного eepsitepeerProfiles/, netDb/ — кэш сетевой базы (можно НЕ переносить, восстановится сам за ~30 мин)# Деплой / обновление
cd ansible/playbooks
ansible-playbook -c ssh service-i2p-bootstrap.yml
# Полный снос (включая данные — НЕ рекомендуется на живом роутере)
ansible-playbook -c ssh service-i2p-bootstrap.yml -e sm2c_cloud_i2p_remove_stack=true
# Принудительный перезапуск
ssh -p 21150 root@firefly.e1.4gain.pro 'docker service update --force i2p_i2p'
В web-консоли (/) → раздел Network → "OK" / "Testing..." / "Firewalled".
tcp 12345 и udp 12345 на роутере.Changelog
*.vpn.4gain.pro (DNS-01 LE), документирована необходимость копировать i2ptunnel.config (claude/forGain)