Учебное руководство
Главы руководства
На этой странице

Реализованные границы, ограничения и безопасность

Оглавление · Далее: практикум

Учебный проект позволяет разобраться в полном пути до 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 и старые образы автоматически не очищаются.

Разумная последовательность улучшений

  1. Сначала проверить ручной редакторский сценарий и restore drill, затем обновлять зависимости.
  2. Для нагрузки измерить CMS запросы, добавить осознанный cache/revalidation и pagination UI.
  3. Для больших media перейти от bounded buffering к streaming/direct origin/CDN.
  4. Для фоновых бизнес-операций добавить идемпотентные эффекты, мониторинг и ограничение retries.
  5. Для отказоустойчивости вынести проверенные backups за VPS и спроектировать несколько узлов; одноузловой Garage и Docker restart policy сами по себе HA не дают.