19 KiB
Установка Docker и развёртывание Proxmox VPS Panel
Полная пошаговая инструкция: от чистого Linux-сервера до работающей панели управления VPS на базе Proxmox VE.
Документ рассчитан на Debian 12 / Ubuntu 22.04+ (это самый частый вариант для Proxmox-хоста и для отдельной VM/LXC под панель). Для других дистрибутивов есть отдельный раздел ниже.
1. Требования
Аппаратные (для VM/LXC, где будет крутиться панель)
| Ресурс | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 vCPU | 2 vCPU |
| RAM | 1 ГБ | 2 ГБ |
| Диск | 8 ГБ | 20 ГБ (с запасом под бэкапы Postgres) |
| Сеть | Доступ до API Proxmox по TCP 8006 | то же |
Программные
- Linux с ядром ≥ 3.10 (для Docker Engine)
- Права
rootили пользователь из группыsudo - Открытый порт
5173(frontend, nginx) — если панель должна быть доступна извне - Доступ до Proxmox VE по HTTPS (порт 8006)
Сетевые
- Сервер панели должен «видеть» Proxmox API (
https://<pve-ip>:8006/api2/json) - Proxmox в свою очередь должен «видеть» сеть, в которой будут создаваться VM/CT
(обычно это один и тот же
vmbr0/ bridge)
2. Установка Docker Engine + Compose
Docker Engine — это сервер контейнеров (демон
dockerd). Docker Compose — это инструмент для описания multi-container приложений в YAML (форматcompose.yaml/docker-compose.yml).
2.1. Debian / Ubuntu (рекомендуемый путь)
# 1. Обновляем индекс пакетов и ставим prerequisites
sudo apt-get update
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# 2. Добавляем официальный GPG-ключ Docker
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 3. Добавляем репозиторий Docker
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 4. Ставим Docker Engine + CLI + Compose plugin
sudo apt-get update
sudo apt-get install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-plugin
Для Ubuntu замените
debianнаubuntuв строке с URL репозитория, остальное идентично.
2.2. Альтернатива: официальный install.sh
Если не хочется возиться с репозиторием — Docker предоставляет скрипт, который сделает всё сам:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Этот же скрипт работает на Debian, Ubuntu, RHEL, Fedora, CentOS, AlmaLinux, Rocky и т. д. — внутри он сам определяет дистрибутив.
2.3. Другие дистрибутивы (краткая сводка)
| Дистрибутив | Что делать |
|---|---|
| Fedora / RHEL / Alma / Rocky | sudo dnf -y install dnf-plugins-core && sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo && sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
| Arch / Manjaro | sudo pacman -S docker docker-compose |
| openSUSE | sudo zypper install docker docker-compose |
| TrueNAS SCALE | см. раздел 8 — там Docker уже встроен |
3. Постустановочная настройка Docker
3.1. Включаем автозапуск демона
sudo systemctl enable --now docker
sudo systemctl status docker # должно быть active (running)
3.2. Разрешаем пользователю работать без sudo
По умолчанию docker требует root. Чтобы не набирать sudo каждый раз:
sudo usermod -aG docker $USER
# После этого нужно ПЕРЕЛОГИНИТЬСЯ (или выполнить newgrp docker):
newgrp docker
Проверка:
docker version
docker compose version
docker run --rm hello-world
Если hello-world скачался и напечатал приветствие — Docker готов.
3.3. Ограничение логов (опционально, но полезно)
Чтобы контейнеры не съедали диск логами, создайте /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
И перезапустите демон:
sudo systemctl restart docker
4. Подготовка Proxmox
Эти шаги делаются в веб-интерфейсе Proxmox.
4.1. API-токен
- Datacenter → Permissions → API Tokens → Add
- User:
root@pam(для теста; в проде лучше завести отдельного пользователя — см. раздел «Безопасность» ниже) - Token ID: например
panel - Privilege Separation: выключить (чтобы токен наследовал все права владельца)
- Скопируйте Secret — он показывается один раз.
В итоге получите пару:
PVE_TOKEN_NAME=root@pam!panel
PVE_TOKEN_VALUE=<тот самый секрет>
Права, которые нужны панели:
VM.Allocate,VM.PowerMgmt,VM.Config.Disk,VM.Config.Network,VM.Config.CPU,VM.Config.Memory,VM.Config.Cloudinit,VM.Clone,VM.Audit,VM.Snapshot,VM.BackupSys.Audit(для чтения статусов задач Proxmox)- Аналогичные права для
PVEAdmin/PVEAuditorна ветке/
В тестовой среде проще всего выдать роль PVEAdmin на корень /.
4.2. Шаблон VM (для VM-инстансов)
- Скачайте cloud-образ, например Ubuntu 22.04:
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img - В Proxmox создайте VM, в Hardware → CD/DVD укажите этот образ.
- В Cloud-Init → User, Password, SSH key — заполните значения по умолчанию (панель их перезапишет своими).
- Запустите VM, убедитесь, что cloud-init отработал и сеть поднялась.
- Выключите VM и превратите её в шаблон:
VMID запомните — он пойдёт в поле
qm template <vmid>source_vmidшаблона в панели.
4.3. Шаблон LXC (для CT-инстансов)
- Узел → local (storage) → CT Templates → Template → вкладка Download
- Скачайте, например,
debian-12-standard_12.7-1_amd64.tar.zst - Готово. В панели поле
source_templateбудет иметь вид:local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst
5. Клонирование и настройка репозитория
5.1. Клонируем
git clone https://gitea.nasweb.ru/host/Proxmox-VPS-Panel.git
cd Proxmox-VPS-Panel
Структура должна выглядеть так:
Proxmox-VPS-Panel/
├── backend/
├── frontend/
├── docker-compose.yml
└── .gitignore
5.2. Готовим .env для backend
cd backend
cp .env.example .env
nano .env # или vim / любой редактор
Заполните:
# Обязательно смените! Сгенерировать: openssl rand -hex 32
SECRET_KEY=<случайная_строка_минимум_32_символа>
# Proxmox API
PVE_HOST=https://192.168.31.2:8006
PVE_NODE=pve
PVE_TOKEN_NAME=root@pam!panel
PVE_TOKEN_VALUE=<ваш_секрет_токена>
# CORS — домен фронтенда через запятую (без пробелов)
ALLOW_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
# Пароль БД — ОБЯЗАТЕЛЬНО должен совпадать с POSTGRES_PASSWORD
# из .env рядом с docker-compose.yml
DATABASE_URL=postgresql://panel:<тот_же_пароль_что_и_POSTGRES_PASSWORD>@db:5432/panel
⚠️
DATABASE_URLобычно собирается автоматически внутриdocker-compose.ymlчерез${POSTGRES_USER}и${POSTGRES_PASSWORD}. Если вы переопределяете его здесь — убедитесь, что хост =db(имя сервиса в compose), а неlocalhost, иначе backend не достучится до Postgres.
5.3. Генерируем секреты
# SECRET_KEY для подписи JWT
openssl rand -hex 32
# POSTGRES_PASSWORD для базы данных
openssl rand -hex 16
5.4. Создаём .env рядом с docker-compose.yml
Вернитесь в корень проекта:
cd ..
cat > .env <<'EOF'
POSTGRES_USER=panel
POSTGRES_PASSWORD=<тот_самый_пароль_из_openssl_rand_hex_16>
POSTGRES_DB=panel
FRONTEND_PORT=5173
EOF
chmod 600 .env # только владелец может читать — там секрет
Этот файл уже в
.gitignore, но на всякий случай не пушьте его.
6. Запуск панели
6.1. Поднимаем стек
docker compose pull # подтянуть базовые образы (postgres, alpine)
docker compose up -d --build
--buildнужен, потому что backend и frontend собираются из исходников (multi-stage Dockerfile внутриbackend/иfrontend/)-dзапускает в фоне
6.2. Проверяем, что всё поднялось
docker compose ps
Все три сервиса (db, backend, frontend) должны быть в статусе running
или healthy. Healthcheck у backend проверяет http://localhost:8000/health,
у frontend — http://localhost:5173/, у БД — pg_isready.
Логи в реальном времени:
docker compose logs -f
# или только backend:
docker compose logs -f backend
6.3. Проверка API вручную
curl http://localhost:5173/api/health
# {"status":"ok"}
curl http://localhost:5173/api/health/ready
# {"status":"ready","db":"ok"}
/api/*проксируется nginx-фронтенда на backend, поэтому порт 8000 наружу не торчит.
6.4. Открываем UI
В браузере:
http://<ip-сервера-панели>:5173
-
Нажмите Register — зарегистрируйтесь.
-
Первый зарегистрированный пользователь автоматически становится админом. Это важно — зайдите первым сами.
-
Войдите как админ, откройте Admin → Templates, создайте шаблон:
- Type:
vmилиlxc - Name: что увидит клиент (например,
Ubuntu 22.04 / 1 vCPU / 1 GB) - Cores / Memory / Disk: сколько ресурсов получит инстанс
- Source VMID (для
vm): VMID вашего VM-шаблона из шага 4.2 - Source template (для
lxc): путь видаlocal:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst
- Type:
-
Выйдите из админа, зарегистрируйте второго пользователя (или попросите клиента) — он уже будет
clientи увидит шаблон в дашборде.
7. Типовые ошибки и что с ними делать
| Симптом | Причина | Решение |
|---|---|---|
POSTGRES_PASSWORD is required при up |
не задан POSTGRES_PASSWORD в .env рядом с compose |
см. шаг 5.4 |
Backend падает с connection refused на db:5432 |
compose стартует backend раньше, чем БД приняла соединения | уже лечится через depends_on: condition: service_healthy; подождите минуту |
pve authentication failed при создании VPS |
неверный PVE_TOKEN_VALUE или истёк токен |
пересоздайте токен в Proxmox и обновите .env, затем docker compose restart backend |
| CORS-ошибка в браузере: «blocked by CORS policy» | в ALLOW_ORIGINS нет домена, с которого открываете панель |
добавьте свой домен/IP в backend/.env → ALLOW_ORIGINS, затем docker compose restart backend |
permission denied при qm template |
вы выполняете не от root | sudo qm template <vmid> |
| Не приходит IP созданной VM | в VM-шаблоне не установлен qemu-guest-agent и не включён в Proxmox |
установите qemu-guest-agent в шаблоне, в опциях VM включите Run guest agent on boot |
| Долго создаётся VM/CT | это нормально — qmclone/pct clone могут занимать минуты на больших дисках |
следите за прогрессом через docker compose logs -f backend или UI Proxmox |
8. Установка на TrueNAS SCALE
TrueNAS SCALE (Cobia / Dragonfish / Electric Eel / Fangtooth) уже содержит Docker Engine и Compose из коробки. Дополнительно ставить ничего не нужно.
8.1. Вариант A: «Custom App» через UI
- Apps → Discover Apps → Custom App
- Application Name:
vps-panel - В секции Container Images / Compose переключитесь на режим
«Custom Compose
» и вставьте содержимое нашегоdocker-compose.yml(или положите файлы в датасет и смонтируйте их как/docker-compose.yml`). - Переменные окружения задайте через UI:
POSTGRES_USER=panelPOSTGRES_PASSWORD=<openssl rand -hex 16>POSTGRES_DB=panelFRONTEND_PORT=5173- На отдельной вкладке для сервиса
backendдобавьте всеPVE_*иSECRET_KEY,ALLOW_ORIGINS, плюсenv_file: ./backend/.env
- Storage:
- Для сервиса
dbсмонтируйтеpanel_db(named volume) или путь на датасете типа/mnt/tank/apps/vps-panel/db
- Для сервиса
- Нажмите Install. Статус появится в Installed Applications.
8.2. Вариант B: shell + docker compose
# Заходим на TrueNAS по SSH или открываем System Settings → Shell
cd /mnt/tank/apps/vps-panel # путь, куда положили репозиторий
cp backend/.env.example backend/.env
nano backend/.env # заполняем
cat > .env <<'EOF'
POSTGRES_USER=panel
POSTGRES_PASSWORD=<openssl rand -hex 16>
POSTGRES_DB=panel
FRONTEND_PORT=5173
EOF
docker compose up -d --build
8.3. Reverse-proxy
TrueNAS Apps умеет автоматически прокидывать порты. Если нужен внешний доступ:
- Встроенный reverse-proxy TrueNAS (например, через приложение
nginx-proxy-managerилиtraefik) - Или собственный reverse-proxy (Caddy, Nginx) с TLS через Let's Encrypt
Обязательно укажите итоговый внешний домен в backend/.env → ALLOW_ORIGINS,
иначе CORS заблокирует запросы.
9. Обновление панели
cd Proxmox-VPS-Panel
git pull
docker compose pull
docker compose up -d --build
docker compose restart
Миграций БД нет (используется Base.metadata.create_all()), так что апгрейд
проходит без ручных шагов. Перед большими апгрейдами рекомендуется
сделать бэкап volume panel_db:
docker compose stop db
docker run --rm \
-v panel_db:/from \
-v $(pwd)/backups:/to \
alpine sh -c "tar czf /to/panel_db_$(date +%F).tgz -C /from ."
docker compose start db
10. Удаление
cd Proxmox-VPS-Panel
docker compose down # остановить и удалить контейнеры
docker compose down -v # + удалить volume panel_db (ВСЕ ДАННЫЕ БД)
docker image prune -a # удалить неиспользуемые образы
Удаление не трогает VM и LXC на Proxmox — их панель создаёт через API, и они продолжат жить независимо.
Краткий чек-лист «поставил и работает»
[ ] Docker Engine + Compose установлены
[ ] docker compose version показывает v2+
[ ] В Proxmox создан API-токен
[ ] В Proxmox есть VM-шаблон (если планируются VM)
[ ] В Proxmox есть CT-шаблон (если планируются LXC)
[ ] git clone репозитория выполнен
[ ] backend/.env заполнен, SECRET_KEY сменён
[ ] POSTGRES_PASSWORD сгенерирован и записан в .env рядом с compose
[ ] docker compose up -d --build — все 3 сервиса running/healthy
[ ] curl /api/health → {"status":"ok"}
[ ] В браузере открыт http://<host>:5173, зарегистрирован админ
[ ] Создан хотя бы один шаблон в Admin → Templates
Если все галочки стоят — панель готова к работе.