Урок 19: Деплой проекта в Symfony. Docker, Heroku, HTTPS

В 19-м уроке я расскажу, как правильно вывести ваш проект в «боевой режим», задеплоить его на сервер. Мы разберём настройку production-окружения, Docker-контейнеризацию, деплой на примере Heroku, а также подключение HTTPS и домена. В конце урока вас ждут практические задания, которые помогут закрепить материал.

Настройка окружения для Production

Перед деплоем важно подготовить Symfony для работы в production-режиме. В отличие от dev-окружения, здесь отключается отладочная информация, кэш оптимизируется, а зависимости устанавливаются без «лишних» пакетов.

Шаг 1: Переключение окружения

В файле .env измените значение переменной APP_ENV на prod:

env
APP_ENV=prod
APP_DEBUG=0

Убедитесь, что APP_DEBUG установлен в 0, чтобы избежать утечки чувствительной информации.

Шаг 2: Установка зависимостей без dev-пакетов

Запустите команду:

bash
composer install --no-dev --optimize-autoloader

Флаг --no-dev удалит пакеты, которые нужны только для разработки (например, отладчик), а --optimize-autoloader ускорит загрузку классов.

Шаг 3: Очистка и оптимизация кэша

Выполните:

bash
php bin/console cache:clear --env=prod --no-debug
php bin/console cache:warmup --env=prod

Практическое задание 1:
Создайте локальное production-окружение:

  1. Склонируйте ваш проект в новую папку.
  2. Выполните шаги 1–3.
  3. Запустите php -S 0.0.0.0:8000 -t public и проверьте работу через браузер.

Docker-контейнеризация Symfony

Docker упрощает деплой, упаковывая приложение в изолированные контейнеры. Создадим базовую конфигурацию.

Шаг 1: Создание Dockerfile

Добавьте файл Dockerfile в корень проекта:

dockerfile
# Используем официальный образ PHP с Apache
FROM php:8.2-apache

# Устанавливаем зависимости
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    libzip-dev \
    && docker-php-ext-install zip pdo_mysql

# Копируем проект в контейнер
COPY . /var/www/html

# Настраиваем Apache
RUN a2enmod rewrite
COPY ./docker/apache.conf /etc/apache2/sites-available/000-default.conf

# Устанавливаем Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Устанавливаем зависимости
RUN composer install --no-dev --optimize-autoloader

# Настраиваем права
RUN chown -R www-data:www-data /var/www/html/var

Шаг 2: Настройка Apache

Создайте файл docker/apache.conf:

apache
<VirtualHost *:80>
    DocumentRoot /var/www/html/public

    <Directory /var/www/html/public>
        AllowOverride All
        Require all granted
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Шаг 3: Docker Compose

Добавьте docker-compose.yml для работы с MySQL:

yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "80:80"
    depends_on:
      - db
    environment:
      DATABASE_URL: "mysql://user:password@db:3306/main_db"

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_DATABASE: main_db
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Практическое задание 2:

  1. Соберите контейнер: docker-compose build.
  2. Запустите: docker-compose up -d.
  3. Откройте http://localhost и убедитесь, что проект работает.

Деплой на Heroku

Heroku облачная платформа, которая поддерживает Docker. Рассмотрим деплой через Git.

Шаг 1: Подготовка

  1. Установите Heroku CLI.
  2. Создайте файл heroku.yml в корне проекта:
yaml
build:
  docker:
    web: Dockerfile

Шаг 2: Создание приложения

Выполните в терминале:

bash
heroku login
heroku create your-app-name
heroku stack:set container
git push heroku main

Шаг 3: Настройка базы данных

Добавьте плагин JawsDB MySQL:

bash
heroku addons:create jawsdb:mysql

Получите URL БД:

bash
heroku config:get DATABASE_URL

Обновите DATABASE_URL в .env.prod.local на Heroku через настройки панели.

Практическое задание 3:

  1. Задеплойте ваш проект на Heroku.
  2. Проверьте работу через сгенерированный URL (например, https://your-app-name.herokuapp.com).

Настройка HTTPS и домена

Без HTTPS современный сайт не может считаться безопасным. Настроим его через Let’s Encrypt.

Шаг 1: Покупка домена

Купите домен на любом регистраторе (например, Reg.ru). В настройках DNS укажите запись CNAME на адрес Heroku (например, your-app-name.herokuapp.com).

Шаг 2: Подключение HTTPS на Heroku

Heroku автоматически предоставляет сертификат для домена. В терминале выполните:

bash
heroku certs:auto:enable

Добавьте домен в приложение:

bash
heroku domains:add your-domain.com

Шаг 3: Ручная настройка HTTPS (для AWS EC2)

Если вы используете AWS EC2, установите Certbot:

bash
sudo apt-get install certbot python3-certbot-nginx

Запустите:

bash
sudo certbot --nginx -d your-domain.com

Certbot автоматически обновит конфиг Nginx и сертификаты.

Практическое задание 4:

  1. Привяжите свой домен к Heroku или AWS.
  2. Убедитесь, что сайт доступен по HTTPS.

Итоги 19-го урока

Мы прошли весь путь от настройки production-окружения до деплоя на сервер. Теперь ваш проект доступен пользователям. Если возникнут ошибки, проверьте логи через heroku logs --tail или docker-compose logs.

Полный курс с уроками по Symfony для начинающих: https://max-gabov.ru/symphony-dlya-nachinaushih

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий