Рубрики
Uncategorized

Как мне развернуть мою Symfony API — часть 1 — Разработка

Это первая из серии сообщений блога о том, как развернуть приложение на основе Symfony PHP в кластер Docker Cluster, размещенного на экземплярах Amazon EC2. Этот пост ориентирован на среду развития.

Автор оригинала: 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»