Initial commit: InviteMe production redesign
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
# InviteMe
|
||||
|
||||
Production-система регистрации гостей, рассылки приглашений, выпуска QR-билетов и контроля входа на мероприятия.
|
||||
|
||||
## Возможности
|
||||
|
||||
- Мероприятия и ролевая модель: администратор, организатор и сотрудник на входе.
|
||||
- Импорт гостей из `.xlsx`, закрытое хранение фотографий и генерация QR-кодов.
|
||||
- Фоновая рассылка через SMTP, EWS или локальный Outlook с индивидуальными статусами доставки.
|
||||
- Персональная страница приглашения: RSVP, комментарий, особенности питания, билет и календарь `.ics`.
|
||||
- Сканирование на входе, отчёты о посещаемости и журнал аудита.
|
||||
- PostgreSQL, общие лимиты запросов через Redis, автоматический HTTPS и миграции базы.
|
||||
|
||||
## Запуск в production
|
||||
|
||||
Нужны Linux-сервер с Docker Compose, домен, направленный на сервер, и открытые входящие порты 80/443.
|
||||
|
||||
```bash
|
||||
cp .env.example .env
|
||||
# Заполните DOMAIN и сгенерируйте три секрета в .env.
|
||||
docker compose up -d --build
|
||||
docker compose exec inviteme flask --app run.py create-admin
|
||||
```
|
||||
|
||||
Caddy автоматически получает и продлевает TLS-сертификат. Контейнер приложения напрямую наружу не публикуется.
|
||||
|
||||
Полная инструкция по установке, резервному копированию и обновлению: [docs/PRODUCTION.md](docs/PRODUCTION.md).
|
||||
|
||||
## Локальная разработка
|
||||
|
||||
```bash
|
||||
python -m venv venv
|
||||
venv/bin/pip install -r requirements-dev.txt
|
||||
venv/bin/python run.py
|
||||
```
|
||||
|
||||
На Windows замените `venv/bin/` на `venv\Scripts\`. Локальный режим использует SQLite и разрешает создание первого администратора через веб-страницу.
|
||||
|
||||
## Безопасность
|
||||
|
||||
- Production не запускается без уникальных секретов и обязательных безопасных настроек.
|
||||
- Фотографии, QR-коды, билеты и отчёты находятся вне `static` и выдаются только после проверки доступа.
|
||||
- Организатор видит только собственные мероприятия, а сотрудник на входе — только назначенные ему.
|
||||
- Двойная отметка входа блокируется базой, ошибочный вход отменяется с обязательной записью в аудит.
|
||||
- Изображения ограничиваются по размеру, декодируются, проверяются и сохраняются заново. SVG и анимация запрещены.
|
||||
- Почтовые пароли шифруются перед записью в базу.
|
||||
- Включены CSRF, защищённые cookies, HTTPS, security headers и лимиты запросов через Redis.
|
||||
- Контейнер работает без root, с файловой системой только для чтения и без Linux capabilities.
|
||||
|
||||
## Проверка
|
||||
|
||||
```bash
|
||||
python -m pytest -q
|
||||
pip-audit -r requirements.txt
|
||||
```
|
||||
|
||||
## Структура
|
||||
|
||||
```text
|
||||
app/ Flask-приложение
|
||||
instance/uploads/ закрытые файлы в локальном режиме
|
||||
migrations/ миграции Alembic
|
||||
tests/ регрессионные тесты безопасности
|
||||
docs/PRODUCTION.md инструкция по эксплуатации
|
||||
```
|
||||
|
||||
## Лицензия
|
||||
|
||||
Открытая лицензия не предоставляется. Исходный код предназначен только для разрешённого правообладателем использования.
|
||||
Reference in New Issue
Block a user