Админка: секретный путь, смена ссылки, интервал и принудительное обновление
Панель без публичного входа: страница живёт по ADMIN_PATH, логин/пароль — ADMIN_LOGIN/ADMIN_PASSWORD из .env (пусто = админка выключена и маршруты /api/admin/* не регистрируются, прод можно не трогать). Умеет: посмотреть текущую ссылку и состояние кэша, вставить новую ссылку (проверяется скачиванием и разбором до сохранения, при ошибке откат), принудительно обновить таблицу вне интервала и без проверки modified, задать интервал в минутах (1..1440). Реализация: - backend/admin.py — cookie-сессия на HMAC (ключ = пароль, 12 часов, HttpOnly/SameSite/Secure-за-https), сравнение за постоянное время; compare_digest по байтам — кириллица в логине не роняет сервер; - schedule/settings.py — ссылка и интервал в JSON (SETTINGS_FILE), атомарная запись, терпимость к битому/недоступному файлу (тогда живёт в памяти); - schedule/cache.py — интервал вместо TTL, apply_link с откатом, force_reload, state() для панели; кэш без ссылки больше не роняет старт; - frontend: страница admin.html (вне static, прямой /admin.html закрыт) и прокси /api/admin/* с телом и Set-Cookie; - docker-compose: том schedule_data для настроек, ADMIN_* в окружении; - deploy/: nginx-конфиг и инструкция для стенда dev.schedule.our-place.ru. Тесты: 138 (новые — админ-API, сессии, ссылка/интервал, force, хранилище).
This commit is contained in:
84
deploy/README-dev.md
Normal file
84
deploy/README-dev.md
Normal file
@@ -0,0 +1,84 @@
|
||||
# Тестовый стенд (dev.schedule.our-place.ru)
|
||||
|
||||
Отдельный стенд для обкатки админки: свой каталог, свои порты, своя база
|
||||
настроек. Прод (`/opt/schedule`, `schedule.our-place.ru`) не трогаем — он
|
||||
продолжает работать как раньше.
|
||||
|
||||
Ветка: `admin-panel`.
|
||||
|
||||
## 1. Код
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /opt/schedule-dev && sudo chown "$USER" /opt/schedule-dev
|
||||
git clone -b admin-panel <адрес репозитория> /opt/schedule-dev
|
||||
```
|
||||
|
||||
Адрес — тот же, что у прода: если прод-клон забирает обновления по SSH,
|
||||
берите SSH-адрес (`ssh://git@git.our-place.ru:2222/Mermutef/schedule.git`),
|
||||
если по HTTPS — HTTPS-адрес с токеном:
|
||||
|
||||
```bash
|
||||
git clone -b admin-panel https://Mermutef:<токен>@git.our-place.ru/Mermutef/schedule.git /opt/schedule-dev
|
||||
```
|
||||
|
||||
## 2. .env
|
||||
|
||||
Скопировать `.env.example` в `/opt/schedule-dev/.env` и заполнить:
|
||||
|
||||
```ini
|
||||
SCHEDULE_LINK=https://disk.yandex.ru/i/...
|
||||
SCHEDULE_INTERVAL_MINUTES=15
|
||||
SCHEDULE_RETRY_AFTER=60
|
||||
ADMIN_PATH=/manage-<секретная-часть>
|
||||
ADMIN_LOGIN=<логин>
|
||||
ADMIN_PASSWORD=<пароль>
|
||||
API_PORT=127.0.0.1:8001
|
||||
FRONTEND_PORT=127.0.0.1:8091
|
||||
SCHEDULE_API=http://api:8000
|
||||
SETTINGS_FILE=/data/settings.json
|
||||
```
|
||||
|
||||
Порты 8001/8091 выбраны, чтобы не пересечься с продом (8000/8090).
|
||||
`ADMIN_PATH` — секретный путь страницы админки: его нужно знать, чтобы
|
||||
попасть в панель; на сайте ссылки на него нет.
|
||||
|
||||
## 3. Запуск
|
||||
|
||||
```bash
|
||||
cd /opt/schedule-dev
|
||||
sudo docker compose up -d --build
|
||||
sudo docker compose ps
|
||||
```
|
||||
|
||||
Настройки админки лежат в томе `schedule-dev_schedule_data` и переживают
|
||||
пересборку; посмотреть можно так:
|
||||
|
||||
```bash
|
||||
sudo docker run --rm -v schedule-dev_schedule_data:/data alpine cat /data/settings.json
|
||||
```
|
||||
|
||||
## 4. nginx и сертификат
|
||||
|
||||
```bash
|
||||
sudo cp /opt/schedule-dev/deploy/nginx-dev.conf /etc/nginx/sites-available/dev.schedule.our-place.ru
|
||||
sudo ln -sf /etc/nginx/sites-available/dev.schedule.our-place.ru /etc/nginx/sites-enabled/dev.schedule.our-place.ru
|
||||
sudo nginx -t && sudo systemctl reload nginx
|
||||
sudo certbot --nginx -d dev.schedule.our-place.ru
|
||||
```
|
||||
|
||||
## 5. Проверка
|
||||
|
||||
```bash
|
||||
curl -sI https://dev.schedule.our-place.ru/ | head -3 # 200
|
||||
curl -s -o /dev/null -w '%{http_code}\n' https://dev.schedule.our-place.ru/api/admin/state # 401 (нужен вход)
|
||||
```
|
||||
|
||||
Дальше — открыть `https://dev.schedule.our-place.ru/<ADMIN_PATH>` в браузере,
|
||||
войти логином/паролем из `.env` и проверить: смена ссылки, интервал,
|
||||
«Обновить сейчас».
|
||||
|
||||
## Обновление стенда
|
||||
|
||||
```bash
|
||||
cd /opt/schedule-dev && git pull && sudo docker compose up -d --build
|
||||
```
|
||||
46
deploy/nginx-dev.conf
Normal file
46
deploy/nginx-dev.conf
Normal file
@@ -0,0 +1,46 @@
|
||||
# Тестовый стенд dev.schedule.our-place.ru
|
||||
#
|
||||
# Ставится рядом с прод-сайтом schedule.our-place.ru (тот не трогаем):
|
||||
# отдельный каталог /opt/schedule-dev, отдельные порты, отдельная база настроек.
|
||||
#
|
||||
# sudo cp ~/schedule-dev/deploy/nginx-dev.conf /etc/nginx/sites-available/dev.schedule.our-place.ru
|
||||
# sudo ln -sf /etc/nginx/sites-available/dev.schedule.our-place.ru /etc/nginx/sites-enabled/
|
||||
# sudo certbot --nginx -d dev.schedule.our-place.ru
|
||||
# sudo nginx -t && sudo systemctl reload nginx
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name dev.schedule.our-place.ru;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/html;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 https://$host$request_uri;
|
||||
}
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name dev.schedule.our-place.ru;
|
||||
|
||||
ssl_certificate /etc/letsencrypt/live/dev.schedule.our-place.ru/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/dev.schedule.our-place.ru/privkey.pem;
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
|
||||
client_max_body_size 8m;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:8091;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
# принудительное обновление расписания из админки — до ~2 минут
|
||||
proxy_read_timeout 300s;
|
||||
proxy_send_timeout 300s;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user