# Структура проекта

```text
aag-interactive/
├── apps/
│   ├── api/                 сервер, авторизация, материалы, живые сессии
│   │   ├── src/             код сервера
│   │   ├── tests/           серверные проверки
│   │   ├── config/          исходный образец списка запрещённых слов
│   │   └── data/            локальная база, загрузки и рабочий список слов
│   └── web/                 страницы сайта, стили, скрипты, веб-проверки
│       ├── src/             логика интерфейса и стили
│       ├── tests/           проверки интерфейса
│       └── public/          безопасные публичные образцы
├── packages/contracts/     общие контракты приложения
├── deploy/                 рабочие Docker, Compose, HTTPS, копирование
│   └── examples/           старые примеры конфигурации; не используются
├── docs/                   проектная документация и результаты проверок
├── scripts/                локальный запуск, упаковка, вспомогательные задачи
├── SERVER-SETUP.md         краткая инструкция публикации
└── README.md               обзор возможностей и локальный запуск
```

Рабочая публикация использует только `deploy/compose.yaml`, `deploy/Dockerfile`, `deploy/Caddyfile` и `deploy/.env.server` (копия `.env.server.example`). Файлы в `deploy/examples/` оставлены для истории и не участвуют в запуске.

`apps/api/data/` — **локальные данные**, которые не надо включать в исходники или архив для чистого сервера. На VPS их аналогом служит закрытый постоянный том `/data`. Материалы и пользователи находятся в SQLite, загруженные презентации — в `uploads/`, а рабочий список запрещённых слов — в `word-cloud-blocklist.txt`. Архивирование материала в панели администратора сохраняет возможность восстановления; оно не стирает историю из базы физически.

При упаковке `scripts/package-server.ps1` берёт только необходимые исходники и настройки. Перед публикацией проверьте содержимое архива и настройку домена. Инструкция по публикации: [SERVER-SETUP.md](../SERVER-SETUP.md).
