VPSРейтинг
Self-hosted13 августа 2026 · 17 мин

Termix на VPS: веб-SSH вместо Termius

Список серверов, SSH-ключи, терминал, файловый менеджер и туннели — всё в браузере и всё на вашем сервере. Ставим Termix за двадцать минут, закрываем HTTPS и двухфакторной аутентификацией и разбираемся, почему это одновременно очень удобно и очень опасно.

Задача: подключиться к серверу с любого устройства

У человека, который арендует хотя бы пару VPS, довольно быстро появляется одна и та же проблема. Ключи и список серверов лежат на рабочем ноутбуке. С телефона в дороге зайти неудобно. На чужом компьютере — нечем: ставить туда SSH-клиент и копировать приватный ключ никто в здравом уме не станет. А если ноутбук потеряется, вместе с ним потеряется и вся «карта» инфраструктуры.

Классический ответ — Termius: красивый клиент под все платформы, который синхронизирует хосты и ключи между устройствами. Но синхронизация в нём платная. В бесплатном тарифе Starter есть SSH, SFTP и проброс портов, а вот облачное хранилище и синхронизация между мобильным и десктопом — это тариф Pro за 10 $ в месяц при годовой оплате. Плюс два неприятных нюанса: ваши ключи оказываются в чужом облаке, а оплатить зарубежную подписку из России в 2026-м — отдельный квест.

Второй распространённый ответ — поставить на сервер что-нибудь вроде ttyd или wetty, которые отдают терминал в браузер. Это работает, но решает только половину задачи: терминал есть, а менеджера хостов, хранилища ключей, файлового менеджера и туннелей — нет. И, что важнее, такие инструменты обычно отдают шелл того сервера, на котором стоят, а не позволяют ходить с него на другие машины.

Termix закрывает обе половины задачи

Это self-hosted веб-приложение: вы ставите его на отдельный VPS, открываете в браузере и получаете менеджер хостов, терминал во вкладках, хранилище SSH-ключей, файловый менеджер по SFTP, туннели, метрики серверов и даже удалённый рабочий стол по RDP и VNC. Открывается с чего угодно — с ноутбука, с телефона, с планшета, с чужого компьютера. Устанавливать на устройство ничего не нужно.

Проект написан на React и Node.js, лежит под лицензией Apache 2.0, к августу 2026 набрал почти 15 тысяч звёзд на GitHub и обновляется буквально каждый день. Актуальная версия на момент написания — 2.6.1 от 6 августа 2026. Дальше в статье все команды и все названия пунктов интерфейса проверены на реально развёрнутой установке именно этой версии.

Чем Termix отличается от соседей по нише

«Терминал в браузере» — это несколько разных категорий инструментов, которые легко перепутать. Короткая карта, чтобы не поставить не то:

ИнструментЧто это на самом делеКогда брать
TermixМенеджер подключений с терминалом, ключами, SFTP, туннелями и RDP/VNCНужна замена Termius: много серверов, доступ с разных устройств
ttyd, wetty, GoTTYОтдают в браузер шелл одной конкретной машины, больше ничегоНужна аварийная консоль к одному серверу и максимально просто
Apache GuacamoleТяжёлый корпоративный шлюз к RDP, VNC и SSH с правами и группамиГлавное — удалённые рабочие столы Windows для команды
NextermТот же класс, что Termix, но заметно моложе и меньше по функциямХочется максимально простой интерфейс и не нужны туннели с метриками
Portainer, KomodoПро управление Docker, а не про доступ к серверамЗадача — деплой и стеки контейнеров, а не SSH

Отдельно стоит сказать про Docker внутри Termix. Он умеет показывать контейнеры на подключённых серверах, запускать, останавливать и удалять их, смотреть статистику и логи, заходить внутрь через docker exec. Но создавать стеки он не умеет — авторы прямо пишут в описании, что не пытались заменить Portainer и Dockge. Если вам нужен и полноценный деплой, посмотрите наш разбор Docker Compose на VPS.

Сразу о главном риске

Прежде чем ставить — поймите, что вы делаете. Termix собирает в одном месте доступ ко всем вашим серверам: адреса, логины, пароли и приватные ключи. Тот, кто войдёт в панель, автоматически получит рутовый доступ ко всей вашей инфраструктуре. Это не повод не ставить, это повод настроить правильно.

Пять правил, которые не обсуждаются

  • Только HTTPS. Пароль при входе уходит на сервер в теле обычного HTTP-запроса. Без TLS его увидит любой, кто слушает канал. Это признают и сами авторы в разделе документации о безопасности.
  • Порт контейнера — на 127.0.0.1. Docker пробивает правила UFW насквозь: если написать 8080:8080, панель будет доступна из интернета даже при закрытом файрволе.
  • Выключить регистрацию сразу после создания первого пользователя. По умолчанию зарегистрироваться может кто угодно, кто откроет адрес.
  • Включить двухфакторную аутентификацию. Одного пароля для входа во все ваши серверы мало.
  • Отдельный сервер. Не ставьте Termix рядом с сайтами: дыра в стороннем движке на том же сервере отдаст злоумышленнику и файл с ключами шифрования, и логи контейнера — а через логи восстанавливается пароль любой учётной записи (объясняем это на шаге 3).

Самый надёжный вариант — вообще не публиковать Termix в интернет, а поднять WireGuard и ходить в панель только через VPN. Тогда снаружи у сервера открыт один UDP-порт, и перебирать пароли просто некому. Ниже мы всё-таки разберём вариант с публичным доменом — он нужен, если хочется заходить с чужого устройства, где VPN не поставить, — но если такой задачи нет, VPN лучше.

Что понадобится

  • VPS с Ubuntu 22.04 или 24.04 — 1 ГБ памяти и 10 ГБ диска с запасом хватает. На нашей установке Termix занимал 68–155 МБ памяти, guacd — около 10 МБ.
  • Домен или поддомен с A-записью на IP сервера — нужен для бесплатного сертификата. В примерах используется termix.example.com, замените на свой.
  • Установленный Docker — официальный, не из репозитория Ubuntu.

Если Docker ещё не стоит, ставим его одной командой с официального скрипта:

установка Docker
curl -fsSL https://get.docker.com | sudo sh

Проверяем, что всё на месте — команда должна показать версию 2.x:

проверка
sudo docker compose version

Шаг 1. Запускаем Termix

Создаём каталог для проекта и файл описания:

каталог
sudo mkdir -p /opt/termix && cd /opt/termix
sudo nano /opt/termix/docker-compose.yml
services:
  termix:
    image: ghcr.io/lukegus/termix:latest
    container_name: termix
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:8080"
    volumes:
      - termix-data:/app/data
    environment:
      PORT: "8080"
      ENABLE_TELEMETRY: "false"
      GUACD_HOST: "guacd"
      GUACD_TUNNEL_HOST: "termix"
      GUACD_RECORDING_PATH: "/termix-data/session_recordings/guacamole"
    depends_on:
      - guacd
    networks:
      - termix-net

  guacd:
    image: guacamole/guacd:1.6.0
    container_name: guacd
    restart: unless-stopped
    volumes:
      - termix-data:/termix-data
    networks:
      - termix-net

volumes:
  termix-data:
    driver: local

networks:
  termix-net:
    driver: bridge

Разберём места, которые важны и которые легко испортить.

  • 127.0.0.1:8080:8080 — панель слушает только сам сервер. Наружу её выпустит Nginx, который мы поставим следующим шагом. В примерах из документации Termix стоит просто 8080:8080: так панель окажется открыта всему интернету ещё до того, как вы успеете завести пароль.
  • PORT: "8080" — порт внутри контейнера, менять его незачем. Если 8080 на сервере уже занят, правьте левую часть строки портов, например 127.0.0.1:9090:8080. А если всё-таки меняете PORT, не берите значения из диапазона 30001–30005 — они заняты внутренними службами Termix.
  • guacd — отдельный контейнер, движок Apache Guacamole. Он нужен только для удалённого рабочего стола по RDP, VNC и Telnet; SSH, файлы и туннели работают без него. Если удалённый рабочий стол не нужен, удалите весь сервис guacd, строки depends_on, три переменные GUACD_*, оба упоминания networks и блок networks в конце файла — сеть Compose создаст сам.
  • Порт guacd (4822) наружу не пробрасывается специально. В примере из документации проекта он опубликован на хосте, но это лишнее: Termix ходит к нему по внутренней docker-сети, а открытый 4822 — просто ещё одна дверь снаружи.
  • ENABLE_TELEMETRY: "false" отключает анонимную статистику, которую Termix иначе отправляет раз в сутки. Строку можно убрать, если вы не против помочь проекту цифрами.

Запускаем:

запуск
sudo docker compose up -d

Первый старт занимает секунд двадцать: Termix генерирует ключи шифрования, создаёт базу и докачивает вспомогательный бинарник. Убедиться, что всё поднялось, можно по логам:

логи
sudo docker compose logs -f termix

Ищем в выводе две строки — версию и сообщение об успешном старте. В реальном логе перед ними стоит время, а после — служебные пометки. Увидели — можно нажать Ctrl+C:

[INFO] [📦] Termix Backend starting - Version: 2.6.1
[SUCCESS] [🚀] Termix backend started successfully

Шаг 2. Домен и HTTPS

Перед этим шагом убедитесь, что A-запись вашего домена уже указывает на IP сервера — иначе certbot не сможет выпустить сертификат. Ставим веб-сервер и клиент Let's Encrypt:

установка
sudo apt update && sudo apt install -y nginx certbot python3-certbot-nginx

Создаём конфиг сайта. Замените termix.example.com на свой домен:

sudo nano /etc/nginx/sites-available/termix
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    server_name termix.example.com;

    client_max_body_size 5G;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_buffering off;
        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
    }
}

Здесь четыре места, без которых что-нибудь обязательно сломается:

  • Блок map вместе с заголовками Upgrade и Connection пропускает веб-сокет. Без них интерфейс откроется как ни в чём не бывало, а терминал будет бесконечно «подключаться»: сервер вернёт ошибку 426 Upgrade Required. Это самая частая ошибка при настройке Termix.
  • client_max_body_size 5G — лимит на размер загружаемого файла. Стандартный лимит Nginx — один мегабайт, и файловый менеджер на файле в три мегабайта отвалится с ошибкой 413. Пять гигабайт — столько же разрешает внутренний Nginx самого Termix.
  • proxy_read_timeout 86400s — сутки. Иначе Nginx оборвёт открытую вкладку терминала через минуту простоя, и вы будете постоянно переподключаться.
  • proxy_buffering off — чтобы вывод команд появлялся сразу, а не порциями.

Блок map объявляется вне server — так и должно быть. Если точно такой же блок уже есть в конфиге другого вашего сайта, ничего страшного: Nginx разрешает повторное объявление.

Включаем конфиг, проверяем синтаксис и выпускаем сертификат:

включение и HTTPS
sudo ln -s /etc/nginx/sites-available/termix /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d termix.example.com

Certbot спросит почту, попросит согласиться с условиями и предложит включить перенаправление с HTTP на HTTPS — соглашайтесь. Он сам допишет блок с сертификатом в конфиг и настроит автопродление.

Закрываем файрвол. Наружу нужны только SSH и веб:

ufw
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable

Проверьте, что порт 8080 снаружи не отвечает. С другого компьютера выполните curl -m 5 http://IP_СЕРВЕРА:8080 — должно быть «Connection refused» или таймаут. Если страница открылась, значит в docker-compose.yml потерялся префикс 127.0.0.1: исправьте и выполните sudo docker compose up -d.

Шаг 3. Первый вход и закрытие регистрации

Открываем https://termix.example.com. Termix увидит, что пользователей ещё нет, и предложит создать первого. Первый созданный пользователь автоматически становится администратором — так что не тяните и заведите его сразу, пока это не сделал кто-то другой.

Сразу после входа — самое важное действие во всей установке. Нажмите на своё имя пользователя внизу слева, откройте «Настройки администратора», вкладка «Общие», и выключите переключатель «Разрешить регистрацию пользователей». Пока он включён, любой, кто откроет ваш адрес, заведёт себе учётку.

Надёжнее — запретить регистрацию намертво

Переключатель в интерфейсе можно случайно включить обратно. Переменная окружения перекрывает его и блокирует настройку совсем. Добавьте в docker-compose.yml в блок environment строку:

      ALLOW_REGISTRATION: "false"

и примените: sudo docker compose up -d. Мы проверили — попытка регистрации после этого возвращает «Registration is currently disabled». Только не забудьте сначала создать себе учётку, иначе войти будет некому.

Второе обязательное действие — двухфакторная аутентификация. Профиль пользователя, раздел «Безопасность», пункт «Аутентификатор TOTP» и кнопка «Настроить TOTP». Termix покажет QR-код: отсканируйте его любым приложением-аутентификатором, введите шестизначный код для подтверждения и обязательно сохраните резервные коды — кнопка «Скачать резервные коды». Каждый из них срабатывает один раз и понадобится, если вы потеряете телефон.

Заодно можно переключить интерфейс на русский: там же, в профиле, пункт «Язык». В версии 2.6 встроено около 30 языков.

Если потеряли пароль от панели

Восстановление устроено необычно, и это стоит знать заранее. На странице входа есть запрос сброса пароля, но код никуда не отправляется — Termix пишет его прямо в лог контейнера. Достать его можно с сервера по SSH:

код сброса пароля
cd /opt/termix
sudo docker compose logs termix | grep "reset code"

В логе появится строка вида Password reset code generated for user admin: 435920. Код действует 15 минут.

Обратная сторона этого удобства: кто может читать логи контейнера, тот может сбросить пароль любому пользователю и войти в панель. Считайте доступ по SSH к серверу с Termix равным полному доступу к самой панели — и не пускайте на этот сервер посторонних.

Пускать только со своих адресов

Перебор паролей Termix отбивает сам: после пяти неудачных попыток вход блокируется на десять минут — по IP и по имени пользователя одновременно. Мы это проверили: шестая попытка возвращает «Too many login attempts» и время до разблокировки. Отдельный Fail2Ban ставить не нужно.

Но если у вас статический IP дома или на работе, надёжнее просто не пускать всех остальных. Добавьте две строки в начало блока location / в конфиге Nginx:

/etc/nginx/sites-available/termix — внутри location /
        allow 203.0.113.5;
        deny all;

Вместо 203.0.113.5 — ваш адрес; строк allow может быть несколько, можно указывать и подсети вида 198.51.100.0/24. Все остальные получат 403 и даже не увидят страницу входа. Продлению сертификата это не мешает: проверочный запрос Let's Encrypt идёт в отдельную, более точную локацию — мы специально проверили, что при deny all в location / она продолжает отвечать.

Не забудьте применить: sudo nginx -t && sudo systemctl reload nginx. И держите под рукой доступ по SSH — если адрес сменится, вернуть себе панель можно будет только через правку конфига на сервере.

Шаг 4. Добавляем первый сервер

Открываем «Менеджер хостов» — кнопка вверху слева — и нажимаем «Добавить хост». Заполняем адрес, порт, имя пользователя и способ входа. Ниже в форме есть переключатели, какие возможности включить для этого сервера: «Включить терминал», «Включить файловый менеджер», туннели, Docker, метрики. Включайте только то, чем реально будете пользоваться — меньше включено, меньше поверхность атаки.

При первом подключении Termix спросит про отпечаток ключа

Появится окно с отпечатком ключа сервера — ровно как привычный вопрос обычного sshпро «authenticity of host can't be established». Это защита от подмены сервера: сверьте отпечаток и подтвердите. При следующих подключениях Termix проверит его молча, а если ключ вдруг изменится — предупредит.

Дальше сервер открывается во вкладке. Вкладок можно держать сколько угодно, а экран — делить на четыре панели одновременно. Есть удобная мелочь: двойное нажатие левого Shift открывает поиск по хостам, чтобы подключиться, не отрывая рук от клавиатуры.

Шаг 5. SSH-ключи вместо паролей

Вписывать пароль в каждый хост — плохая идея, тем более что серверы правильнее вообще закрыть от входа по паролю (об этом — в статье про безопасность VPS). В Termix для этого есть раздел «Учётные данные»: вы один раз добавляете приватный ключ, а потом просто выбираете его в настройках любого хоста.

Если ключа ещё нет, создайте его на своей машине — современный стандарт это ed25519:

на своём компьютере
ssh-keygen -t ed25519 -C "termix"

Публичную часть (~/.ssh/id_ed25519.pub) кладём на серверы обычным способом:

на своём компьютере, для каждого сервера
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@IP_СЕРВЕРА

Приватную часть (файл id_ed25519 без расширения) добавляем в Termix: «Учётные данные»«Добавить учётные данные», тип «SSH-ключ», вставляем содержимое файла или загружаем его кнопкой «Загрузить файл приватного ключа». Публичный ключ Termix вычислит из приватного сам. Если ключ защищён паролем — его вводят в поле «Пароль ключа».

После этого в настройках хоста выбирается способ входа «Учётные данные» и нужный ключ из списка. Один ключ — десять серверов, менять в одном месте.

Как ключи хранятся на самом деле

Здесь важно не обмануться словом «зашифровано». Устроено так: каждое чувствительное поле (пароли, приватные ключи) шифруется персональным ключом пользователя алгоритмом AES-256-GCM, сам этот персональный ключ зашифрован мастер-ключом сервера, а вся база SQLite целиком лежит на диске в зашифрованном виде — файл db.sqlite.encrypted. Мастер-ключ и ключ базы хранятся рядом, в файле .env внутри тома с данными, и генерируются автоматически при первом запуске.

Практический смысл: шифрование защищает от того, кто утащил только копию базы — например, старый бэкап или снапшот диска без файла .env. От того, кто получил root на самом сервере, оно не защищает: ключи лежат там же. Поэтому Termix и стоит держать на отдельной машине, где нет ничего лишнего.

Что ещё умеет Termix

Файловый менеджер

Работает поверх SFTP: два окна, перетаскивание, загрузка и скачивание, правка текста и кода прямо в браузере, просмотр картинок и видео. Умеет копировать файлы напрямую с сервера на сервер и выполнять операции через sudo. Заменяет отдельный SFTP-клиент.

Туннели

Проброс портов между серверами с автоматическим переподключением и контролем состояния. Классический сценарий: база данных на сервере закрыта от интернета, а вам надо на неё посмотреть — поднимаете туннель и работаете, не открывая порт наружу.

Метрики хоста

Процессор, память, диски, сеть, аптайм, список процессов и служб systemd, просмотр логов, состояние файрвола и сертификатов — по SSH, без установки агентов на серверы. Есть графики истории и оповещения по порогам через ntfy или вебхук. Это не замена Prometheus с Grafana, но чтобы быстро понять «почему тормозит» — хватает.

Удалённый рабочий стол

RDP, VNC и Telnet в браузере — тот самый контейнер guacd из нашего compose-файла. Настраивать ничего не нужно: переменная GUACD_HOST уже указывает Termix на этот контейнер, и на свежей установке всё включено (мы проверили — настройки отдают enabled: true, url: guacd:4822). Просто добавьте хост и выберите наверху формы протокол RDP или VNC вместо SSH. Проверить состояние можно в «Настройках администратора» «Общие»: переключатель «Включить Guacamole» и поле «URL guacd» рядом.

Сниппеты и доступ для команды

Сохранённые команды в одну кнопку и запуск одной команды сразу во всех открытых терминалах. Плюс роли и выдача доступа к конкретным хостам конкретным пользователям — если сервером занимается не только вы.

Бэкап и обновление

Все данные Termix — база с хостами и ключами, ключи шифрования, журналы сессий — лежат в одном docker-томе. Бэкапить нужно именно его целиком: без файла .env из этого тома базу расшифровать не получится, а без базы бесполезен сам .env. Сертификат Let's Encrypt в томе не лежит — он в /etc/letsencrypt на сервере, и при переезде проще выпустить его заново.

Контейнер периодически перезаписывает файл базы, поэтому перед копированием его лучше остановить — так вы точно получите целостный снимок:

бэкап тома в архив
cd /opt/termix
sudo docker compose stop
sudo docker run --rm -v termix_termix-data:/data:ro -v /root:/backup alpine \
  tar czf /backup/termix-backup.tar.gz -C /data .
sudo docker compose start

Имя тома складывается из имени каталога и имени тома в compose-файле. У нас каталог /opt/termix, поэтому том называется termix_termix-data. Проверить точное имя всегда можно командой sudo docker volume ls.

Восстановление из архива — обратная операция:

восстановление
cd /opt/termix
sudo docker compose stop
sudo docker run --rm -v termix_termix-data:/data -v /root:/backup:ro alpine \
  sh -c "rm -rf /data/* /data/.env && tar xzf /backup/termix-backup.tar.gz -C /data"
sudo docker compose start

Мы прогнали этот цикл целиком на тестовой установке: сделали архив, полностью стёрли том, восстановили из архива — пользователи, хосты и сохранённые SSH-ключи вернулись на место. Проверьте восстановление у себя до того, как оно понадобится. Архив стоит забирать с сервера наружу — как это автоматизировать, разобрано в статье про бэкапы через restic и rclone.

Обновление — две команды. Своих автоматических копий перед каждым обновлением Termix не делает (каталог backups внутри тома появляется только при разовых крупных миграциях базы), так что ваш архив — единственная страховка:

обновление
cd /opt/termix
sudo docker compose pull
sudo docker compose up -d

Проект развивается очень быстро, поэтому обновляйтесь регулярно — это ещё и способ вовремя получать исправления безопасности. Если стабильность важнее свежести, вместо :latest в compose-файле можно указать конкретную версию, например ghcr.io/lukegus/termix:2.6.1.

Частые проблемы

Интерфейс открывается, но терминал бесконечно «подключается»

Классика: в конфиге Nginx нет блока map и заголовков Upgrade с Connection. Страница — обычный HTTP и грузится нормально, а терминал работает по веб-сокету, и без этих заголовков сервер отвечает 426 Upgrade Required. Мы специально воспроизвели эту ошибку — симптом выглядит именно так. Скопируйте конфиг из шага 2 целиком, затем:

sudo nginx -t && sudo systemctl reload nginx

Загрузка файла падает с ошибкой 413

Не хватает client_max_body_size в конфиге Nginx: по умолчанию лимит всего один мегабайт. Мы проверили — с лимитом 1m файл на 3 МБ гарантированно отваливается, с 5G проходит. Строка должна стоять внутри блока server, после чего Nginx нужно перезагрузить.

После перезапуска контейнера всех выкинуло из панели

Так и задумано: при старте Termix очищает таблицу активных сессий, поэтому после каждого docker compose up -d или перезагрузки сервера нужно войти заново. Данные при этом на месте — мы это проверяли. Если после входа список хостов пуст, проблема не в сессиях, а в томе: убедитесь, что вы не запускали docker compose down -v — ключ -v удаляет том вместе с данными.

Хосты RDP и VNC не подключаются

Первое: убедитесь, что контейнер guacd вообще запущен — sudo docker compose ps. Второе: проверьте, что в docker-compose.ymlосталась строка GUACD_HOST: "guacd". Она важнее, чем поле «URL guacd» в интерфейсе: значение из переменной окружения перекрывает то, что вписано в настройках, так что менять поле в панели бесполезно, пока переменная задана. И учтите, что guacd — это имя сервиса во внутренней docker-сети: localhost:4822 здесь не сработает, потому что ведёт в сам контейнер Termix, где никто не слушает.

Страница входа доступна из интернета, хотя ufw включён

Docker добавляет свои правила в iptables в обход ufw, поэтому опубликованный порт виден снаружи независимо от настроек файрвола. Единственное надёжное лечение — привязка порта к адресу 127.0.0.1 в docker-compose.yml, как в нашем примере. После правки выполните sudo docker compose up -d и перепроверьте снаружи.

Коротко: порядок действий

  1. Отдельный VPS от 1 ГБ памяти, официальный Docker, домен с A-записью
  2. docker-compose.yml с портом на 127.0.0.1 и sudo docker compose up -d
  3. Nginx с блоком map, лимитом 5G и большими таймаутами, затем certbot
  4. ufw: только SSH и Nginx Full
  5. Создать первого пользователя — он же администратор
  6. Выключить регистрацию, лучше через ALLOW_REGISTRATION: "false"
  7. Включить 2FA и сохранить резервные коды
  8. По возможности — allow/deny по IP в Nginx или доступ только через VPN
  9. Добавить SSH-ключ в «Учётные данные», затем хосты
  10. Настроить бэкап тома и один раз проверить восстановление

Если через неделю окажется, что не подошло — sudo docker compose down убирает контейнеры, а данные остаются в томе. Удалить всё вместе с данными: sudo docker compose down -v.

Нужен отдельный сервер под панель доступа? Termix хватает самого простого VPS

Лучшие VPS 2026 →