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.
22 lines
793 B
Docker
22 lines
793 B
Docker
# API аккаунтов Сплит-тренера: только стандартная библиотека Python, без сторонних пакетов.
|
|
FROM python:3.13-slim
|
|
|
|
ENV PYTHONUNBUFFERED=1 \
|
|
PYTHONDONTWRITEBYTECODE=1 \
|
|
DB_PATH=/data/splitapi.sqlite3 \
|
|
BIND=0.0.0.0 \
|
|
PORT=8000
|
|
|
|
WORKDIR /app
|
|
COPY server/splitapi /app/splitapi
|
|
|
|
# Без root-прав; /data - единственное место для записи (том с базой SQLite)
|
|
RUN useradd --system --uid 10001 --no-create-home --shell /usr/sbin/nologin app \
|
|
&& mkdir /data && chown 10001:10001 /data
|
|
USER 10001
|
|
|
|
EXPOSE 8000
|
|
VOLUME /data
|
|
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 CMD ["python", "-m", "splitapi", "--healthcheck"]
|
|
CMD ["python", "-m", "splitapi"]
|