Docker starter kit and scripts for full dev environment. Nginx, php, databases and additional envs in docker containers for each project on your corporate dev server
Основанием служит palchik1985/docker-php-starter-kit, заточенный под совместное использование некоторых контейнеров.
- Установка софта на сервер должна быть сведена к минимуму, всё работает на основании docker контейнеров, для легкого деплоя и переноса между серверами
- Контейнеры, которые требуются почти на всех проектах или занимают много места (PHP сборка ~500Mb, MySql ~380Mb), должны быть единственными на сервере, остальные проекты подключаются к ним. Nginx также один главный.
- MySql и postgres контейнеры - по 1 на сервер. Каждый проект подключается к своей бд со своим юзером. В бд чужого проекта MySQL юзер смотреть не может.
- SSH ключи и доступ к серверу должны менеджиться админ персоналом, а не девопсами. Желательно через панель управления
- У каждого проекта есть стандартный набор папок в которых хранятся инструменты для деплоя. Каждый проект имеет локальный docker конфиг и dev docker конфиг.
- Nginx забирает конфиги из папок каждого проекта, которые имеют одинаковое название - project_root/deploy/sitename.conf
- Реализовано автоматическое обновление проектов по webhook в bitbucket (после обновления ветки, идет автообновление проекта на сервере). Ветка staging обновляется на dev сервере. Prod сервер обновляется с ветки prod
- В ветку prod пушит только тимлид проекта, либо на основании пул-реквестов
- В файле project_root/deploy/staging/build.sh (или другое имя, которое берется из ENV настроек скрипта) добавляются любые команды, необходимые для сборки проекта на сервере.
- Сервер имеет систему мониторинга, на основе https://code-maze.com/top-docker-monitoring-tools/ https://rancher.com/comparing-monitoring-options-for-docker-deployments/
- Проекты сервера по возможности отделены друг от друга, на основании chroot или docker container (https://github.com/yelp/dockersh/)
- Рестарт сервисов (PHP, nginx etc) осуществляется не напрямую а через скрипты с правами --x--x--x (никто не может читать и писать, все могут выполнять)
- 3-4 предыдущих версии деплоя хранится на сервере для легкой возможности быстро откатить код назад
- проброс пользователя в конкретный docker контейнер при подключении, без возможности получить доступ к остальной системе (необходимо учесть возможность подключения по ssh ftp)
- все проекты и контейнеры лежат в папке, заданной в файле .env, по умолчанию - /var/www
- SERVER DOCKER CONTAINERS лежат в папке /ROOTPATH/server/ - docker-compose + docker files + db etc, также есть проброс папки sites-enabled в nginx контейнер
- сайты лежат в подпапках /var/www/sitename
- каждый проект содержит папку deploy, где есть файл sitename.conf (nginx конфиг сайта), там же файл build.sh в котором прописаны скрипты на выполнение, с путями от корня проекта.
- в папке deploy находятся подпапки local, staging, prod с конфигами под все окружения.
- в папке local находится docker-starter-kit, в папках staging/prod - его версии без php,mysql и других общих модулей сервера
- local starter kit умеет генерировать конфиги для staging/prod
- по команде в консоли newproject происходит копирование проекта в подпапку с именем
- идет проверка на наличие папки deploy и конфигов, в случае нахождения конфигов, создается линка в sites-enabled папки server
- перезагрузка nginx и поднятие локальных контейнеров
- nginx добавляется ендпоинт под bitbucket hook (приходит хук, скрипт этого сайта делает git pull ветки и build.sh)
- build.sh
- после отработки посылается команда в devops slack чат проекта с выдачей консоли
- bitbucket hook на 80 /sitename/deployhook/
- скрипт делает git pull в том проекте где получен хук
- запускает build.sh
- проверяет правильность конфига сервера (отсутствие конфликтов между контейнерами)
- стопает контейнеры проекта, + docker-compose up --build -d
- отдает результат консоли в slack чат (настройка через конфиг или build.sh)
- апи умеет отдавать такую инфу о сервере: состояние контейнеров (docker cli) список проектов и их статусы (запущен лежит и тп) список доступов ssh на сервер