Автор оригинала: Asmir Mustafic.
В этом сообщении в блоге я собираюсь поделиться стратегией развертывания, я использовал для развертывания API-ориентированного приложения для AWS для клиента.
Это первый пост из серии постов, которые будут описывать весь процесс развертывания от развития до производства.
Приложение было более или менее базовым API, реализованным с использованием Симфония 3.3 и несколько других вещей как Доктрина Орм и Фос отдых пучка . Очевидно, что исходный код был сохранен в репозитории Git.
Когда проект/приложение было завершено, я использовал Circleci (который предлагает 1 контейнер для частных сборки бесплатно) для координации «сборки и развертывание» процесс.
Процесс можно обобщить в следующей схеме:
Код хранилища был размещен на GitHub, и Circleci был настроен для запуска сборки на каждый коммит.
Как поток развития я использовал Потрясающий и каждый коммит к Мастер
запускал развертывание, чтобы жить, каждый коммит на Развивать
Запускал развертывание для постановки И каждый коммит к функциональным веткам запускал развертывание в тестовой среде. Обязательство к выпуску ветвей запускали развертывание до доживной среды.
Развертывание для жизни имело вручную шаг подтверждения.
Среда разработки
Очевидно, все начинается из среды развития.
Как среда развития я использовал Докер и Docker Compose Отказ
Много акцента использовалось для обеспечения без гражданства Подход в каждом компонент. С точки зрения докера Это означало, что невозможно использовать общие папки между контейнером и хостом Хранить состояние заявки (сеансы, журналы, …).
Не хранение данных на хосте имеет фундаментальное значение, чтобы иметь возможность развернуть бесшовно приложение к живому. Журналы, сеансы, загрузки, userData должны храниться в специализированных услугах в качестве инструментов управления журналами, хранилищ ключевых значений, хранилища объектов (как AWS S3 или аналогичный).
Docker Compose File.
Docker Compose — это инструмент, который позволяет настроить и координировать контейнеры.
# docker-compose.yml version: '3.3' services: db: image: goetas/api-pgsql:dev build: docker/pgsql ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data/pgdata environment: PGDATA: /var/lib/postgresql/data/pgdata POSTGRES_PASSWORD: api php: image: goetas/api-php:dev build: context: . dockerfile: docker/php-fpm/Dockerfile volumes: - .:/var/www/app www: image: goetas/api-nginx:dev build: context: . dockerfile: docker/nginx/Dockerfile ports: - "7080:80" volumes: - .:/var/www/app volumes: db_data: {}
Из этого Docker-Compose.yml
Мы видим, что у нас есть PHP, Nginx и база данных PostgreSQL.
Пожалуйста, обратите внимание на составную версию 3.3
, означает, что мы можем запустить этот составной файл как стопка докера и развернуть его на простых докеровных хостах на Докер Рой кластеры.
Отметить также построить
Раздел PHP
и www
Сервисы. Изображения построены из указанного Dockerfile
, Но контекст
постройки (рабочий каталог) — Отказ
. Это позволяет построить изображение Docker, содержащее уже исходный код нашего приложения Но сохраняя хорошую структуру папки.
дБ
Контейнер используется только для разработки и испытательной среды (Где производительность и высокая доступность не нужна), для Live использовалась экземпляр Amazon RDS.
Docker Files.
От предыдущего Docker-Compose.yml
Файл. Мы видим, что мы используем «пользовательские» изображения для каждой службы.
Давайте посмотрим на них.
ДБ (postgres)
docker/pgsql/dockerfile
FROM postgres:9.6 COPY bin/init-user-db.sh /docker-entrypoint-initdb.d/init-user-db.sh
Docker/pgsql/bin/init-user-db.sh
#!/bin/bash set -e psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL CREATE USER mydbuser PASSWORD 'XXXXX'; CREATE DATABASE mydb; GRANT ALL PRIVILEGES ON DATABASE mydb TO mydbuser; EOSQL
Этот документ Docker тривиален, просто ссылки на официальный Postgres: 9.6
Изображение и создает базу данных, когда вращающийся вверх по контейнеру.
Данные сохраняются в хост-машина в докеренном объеме, как указано в тома
Раздел на Docker-Compose.yml
файл.
Edit (2017-09-24) : Благодаря Михал МЛекко Я обнаружил, что на заказ сценарий сборки На самом деле не нужно, поскольку изображения по умолчанию Postgres позволяет настроить создание базы данных по умолчанию через Переменные среды. Чтобы проработать Postgres достаточно что-то делать как:
db: image: postgres:9.6 ports: - "5432:5432" volumes: - db_data:/var/lib/postgresql/data/pgdata environment: PGDATA: /var/lib/postgresql/data/pgdata POSTGRES_USER: mydb # postgres user POSTGRES_DB: mydb # postgres db name POSTGRES_PASSWORD: XXX # postgres password
Папирофон
Это Docker/PHP-FPM/DockerFile
Файл для создания изображения PHP.
# docker/php-fpm/Dockerfile FROM php:7.1-fpm RUN usermod -u 1000 www-data RUN groupmod -g 1000 www-data # install system basics RUN apt-get update -qq && apt-get install -y -qq \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng12-dev git \ zlib1g-dev libicu-dev g++ \ wget libpq-dev # install some php extensions RUN docker-php-ext-install -j$(nproc) iconv mcrypt bcmath intl zip opcache pdo_pgsql\ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-enable opcache # install composer RUN curl -s https://getcomposer.org/composer.phar > /usr/local/bin/composer \ && chmod a+x /usr/local/bin/composer # copy some custom configurations for PHP and FPM COPY docker/php-fpm/ini/app.ini /usr/local/etc/php/conf.d/app.ini COPY docker/php-fpm/conf/www.pool.conf /usr/local/etc/php-fpm.dwww.pool.conf WORKDIR /var/www/app # copy the source code COPY composer.* ./ COPY app app COPY bin bin COPY src src COPY web/index.php web/index.php COPY var var COPY vendor vendor # set up correct permissions to run the next composer commands RUN if [ -e vendor/composer ]; then chown -R www-data.www-data vendor/composer vendor/*.php app/config web var; fi # generate the autoloaders and run composer scripts USER www-data RUN if [ -e vendor/composer ]; then composer dump-autoload --optimize --no-dev --no-interaction \ && APP_ENV=prod composer run-script post-install-cmd --no-interaction; fi
Это изображение PHP, нечего сказать, кроме вопроса разрешений, которая была необходима, поскольку Скопировать
Операция — это всегда выполняется как корень
Отказ Выполнение Клад
Команда была необходима для папок, которые будут затронуты Композитор Dump-Autoload
и Composer Run-Script Post-install-cmd
Отказ
Www (nginx)
# docker/nginx/Dockerfile FROM nginx:stable # copy some custom configurations COPY docker/nginx/conf /conf # copy the source code COPY web /var/www/app/web
Изображение веб-сервера также тривиально, он просто копирует некоторые конфигурации (в основном виртуальной установкой хоста) и Копирует код, доступный в Веб
каталог (единственный, который выставлен на сервер по рекомендациям Symfony).
Бег
Набрав в свою оболочку …
docker-compose up -d
Окружающая среда развития и готова!
подсказки
Вот два совета о том, как управлять некоторыми аспектами вашей заявки
Переменные среды
Выставленная установка достаточна, но для создания более гибкого изображения для меня была фундаментальной, чтобы позволить использовать Переменные среды в файлах конфигурации Отказ
Для этого я использовал помощник скрипта для замены переменных среды из файла со своими значениями.
Следующий файл был скопирован на каждом изображении, созданный Via DockerFile в /conf/substitute-env-vars.sh
Отказ
#!/usr/bin/perl -p s/\$\{([^:}]+)(:([^}]+))?\}/defined $ENV{$1} ? $ENV{$1} : (defined $3 ? "$3": "\${$1}")/eg
Все файлы конфигурации были скопированы всегда на /Конф
.
Позже докер- Выходная точка
Ответил за заменить переменные среды из файла со значениями выполнения и разместить файлы правильное местоположение.
Это часть файла ententPoint:
#!/bin/bash set -e /conf/substitute-env-vars.sh < /conf/app.ini > /usr/local/etc/php/conf.d/app.ini /conf/substitute-env-vars.sh < /conf/nginx.conf > /etc/nginx/conf.d/www.conf ## here the rest of your entrypoint ...
С этим скриптом мы можем использовать переменные среды в каждом файле конфигурации. Возможна указать разные имена хостов для контейнеров NGINIX без восстановления изображений, но, только что настройка соответствующих переменных среды.
Давайте рассмотрим следующие файл конфигурации Nginx:
server { server_name ${APP_SERVER_NAME:project.dev}; root ${APP_SERVER_ROOT:/var/www/app/web}; }
$ App_server_name
и $ App_server_root
Переменные среды и при установке на www.example.com
и /home/me/www
Полученный файл будет:
server { server_name www.example.com; root /home/me/www; }
Если некоторые переменные недоступны, они будут заменены его значением по умолчанию ( Project.dev
и /var/www/app/web
в этом случае). Если переменная не определена, и значение по умолчанию не указано, результат будет пустой строкой.
Журналы
По умолчанию Symfony хранит журналы в файл, используя Docker, в некоторых ситуациях может быть не лучшим подходом.
Я настроил Monolog для вывода журналов непосредственно к потоку «Стандартная ошибка». Позже это позволит настроить Docker и Драйверы Docker Log Для хранения журналов через Один из поддерживаемых драйверов (JSON-File, Syslog, Gelf, Awslogs, Splunk … и многие другие).
Здесь config_prod.yml
фрагмент.
monolog: handlers: main: type: fingers_crossed action_level: error handler: nested buffer_size: 5000 # log up to 5000 items excluded_404s: # do not consider 404 as errors - ^.* nested: type: stream path: "php://stderr" level: debug
Обратите внимание на Buffer_size
Вариант, если у вас есть длинные запуск скрипты (CLI DAEMONS), Этот вариант является фундаментальным, чтобы избежать утечек памяти.
Symfony по умолчанию будет хранить журналы навсегда ожидание ошибки критически важно, чтобы промыть буфер журнала, но «хорошее» не должно иметь ошибок, поэтому буфер никогда не будет покрасен. С помощью этой опции Symfony сохранит только последние 5000 журналов журнала.
Заключение
В этом посте я поделился своей местной средой. Есть много вещей, которые могут быть улучшены, многие из них были фундаментальными для моего проекта, но для краткости я не мог включать их в этот пост.
Некоторые улучшения, которые можно сделать:
- Уменьшение размера изображения путем удаления временных файлов после установки библиотек сделано
- Удаление композитора
- ?
В следующих постах увидим, как переместить местные условия развития, посвященные строительству конвейер для живой среды.
Я что-то пропустил? Обратная связь приветствуется.
Эта статья была первоначально опубликована на https://www.goetas.com/blog/how-do-ideploy-my-symfony-api-part—development/
Оригинал: «https://www.codementor.io/@goetas/how-do-i-deploy-my-symfony-api-part-1-development-ccy2uns19»