Установка Portainer на VPS: удобное управление Docker-контейнерами
TL;DR
В этом руководстве мы настроим Portainer CE на вашем виртуальном приватном сервере (VPS), предоставив вам мощный и интуитивно понятный веб-интерфейс для управления всеми вашими Docker-контейнерами, образами, томами и сетями. Это значительно упростит развертывание и мониторинг ваших приложений, избавляя от необходимости постоянно использовать командную строку.
- Portainer CE устанавливается как Docker-контейнер на ваш VPS.
- Вы получите централизованный GUI для управления всеми аспектами Docker.
- Руководство включает подготовку сервера, установку Docker и Portainer, настройку TLS через Caddy.
- Особое внимание уделяется безопасности, резервному копированию и обслуживанию системы.
- Все команды актуальны для Ubuntu 24.04 LTS и версий ПО на 2026 год.
Что мы настраиваем и зачем
Мы будем устанавливать Portainer Community Edition (CE) на ваш VPS. Portainer — это мощный, легковесный инструмент для управления Docker-окружениями, предоставляющий интуитивно понятный веб-интерфейс. Если вы уже работаете с Docker, то знаете, что управление контейнерами, образами, сетями и томами через командную строку может быть достаточно трудоемким, особенно при работе с несколькими проектами или сложными конфигурациями.
В итоге вы получите централизованную панель управления, которая позволит вам:
- Разворачивать и останавливать контейнеры в несколько кликов.
- Управлять Docker-образами и реестрами.
- Настраивать сети и тома для ваших приложений.
- Мониторить состояние контейнеров и их логи.
- Управлять стеками Docker Compose, создавать и редактировать их прямо из интерфейса.
- Настраивать доступ для нескольких пользователей с разными ролями.
Почему self-hosted на VPS, а не облачные альтернативы?
На рынке существуют различные альтернативы для управления контейнерами. Это могут быть облачные управляемые сервисы, такие как AWS Elastic Container Service (ECS), Google Kubernetes Engine (GKE) или Azure Kubernetes Service (AKS). Эти платформы предлагают высокую масштабируемость и абстрагируют вас от инфраструктурных деталей, но часто обходятся значительно дороже и могут быть избыточными для небольших и средних проектов.
Самостоятельное развертывание Portainer на VPS имеет ряд преимуществ:
- Полный контроль: Вы полностью контролируете свою инфраструктуру, данные и конфигурации.
- Экономия затрат: VPS значительно дешевле, чем облачные управляемые сервисы, особенно для небольших нагрузок.
- Гибкость: Вы можете настроить сервер под свои специфические нужды, установить любое дополнительное ПО.
- Опыт и обучение: Управление собственным сервером дает ценные навыки в администрировании систем и Docker.
- Приватность: Ваши данные остаются на вашем сервере, под вашим контролем, что важно для чувствительных проектов.
Portainer идеально подходит для разработчиков, которым нужно быстро поднять тестовые окружения, для соло-фаундеров, управляющих своими SaaS-приложениями, для геймеров, разворачивающих игровые серверы, или для криптоэнтузиастов, запускающих ноды. Он предоставляет баланс между простотой использования и мощностью, делая Docker доступным даже для тех, кто не является экспертом в DevOps.
Какой VPS-конфиг нужен под эту задачу
Portainer сам по себе является достаточно легковесным приложением и потребляет минимум ресурсов. Однако, выбирая VPS, важно учитывать не только требования Portainer, но и потенциальные нагрузки от Docker-контейнеров, которыми вы будете управлять. В 2026 году типичные требования к ресурсам для небольших и средних задач остаются относительно стабильными.
Минимальные требования для Portainer и нескольких небольших контейнеров (например, веб-сервер, база данных, небольшое приложение):
- CPU: Минимум 2 vCPU. Это обеспечит достаточную производительность для работы Docker Engine, Portainer и нескольких активных контейнеров без замедлений.
- RAM: 2-4 ГБ. Portainer использует около 50-100 МБ RAM. Остальное понадобится для операционной системы и ваших контейнеров. Например, веб-сервер (Nginx/Apache), база данных (PostgreSQL/MySQL) и небольшое Node.js/Python приложение могут легко использовать 1-2 ГБ RAM.
- Диск: 50-100 ГБ SSD. SSD-диски критически важны для производительности Docker, так как они ускоряют операции с образами и томами. 50 ГБ будет достаточно для ОС, Docker Engine, нескольких образов и данных приложений. Если вы планируете хранить большие объемы данных (например, логи, медиафайлы, большие базы данных), выбирайте 100 ГБ или больше.
- Сеть: 1 Гбит/с порт. Большинство современных VPS-провайдеров предлагают такую скорость по умолчанию. Это обеспечит быструю загрузку образов Docker и стабильную работу ваших приложений.
Конкретный VPS-план под задачу
Для большинства пользователей, желающих установить Portainer и управлять 3-5 не очень ресурсоемкими контейнерами (например, веб-сервер, база данных, CI/CD агент, небольшой бэкенд), оптимально подойдет VPS с характеристиками:
- 2-4 vCPU
- 4 ГБ RAM
- 100 ГБ SSD
- 1 Гбит/с сетевой порт
Вы можете найти VPS с указанными характеристиками у большинства провайдеров, предлагающих надежные и производительные решения для виртуальных серверов.
Когда нужен dedicated, а не VPS
В некоторых случаях обычного VPS может быть недостаточно, и стоит рассмотреть аренду выделенного сервера (dedicated server):
- Высокие и постоянные нагрузки: Если вы планируете запускать десятки контейнеров, высоконагруженные базы данных, стриминговые сервисы или обрабатывать очень большой трафик.
- Требования к производительности: Для задач, требующих максимальной производительности CPU (например, компиляция кода, машинное обучение) или очень большого объема оперативной памяти (например, in-memory базы данных).
- Специфическое оборудование: Если вам нужны GPU для вычислений, специфичные RAID-массивы или другие аппаратные особенности, недоступные на VPS.
- Строгие SLA и изоляция: Dedicated сервер обеспечивает полную изоляцию ресурсов, что может быть критично для некоторых корпоративных приложений или для соблюдения строгих требований безопасности.
Для управления Portainer и десятками контейнеров на выделенном сервере, вам потребуется подходящий dedicated сервер с мощным многоядерным процессором, 32-64 ГБ RAM и несколькими SSD большой емкости.
Локация: на что влияет
Выбор локации VPS-сервера также важен и зависит от целевой аудитории ваших приложений:
- Задержка (Latency): Чем ближе сервер к вашим пользователям, тем ниже будет задержка и быстрее загрузка страниц или отклик приложений. Если ваша основная аудитория находится в Европе, выбирайте европейский дата-центр.
- Законодательство и соблюдение требований: В некоторых случаях (например, для обработки персональных данных) может потребоваться хранить данные в определенной юрисдикции. Убедитесь, что выбранная локация соответствует всем нормативным требованиям (например, GDPR для ЕС).
- Стоимость: Цены на VPS могут незначительно отличаться в зависимости от локации дата-центра.
Обычно рекомендуется выбирать локацию, которая географически наиболее близка к большинству ваших пользователей, чтобы обеспечить наилучший пользовательский опыт.
Подготовка сервера
Прежде чем устанавливать Docker и Portainer, необходимо выполнить базовую настройку и усиление безопасности вашего VPS. Мы будем использовать Ubuntu 24.04 LTS (Long Term Support) как актуальную и стабильную операционную систему на 2026 год. Все команды выполняются от имени пользователя root или с использованием sudo.
1. Подключение к серверу
Подключитесь к вашему VPS по SSH. Замените your_vps_ip на реальный IP-адрес вашего сервера.
ssh root@your_vps_ip
Если это первое подключение, вас могут попросить подтвердить отпечаток SSH-ключа сервера.
2. Обновление системы
Всегда начинайте с обновления списка пакетов и установки доступных обновлений, чтобы убедиться, что ваша система использует самые актуальные версии ПО.
sudo apt update && sudo apt upgrade -y
Эта команда обновит кэш пакетов и установит все доступные обновления без запроса подтверждения.
3. Создание нового пользователя с правами sudo
Работа под пользователем root не рекомендуется для повседневных задач из соображений безопасности. Создайте нового пользователя и предоставьте ему права sudo.
adduser your_username
Следуйте инструкциям на экране, чтобы задать пароль и другую информацию (можно оставить пустой). Затем добавьте пользователя в группу sudo:
sudo usermod -aG sudo your_username
Теперь вы можете переключиться на нового пользователя и выполнять команды с sudo.
su - your_username
4. Настройка аутентификации по SSH-ключам (рекомендуется)
Аутентификация по SSH-ключам значительно безопаснее, чем использование паролей. Если вы еще не используете SSH-ключи, сгенерируйте их на своей локальной машине.
Скопируйте ваш публичный SSH-ключ на сервер (замените ~/.ssh/id_rsa.pub на путь к вашему ключу, а your_username и your_vps_ip на свои значения):
ssh-copy-id your_username@your_vps_ip
Если ssh-copy-id недоступна, вы можете сделать это вручную:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
Вставьте содержимое вашего публичного ключа (обычно начинается с ssh-rsa AAAA...) в файл authorized_keys и сохраните его. Затем установите правильные права:
chmod 600 ~/.ssh/authorized_keys
5. Отключение входа для пользователя root по SSH
После настройки входа по SSH-ключам для нового пользователя, отключите возможность входа по SSH для root, чтобы повысить безопасность.
sudo nano /etc/ssh/sshd_config
Найдите строку PermitRootLogin и измените ее на:
PermitRootLogin no
Также рекомендуется изменить порт SSH по умолчанию (22) на другой, менее распространенный, чтобы уменьшить количество автоматических атак. Найдите строку #Port 22, раскомментируйте ее и измените на, например, Port 2222. Если вы изменили порт, не забудьте указать его при подключении: ssh -p 2222 your_username@your_vps_ip.
Перезапустите SSH-сервис, чтобы изменения вступили в силу:
sudo systemctl restart sshd
6. Настройка брандмауэра (UFW)
UFW (Uncomplicated Firewall) — это удобный инструмент для управления брандмауэром в Linux. Настройте его, чтобы разрешить только необходимые подключения:
sudo apt install ufw -y # Установка UFW, если еще не установлен
sudo ufw allow OpenSSH # Разрешить SSH (по умолчанию порт 22, или ваш новый порт)
sudo ufw allow http # Разрешить HTTP (порт 80)
sudo ufw allow https # Разрешить HTTPS (порт 443)
sudo ufw allow 9000/tcp # Разрешить порт для Portainer Edge Agent (необязательно, но полезно)
sudo ufw allow 9443/tcp # Разрешить порт для веб-интерфейса Portainer (по умолчанию HTTPS)
sudo ufw enable # Включить UFW
sudo ufw status verbose # Проверить статус брандмауэра
При запросе подтверждения после sudo ufw enable введите y.
7. Установка Fail2Ban
Fail2Ban сканирует логи сервера (например, логи SSH, веб-сервера) и автоматически блокирует IP-адреса, с которых были замечены попытки подбора паролей или другие вредоносные действия. Это значительно повышает безопасность вашего сервера.
sudo apt install fail2ban -y # Установка Fail2Ban
sudo systemctl enable fail2ban # Включение автозапуска сервиса
sudo systemctl start fail2ban # Запуск сервиса
Fail2Ban по умолчанию настроен для защиты SSH. Вы можете настроить его дополнительно, скопировав файл конфигурации:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
В этом файле вы можете настроить параметры, такие как bantime (время блокировки), findtime (период, за который считаются неудачные попытки) и maxretry (максимальное количество неудачных попыток). Для большинства случаев настройки по умолчанию в jail.local достаточны.
8. Настройка синхронизации времени
Правильная синхронизация времени критически важна для работы многих сервисов, включая TLS-сертификаты, логи и распределенные системы.
sudo timedatectl set-ntp true # Включение синхронизации времени по NTP
sudo timedatectl status # Проверка статуса синхронизации
Теперь ваш сервер готов к установке Docker и Portainer. Выполняйте дальнейшие шаги, используя вашего нового пользователя и sudo.
Установка ПО — пошагово
Теперь, когда ваш сервер подготовлен и защищен, можно приступать к установке Docker Engine и Portainer CE. Мы будем использовать актуальные версии ПО на 2026 год, ориентируясь на последние стабильные релизы.
1. Установка Docker Engine (версия 26.0.x)
Docker Engine — это основа, на которой будет работать Portainer и все ваши контейнеры. Мы установим его из официального репозитория Docker, чтобы всегда иметь доступ к актуальным версиям.
1.1. Удаление старых версий Docker (если они есть)
Если ранее на сервере был установлен Docker, рекомендуется удалить все старые версии, чтобы избежать конфликтов.
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt remove $pkg; done
1.2. Установка необходимых утилит
Установите пакеты, необходимые для работы с HTTPS-репозиториями и GPG-ключами.
sudo apt update
sudo apt install ca-certificates curl gnupg -y
1.3. Добавление официального GPG-ключа Docker
Добавьте GPG-ключ Docker, чтобы ваша система могла проверять подлинность пакетов из репозитория Docker.
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
1.4. Добавление репозитория Docker в APT-источники
Добавьте официальный репозиторий Docker для Ubuntu 24.04 (кодовое имя Noble Numbat) в список источников пакетов вашей системы.
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
1.5. Установка Docker Engine, Containerd и Docker Compose
Обновите список пакетов и установите Docker Engine, а также Containerd (среда выполнения контейнеров) и Docker Compose (инструмент для определения и запуска многоконтейнерных Docker-приложений).
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
1.6. Добавление пользователя в группу docker
Чтобы иметь возможность запускать команды Docker без sudo, добавьте вашего пользователя в группу docker.
sudo usermod -aG docker $USER
newgrp docker # Применит изменения к текущей сессии без перелогина
После выполнения newgrp docker, попробуйте выполнить команду Docker без sudo. Если вы не использовали newgrp docker, вам потребуется выйти из SSH-сессии и зайти снова, чтобы изменения вступили в силу.
1.7. Проверка установки Docker
Убедитесь, что Docker Engine установлен и работает корректно, запустив тестовый контейнер hello-world.
docker run hello-world
Вывод должен содержать сообщение о том, что ваш Docker-установлен и работает.
2. Установка Portainer CE (версия 2.21.x)
Теперь, когда Docker установлен, можно развернуть Portainer CE как Docker-контейнер. Мы будем использовать последнюю стабильную версию Portainer CE, которая будет актуальна для 2026 года (например, 2.21.x).
2.1. Создание тома для данных Portainer
Portainer хранит свои конфигурационные данные, базы данных и настройки в постоянном томе. Создайте его, чтобы данные сохранялись даже при обновлении или пересоздании контейнера Portainer.
docker volume create portainer_data
2.2. Запуск контейнера Portainer
Запустите Portainer CE в контейнере. Мы настроим его на автоматический запуск при старте сервера и привяжем необходимые порты и тома.
docker run -d \
-p 8000:8000 \
-p 9443:9443 \
--name portainer \
--restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
Разберем параметры команды:
-d: Запускает контейнер в фоновом режиме (detached mode).-p 8000:8000: Пробрасывает порт 8000 хоста на порт 8000 контейнера. Используется для связи с Edge Agent, если вы будете управлять удаленными Docker-окружениями.-p 9443:9443: Пробрасывает порт 9443 хоста на порт 9443 контейнера. Это основной порт для доступа к веб-интерфейсу Portainer по HTTPS.--name portainer: Присваивает контейнеру имяportainerдля удобства управления.--restart always: Гарантирует, что контейнер Portainer будет автоматически перезапускаться при остановке или перезагрузке сервера.-v /var/run/docker.sock:/var/run/docker.sock: Монтирует сокет Docker из хост-системы в контейнер Portainer. Это позволяет Portainer взаимодействовать с локальным Docker Engine.-v portainer_data:/data: Монтирует созданный нами томportainer_dataв директорию/dataвнутри контейнера, где Portainer хранит свои данные.portainer/portainer-ce:latest: Указывает Docker-образ Portainer Community Edition. Тегlatestвсегда будет указывать на последнюю стабильную версию.
2.3. Проверка статуса контейнера Portainer
Убедитесь, что контейнер Portainer запущен и работает корректно.
docker ps -a | grep portainer
Вывод должен показать контейнер с именем portainer в статусе Up.
Теперь Portainer установлен и запущен. На следующем шаге мы приступим к его начальной настройке и обеспечению безопасного доступа через HTTPS.
Конфигурация
После успешной установки Portainer настало время для его начальной настройки и обеспечения безопасного доступа. Мы настроим доступ к веб-интерфейсу, создадим администратора и, самое главное, обеспечим HTTPS-соединение с помощью обратного прокси-сервера Caddy и автоматических Let's Encrypt сертификатов.
1. Первичный доступ к Portainer UI
Откройте ваш веб-браузер и перейдите по адресу https://your_vps_ip:9443. Вас встретит страница первоначальной настройки Portainer.
- Создайте пользователя-администратора: Введите имя пользователя (например,
admin) и надежный пароль. Обязательно используйте сложный пароль. - Выбор окружения: После создания пользователя Portainer предложит вам выбрать, каким окружением Docker вы хотите управлять. Выберите "Get Started" для управления локальным Docker-окружением на вашем VPS.
Вы попадете в дашборд Portainer. Обратите внимание, что по умолчанию Portainer использует самоподписанный SSL-сертификат, поэтому ваш браузер будет выдавать предупреждение о небезопасном соединении. Мы исправим это, настроив Caddy.
2. Настройка TLS/HTTPS с помощью Caddy (рекомендуется)
Использование Caddy в качестве обратного прокси-сервера — это современный и очень удобный способ обеспечить HTTPS для Portainer и других ваших приложений. Caddy автоматически получает и обновляет сертификаты Let's Encrypt, что значительно упрощает управление TLS.
2.1. Установка Caddy
Мы установим Caddy из его официального репозитория.
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy -y
После установки Caddy будет запущен как системный сервис. Проверьте его статус:
sudo systemctl status caddy
Он должен быть в состоянии active (running).
2.2. Настройка DNS-записи
Для того чтобы Caddy мог получить сертификат Let's Encrypt, вам потребуется доменное имя, указывающее на ваш VPS. Создайте A-запись у вашего регистратора доменов (например, portainer.yourdomain.com) и укажите IP-адрес вашего VPS.
Дождитесь, пока DNS-запись распространится по сети (это может занять от нескольких минут до нескольких часов).
2.3. Настройка Caddyfile
Caddyfile — это основной файл конфигурации для Caddy. Мы настроим его для проксирования запросов с вашего домена на Portainer.
sudo nano /etc/caddy/Caddyfile
Удалите существующее содержимое и вставьте следующее, заменив portainer.yourdomain.com на ваше доменное имя:
portainer.yourdomain.com {
reverse_proxy localhost:9443 {
transport http {
tls_trust_panther_root
insecure_skip_verify
}
}
}
Пояснения к Caddyfile:
portainer.yourdomain.com: Указывает домен, для которого Caddy будет обрабатывать запросы и автоматически получать SSL-сертификат.reverse_proxy localhost:9443: Перенаправляет все входящие запросы на локальный порт 9443, где работает Portainer.transport http { ... }: Этот блок важен, так как Portainer по умолчанию использует внутренний самоподписанный TLS на порту 9443.tls_trust_panther_root: Добавляет в доверенные сертификаты корневой сертификат Let's Encrypt.insecure_skip_verify: ВНИМАНИЕ! Эта опция отключает проверку сертификата бэкенда (Portainer). Используется здесь, потому что Portainer использует самоподписанный сертификат. В производственных условиях для других приложений, где бэкенд имеет валидный сертификат, эту опцию использовать не следует. Для Portainer это допустимо, так как Caddy сам обеспечивает внешний TLS.
Сохраните файл (Ctrl+O, Enter) и закройте редактор (Ctrl+X).
2.4. Применение конфигурации Caddy
Проверьте синтаксис Caddyfile и перезагрузите сервис Caddy.
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
Если все настроено правильно, Caddy перезагрузится без ошибок. Теперь вы можете получить доступ к Portainer по адресу https://portainer.yourdomain.com. Ваш браузер больше не будет выдавать предупреждений о безопасности, так как Caddy предоставит действительный SSL-сертификат от Let's Encrypt.
3. Проверка работоспособности
Убедитесь, что Portainer доступен и работает корректно через доменное имя:
curl -I https://portainer.yourdomain.com
Вы должны увидеть HTTP-статус 200 OK или 302 Found (если Portainer перенаправляет на страницу входа), а также заголовки, указывающие на успешное соединение по HTTPS.
4. Развертывание тестового контейнера через Portainer
Давайте развернем простой веб-сервер Nginx, чтобы убедиться, что Portainer полноценно управляет Docker Engine.
- Войдите в Portainer через ваш домен (
https://portainer.yourdomain.com). - В левом меню выберите "Local" (под "Environments").
- Перейдите в "Containers", затем нажмите "Add container".
- Заполните поля:
- Name:
test-nginx - Image:
nginx:latest - Port mappings: Нажмите "publish a new network port".
- Host port:
8080(или любой свободный) - Container port:
80 - Protocol:
tcp
- Host port:
- Name:
- Нажмите "Deploy the container".
Через несколько секунд контейнер test-nginx должен быть запущен. Проверьте его, открыв в браузере http://your_vps_ip:8080. Вы должны увидеть стандартную приветственную страницу Nginx.
Теперь у вас есть полностью настроенный Portainer с безопасным доступом, готовый к управлению вашими Docker-приложениями.
Бэкапы и обслуживание
Обеспечение регулярного резервного копирования и своевременного обслуживания является критически важным для любой рабочей системы. В этом разделе мы рассмотрим, что именно нужно бэкапить, как автоматизировать этот процесс и как поддерживать вашу систему в актуальном состоянии.
1. Что бэкапить
Для Portainer и ваших Docker-приложений необходимо регулярно создавать резервные копии следующих компонентов:
- Данные Portainer: Это самый важный элемент. Том
portainer_dataсодержит всю конфигурацию Portainer, информацию о пользователях, реестрах, стеках, сетях и томах. Без него восстановление Portainer будет означать потерю всех настроек. - Docker-тома ваших приложений: Все постоянные данные, используемые вашими контейнерами (базы данных, пользовательские файлы, загрузки), хранятся в Docker-томах. Каждый том, помеченный как "persistent" или явно созданный, должен быть забэкаплен.
- Файлы Docker Compose: Если вы используете
docker-compose.ymlдля определения ваших приложений, эти файлы являются их "исходным кодом". Храните их в системе контроля версий (например, Git) и/или включайте в регулярные бэкапы. - Конфигурационные файлы: Конфигурации Caddy (
/etc/caddy/Caddyfile), настройки Fail2Ban (/etc/fail2ban/jail.local) и любые другие кастомные настройки ОС или приложений.
2. Простой скрипт автобэкапа с использованием Restic
Мы будем использовать Restic — современный, быстрый, эффективный и зашифрованный инструмент для резервного копирования. Restic поддерживает множество бэкендов для хранения, включая S3-совместимые хранилища, SFTP, Backblaze B2 и другие.
2.1. Установка Restic
Скачайте последнюю версию Restic и переместите исполняемый файл в /usr/local/bin.
# Проверьте актуальную версию на https://github.com/restic/restic/releases
RESTIC_VERSION="0.16.4" # Актуально на 2026, может меняться
wget https://github.com/restic/restic/releases/download/v${RESTIC_VERSION}/restic_${RESTIC_VERSION}_linux_amd64.bz2
bzip2 -d restic_${RESTIC_VERSION}_linux_amd64.bz2
sudo mv restic_${RESTIC_VERSION}_linux_amd64 /usr/local/bin/restic
sudo chmod +x /usr/local/bin/restic
2.2. Настройка репозитория Restic
Создайте репозиторий Restic. В качестве примера мы будем использовать локальную директорию, но для продакшена крайне рекомендуется использовать удаленное хранилище (S3, Backblaze B2, SFTP).
# Создаем директорию для локального репозитория (только для примера)
sudo mkdir -p /mnt/backups/restic_repo
sudo chown $USER:$USER /mnt/backups/restic_repo
# Инициализируем репозиторий. Замените 'your_strong_password' на ОЧЕНЬ надежный пароль.
# Этот пароль будет нужен для доступа ко всем вашим бэкапам.
export RESTIC_PASSWORD="your_strong_password"
restic init --repo /mnt/backups/restic_repo
Для S3-совместимого хранилища (например, MinIO, AWS S3, DigitalOcean Spaces):
# Замените на свои данные
export AWS_ACCESS_KEY_ID="your_s3_access_key"
export AWS_SECRET_ACCESS_KEY="your_s3_secret_key"
export RESTIC_PASSWORD="your_strong_password"
restic init --repo s3:https://s3.your-region.amazonaws.com/your-bucket-name
2.3. Создание скрипта бэкапа
Создайте файл /usr/local/bin/backup_script.sh:
sudo nano /usr/local/bin/backup_script.sh
Вставьте следующее содержимое:
#!/bin/bash
# --- Настройки ---
# Путь к репозиторию Restic
RESTIC_REPO="/mnt/backups/restic_repo" # Или s3:https://... для удаленного
# Пароль для репозитория Restic
export RESTIC_PASSWORD="your_strong_password"
# Директория для временных файлов бэкапа (если нужно)
BACKUP_TEMP_DIR="/tmp/docker_backups"
# Что бэкапить
PATHS_TO_BACKUP=(
"/var/lib/docker/volumes/portainer_data" # Данные Portainer
"/var/lib/docker/volumes/your_app_data_volume" # Пример: том для вашего приложения
"/etc/caddy/Caddyfile" # Конфигурация Caddy
"/etc/fail2ban/jail.local" # Конфигурация Fail2Ban
"/opt/docker-compose-projects" # Директория с docker-compose.yml файлами
)
# --- Функции ---
# Функция для создания снимков Docker-томов (Portainer сам не останавливаем)
backup_docker_volume() {
local volume_path=$1
local volume_name=$(basename "$volume_path")
echo "Создание временного архива для Docker-тома: $volume_name"
# Для Portainer_data достаточно просто бэкапить директорию
# Для других томов, возможно, потребуется остановка контейнера
# или использование 'docker run --rm -v $volume_name:/volume -v $BACKUP_TEMP_DIR:/backup alpine tar cvf /backup/$volume_name.tar /volume'
}
# --- Основной скрипт ---
echo "--- Запуск бэкапа $(date) ---"
# Создаем временную директорию, если она нужна для сложных бэкапов томов
# mkdir -p "$BACKUP_TEMP_DIR"
# Выполняем бэкап с Restic
/usr/local/bin/restic backup \
"${PATHS_TO_BACKUP[@]}" \
--repo "$RESTIC_REPO" \
--verbose \
--tag "daily-backup" \
--exclude-file /root/.restic_exclude.txt # Пример файла исключений, если нужен
# Очистка старых бэкапов (политика сохранения)
echo "Очистка старых снимков..."
/usr/local/bin/restic forget \
--repo "$RESTIC_REPO" \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 6 \
--prune \
--verbose
echo "--- Бэкап завершен $(date) ---"
# Удаляем временную директорию
# rm -rf "$BACKUP_TEMP_DIR"
Сделайте скрипт исполняемым:
sudo chmod +x /usr/local/bin/backup_script.sh
Важно: Замените your_strong_password на ваш реальный пароль от репозитория Restic. Никогда не храните пароли в открытом виде в продакшене; лучше используйте переменные окружения или секреты Docker. Для cron-задания можно задать RESTIC_PASSWORD прямо в crontab.
Для бэкапа Docker-томов, кроме portainer_data, может потребоваться остановка связанных контейнеров или использование команды docker run --rm -v для создания снимка тома. Однако для большинства приложений, которые корректно обрабатывают IO, достаточно прямого бэкапа директории тома.
3. Автоматизация бэкапов с помощью Cron
Добавьте скрипт в Cron для ежедневного автоматического выполнения.
crontab -e
Выберите редактор (если предложит) и добавьте следующую строку в конец файла, чтобы скрипт запускался каждый день в 3:00 утра:
0 3 * /usr/local/bin/backup_script.sh >> /var/log/backup.log 2>&1
Эта строка будет запускать скрипт ежедневно в 3 часа ночи и перенаправлять весь вывод в файл /var/log/backup.log для последующего анализа.
4. Куда складывать бэкапы
Никогда не храните все бэкапы на том же сервере, что и оригинальные данные. Если сервер выйдет из строя, вы потеряете и данные, и бэкапы.
- Внешний S3-совместимый хранилище: Рекомендуемый вариант. Это может быть AWS S3, Backblaze B2, DigitalOcean Spaces, MinIO или любой другой провайдер объектного хранилища. Это надежно, масштабируемо и относительно недорого.
- Отдельный VPS: Вы можете настроить второй, менее мощный VPS и использовать его исключительно для хранения бэкапов, например, через SFTP или NFS.
- Локальный NAS/внешний диск: Если вы управляете локальным сервером, можно использовать сетевое хранилище.
5. Обслуживание и обновления
Регулярные обновления критически важны для безопасности и стабильности системы.
- Обновление ОС: Регулярно запускайте
sudo apt update && sudo apt upgrade -y. Для Ubuntu LTS это можно делать раз в месяц или по мере выхода важных патчей безопасности. - Обновление Docker Engine: Обновляется вместе с пакетами ОС через
apt upgrade. Всегда проверяйте release notes перед крупными обновлениями. - Обновление Portainer:
- Остановите текущий контейнер Portainer:
docker stop portainer - Удалите текущий контейнер:
docker rm portainer - Скачайте новый образ:
docker pull portainer/portainer-ce:latest - Запустите новый контейнер, используя тот же том данных
portainer_data:docker run -d \ -p 8000:8000 \ -p 9443:9443 \ --name portainer \ --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
Portainer обновится, используя ваши существующие данные.
- Остановите текущий контейнер Portainer:
- Стратегия обновлений:
- Rolling updates (непрерывные): Для некритичных систем можно настроить автоматическое обновление, но это рискованно.
- Maintenance window (окно обслуживания): Рекомендуется планировать обновления на время минимальной нагрузки, предварительно протестировав их на стейджинг-сервере (если есть).
- Мониторинг логов: Регулярно просматривайте логи системы (
journalctl -xe), Docker-контейнеров (docker logs) и Portainer, чтобы выявлять проблемы на ранних стадиях.
Соблюдение этих практик обеспечит стабильность, безопасность и возможность восстановления вашей Docker-инфраструктуры, управляемой Portainer.
Troubleshooting + FAQ
В этом разделе собраны ответы на часто задаваемые вопросы и решения типичных проблем, которые могут возникнуть при установке и использовании Portainer на VPS.
Не могу получить доступ к Portainer по HTTPS через домен.
Что проверить:
- DNS-запись: Убедитесь, что ваша A-запись (например,
portainer.yourdomain.com) корректно указывает на IP-адрес вашего VPS и полностью распространилась по DNS-серверам. Проверьте с помощьюdig portainer.yourdomain.com. - UFW (брандмауэр): Проверьте, разрешен ли порт 443 (HTTPS) в UFW. Команда
sudo ufw status verboseдолжна показать443/tcp ALLOW Anywhere. - Caddy-сервис: Проверьте, запущен ли Caddy и нет ли ошибок в его логах. Команды:
sudo systemctl status caddyиsudo journalctl -u caddy --no-pager. - Caddyfile: Убедитесь, что конфигурация в
/etc/caddy/Caddyfileправильная, доменное имя указано верно, и вы перезагрузили Caddy после изменений (sudo systemctl reload caddy). - Portainer-контейнер: Убедитесь, что контейнер Portainer запущен и слушает на порту 9443. Проверьте с помощью
docker ps -a | grep portainerиdocker logs portainer.
Как фиксить: Исправьте DNS-запись, добавьте правило в UFW, проверьте синтаксис Caddyfile, перезапустите сервисы.
Контейнеры не запускаются или падают сразу после запуска.
Что проверить:
- Логи контейнера: Самый первый шаг — посмотреть логи проблемного контейнера. В Portainer это можно сделать, перейдя в раздел "Containers", выбрав нужный контейнер и нажав "Logs". В командной строке:
docker logs <container_name_or_id>. - Наличие ресурсов: Проверьте, достаточно ли RAM и CPU на VPS. Некоторые контейнеры требуют больше ресурсов, чем вы предполагали.
- Настройки томов (volumes): Убедитесь, что все необходимые тома смонтированы правильно и имеют нужные права доступа.
- Настройки сети: Если контейнер должен взаимодействовать с другими контейнерами или внешней сетью, убедитесь, что его сетевые настройки корректны.
- Ошибки в Dockerfile/docker-compose.yml: Если вы используете свои образы или Docker Compose, проверьте файлы на наличие синтаксических ошибок или неверных путей.
Как фиксить: Анализируйте логи, корректируйте Dockerfile/docker-compose.yml, выделяйте больше ресурсов, проверяйте права доступа к файлам и директориям, используемым томами.
Docker команды требуют sudo, хотя я добавил пользователя в группу docker.
Что проверить:
- Группа docker: Убедитесь, что ваш пользователь действительно находится в группе
docker. Командаgroups $USERдолжна показатьdockerсреди групп. - Перелогин: После добавления пользователя в группу
dockerнеобходимо выйти из SSH-сессии и зайти заново, чтобы изменения вступили в силу. Либо выполнитеnewgrp docker.
Как фиксить: Выйдите из SSH-сессии и залогиньтесь снова, или выполните newgrp docker, чтобы обновить членство в группах для текущей сессии.
Какой VPS-конфиг минимально подойдёт для Portainer и пары небольших приложений?
Для Portainer и 2-3 небольших приложений (например, веб-сервер, база данных, блог на WordPress) вам будет достаточно VPS с 2 vCPU, 2-4 ГБ оперативной памяти и 50-80 ГБ SSD-диска. Это обеспечит комфортную работу Portainer и стабильное функционирование ваших сервисов.
Что выбрать — VPS или dedicated для этой задачи?
Для управления Docker-контейнерами с помощью Portainer и запуска большинства средних проектов (несколько десятков контейнеров, средняя нагрузка) VPS является оптимальным выбором. Он более экономичен, гибок и прост в управлении. Выделенный сервер (dedicated) нужен только в случаях, если вы планируете запускать очень высоконагруженные приложения, сотни контейнеров, или если вам требуется специфическое оборудование (например, мощные GPU) или полная физическая изоляция ресурсов. Для большинства пользователей VPS будет более чем достаточен.
Как обновить Portainer без потери данных?
Обновление Portainer обычно происходит без потери данных, так как все важные данные хранятся в Docker-томе portainer_data. Процесс выглядит так:
- Остановите текущий контейнер Portainer:
docker stop portainer. - Удалите старый контейнер:
docker rm portainer. - Загрузите последнюю версию образа Portainer:
docker pull portainer/portainer-ce:latest. - Запустите новый контейнер, используя те же параметры и тот же том данных
portainer_data:docker run -d \ -p 8000:8000 \ -p 9443:9443 \ --name portainer \ --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v portainer_data:/data \ portainer/portainer-ce:latest
После этого Portainer запустится с новой версией, используя все ваши предыдущие настройки и данные.
Я забыл пароль администратора Portainer. Как его сбросить?
Если вы забыли пароль администратора Portainer, вы можете сбросить его, выполнив следующие шаги:
# Остановите контейнер Portainer
docker stop portainer
# Запустите временный контейнер для сброса пароля
docker run --rm -it \
-v portainer_data:/data \
portainer/portainer-ce:latest \
--admin-password "new_strong_password"
# Замените "new_strong_password" на ваш новый пароль.
# После выполнения этой команды временный контейнер удалится.
# Запустите основной контейнер Portainer снова
docker start portainer
Теперь вы можете войти в Portainer с новым паролем.
Выводы и следующие шаги
В этом подробном руководстве мы успешно настроили Portainer Community Edition на вашем VPS, превратив сложный процесс управления Docker-контейнерами в интуитивно понятную задачу с помощью веб-интерфейса. Вы прошли через все этапы: от подготовки сервера и установки Docker до настройки безопасного доступа через Caddy с автоматическими SSL-сертификатами, а также внедрили базовые практики резервного копирования и обслуживания. Теперь вы полностью контролируете свою Docker-инфраструктуру, имея мощный инструмент для развертывания, мониторинга и управления вашими приложениями.
Вот несколько направлений, куда вы можете двигаться дальше, чтобы максимально использовать возможности вашей новой среды:
- Изучите дополнительные функции Portainer: Portainer предлагает множество продвинутых функций, таких как управление стеками Docker Compose, шаблоны приложений, создание команд и управление доступом на основе ролей (RBAC), интеграция с реестрами образов и многое другое.
- Внедрите CI/CD: Интегрируйте Portainer в ваш рабочий процесс непрерывной интеграции и доставки (CI/CD). Вы можете настроить автоматическое развертывание новых версий ваших приложений в Portainer после успешной сборки.
- Мониторинг и логирование: Рассмотрите возможность установки стека мониторинга, такого как Prometheus и Grafana, для глубокого анализа производительности ваших контейнеров и VPS. Для централизованного логирования можно использовать ELK Stack (Elasticsearch, Logstash, Kibana) или Grafana Loki.
- Масштабирование: Если ваши потребности вырастут, изучите возможности Docker Swarm или даже Kubernetes. Portainer может управлять кластерами Swarm и Kubernetes, предоставляя единый интерфейс для масштабирования ваших приложений.
Ваш VPS теперь является мощной и гибкой платформой для хостинга любых ваших проектов, а Portainer делает управление этой платформой простым и эффективным.