src/Citapp.Admin— Blazor WASM админка (frontend для владельца бизнеса).src/Citapp.BotApi— ASP.NET Core backend (Webhook + API для админки + бизнес-логика слотов/записей).- Supabase — Postgres/Auth/Storage, используется обеими частями.
- Установить .NET 10 SDK.
- В Supabase применить миграции из раздела 6 (все файлы по порядку).
- Настроить переменные окружения для BotApi (см. раздел 4).
- Настроить
src/Citapp.Admin/wwwroot/appsettings.runtime.json(см. раздел 5). - Запустить API:
dotnet run --project src/Citapp.BotApi - Запустить Admin:
dotnet run --project src/Citapp.Admin
- Поднимите BotApi локально/на сервере.
- Укажите в Meta Webhook URL:
https://<botapi-domain>/webhook/whatsapp. - Для локальной разработки можно использовать ngrok:
ngrok http 5001, затем подставитьhttps://<ngrok-id>.ngrok.io/webhook/whatsapp. WHATSAPP_VERIFY_TOKENв BotApi должен совпадать с verify token в Meta.
Итоговая связка: WhatsApp Cloud API → webhook в Citapp.BotApi → чтение/запись данных в Supabase; Citapp.Admin работает отдельно как UI и обращается к BotApi/Supabase.
| Variable | Description |
|---|---|
| SUPABASE_URL | URL Supabase |
| SUPABASE_SERVICE_ROLE_KEY | Secret service role key |
| SUPABASE_DB_CONNECTION_STRING | Строка подключения к Postgres (обязательна для репозиториев BotApi) |
| WHATSAPP_ACCESS_TOKEN | Meta token |
| WHATSAPP_VERIFY_TOKEN | Verify token |
| WHATSAPP_APP_SECRET | App secret for HMAC |
| CORS_ALLOWED_ORIGINS | Список origins через запятую (например: http://localhost:5000,https://your-admin-domain) |
Примечание: если
CORS_ALLOWED_ORIGINSне задан, в Development разрешены толькоhttp://localhost:5000,https://localhost:5001,http://localhost:5173,https://localhost:5173.
Admin читает wwwroot/appsettings.runtime.json на старте, поэтому для статического хостинга (включая GitHub Pages) значения задаются без перекомпиляции.
Обязательные ключи:
{
"Supabase": {
"Url": "https://<project-ref>.supabase.co",
"AnonKey": "<public-anon-key>",
"ServiceMediaBucket": "service-media"
},
"BotApi": {
"BaseUrl": "https://<botapi-domain>"
}
}Применяйте файлы строго по порядку через SQL Editor Supabase:
Supabase/Migrations/001_initial_schema.sqlSupabase/Migrations/002_rls_policies.sqlSupabase/Migrations/003_hardening_policies_constraints_storage.sqlSupabase/Migrations/004_allow_blocked_by_master_booking_status.sqlSupabase/Migrations/005_mvp_uniqueness_invariants.sql
Коротко по статусам для занятости слотов (актуальная семантика):
- блокируют слот:
booked,blocked_by_master; - не блокируют слот:
completed,no_show,cancelled.
Workflow .github/workflows/deploy-admin.yml публикует src/Citapp.Admin в GitHub Pages при push в main и генерирует appsettings.runtime.json из GitHub Actions Variables:
SUPABASE_URLSUPABASE_ANON_KEYSUPABASE_SERVICE_MEDIA_BUCKETBOTAPI_BASE_URL