Skip to content

Перенос туннеля на другое устройство — FAQ

Частые вопросы при переносе device_client с одного устройства на другое: смена телефона, переезд с Linux на Windows, с физического устройства на VPS и т.д.


Общие вопросы

Можно ли запустить один slug на двух устройствах одновременно?

Нет. Прокси-сервер dix.su допускает только одно активное подключение на slug. Если второй клиент подключится — первый будет вытеснен (соединение разорвано), владелец получит email-уведомление о вытеснении.

Правильный порядок переноса: 1. Поднять новый стек и убедиться что он работает локально 2. Запустить туннель на новом устройстве 3. Проверить slug.dix.su 4. Только потом остановить туннель на старом устройстве

Нужно ли перевыпускать токен при переносе?

Необязательно, но рекомендуется если токен мог засветиться: попал в историю команд, лог-файлы, переписку или публичный репозиторий.

Перевыпустить: dix.su → «Туннель» → «Перевыпустить токен». Старый токен немедленно перестаёт работать — старый клиент отключится.

Теряются ли данные туннеля при переносе?

Нет. Slug, настройки приватности, кастомный домен, статистика — всё хранится на сервере dix.su и привязано к аккаунту, а не к конкретному устройству. Переносится только клиент (device_client), данные остаются.


Перенос между Linux-устройствами

Как перенести с одного Linux на другой?

На новом устройстве:

# Скачать бинарник
curl -fsSL https://dix.su/install.sh | SLUG=myslug TOKEN=mytoken PORT=8080 bash

# Или вручную
curl -fsSL https://dix.su/downloads/device_client_linux_x86_64 -o ~/.local/bin/device_client
chmod +x ~/.local/bin/device_client
SERVER_HOST=dix.su SERVER_PORT=443 device_client myslug mytoken 8080

Затем остановить на старом устройстве:

# systemd
systemctl stop device-client-myslug && systemctl disable device-client-myslug

# OpenRC (Alpine / PostmarketOS)
rc-service device-client-myslug stop && rc-update del device-client-myslug

Как подключиться к старому устройству если нет белого IP?

Если старое устройство доступно через туннель dix.su — подключиться по SSH через mgmt-туннель:

ssh -p 2222 \
  -o "ProxyCommand=bash -c '{ echo DIXSU:myslug; cat; } | nc myslug.dix.su 2222'" \
  root@myslug.dix.su

Подробнее: guides/mgmt-tunnel.md


Перенос на Windows

Работает ли device_client на Windows?

Да. Скачать: https://dix.su/downloads/device_client_windows_x86_64

Запуск в PowerShell:

$env:SERVER_HOST="dix.su"; $env:SERVER_PORT="443"
.\device_client_windows_x86_64.exe myslug mytoken 8080

Почему туннельный контейнер не подходит для Windows + Docker Desktop?

Docker Desktop на Windows не поддерживает network_mode: host для контейнеров. Контейнер с туннелем видит свой localhost, но не localhost хоста Windows, и не может достучаться до сервиса на порту 8080.

Решение: запускать device_client_windows_x86_64.exe нативно на Windows, а не в Docker. В .env стека: COMPOSE_PROFILES= (пусто).

Можно ли автоматически запустить туннель при загрузке Windows?

Через Планировщик задач (PowerShell от администратора):

$action = New-ScheduledTaskAction `
  -Execute "C:\dixsu\device_client_windows_x86_64.exe" `
  -Argument "myslug mytoken 8080" `
  -WorkingDirectory "C:\dixsu"
$trigger  = New-ScheduledTaskTrigger -AtLogOn
$trigger.Delay = "PT1M"
$settings = New-ScheduledTaskSettingsSet `
  -ExecutionTimeLimit 0 -RestartCount 999 `
  -RestartInterval (New-TimeSpan -Minutes 1)
Register-ScheduledTask -TaskName "dixsu-tunnel-myslug" `
  -Action $action -Trigger $trigger -Settings $settings -RunLevel Highest -Force

Задача запускается после входа в систему. Для серверного режима также настрой автовход в Windows (Sysinternals Autologon).


Перенос приложения вместе с туннелем

Нужно ли переносить само приложение или только клиент?

Зависит от архитектуры:

Случай Что переносить
Приложение на новом устройстве уже запущено Только клиент device_client
Переезжаешь вместе с приложением Клиент + данные приложения (БД, файлы)
Приложение в Docker-стеке Клонируй стек, восстанови из бэкапа

Как перенести Docker-стек магазина (Django / Oscar) с PostmarketOS на Windows?

Подробный пошаговый гайд с разбором всех подводных камней:

📄 Перенос магазина с PostmarketOS на Windows + Docker Desktop

Гайд покрывает: настройку WSL2, SSH-ключи для GitLab, экспорт данных со старого устройства через туннель, восстановление стека, запуск туннеля нативно на Windows, настройку автозапуска и автоматическое исправление nginx-монтирования после перезагрузки (Docker Desktop WSL2 bind-mount bug, @reboot cron).


Подводные камни

Два клиента с одним slug вытесняют друг друга в цикле

Оба устройства онлайн и оба пытаются держать одно соединение. Немедленно остановить старый клиент (см. «Общие вопросы»).

После переноса сайт отвечает, но открывается старая версия

Браузер или CDN закешировал страницу. Сбрось кеш (Ctrl+Shift+R) или подожди истечения TTL кастомного домена (обычно 5 минут).

Туннель подключается, но приложение не отвечает

Клиент успешно соединился с dix.su, но LOCAL_PORT недоступен локально. Проверь что приложение запущено и слушает нужный порт:

# Linux
ss -tlnp | grep 8080

# Windows PowerShell
netstat -ano | findstr :8080

После перезагрузки контейнеры Up, но сайт не отвечает (nginx без конфига)

Docker Desktop на WSL2 иногда монтирует bind-mount директорию пустой при рестарте контейнера. Nginx стартует с дефолтным конфигом (без проксирования) — conf.d внутри контейнера пуст, хотя файл на хосте есть.

Диагностика:

docker exec <nginx-container> ls /etc/nginx/conf.d/
# пусто — это оно

Исправление:

docker compose up -d --force-recreate nginx

Чтобы чинилось автоматически при каждой перезагрузке — добавить в crontab WSL:

@reboot /home/<user>/django_shop/scripts/fix-nginx-mount.sh >> /tmp/fix-nginx.log 2>&1

Подробнее в гайде по миграции: шаг 14.

SmartScreen блокирует device_client_windows_x86_64.exe

Файл скачан из интернета и не имеет подписи. Это ожидаемое поведение. Правой кнопкой на файл → Свойства → внизу «Разблокировать» → ОК. Или при запуске: Подробнее → Выполнить в любом случае.