Files
schedule/deploy/README-dev.md
Vladislav Kopnin cfa6a99639 Админка: секретный путь, смена ссылки, интервал и принудительное обновление
Панель без публичного входа: страница живёт по 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, хранилище).
2026-09-28 12:06:25 +03:00

3.0 KiB
Raw Blame History

Тестовый стенд (dev.schedule.our-place.ru)

Отдельный стенд для обкатки админки: свой каталог, свои порты, своя база настроек. Прод (/opt/schedule, schedule.our-place.ru) не трогаем — он продолжает работать как раньше.

Ветка: admin-panel.

1. Код

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-адрес с токеном:

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 и заполнить:

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. Запуск

cd /opt/schedule-dev
sudo docker compose up -d --build
sudo docker compose ps

Настройки админки лежат в томе schedule-dev_schedule_data и переживают пересборку; посмотреть можно так:

sudo docker run --rm -v schedule-dev_schedule_data:/data alpine cat /data/settings.json

4. nginx и сертификат

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. Проверка

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 и проверить: смена ссылки, интервал, «Обновить сейчас».

Обновление стенда

cd /opt/schedule-dev && git pull && sudo docker compose up -d --build