Files
Proxmox-VPS-Panel/INSTALL.md
T

488 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Установка 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 (рекомендуемый путь)
```bash
# 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 предоставляет скрипт, который
сделает всё сам:
```bash
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. Включаем автозапуск демона
```bash
sudo systemctl enable --now docker
sudo systemctl status docker # должно быть active (running)
```
### 3.2. Разрешаем пользователю работать без `sudo`
По умолчанию `docker` требует root. Чтобы не набирать `sudo` каждый раз:
```bash
sudo usermod -aG docker $USER
# После этого нужно ПЕРЕЛОГИНИТЬСЯ (или выполнить newgrp docker):
newgrp docker
```
Проверка:
```bash
docker version
docker compose version
docker run --rm hello-world
```
Если `hello-world` скачался и напечатал приветствие — Docker готов.
### 3.3. Ограничение логов (опционально, но полезно)
Чтобы контейнеры не съедали диск логами, создайте `/etc/docker/daemon.json`:
```json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
```
И перезапустите демон:
```bash
sudo systemctl restart docker
```
---
## 4. Подготовка Proxmox
Эти шаги делаются в **веб-интерфейсе Proxmox**.
### 4.1. API-токен
1. **Datacenter → Permissions → API Tokens → Add**
2. User: `root@pam` (для теста; в проде лучше завести отдельного пользователя —
см. раздел «Безопасность» ниже)
3. Token ID: например `panel`
4. Privilege Separation: **выключить** (чтобы токен наследовал все права владельца)
5. Скопируйте **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.Backup`
- `Sys.Audit` (для чтения статусов задач Proxmox)
- Аналогичные права для `PVEAdmin` / `PVEAuditor` на ветке `/`
В тестовой среде проще всего выдать роль `PVEAdmin` на корень `/`.
### 4.2. Шаблон VM (для VM-инстансов)
1. Скачайте cloud-образ, например Ubuntu 22.04:
```bash
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
```
2. В Proxmox создайте VM, в **Hardware → CD/DVD** укажите этот образ.
3. В **Cloud-Init → User**, **Password**, **SSH key** — заполните значения по умолчанию
(панель их перезапишет своими).
4. Запустите VM, убедитесь, что cloud-init отработал и сеть поднялась.
5. Выключите VM и превратите её в шаблон:
```bash
qm template <vmid>
```
VMID запомните — он пойдёт в поле `source_vmid` шаблона в панели.
### 4.3. Шаблон LXC (для CT-инстансов)
1. Узел → **local (storage)** → **CT Templates → Template** → вкладка **Download**
2. Скачайте, например, `debian-12-standard_12.7-1_amd64.tar.zst`
3. Готово. В панели поле `source_template` будет иметь вид:
```
local:vztmpl/debian-12-standard_12.7-1_amd64.tar.zst
```
---
## 5. Клонирование и настройка репозитория
### 5.1. Клонируем
```bash
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
```bash
cd backend
cp .env.example .env
nano .env # или vim / любой редактор
```
Заполните:
```env
# Обязательно смените! Сгенерировать: 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. Генерируем секреты
```bash
# SECRET_KEY для подписи JWT
openssl rand -hex 32
# POSTGRES_PASSWORD для базы данных
openssl rand -hex 16
```
### 5.4. Создаём `.env` рядом с `docker-compose.yml`
Вернитесь в корень проекта:
```bash
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. Поднимаем стек
```bash
docker compose pull # подтянуть базовые образы (postgres, alpine)
docker compose up -d --build
```
- `--build` нужен, потому что backend и frontend собираются из исходников
(multi-stage Dockerfile внутри `backend/` и `frontend/`)
- `-d` запускает в фоне
### 6.2. Проверяем, что всё поднялось
```bash
docker compose ps
```
Все три сервиса (`db`, `backend`, `frontend`) должны быть в статусе `running`
или `healthy`. Healthcheck у backend проверяет `http://localhost:8000/health`,
у frontend — `http://localhost:5173/`, у БД — `pg_isready`.
Логи в реальном времени:
```bash
docker compose logs -f
# или только backend:
docker compose logs -f backend
```
### 6.3. Проверка API вручную
```bash
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
```
1. Нажмите **Register** — зарегистрируйтесь.
2. **Первый зарегистрированный пользователь автоматически становится админом.**
Это важно — зайдите первым сами.
3. Войдите как админ, откройте **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`
4. Выйдите из админа, зарегистрируйте второго пользователя (или попросите
клиента) — он уже будет `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
1. **Apps → Discover Apps → Custom App**
2. **Application Name**: `vps-panel`
3. В секции **Container Images / Compose** переключитесь на режим
«Custom Compose`» и вставьте содержимое нашего `docker-compose.yml`
(или положите файлы в датасет и смонтируйте их как `/docker-compose.yml`).
4. Переменные окружения задайте через UI:
- `POSTGRES_USER` = `panel`
- `POSTGRES_PASSWORD` = `<openssl rand -hex 16>`
- `POSTGRES_DB` = `panel`
- `FRONTEND_PORT` = `5173`
- На отдельной вкладке для сервиса `backend` добавьте все `PVE_*` и
`SECRET_KEY`, `ALLOW_ORIGINS`, плюс `env_file: ./backend/.env`
5. **Storage**:
- Для сервиса `db` смонтируйте `panel_db` (named volume) или
путь на датасете типа `/mnt/tank/apps/vps-panel/db`
6. Нажмите **Install**. Статус появится в **Installed Applications**.
### 8.2. Вариант B: shell + `docker compose`
```bash
# Заходим на 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. Обновление панели
```bash
cd Proxmox-VPS-Panel
git pull
docker compose pull
docker compose up -d --build
docker compose restart
```
Миграций БД нет (используется `Base.metadata.create_all()`), так что апгрейд
проходит без ручных шагов. Перед большими апгрейдами рекомендуется
сделать бэкап volume `panel_db`:
```bash
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. Удаление
```bash
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
```
Если все галочки стоят — панель готова к работе.