Перейти к основному содержимому

Как открыть сервер в Docker через proximamp

Добавьте в compose.yml контейнер из образа proximamp/proximamp: он держит туннели к соседним контейнерам, а порт сервера наружу открывать не нужно. Образ есть для Linux x86_64 и arm64: сервер, Raspberry Pi, NAS Synology, QNAP, Unraid.

Запустите​

Пример: сервер Minecraft (образ itzg/minecraft-server) и туннель к нему. compose.yml:

services:
minecraft:
image: itzg/minecraft-server
environment:
EULA: "TRUE"
volumes:
- minecraft:/data
restart: unless-stopped
proximamp:
image: proximamp/proximamp
hostname: minecraft-tunnel # имя устройства в списке устройств аккаунта
volumes:
- ./proximamp.yml:/etc/proximamp/proximamp.yml:ro
- proximamp:/var/lib/proximamp # вход и адреса туннелей
restart: unless-stopped
volumes:
minecraft:
proximamp:

Рядом proximamp.yml (как устроен этот файл):

tunnels:
minecraft:
type: tcp
port: 25565
host: minecraft # имя сервиса из compose.yml
docker compose up -d
docker compose exec proximamp proximamp login --remote
docker compose logs -f proximamp

Вторая команда входит в аккаунт кодом с телефона. Пока входа нет, контейнер ждёт его и не завершается. Адрес туннеля появится в журнале, который показывает третья команда; Ctrl+C закрывает только журнал, контейнер работает дальше.

Команды proximamp с других страниц в контейнере набирайте после docker compose exec proximamp, например:

docker compose exec proximamp proximamp whoami

Вход без человека​

Войдите ключом устройства один раз; как создать ключ, написано там же. Если других устройств со входом нет, ключ создаст и контейнер, вошедший кодом с телефона, когда у аккаунта есть пароль: команда спросит его.

docker compose exec proximamp proximamp keys create --name minecraft-tunnel

Сохраните ключ в файл key.txt на компьютере и войдите им:

docker compose exec -T proximamp proximamp login --key-stdin < key.txt

В PowerShell < не работает:

Get-Content key.txt | docker compose exec -T proximamp proximamp login --key-stdin

Ключ можно дать и переменной PROXIMAMP_KEY в environment: сервиса proximamp, но её видно в docker inspect. Вход сохраняется в томе, поэтому после первого запуска уберите переменную из compose.yml и пересоздайте контейнер:

docker compose up -d

Том, права и обновление​

  • Вход и память адресов лежат в томе /var/lib/proximamp. С ним новый контейнер, после обновления образа или пересоздания, остаётся тем же устройством и получает тот же адрес. Без тома каждый контейнер входит новым устройством.

  • Программа в контейнере работает от пользователя 10001, без прав root: proximamp.yml должен быть доступен ему на чтение (подходят обычные права 644). Если вместо тома подключаете папку компьютера (./data:/var/lib/proximamp), в Linux отдайте её этому пользователю:

    mkdir -p data
    sudo chown 10001:10001 data
  • После правки proximamp.yml перезапустите контейнер: сам он файл не перечитывает.

    docker compose restart proximamp
  • Обновление — на странице «Как обновить proximamp».

Без Compose​

Один туннель без файла запускает docker run. Без входа такой туннель не ждёт его, а завершается, поэтому сначала войдите, сохранив вход в томе, потом запустите туннель. --host нужен всегда: localhost в контейнере — сам контейнер, поэтому укажите адрес компьютера с сервером в сети.

docker run --rm -it --hostname minecraft-tunnel -v proximamp:/var/lib/proximamp proximamp/proximamp login --remote
docker run -d --name proximamp --hostname minecraft-tunnel --restart unless-stopped -v proximamp:/var/lib/proximamp proximamp/proximamp tcp 25565 --host 192.168.1.20
docker logs proximamp # адрес туннеля

Ключом устройства первая команда входит так:

docker run --rm -i --hostname minecraft-tunnel -v proximamp:/var/lib/proximamp proximamp/proximamp login --key-stdin < key.txt
Get-Content key.txt | docker run --rm -i --hostname minecraft-tunnel -v proximamp:/var/lib/proximamp proximamp/proximamp login --key-stdin

Остальные команды proximamp с других страниц набирайте после docker exec -it proximamp, а команду с < файл или Get-Content … | — после docker exec -i proximamp.

Если вход закончился, туннель перезапускается снова и снова. Остановите его, войдите и запустите снова:

docker stop proximamp
docker run --rm -it --hostname minecraft-tunnel -v proximamp:/var/lib/proximamp proximamp/proximamp login --remote
docker start proximamp

Проверьте​

Посмотрите адрес туннеля:

docker compose logs proximamp

Подключитесь по нему с другого компьютера: откроется ваш сервер.

Удалить​

  1. Выйдите из аккаунта в контейнере:

    docker compose exec proximamp proximamp logout

    Если контейнер входил ключом устройства, отзовите ключ там, где вы вошли паролем, VK ID, Яндекс ID или кодом с телефона (отзыв ключа), и удалите файл key.txt: иначе ключом можно войти снова.

  2. Остановите и удалите контейнер туннеля:

    docker compose rm -sf proximamp
  3. Уберите из compose.yml сервис proximamp и том proximamp: иначе следующий docker compose up создаст контейнер снова.

  4. Удалите том и образ. Имя тома — имя папки проекта и _proximamp, все тома показывает docker volume ls:

    docker volume rm minecraft_proximamp # проект в папке minecraft
    docker image rm proximamp/proximamp

Туннель, запущенный docker run без Compose, удаляется так:

docker exec proximamp proximamp logout
docker rm -f proximamp
docker volume rm proximamp
docker image rm proximamp/proximamp

Проверьте:

docker ps -a

Контейнера с образом proximamp/proximamp в списке нет.