Дашборд
| Ім'я | Роль | Дата |
|---|
Учасники
| Ім'я | Роль | Теги | Адмін |
|---|
Спільнота
Команда
| Ім'я | Посада | Компетенції | Контакти |
|---|
Розклад
Подія
Учасники app RSVP
Гості —
Аналітика подій
| Дата | Тема | Тип | Статус | Записалось | Ліміт |
|---|
Галерея зображень
Завантажені (0)
Запити на активацію
AI Помічник
Аналіз учасників за запитомФайли та фото
Натисніть або перетягніть файли сюди
Підтримуються: JPG, PNG, GIF, WEBP, PDF, DOC
Чати
| Назва | Тип | Учасників | Повідомлень | Дії |
|---|---|---|---|---|
| Завантаження… | ||||
Сканер квитків
Ініціативи
| Ініціатива | Автор | Відгуків | Статус | Дії |
|---|---|---|---|---|
| Завантаження… | ||||
Розсилки
Налаштування
🎛️ Функції застосунку
Вмикай функцію, коли вона готова до спільноти. Вимкнена — учасники бачать екран «Скоро» з описом і кнопкою «Повідомити».
Застосунок підхоплює зміну при наступному запуску (кеш прапорців оновлюється на старті).🎓 Шаблони програм
При створенні програми обираєш шаблон — назва, опис, ментор, кількість днів, ціна підставляються автоматично.
💳 Шаблони оплати
Шаблони реквізитів для платних подій. До івенту обираєш один або кілька — учасник побачить їх як таби у вікні оплати.
🔔 Сповіщення (за замовчуванням)
Канали доставки по типах. Юзери можуть перевизначити у себе в профілі.
| Тип | 🔔 Push (in-app) |
|---|
Документація
Довідник для адміністраторів
Cloudflare (SSL/CDN) → Traefik (proxy) → Docker → Express (port 5050)
↓
┌────────────────┴────────────────┐
↓ ↓
PostgreSQL Local Files
(Docker local) (uploads)
React Native 0.81
React 19
TypeScript
Drizzle ORM
PostgreSQL (Docker)
esbuild
Traefik reverse proxy
Cloudflare CDN/SSL
Hetzner VPS
Anthropic Claude AI
Sharp (обробка зображень)
bcrypt (паролі)
Створення учасника
- Перейдіть у розділ Учасники
- Натисніть + Новий учасник
- Заповніть обовʼязкові поля: Імʼя, Прізвище, Email
- Оберіть статус та групу
- Натисніть Зберегти
Активація нового учасника
Нові користувачі, які реєструються у застосунку (телефон + пароль або Apple ID), автоматично отримують статус isActive: false. Для активації:
- Перейдіть у розділ Запити — тут відображаються нові неактивовані користувачі
- Перевірте данні учасника, при потребі відредагуйте профіль
- Призначте групу та рівень у полі Прогрес
- Натисніть Активувати — учасник отримає доступ до застосунку
Масове завантаження фото
Фото завантажуються автоматично при створенні/редагуванні учасника. Файл оброблюється Sharp і зберігається у трьох розмірах: thumb (100x100), medium (400x400), full (800x800).
Програма складається з рівнів та груп. Кожна група належить до одного рівня.
Група 1.1, Група 1.2, ... Група 1.11
Рівень 2 — поглиблений курс
Група 2.1, Група 2.4, Група 2.5
Матеріали групи
До кожної групи можна прикріпити навчальні матеріали (PDF, DOC, зображення). Для цього відкрийте деталі групи в розділі Спільнота та завантажте файли через форму.
Створення заняття
- Перейдіть у розділ Розклад
- Натисніть + Додати заняття
- Оберіть групу або "Для всіх" для загального івенту
- Вкажіть дату, час початку і завершення, тему
- За бажанням додайте спікера/ментора, опис та місце/посилання
- Натисніть Зберегти
Типи занять
| Тип | Опис | Поле місця |
|---|---|---|
| Офлайн | Зустріч (Пт/Сб/Нд) | Адреса або назва місця |
| Онлайн | Зустріч (Ср вечір) | Посилання на зустріч (Zoom, Meet) |
| Виїзний | Виїзна подія | Адреса або назва місця виїзду |
Загальні івенти ("Для всіх")
Якщо при створенні заняття обрати "Для всіх", воно буде видимим для всіх учасників у мобільному додатку, незалежно від їхньої групи. Це підходить для загальних зустрічей, презентацій та нетворкінг-подій.
Фільтрація у додатку
У мобільному додатку учасники бачать фільтри: Мої групи (заняття своїх груп + загальні), Всі (все), та фільтр по окремій групі. Учасники без призначеної групи бачать тільки загальні івенти.
| Роль | Опис | Як визначається |
|---|---|---|
| Випускник | Звичайний учасник спільноти (проходить чи пройшов навчання) | Вручну — status = 'graduate' (стан за замовчуванням) |
| Команда | Штатний учасник команди ASPEN | Вручну — status = 'team' |
| Ментор | Куратор групи, досвідчений учасник команди | Вручну — чекбокс "Ментор" на учаснику з роллю Команда (isMentor) |
| Спікер | Запрошений доповідач, учасник команди | Вручну — чекбокс "Спікер" на учаснику з роллю Команда (isSpeaker) |
progress, де вказано до якого рівня/групи він належить. Це визначає, які заняття він бачить у розкладі.
Файлове сховище знаходиться на локальній файловій системі сервера (Docker volume aspen_uploads).
Типи файлів
| Категорія | Формати | Максимум |
|---|---|---|
| Зображення | JPG, PNG, GIF, WEBP, BMP, TIFF | 10 МБ |
| Документи | PDF, DOC, DOCX | 10 МБ |
Обробка зображень
При завантаженні зображення автоматично створюються три розміри: thumb (100×100), medium (400×400), full (800×800). Формат — JPEG з якістю 85%, progressive.
safePath() — захист від path traversal атак. Шлях файлу валідується перед кожним зверненням.
AI-помічник використовує Anthropic Claude для аналізу бази учасників. Він має доступ до списку всіх користувачів і може відповідати на запити про спільноту.
Приклади запитів
ANTHROPIC_API_KEY у файлі .env.
Публічні ендпоінти
| Метод | Шлях | Опис |
|---|---|---|
GET | /api/users | Активні учасники |
GET | /api/users/:id | Деталі учасника |
GET | /api/levels | Рівні програми |
GET | /api/groups | Всі групи |
GET | /api/groups/active | Тільки активні групи |
GET | /api/schedules | Розклад занять |
GET | /api/tags | Теги компетенцій |
GET | /storage/* | Файли (фото, матеріали) |
Авторизація
| Метод | Шлях | Опис |
|---|---|---|
POST | /api/auth/phone/register | Реєстрація (телефон + пароль) |
POST | /api/auth/phone/login | Вхід по телефону |
Адмін ендпоінти (потрібна авторизація)
| Метод | Шлях | Опис |
|---|---|---|
POST | /api/admin/login | Вхід в адмінку |
POST | /api/users | Створити учасника |
PUT | /api/users/:id | Оновити учасника |
DEL | /api/users/:id | Видалити учасника |
POST | /api/schedules | Створити заняття |
PUT | /api/schedules/:id | Оновити заняття |
DEL | /api/schedules/:id | Видалити заняття |
POST | /api/ai/chat | AI-помічник |
Автоматичний деплой
./deploy.sh
Скрипт виконує: rsync файлів на сервер → npm ci → білд Expo + server → Docker rebuild → запуск.
Ручний деплой
# SSH на сервер ssh -i ~/.ssh/hetzner [email protected] cd /opt/sites/aspen # Білд та запуск npm ci && npm run server:build APP_DOMAIN=aspen.redcats.uk npm run expo:static:build docker compose build --no-cache && docker compose up -d # Перевірка логів docker logs aspen -f
Міграція бази даних
DATABASE_URL=... npm run db:push
| Змінна | Опис | Приклад |
|---|---|---|
NODE_ENV | Режим роботи | production |
PORT | Порт сервера | 5000 |
APP_DOMAIN | Домен додатку | aspen.redcats.uk |
DATABASE_URL | PostgreSQL (Neon) | postgresql://... |
SESSION_SECRET | Секрет для Express session | Довільний рядок |
STORAGE_DIR | Директорія файлів | /app/data/uploads |
ANTHROPIC_API_KEY | Ключ Anthropic (AI) | sk-ant-... |
SESSION_SECRET. Без нього використовується fallback-ключ, що небезпечно.
SESSION_SECRET встановлений і не змінюється між деплоями. Якщо учасник неактивний (isActive: false), його сесія може не відновлюватись — активуйте через адмінку.
STORAGE_DIR існує та має права на запис. У Docker це volume aspen_uploads.
ANTHROPIC_API_KEY у .env. Ключ має починатися з sk-ant-. Перевірте баланс та ліміти на dashboard.anthropic.com.