Files
darko fcafe1ae15 feat: аккаунты по почте с подтверждением, сбросом пароля и синхронизацией прогресса
API аккаунтов на чистой стандартной библиотеке Python (server/splitapi):
- регистрация по почте: пароль задаётся по ссылке из письма, аккаунт создаётся только после подтверждения
- вход, выход, сброс пароля по почте (токены одноразовые, в базе только SHA-256), удаление аккаунта
- пароли scrypt, лимиты попыток по паре «адрес + IP», IP и аккаунту, защита от CSRF
- хранение прогресса пользователя с оптимистичной блокировкой версии
- SMTP через переменные окружения; без SMTP на публичном адресе API не стартует

Клиент: public/auth.js (вход, регистрация, сброс, синхронизация), public/sync.js
(чистое слияние прогресса). Без API сайт работает как раньше.

Развёртывание: Dockerfile.api, сервис splitapi в docker-compose, проксирование /api/
в nginx с ограничением частоты, deploy/install-api-debian.sh (systemd), .env.example.

Тесты: 216 для бэкенда (unittest, покрытие около 97%), 16 для клиентского слияния.
Документация: раздел «Аккаунты и почта» в docs/DEPLOY.md, раздел 9 в docs/ИНСТРУКЦИЯ.md.
2026-10-16 11:25:09 +03:00

31 lines
1.9 KiB
Bash
Raw Permalink 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.
# Образец настроек. Скопируйте в файл .env рядом с docker-compose.yml и измените под себя:
# cp .env.example .env
# Файл .env содержит пароль почтового сервиса: не добавляйте его в git (он уже в .gitignore).
# --- Сайт ---
# Порт и адрес, на котором сайт слушает на сервере (по умолчанию только localhost: за обратным прокси)
#BIND=127.0.0.1
#PORT=8080
# Внешний адрес сайта, как его видят пользователи (из него строятся ссылки в письмах и проверяется Origin).
# Если сайт открывается по подпути, укажите его: https://example.com/trainer
PUBLIC_URL=http://127.0.0.1:8080
# --- Аккаунты ---
# false закроет регистрацию новых пользователей (уже зарегистрированные продолжат входить)
#ALLOW_REGISTRATION=true
# Сколько дней действует вход на устройстве
#SESSION_DAYS=30
# --- Почта (подтверждение регистрации и сброс пароля) ---
# Пока SMTP_HOST не задан, письма не отправляются, а печатаются в лог контейнера splitapi.
# Это только для проверки: на боевом сервере настройте SMTP.
#SMTP_HOST=smtp.example.com
#SMTP_PORT=587
# starttls (порт 587), ssl (порт 465) или none (только для локального релея)
#SMTP_SECURITY=starttls
#SMTP_USER=noreply@example.com
#SMTP_PASSWORD=
# От чьего имени уходят письма (по умолчанию: noreply@домен-сайта)
#MAIL_FROM=Сплит-тренер <noreply@example.com>