Реализованные границы, ограничения и безопасность
Оглавление · Далее: практикум
Учебный проект позволяет разобраться в полном пути до VPS, но не содержит всех механизмов промышленной системы. Ниже — ограничения, подтверждённые конфигурацией и кодом, а не список воображаемых угроз.
Данные и функциональность
- Strapi — единственный редакционный источник. При отказе CMS нет JSON fallback.
- Импорт переносит публичный контент, не регистрацию, SMS и личный кабинет оригинала.
- Iframe заменяется безопасной ссылкой; inline emoji — Unicode. Преобразования в report.
- Редакторские правки сохраняются при обычном rerun; --update-existing явно их заменяет.
- Source API не гарантирует постоянные IDs всех партнёров: повторяйте один сохранённый snapshot, сравнивайте новый снимок перед явным обновлением.
- Полный список читается при запросе; нет CDN, межзапросного кэша и страниц pagination UI.
- Gallery media metadata общая у файла. Разные подписи одного файла в разных отношениях могут потребовать отдельного component с подписью.
- Автоматической миграции старых local uploads в S3 нет; volume и proxy совместимости сохранены.
События и выполнение
- Webhook использует общий Bearer-секрет, без подписанного timestamp или replay protection.
- Нет allowlist
model, лимита размера тела в handler, собственной rate limiting политики или обязательного ID записи в контракте. - Повторы задач не обеспечивают exactly-once внешних побочных эффектов.
- Нет transactional outbox между CMS DB commit и доставкой HTTP webhook.
- Webhook отвечает 200 после инвалидирования кеша, а HTML обновляется при следующем посещении. Нет сквозного SLA доставки; потерянное уведомление компенсируется ревалидацией раз в час.
- Воркер только логирует payload; бизнес-изменений на сайте не делает.
- Production helper выбирает первый обычный tenant и не проверяет token expiry.
- Нет отдельного healthcheck воркера или автоматического smoke в deploy pipeline.
Доступ и секреты
CMS/Hatchet используют собственные аккаунты и сессии по HTTPS. Внешний Basic Auth отключён из-за конфликта с Bearer-запросами Strapi. Защита admin/API определяется правами приложений; серверный adapter читает внутренний CMS адрес.
tRPC пока read-only и не имеет user context. Это не готовый authenticated API. Не добавляйте mutation с доступом к CMS, опираясь только на TypeScript-типы.
Внутренний Hatchet gRPC настроен без TLS. Порты gRPC и панели привязаны к loopback на хосте. PostgreSQL не опубликован. Эти факты не делают Docker-сеть песочницей для недоверенных задач: все функции одного воркера имеют его environment и права.
Deploy-user входит в docker group и фактически может управлять хостом. Ограничения SSH forwarding/PTY не устраняют эту возможность. Приватный ключ и GitHub repository access нужно защищать как deployment credentials.
Production .env и локальная копия доступов хранят секреты в plaintext с
ограниченными файловыми правами. Secret manager/KMS и автоматическая ротация
не настроены. Логи задачи содержат entry целиком, поэтому не предназначены
для произвольных персональных данных без изменения политики логирования.
Индексация
Robots, metadata и X-Robots-Tag выражают запрет индексации. Это не firewall, не авторизация и не гарантированное скрытие адреса, уже найденного поисковиком. Учебный сайт публично доступен. Private content должен иметь контроль доступа.
Зависимости и воспроизводимость
В документации предыдущей проверки CMS от 2026-10-02 зафиксировано 22 advisory, включая 4 high. Axios закреплён совместимым override. Это историческая запись, а не утверждение, что текущая vulnerability database неизменна.
Повторите npm audit --omit=dev в infra/strapi и оцените конкретные зависимости
перед изменением условий доступа. Root check не запускает audit.
Application images привязаны к digest при деплое, но инфраструктурные/base images используют branch tags. Lockfiles и pinned Actions уменьшают неопределённость, но не создают полной побитовой воспроизводимости всего стека.
Эксплуатация
- Один хост, один PostgreSQL: нет HA и автоматического failover.
- Нет autoscaling, ресурсных лимитов контейнеров или централизованных метрик/alerts.
- Backup/offsite/retention/restore drills не автоматизированы.
- Healthchecks проверяют локальную доступность, не весь бизнес-процесс.
- Deployment содержит best-effort image rollback, но не rollback данных/миграций.
- Bootstrap оставляет настройку host firewall/SSH владельцу хоста.
- Release directories и старые образы автоматически не очищаются.
Разумная последовательность улучшений
- Сначала проверить ручной редакторский сценарий и restore drill, затем обновлять зависимости.
- Для нагрузки измерить CMS запросы, добавить осознанный cache/revalidation и pagination UI.
- Для больших media перейти от bounded buffering к streaming/direct origin/CDN.
- Для фоновых бизнес-операций добавить идемпотентные эффекты, мониторинг и ограничение retries.
- Для отказоустойчивости вынести проверенные backups за VPS и спроектировать несколько узлов; одноузловой Garage и Docker restart policy сами по себе HA не дают.