# Розгортання особистого кабінету на VPS (`cabinet.mirtvs.pl.ua`)

Інструкція для Ubuntu/Debian. Схема: **nginx (HTTPS) → gunicorn/uvicorn
(127.0.0.1:8000) → PostgreSQL**, застосунок читає дані з 1С по HTTPS.

## 0. Передумови

- VPS з Ubuntu 22.04+/Debian 12+, root/sudo.
- DNS: **A-запис** `cabinet.mirtvs.pl.ua` → IP вашого VPS.
- Встановлені пакети:
  ```bash
  sudo apt update
  sudo apt install -y python3-venv python3-pip postgresql nginx certbot python3-certbot-nginx git ufw
  ```

## 1. Користувач і код

```bash
sudo useradd --system --create-home --home-dir /opt/cabinet --shell /usr/sbin/nologin cabinet
sudo -u cabinet git clone <URL-репозиторію> /opt/cabinet
cd /opt/cabinet/backend
sudo -u cabinet python3 -m venv .venv
sudo -u cabinet .venv/bin/pip install -r requirements.txt
```

### Логотип

Покладіть офіційний логотип КП «ТЕПЛОВОДСЕРВІС» у файл
`/opt/cabinet/frontend/logo.png` (той, що надсилали). Кабінет підхопить його
автоматично. Якщо файлу немає — показується тимчасова іконка `logo.svg`.
За потреби змінити назву/кольори — `frontend/brand.js`.

## 2. PostgreSQL

```bash
sudo -u postgres psql <<'SQL'
CREATE USER cabinet WITH PASSWORD 'ЗАМІНІТЬ_ПАРОЛЬ';
CREATE DATABASE cabinet OWNER cabinet;
SQL
```

## 3. Конфігурація `.env`

```bash
cd /opt/cabinet/backend
sudo -u cabinet cp .env.example .env
sudo -u cabinet nano .env
```
Мінімум змінити:
```
SECRET_KEY=<openssl rand -hex 32>
ADMIN_USERNAME=<логін оператора>
ADMIN_PASSWORD=<надійний пароль>
DATABASE_URL=postgresql+psycopg2://cabinet:ЗАМІНІТЬ_ПАРОЛЬ@localhost:5432/cabinet
CORS_ORIGINS=https://cabinet.mirtvs.pl.ua

# 1С (після публікації сервісу Cabinet — див. onec-1c/)
ONEC_MODE=http
ONEC_HTTP_BASE_URL=https://<IP-або-хост-1С>:<порт>/<база>/hs/cabinet
ONEC_HTTP_USERNAME=<службовий користувач 1С>
ONEC_HTTP_PASSWORD=<пароль>
ONEC_HTTP_VERIFY_SSL=true
```
> Для першого запуску (без 1С) можна лишити `ONEC_MODE=demo`.

## 4. systemd-сервіс

```bash
sudo cp /opt/cabinet/deploy/systemd/cabinet.service /etc/systemd/system/cabinet.service
sudo systemctl daemon-reload
sudo systemctl enable --now cabinet
sudo systemctl status cabinet          # має бути active (running)
curl -s http://127.0.0.1:8000/api/health
```

## 5. Nginx + HTTPS

```bash
sudo mkdir -p /var/www/certbot
sudo cp /opt/cabinet/deploy/nginx/cabinet.mirtvs.pl.ua.conf /etc/nginx/sites-available/cabinet.conf
sudo ln -s /etc/nginx/sites-available/cabinet.conf /etc/nginx/sites-enabled/cabinet.conf

# Отримати сертифікат (nginx-плагін сам додасть/перевірить TLS):
sudo certbot --nginx -d cabinet.mirtvs.pl.ua

sudo nginx -t && sudo systemctl reload nginx
```
Відкрийте `https://cabinet.mirtvs.pl.ua/` — кабінет, `/admin.html` — оператор.

## 5-альт. Якщо у вас Apache (замість nginx)

Коли на сервері вже стоїть Apache з робочим HTTPS (як на
`cabinet.mirtvs.pl.ua`), використайте конфіг
[`deploy/apache/cabinet.mirtvs.pl.ua.conf`](apache/cabinet.mirtvs.pl.ua.conf):

```bash
# 1) увімкнути потрібні модулі
sudo a2enmod proxy proxy_http headers ssl rewrite

# 2) вимкнути стару роздачу файлів цього домену (якщо була), додати наш конфіг
sudo cp /opt/cabinet/deploy/apache/cabinet.mirtvs.pl.ua.conf \
        /etc/apache2/sites-available/cabinet.conf
sudo a2ensite cabinet
# перевірте шляхи до SSL-сертифіката всередині конфіга!

sudo apache2ctl configtest && sudo systemctl reload apache2
```

> Головне: Apache має **проксіювати** на `127.0.0.1:8000`, а не роздавати
> файли репозиторію. Код тримайте в `/opt/cabinet` (поза `DocumentRoot`).

## 6. Фаєрвол

```bash
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
```
На боці **1С**: відкрити порт HTTP-сервісу `Cabinet` **лише для IP цього VPS**.

## 7. Оновлення версії

```bash
cd /opt/cabinet
sudo -u cabinet git pull
sudo -u cabinet backend/.venv/bin/pip install -r backend/requirements.txt
sudo systemctl restart cabinet
```

## 8. Резервні копії

- БД кабінету: `pg_dump cabinet` за розкладом (cron).
- `.env` зберігати окремо (секрети).

## Примітки з безпеки

- `SECRET_KEY`, `ADMIN_PASSWORD`, пароль БД — унікальні й надійні.
- Панель `/admin.html` бажано обмежити за IP (див. закоментований блок у
  конфізі nginx) або винести в окрему мережу.
- Канал VPS ↔ 1С — лише HTTPS і лише з дозволених IP.
