NetBird на своём сервере: mesh-VPN как Tailscale без облака
TL;DR
NetBird позволяет развернуть собственную mesh-VPN-сеть на VPS: устройства получают защищённые WireGuard-туннели, видят друг друга по приватным IP-адресам и управляются через единый сервер без зависимости от публичного SaaS-аккаунта.
- Для небольшой команды достаточно VPS с 2 vCPU, 4 ГБ RAM, 40 ГБ SSD и публичным IPv4.
- NetBird использует WireGuard для передачи трафика, а management-сервер координирует участников, группы, маршруты и политики доступа.
- Самый практичный способ self-hosted установки в 2026 году — официальный Docker Compose-стек с PostgreSQL, coturn, Signal и веб-панелью.
- Для работы через NAT важно открыть UDP-порты WireGuard и TURN, а для панели управления нужен HTTPS-сертификат.
- Бэкапировать необходимо PostgreSQL, файл окружения, Docker Compose-конфигурацию и ключи/секреты identity provider.
- После установки можно подключить Linux, macOS, Windows, Android, iOS и настроить private DNS, exit node, site-to-site routing и ACL-политики.
Что мы настраиваем и зачем
NetBird — это self-hosted платформа для построения mesh-VPN. По назначению она близка к Tailscale, ZeroTier и Headscale: вы устанавливаете агент на серверы, ноутбуки и другие устройства, авторизуете их в одной сети и получаете защищённую связность между участниками.
В основе передачи данных лежит WireGuard. Это означает, что пользовательский трафик по возможности идёт напрямую между двумя узлами. Центральный сервер NetBird не обязан проксировать каждый пакет: он хранит состояние сети, выдаёт конфигурации peer-узлам, применяет ACL-политики, помогает с обнаружением участников и предоставляет административную панель.
Если прямое соединение невозможно из-за CGNAT, симметричного NAT или корпоративного firewall, NetBird может передать трафик через TURN-релей. В self-hosted схеме таким релеем обычно выступает coturn, запущенный на том же VPS. Это не отменяет шифрование WireGuard: TURN видит транспортный поток, но не расшифровывает VPN-трафик.
Что получится после выполнения инструкции
В результате вы получите домен вида netbird.example.com с HTTPS-панелью управления. В панели можно приглашать пользователей, создавать setup keys для серверов без интерактивного входа, объединять peers в группы, добавлять маршруты в локальные подсети и ограничивать доступ правилами.
Каждое подключённое устройство получит адрес из внутренней сети NetBird, например 100.64.0.0/10 или выбранного вами диапазона. Вы сможете подключаться к приватным сервисам по SSH, открывать внутренние базы данных, связывать несколько VPS, давать разработчикам доступ только к staging-инфраструктуре или публиковать домашнюю сеть без проброса портов на каждом устройстве.
Почему не просто WireGuard
Обычный WireGuard отлично подходит для схемы «клиент — сервер», но начинает требовать ручного администрирования при десятках узлов. Нужно создавать ключи, добавлять peer-блоки в конфиг всех машин, согласовывать AllowedIPs, обновлять файлы при отзыве устройства и решать проблемы NAT.
NetBird автоматизирует эту работу. Администратор управляет логическими объектами: пользователями, группами, маршрутами и политиками. Агент сам получает актуальную конфигурацию. При удалении ноутбука из сети его ключ перестаёт получать рабочую конфигурацию, а при добавлении нового сервера не нужно вручную редактировать конфиг на всех старых узлах.
Cloud-managed и self-hosted: что выбрать
| Критерий | Облачный сервис | NetBird на своём VPS |
|---|---|---|
| Старт | Быстрее: регистрация и установка агента | Нужны домен, VPS, TLS и обслуживание |
| Контроль метаданных | Часть control plane находится у поставщика | База, логи и identity provider находятся у вас |
| Гибкость | Ограничена тарифом и настройками платформы | Можно менять домены, бэкапы, SSO и сетевую схему |
| Эксплуатация | Обновления и отказоустойчивость ведёт сервис | Ответственность за обновления и резервные копии на владельце |
| Стоимость | Может расти вместе с числом пользователей | Предсказуемая стоимость сервера и хранилища бэкапов |
Self-hosted NetBird имеет смысл, когда важны независимость от внешней учётной записи, контроль над метаданными сети, собственная политика хранения данных или интеграция с корпоративным SSO. Для команды из нескольких человек это также хороший способ изучить современную mesh-VPN-архитектуру без ручного сопровождения десятков WireGuard-конфигов.
NetBird не делает VPS невидимым для интернета автоматически. Публичные сервисы всё равно нужно защищать firewall, обновлениями, сильными паролями и отдельными ACL. Mesh-VPN следует рассматривать как слой защищённой связности, а не как замену базовой безопасности сервера.
Какой VPS-конфиг нужен под эту задачу
Нагрузка NetBird зависит не столько от числа зарегистрированных peers, сколько от количества активных релейных соединений через TURN. Если устройства соединяются напрямую, VPS в основном обслуживает веб-панель, API, PostgreSQL и сигнализацию. Если многие клиенты постоянно работают за сложным NAT, coturn может потреблять заметный трафик и CPU.
| Сценарий | CPU | RAM | Диск | Сеть |
|---|---|---|---|---|
| Тестовая сеть до 10 устройств | 1 vCPU | 2 ГБ | 25 ГБ SSD | 100 Мбит/с, публичный IPv4 |
| Команда 10–50 устройств | 2 vCPU | 4 ГБ | 40–60 ГБ NVMe/SSD | 1 Гбит/с, IPv4, 2–5 ТБ трафика |
| 50–200 устройств или активный TURN | 4 vCPU | 8 ГБ | 80 ГБ NVMe | 1 Гбит/с, высокий либо безлимитный трафик |
| Несколько сотен устройств, много relay-трафика | 8 vCPU | 16 ГБ | 160 ГБ NVMe | 1–10 Гбит/с, отдельный TURN-сервер |
Для большинства личных инфраструктур и небольших команд практичный стартовый вариант — 2 vCPU, 4 ГБ RAM, 50 ГБ NVMe, выделенный IPv4 и порт 1 Гбит/с. Например, можно взять VPS с указанными характеристиками, установить Ubuntu Server 24.04 LTS и оставить запас памяти для PostgreSQL, Docker и будущего мониторинга.
Почему нужен публичный IPv4
Публичный IPv4 упрощает работу TURN и доступ к management-панели. IPv6 полезен, но не заменяет IPv4: часть мобильных и домашних провайдеров всё ещё работает через IPv4 NAT, а некоторые клиенты могут не иметь полноценной IPv6-связности. В идеале сервер должен иметь оба адреса.
Проверьте, разрешает ли провайдер входящий UDP-трафик. Для работы NetBird обычно нужны UDP-порты WireGuard и TURN. Если UDP фильтруется на уровне площадки, часть клиентов будет подключаться нестабильно или вообще не сможет использовать relay.
Когда нужен dedicated, а не VPS
Dedicated-сервер оправдан не из-за самого control plane, а из-за сетевой нагрузки и требований к изоляции. Он полезен, если TURN регулярно передаёт сотни мегабит в секунду, сеть используется как шлюз для большого числа сотрудников, требуется гарантированная производительность CPU или политика безопасности запрещает shared-virtualization.
Для 5–100 peers dedicated обычно не нужен. Гораздо эффективнее начать с VPS, включить мониторинг нагрузки и отдельно вынести coturn на второй VPS, если relay-трафик стал узким местом. Такое разделение легче масштабировать и обслуживать, чем преждевременная миграция на крупный сервер.
Как выбрать локацию
Локация влияет прежде всего на задержку до control plane и TURN-релея. Прямые WireGuard-соединения между peers не обязаны проходить через VPS, поэтому два клиента из одного города будут обмениваться данными с низкой задержкой независимо от страны control plane. Однако при relay-соединении весь трафик пойдёт через TURN.
Размещайте VPS ближе к большинству пользователей или к критичным сетям. Если команда распределена между Европой и Азией, выберите нейтральную точку для панели и при необходимости добавьте второй TURN-релей в другом регионе. Для доступа к домашнему серверу выбирайте локацию с хорошим маршрутом до домашнего ISP, а не только минимальной ценой.
Подготовка сервера
Инструкция рассчитана на чистый сервер с Ubuntu Server 24.04 LTS x86_64. Эта версия имеет длительный срок поддержки, современное ядро и стабильные пакеты Docker. Перед началом создайте DNS-запись типа A: netbird.example.com должна указывать на публичный IPv4 VPS. Если используется IPv6, добавьте также AAAA-запись.
Не устанавливайте NetBird от имени root напрямую. Создайте отдельного администратора, добавьте SSH-ключ и только после проверки отключайте парольный вход. Оставьте текущую root-сессию открытой до того момента, когда убедитесь, что вход новым пользователем работает.
Обновление операционной системы
Подключитесь к серверу через SSH и установите актуальные обновления. Команда обновляет индекс пакетов, применяет патчи безопасности и перезагружает сервер только при необходимости.
sudo apt update && sudo apt full-upgrade -y
sudo reboot
После перезагрузки подключитесь снова и проверьте версию системы.
cat /etc/os-release
uname -r
Создание пользователя и настройка SSH
Замените vpnadmin на собственное имя пользователя. На рабочем компьютере предварительно создайте ключ командой ssh-keygen -t ed25519, если его ещё нет.
sudo adduser vpnadmin
sudo usermod -aG sudo vpnadmin
sudo install -d -m 700 -o vpnadmin -g vpnadmin /home/vpnadmin/.ssh
Скопируйте публичный ключ в файл authorized_keys. Вставьте одну строку, начинающуюся с ssh-ed25519, вместо примера.
sudo nano /home/vpnadmin/.ssh/authorized_keys
sudo chown vpnadmin:vpnadmin /home/vpnadmin/.ssh/authorized_keys
sudo chmod 600 /home/vpnadmin/.ssh/authorized_keys
Откройте второе окно терминала и проверьте вход: ssh vpnadmin@SERVER_IP. Только после успешной проверки изменяйте настройки SSH-демона.
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
Добавьте или измените следующие параметры. Если вы меняете порт SSH, не забудьте открыть его в firewall до перезапуска сервиса.
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
AllowUsers vpnadmin
sudo sshd -t
sudo systemctl restart ssh
Базовые утилиты, firewall и fail2ban
Установите инструменты диагностики, firewall и защиту от перебора SSH-паролей. Даже при отключённой парольной аутентификации fail2ban полезен для снижения шума в логах и блокировки подозрительных источников.
sudo apt install -y ca-certificates curl gnupg git jq vim \
ufw fail2ban unattended-upgrades dnsutils htop
Откройте только необходимые порты. В этом примере SSH работает на стандартном TCP 22, веб-панель использует 80 и 443, WireGuard NetBird использует UDP 51820, а coturn — UDP/TCP 3478 и диапазон relay-портов UDP 49152–49200. Узкий диапазон упрощает firewall, но ограничивает число одновременных relay-сессий; для небольшой команды он достаточен.
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP ACME'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw allow 51820/udp comment 'NetBird WireGuard'
sudo ufw allow 3478/tcp comment 'TURN TCP'
sudo ufw allow 3478/udp comment 'TURN UDP'
sudo ufw allow 49152:49200/udp comment 'TURN relay range'
sudo ufw enable
sudo ufw status verbose
Создайте минимальную конфигурацию fail2ban. Значение bantime равно одному часу, а после пяти неудачных попыток адрес будет временно заблокирован.
sudo tee /etc/fail2ban/jail.d/sshd.local > /dev/null <<'EOF'
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
Также включите автоматические security-обновления Ubuntu. Docker-образы автоматически обновлять не следует: их лучше обновлять вручную в запланированное окно, после резервного копирования и проверки release notes.
sudo dpkg-reconfigure --priority=low unattended-upgrades
sudo systemctl status unattended-upgrades --no-pager
Установка ПО — пошагово
В 2026 году удобнее всего развернуть self-hosted NetBird через официальный Docker Compose-пакет. Он устанавливает согласованный набор контейнеров: management, signal, dashboard, PostgreSQL, coturn и identity provider. Не собирайте образы из случайных сторонних репозиториев: control plane содержит ключи, токены и данные о вашей внутренней сети.
Перед запуском проверьте актуальную стабильную версию в официальном GitHub release NetBird. В командах ниже используется официальный установочный скрипт getting-started.sh, который скачивает актуальный релизный стек. Это безопаснее, чем фиксировать номер версии, который мог устареть к моменту чтения статьи.
Установка Docker Engine
Сначала удалите старые конфликтующие пакеты Docker, если они были установлены из репозитория Ubuntu. Команда не удаляет ваши данные Docker в /var/lib/docker, но на новом сервере их обычно нет.
sudo apt remove -y docker.io docker-compose docker-compose-v2 \
docker-doc podman-docker containerd runc 2>/dev/null || true
Добавьте официальный GPG-ключ и репозиторий Docker для Ubuntu 24.04.
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Установите Docker Engine и Compose plugin. На начало 2026 года используйте актуальную стабильную ветку Docker Engine из официального репозитория; проверка ниже покажет фактически установленную версию.
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
docker version
docker compose version
Разрешите пользователю vpnadmin запускать Docker без sudo. После добавления в группу выйдите из SSH-сеанса и войдите снова, иначе группа не применится.
sudo usermod -aG docker vpnadmin
exit
После повторного входа выполните тест. Контейнер должен вывести строку приветствия и завершиться без ошибки прав доступа.
docker run --rm hello-world
Получение официального self-hosted пакета
Создайте каталог для инфраструктурных файлов. Не используйте /tmp: он может очищаться системой. Каталог /opt/netbird удобен для сервисов, но владельцем сделаем администратора, чтобы не работать от root.
sudo install -d -m 750 -o vpnadmin -g vpnadmin /opt/netbird
cd /opt/netbird
Задайте полное доменное имя. Оно должно уже резолвиться в IP-адрес VPS, иначе автоматическое получение TLS-сертификата через Let's Encrypt не сработает.
export NETBIRD_DOMAIN="netbird.example.com"
getent ahostsv4 "$NETBIRD_DOMAIN"
Скачайте официальный installer из latest release и сначала просмотрите первые строки скрипта. Проверка перед запуском особенно важна для скриптов, которые получают права на запуск Docker-контейнеров.
curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh \
-o getting-started.sh
less getting-started.sh
chmod 700 getting-started.sh
Запустите скрипт с переменной домена. Официальный bootstrap создаёт Compose-конфигурацию, файл окружения и стартовые настройки self-hosted NetBird. Если upstream installer запросит параметры identity provider или email для ACME, укажите рабочий адрес и сохраните все выданные секреты в защищённом password manager.
NETBIRD_DOMAIN="$NETBIRD_DOMAIN" ./getting-started.sh
После завершения установки проверьте, какие файлы были созданы. Названия могут немного отличаться между версиями NetBird, поэтому ориентируйтесь на фактический вывод скрипта, а не создавайте второй Compose-стек вручную.
cd /opt/netbird
find . -maxdepth 2 -type f | sort
docker compose ps
Проверка контейнеров и журналов
Все критичные контейнеры должны быть в состоянии running или healthy. Первое получение TLS-сертификата может занять одну-две минуты. Если контейнеры перезапускаются, сразу смотрите логи, а не пытайтесь многократно выполнять установку поверх существующей конфигурации.
docker compose ps
docker compose logs --tail=100
docker compose logs --tail=100 management
docker compose logs --tail=100 coturn
Проверьте доступность HTTPS. Флаг -I запрашивает только HTTP-заголовки. Ответ 200, 302 или 307 обычно означает, что reverse proxy и dashboard доступны.
curl -I https://netbird.example.com
curl -fsS https://netbird.example.com/ > /dev/null && echo "HTTPS OK"
Конфигурация
После bootstrap не спешите подключать все серверы. Сначала зафиксируйте конфигурацию, убедитесь в наличии TLS и создайте отдельную административную учётную запись. В зависимости от версии self-hosted пакета NetBird экран входа может использовать встроенный Zitadel либо внешний OpenID Connect provider. Логика одинакова: identity provider отвечает за аутентификацию, а NetBird management отвечает за peers и политики сети.
Работа с файлом окружения
Официальный installer обычно создаёт файл вида setup.env, .env или аналогичный. В нём находятся домен, URL сервисов, пароли PostgreSQL, секреты OIDC и TURN credentials. Ограничьте доступ к этому файлу: права 600 обязательны, потому что утечка переменных позволяет захватить control plane.
cd /opt/netbird
ls -la
find . -maxdepth 2 -type f \( -name ".env" -o -name "setup.env" \) -print
chmod 600 .env 2>/dev/null || true
chmod 600 setup.env 2>/dev/null || true
Ниже показан типовой фрагмент, а не файл для слепой замены. Названия переменных могут отличаться в конкретном релизе. Не публикуйте реальные значения, не сохраняйте их в Git и не отправляйте в чат-боты или тикеты.
NETBIRD_DOMAIN=netbird.example.com
NETBIRD_MGMT_API_ENDPOINT=https://netbird.example.com:443
NETBIRD_MGMT_GRPC_API_ENDPOINT=https://netbird.example.com:443
NETBIRD_AUTH_AUDIENCE=netbird
POSTGRES_DB=netbird
POSTGRES_USER=netbird
POSTGRES_PASSWORD=CHANGE_TO_A_LONG_RANDOM_SECRET
TURN_MIN_PORT=49152
TURN_MAX_PORT=49200
Сгенерировать безопасный секрет можно локально на сервере. Не используйте короткие пароли или повторяющиеся значения для PostgreSQL, Zitadel и TURN.
openssl rand -base64 48
TLS/HTTPS и Caddy
Официальный quickstart NetBird обычно включает reverse proxy и автоматический TLS. Во многих релизах для этого применяется Caddy, который слушает порты 80 и 443 и получает сертификат Let's Encrypt. Если installer уже поднял Caddy, не ставьте второй Caddy или Nginx на хост: два процесса не смогут одновременно занять TCP-порты 80 и 443.
Проверьте, какой контейнер публикует веб-порты. В выводе должен быть сервис с привязкой 0.0.0.0:80->80 и 0.0.0.0:443->443.
docker compose ps
sudo ss -lntup | grep -E ':(80|443|3478|51820)\b'
Если вы сознательно управляете reverse proxy самостоятельно, пример минимального Caddyfile для dashboard и management API выглядит так. Реальные внутренние имена контейнеров и порты возьмите из поставляемого NetBird Compose-файла. Не копируйте пример, пока не сверите их через docker compose config.
netbird.example.com {
encode zstd gzip
handle /api/ {
reverse_proxy management:33073
}
handle /ws-proxy/ {
reverse_proxy signal:10000
}
handle {
reverse_proxy dashboard:80
}
}
Проверьте дату сертификата и имя в Subject Alternative Name. Ошибка сертификата почти всегда означает неверную DNS-запись, закрытый TCP 80/443, наличие другого proxy или попытку запросить сертификат для домена, который ещё не распространился в DNS.
echo | openssl s_client -connect netbird.example.com:443 \
-servername netbird.example.com 2>/dev/null | \
openssl x509 -noout -subject -issuer -dates
Создание первого администратора
Откройте в браузере https://netbird.example.com. Создайте первого пользователя через встроенный identity provider или через настроенный OIDC. После входа проверьте, что ваш пользователь имеет роль администратора в NetBird dashboard. Сразу включите MFA в identity provider, особенно если панель доступна из публичного интернета.
Для серверов удобнее не использовать личный интерактивный вход. В панели NetBird создайте Setup Key, ограничьте его числом использований и сроком действия. Например, для одного production-сервера создайте ключ на одно использование и удалите его после регистрации узла.
Подключение Linux-peer
На сервере, который вы хотите включить в mesh-VPN, установите официальный NetBird client. Перед запуском сверяйте пакетный репозиторий и команду с документацией вашего релиза. Для Ubuntu/Debian типовой вариант использует install-скрипт NetBird, который добавляет официальный репозиторий.
curl -fsSL https://pkgs.netbird.io/install.sh | sudo bash
sudo apt update
sudo apt install -y netbird
netbird version
Замените SETUP_KEY на одноразовый или ограниченный setup key из панели. Параметр --management-url указывает вашему агенту использовать собственный control plane, а не облачный endpoint.
sudo netbird up \
--management-url https://netbird.example.com \
--setup-key SETUP_KEY
Проверьте состояние агента. В исправной конфигурации команда показывает статус Connected, присвоенный NetBird IP и количество peers. На некоторых версиях команда может выводить дополнительную информацию о signal server и relay.
sudo netbird status
ip addr show wt0 2>/dev/null || ip addr | grep -A2 -B2 netbird
Группы, политики и минимальный ACL
Не оставляйте сеть в режиме «все видят всех», если в ней есть production-серверы. Создайте группы admins, developers, prod-servers и staging. Добавляйте peers в группы по назначению, а не по имени сотрудника: так проще поддерживать правила при смене устройств и ролей.
Минимальная политика может разрешать администраторам доступ ко всем серверам по SSH, разработчикам — только к staging, а production-серверам — исходящие соединения друг с другом только на нужные порты. Политики создаются в Dashboard в разделе Access Control. Для начала используйте правило уровня сети, затем постепенно сужайте его до групп и портов.
| Источник | Назначение | Протокол/порт | Назначение правила |
|---|---|---|---|
| admins | prod-servers | TCP 22 | Администрирование по SSH |
| developers | staging | TCP 22, 80, 443 | Разработка и тестирование |
| prod-servers | prod-servers | Только нужные порты | Связь сервисов без полного доступа |
| all | all | Any | Не использовать в production без необходимости |
Проверка mesh-соединения
Подключите минимум два peer-устройства. В dashboard найдите NetBird IP второго устройства, затем выполните ping и SSH через туннель. Если ping запрещён политикой, проверяйте нужный прикладной порт с помощью nc или curl.
ping -c 4 100.64.0.10
nc -vz 100.64.0.10 22
ssh [email protected]
Для проверки, что доступ идёт именно по VPN, подключитесь к сервису, который firewall разрешает только через интерфейс NetBird. На целевой машине можно посмотреть входящие соединения и интерфейс маршрута.
ip route get 100.64.0.10
sudo ss -tnp | grep ':22'
Маршрут в локальную подсеть и exit node
NetBird умеет публиковать маршруты в сети за одним peer. Например, сервер в офисе с доступом к 192.168.50.0/24 может стать routing peer. Для этого на нём включают IP forwarding, а маршрут добавляют в Dashboard и назначают группе-получателю.
sudo tee /etc/sysctl.d/99-netbird-forwarding.conf > /dev/null <<'EOF'
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF
sudo sysctl --system
После включения forwarding настройте firewall/NAT в соответствии с вашей схемой. Не публикуйте домашнюю подсеть целиком без ACL: сначала разрешите доступ только группе администраторов. Exit node, через который клиент отправляет весь интернет-трафик, требует особенно аккуратной настройки NAT, мониторинга трафика и понимания юридических последствий использования публичного IP.
Бэкапы и обслуживание
Контейнеры NetBird можно пересоздать, но данные control plane без резервной копии восстановить сложно. Главный актив — PostgreSQL: в ней находятся пользователи, peers, политики, маршруты, настройки и связанные данные identity provider. Отдельно сохраняйте Compose-файлы, файлы окружения, Caddy-данные и все ключи OIDC/TURN.
Что нужно бэкапить
- Дамп PostgreSQL в логическом формате
pg_dump. - Каталог
/opt/netbirdбез временных файлов и без Docker image layers. - Docker volumes, если в них хранятся данные PostgreSQL, Zitadel и Caddy.
- Файлы
.env,setup.env, Compose YAML и Caddyfile. - Секреты identity provider, recovery codes MFA и документацию по DNS-записям.
- Список setup keys и административных пользователей, но не активные ключи в открытом виде.
Перед настройкой автоматизации выясните имена контейнера PostgreSQL и volume. Это важно: имя может быть не просто postgres. Команда ниже покажет сервисы и подключённые volumes.
cd /opt/netbird
docker compose ps
docker compose config --services
docker volume ls
Установка restic и подготовка хранилища
Хранить единственную копию на том же VPS бессмысленно: при удалении сервера, сбое диска или компрометации root-доступа она может быть потеряна вместе с данными. Используйте S3-совместимое объектное хранилище, отдельный backup-VPS по SFTP или другой независимый сервер.
Ниже используется restic с S3. Замените значения на реквизиты своего хранилища. Пароль репозитория restic должен храниться вне самого VPS, например в password manager. После инициализации удалите экспортированные переменные из интерактивной shell history либо используйте защищённый root-only файл.
sudo apt install -y restic
sudo install -d -m 700 /root/.config/restic
sudo nano /root/.config/restic/netbird.env
sudo chmod 600 /root/.config/restic/netbird.env
export RESTIC_REPOSITORY="s3:https://s3.example.com/netbird-backups"
export RESTIC_PASSWORD="REPLACE_WITH_LONG_UNIQUE_RESTIC_PASSWORD"
export AWS_ACCESS_KEY_ID="REPLACE_WITH_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="REPLACE_WITH_SECRET_KEY"
Инициализируйте репозиторий один раз. Команда создаст зашифрованную структуру backup-репозитория.
sudo bash -c 'source /root/.config/restic/netbird.env && restic init'
Скрипт автоматического бэкапа
Создайте скрипт. Он делает дамп PostgreSQL во временный каталог, сохраняет конфигурацию, отправляет данные в restic и очищает локальные дампы старше семи дней. Замените postgres и netbird на реальные имя сервиса и имя базы из вашего Compose-файла.
sudo tee /usr/local/sbin/backup-netbird.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
source /root/.config/restic/netbird.env
STACK_DIR="/opt/netbird"
BACKUP_DIR="/var/backups/netbird"
DATE="$(date +%F_%H-%M-%S)"
PG_SERVICE="postgres"
PG_DATABASE="netbird"
PG_USER="netbird"
mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"
cd "$STACK_DIR"
docker compose exec -T "$PG_SERVICE" \
pg_dump -U "$PG_USER" -Fc "$PG_DATABASE" \
> "$BACKUP_DIR/postgres_${DATE}.dump"
restic backup \
"$BACKUP_DIR" \
"$STACK_DIR/.env" \
"$STACK_DIR/setup.env" \
"$STACK_DIR/docker-compose.yml" \
--tag netbird --tag postgres
restic forget --tag netbird \
--keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune
find "$BACKUP_DIR" -type f -name '.dump' -mtime +7 -delete
EOF
sudo chmod 700 /usr/local/sbin/backup-netbird.sh
Запустите скрипт вручную до добавления в cron. Затем проверьте список snapshot-ов. Если команда вернула ошибку о несуществующем сервисе, посмотрите docker compose config --services и исправьте PG_SERVICE.
sudo /usr/local/sbin/backup-netbird.sh
sudo bash -c 'source /root/.config/restic/netbird.env && restic snapshots'
Добавьте ежедневный запуск в 03:25. Время выбирайте с учётом часового пояса сервера и периода наименьшей нагрузки.
sudo tee /etc/cron.d/netbird-backup > /dev/null <<'EOF'
25 3 root /usr/local/sbin/backup-netbird.sh >> /var/log/netbird-backup.log 2>&1
EOF
Проверка восстановления
Бэкап, который не проверяли восстановлением, нельзя считать рабочим. Раз в квартал поднимайте временную VM, скачивайте snapshot, восстанавливайте конфиги и пробуйте импортировать PostgreSQL в тестовый контейнер. Не тестируйте восстановление на production-базе.
sudo bash -c 'source /root/.config/restic/netbird.env && restic check'
sudo bash -c 'source /root/.config/restic/netbird.env && restic restore latest --target /tmp/netbird-restore'
Обновления NetBird
Для небольшой сети используйте maintenance window: предупредите пользователей, сделайте бэкап, прочитайте release notes, обновите контейнеры и проверьте подключение двух peers. Rolling update имеет смысл только при нескольких экземплярах control plane и спланированной внешней базе данных; на одном VPS краткий перерыв обычно безопаснее и проще.
cd /opt/netbird
sudo /usr/local/sbin/backup-netbird.sh
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100
Не запускайте бездумно docker system prune -a на production-сервере: команда может удалить образы, нужные для быстрого rollback. Сохраняйте предыдущие версии образов до завершения проверки. После обновления проверьте login в dashboard, регистрацию тестового peer, status существующего клиента и TURN-связность из сети с NAT.
Troubleshooting + FAQ
Почему браузер показывает ошибку TLS-сертификата или сайт не открывается?
Сначала проверьте DNS: команда dig +short netbird.example.com A должна вернуть IP вашего VPS. Затем убедитесь, что TCP 80 и 443 открыты и не заняты другим Nginx, Apache или Caddy: sudo ss -lntp. Посмотрите логи reverse proxy через docker compose logs. Для Let's Encrypt домен должен быть публично доступен во время HTTP-01 challenge. Если используется проксирование DNS/CDN, временно отключите его либо настройте DNS challenge.
Peer зарегистрирован, но статус остаётся Disconnected. Что проверить?
На клиенте выполните sudo netbird status и убедитесь, что management URL указывает на ваш домен. Проверьте разрешение DNS и доступность HTTPS: curl -I https://netbird.example.com. На сервере откройте логи management и signal-контейнеров. Частая причина — неверный внешний URL в файле окружения, просроченный setup key или policy/firewall, блокирующие исходящий HTTPS у клиента. После исправления выполните sudo netbird down и снова sudo netbird up.
Устройства видят друг друга в панели, но ping и SSH не работают. Почему?
Проверьте ACL-политику в Dashboard: наличие peer в сети не означает автоматическое разрешение любого трафика. Затем проверьте локальный firewall целевого сервера: UFW может разрешать SSH только с публичного интерфейса или только с конкретной подсети. Посмотрите NetBird IP обоих peers и маршрут командой ip route get PEER_IP. Для диагностики временно создайте узкое правило, разрешающее TCP 22 между двумя тестовыми группами, а не глобальное правило all-to-all.
Почему соединение работает медленно или идёт через relay?
Это обычно означает, что peers не смогли установить прямой UDP-путь и используют TURN. Проверьте доступность UDP 3478, UDP 51820 и relay-диапазона UDP 49152–49200 на VPS, включая внешний firewall провайдера. На домашних и корпоративных сетях причиной может быть симметричный NAT или запрет UDP. Посмотрите статус клиента и логи coturn. Relay — нормальный fallback, но его скорость зависит от канала VPS и расстояния до пользователей.
Какой VPS-конфиг минимально подойдёт?
Для личной сети из 3–10 устройств подойдёт 1 vCPU, 2 ГБ RAM, 25 ГБ SSD и публичный IPv4. Для стабильной эксплуатации с PostgreSQL, dashboard, coturn и запасом на обновления лучше выбирать 2 vCPU, 4 ГБ RAM и 40–50 ГБ NVMe. Если ожидается много клиентов за NAT, важнее не размер диска, а пропускная способность и включённый UDP-трафик. Следите за RAM, CPU и исходящим трафиком после запуска.
Что выбрать — VPS или dedicated для этой задачи?
Для большинства self-hosted NetBird-сетей достаточно VPS. Control plane потребляет мало ресурсов, а десятки peers редко требуют выделенного железа. Dedicated нужен при высоком постоянном TURN-трафике, требованиях к аппаратной изоляции, нескольких сотнях активных пользователей или необходимости гарантированной полосы. Практичный путь — начать с VPS на 2–4 vCPU и вынести TURN на отдельную машину, если метрики покажут, что relay стал ограничением.
Как добавить маршрут в домашнюю или офисную подсеть?
Выберите peer, который одновременно подключён к NetBird и к локальной сети, например 192.168.50.0/24. На нём включите net.ipv4.ip_forward=1, затем добавьте маршрут в Dashboard и назначьте группы, которым он доступен. Убедитесь, что обратный маршрут существует: либо локальный роутер знает путь к NetBird-подсети, либо routing peer выполняет NAT. Начинайте с одного хоста или небольшой подсети и проверяйте доступ ACL-правилами.
Можно ли удалить peer, если ноутбук потерян?
Да. Откройте Dashboard, найдите устройство в списке Peers и удалите либо disable его. Management server перестанет выдавать ему актуальную конфигурацию и доступ к сетевым ресурсам будет отозван согласно политике. Дополнительно отключите сессии пользователя в identity provider, смените setup keys, если они могли быть сохранены на устройстве, и проверьте audit events. Не используйте бессрочные setup keys с неограниченным числом регистраций.
Выводы и следующие шаги
Теперь у вас есть self-hosted NetBird control plane с HTTPS, WireGuard mesh-VPN, TURN fallback, базовым firewall и резервным копированием PostgreSQL. Такая схема позволяет объединить VPS, домашние серверы и устройства команды в одну приватную сеть без постоянной зависимости от внешнего облачного control plane.
- Создайте группы по ролям и замените широкие правила доступа на минимально необходимые ACL.
- Подключите мониторинг Docker, диска, TLS-сертификатов и объёма TURN-трафика.
- При росте нагрузки вынесите coturn на отдельный сервер, добавьте второй relay-регион и регулярно тестируйте восстановление из бэкапа.