Abitly Strapi CMS
Метадані
Section titled “Метадані”| Поле | Значення |
|---|---|
| Продукт | Abitly.org |
| Тип | CMS (Strapi v5, headless) |
| Статус | 🟢 prod |
| Власник | @Vladbandurin |
Призначення
Section titled “Призначення”Strapi headless CMS — керує контентом Abitly.org (ЗВО, спеціальності, статті, навчальні матеріали, медіа). Віддає REST/GraphQL фронтенду та Abitly API. Має CSV import/export для bulk-роботи контент-команди.
Репозиторій та рантайм
Section titled “Репозиторій та рантайм”| Репо | abitly-org/abitly-strapi (main) |
| Стек | Strapi v5 · @strapi/strapi · @strapi/plugin-users-permissions · @strapi/provider-upload-aws-s3 · strapi-csv-import-export · strapi-plugin-multi-select |
| Хостинг — prod | AWS EC2 abitly-prod-strapi (t4g.medium) — не ECS. |
| Container image | Multi-stage Dockerfile (Node 20 Alpine, ARM64), збирається через docker buildx build --platform linux/arm64 --push у GitHub Actions → ECR abitly/strapi:<commit-sha> |
| Reverse proxy у контейнері | Caddy (Caddyfile у репо) — TLS termination + Cloudflare origin pulls validation |
| Деплой | GitHub Actions build+push → CodePipeline abitly-prod-strapi (з buildspec.yml — CodeBuild stage) → deploy на EC2 abitly-prod-strapi. Деталі → deploy-pipeline. |
| Upload provider | AWS S3 (UPLOAD_PROVIDER=AWS, bucket abitly-prod-strapi-media, регіон eu-central-1). DO Spaces у package.json — dead dep. |
| TLS | Cloudflare Authenticated Origin Pulls — Strapi/Caddy приймає лише з’єднання з валідним origin-cert (SSM ORIGIN_CERT, ORIGIN_KEY, ORIGIN_PULL_CA). |
| Admin URL | https://cms.abitly.org/admin |
| API URL | https://cms.abitly.org |
| Postgres схема | public (SSM /abitly/prod/strapi/DATABASE_SCHEMA) — ⚠️ у Postgres це дефолтна схема, обережно з DDL |
Залежності
Section titled “Залежності”- Залежить від: Postgres (shared instance
studsearch-prod, окрема схемаTODO:) · S3abitly-prod-strapi-media - Від нього залежать: Abitly Web · Abitly API
Env-змінні
Section titled “Env-змінні”SSM /abitly/prod/strapi/ (~20 ключів):
| Категорія | Ключі |
|---|---|
| БД | DATABASE_CLIENT, DATABASE_HOST, DATABASE_PORT, DATABASE_NAME, DATABASE_SCHEMA, DATABASE_USERNAME, DATABASE_PASSWORD, DATABASE_SSL, DATABASE_SSL_REJECT_UNAUTHORIZED, DATABASE_CA |
| App | HOST, PUBLIC_URL, NODE_ENV, APP_KEYS, JWT_SECRET, ADMIN_JWT_SECRET |
| S3 | S3_BUCKET, S3_REGION, UPLOAD_PROVIDER |
| Cloudflare TLS | ORIGIN_KEY, ORIGIN_CERT, ORIGIN_PULL_CA |
| Webhooks | WEBHOOK_SECRET |
Повний індекс → environments.
Ключові команди
Section titled “Ключові команди”npm run develop # dev з autoReloadnpm run build && npm run startnpm run console # Strapi REPLnpm run upgrade # plugin upgradesДеплой та відкат
Section titled “Деплой та відкат”CodePipeline abitly-prod-strapi. Відкат — TODO: (попередня версія артефакту з S3 abitly-prod-strapi-pipeline-*). Деталі → deploy-rollback.
Логи та моніторинг
Section titled “Логи та моніторинг”- EC2 SSH-логи / Strapi logs (
TODO:шлях до файлу). - БД-проблеми → db-issues (⚠️ shared instance).
Типові проблеми
Section titled “Типові проблеми”- CMS не віддає контент / 500 → service-down
- Медіа не вантажиться → перевірити
abitly-prod-strapi-mediapermissions +UPLOAD_PROVIDER=aws-s3 - 403 від Cloudflare → ймовірно прострочений
ORIGIN_CERT→ ротація + оновити SSM - 502 + Caddy
no such host strapi→ контейнер Strapi у crash-loop; перевіритиdocker logsнаbad variable name→ incident-2026-05-28
Відомі інциденти
Section titled “Відомі інциденти”- 2026-05-28 — 40 хв 502 під час переключення на CF Access. SSM-простір
/abitly/prod/strapi/містив багаторядкові PEM Caddy, що зламалиexportв entrypoint. → пост-мортем.