# InviteMe Production-система регистрации гостей, рассылки приглашений, выпуска QR-билетов и контроля входа на мероприятия. ## Возможности - Мероприятия и ролевая модель: администратор, организатор и сотрудник на входе. - Импорт гостей из `.xlsx`, закрытое хранение фотографий и генерация QR-кодов. - Фоновая рассылка через SMTP, EWS или локальный Outlook с индивидуальными статусами доставки. - Персональная страница приглашения: RSVP, комментарий, особенности питания, билет и календарь `.ics`. - Сканирование на входе, отчёты о посещаемости и журнал аудита. - PostgreSQL, общие лимиты запросов через Redis, автоматический HTTPS и миграции базы. ## Запуск в production Нужны Linux-сервер с Docker Compose, домен, направленный на сервер, и открытые входящие порты 80/443. ```bash git clone https://git.mycloud24.ru/insight/InviteMe.git cd InviteMe 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 инструкция по эксплуатации ``` ## Лицензия Открытая лицензия не предоставляется. Исходный код предназначен только для разрешённого правообладателем использования.