Должно соответствовать 12 уровням абстракции
Принипы
1. Кодовая база
Одна кодовая база в системе контроля версий - множество развертываний
2. Зависимости
Явно объявлять и изолировать зависимости
Обычно при помощи Пакетного менеджера
Сейчас зависимости выносят на уровень контейнера где запущено приложение
3. Конфигурация
Сохраняйте конфигурацию в среде выполнения
4. Сторонние службы (Baking Servises)
Считайте сторонние службы подключаемыми ресурсами
Например
База данных, внешние API и тд
Работать с ними осмысленно
5. Сборка, релиз, выполнение
Строго разделять стадии сборки и выполнения
Подход CI CD
6. Процессы
Запускать приложение как один или несколько процессов не сохраняющих внутреннее состояние (stateless)
Хранить состояние во вне (например в БД)
Проще масштабировать приложение
7. Приаязка портов (Port binding)
Приложение само должно слушать обращения на определённом порту
А не ожидать что там будет развернут веб-сервер
Камень в огород Python, PHP
Приложение должно быть самостоятельным
8. Параллелизм
Масштабировать приложение с помощью процессов
Если это stateless - просто
Если statefull - сложно
9. Утилизируемость (Disposabability)
Приложение должно правильно реагировать на сигналы ОС и быстро стартовать
Тогда оркестратор легко сможет стопнуть и поднять приложение
10. Паритет разработки/ работы приложения
Держите окружения разработки, промежуточного развёртывания (staging) и рабочего развёртывания (production) максимально похожими.
убрать различия:
-
Во времени - пишем код и сразу разворачиваем (CV/CD)
-
В персонале - разработчик пишет код, разворачивает и мониторит его работу
-
В инструментах - окружения развертывания должны быть максимально похож
11. Журналирование (Logs)
Рассматривать журнал как поток событий
Отправлять в stgout, откуда их будет забирать Collector log
12. Задачи администрирования
Выполняйте задачи администрирования/ управления с помощью разовых процессов
Разовые процессы администрирования следует запускать в среде идентичной регулярным длительным процессам приложения. Они запускаются на уровне релиза, используя те же кодовую базу и конфигурацию, как и любой другой процесс, выполняющий этот релиз. Код администрирования должен поставляться вместе с кодом приложения, чтобы избежать проблем синхронизации.