Исходный код elisdn.ru

Когда-то в докладе о переписывании легаси рассказывал о постепенном обновлении и рефакторинге своего сайта. Теперь выкладываю доработанный исходный код всего PHP-проекта с полной автоматизацией разработки и деплоя и активным использованием Docker.

На странице github.com/elisdnru сейчас опубликованы:

Cluster

Репозиторий с Ansible-плейбуками для автоматизации поднятия Docker Swarm кластера из одной или более виртуальных машин. Для кэширования публичных Docker-образов по умолчанию регистрируется зеркало mirror.gcr.io от Google.

Traefik

Общий реверс-прокси Traefik для проксирования доменов и поддоменов всех проектов с общими HTTP-заголовками безопасности и обслуживания Let's Encrypt сертификатов.

Cron

Общий планировщик для запуска консольных задач для всех проектов в кластере по расписанию на основе меток у контейнеров.

Site

Репозиторий основного сайта elisdn.ru

В проекте активно используется Docker:

  • Разработка, тестирование и деплой с Docker
  • NGINX и PHP-FPM для сервера
  • Не root пользователь для контейнеров
  • Передача паролей через Docker-секреты
  • Многостадийная сборка образов для продакшена
  • Бесшовный деплой в Docker Swarm
  • Health Checks для всех контейнеров

Локально всё запускается через make. Удалённо всё автоматизировано в GitHub Actions:

  • Pipeline запуска всех линтеров и тестов
  • Кэширование vendor и node_modules
  • Тестирование продакшеновских образов в тестовом окружении
  • Сбор логов в артефакты при ошибках в тестах
  • Ускорение сборки через кэширование образов с Docker BuildKit
  • Автодеплой в Docker Swarm

Основной код на PHP:

  • Отладка через Xdebug в Docker
  • Автоформатирование кода через PHP CS Fixer
  • Анализатор Psalm
  • Конфигурирование через переменные окружения
  • Автоимпорт модулей в панель управления
  • Автоимпорт маршрутов из модулей
  • Автогенерация карты сайта из модулей
  • Вставка виджетов в текст через shortcodes
  • Обновлённый CaregoryBehavior
  • Автокроп загруженных изображений
  • Логирование в stderr для Docker
  • Отправка уведомлений об ошибках в Sentry
  • Feature Flags для разработки по CI/CD
  • Модульные, интеграционные и E2E тесты с Codeception

В дополнение немного JS и CSS:

  • Установка пакетов через Yarn
  • Контроль и форматирование кода с ESLint, StyleLint и Prettier
  • Сборка и минификация JS и CSS через WebPack с Babel
  • Слежение за файлами для автосборки налету

Доведён до ума оставшийся легаси-код на Yii2:

  • Перенос автозагрузки классов в Composer
  • Стабы для Psalm
  • Перенос всех сервисов из Service Locator в DI-контейнер
  • PSR-адаптер для кэша
  • Возможность запрет неявного вызова геттеров и сеттеров через магию __get и __set
  • Преобразование ошибок сохранения ActiveRecord в исключения
  • Уход от встроенных виджетов
  • Уход от использования bower-assets

Проведена оптимизация для Google Page Speed:

  • Кэширование ресурсов в NGINX
  • Протокол HTTP/2
  • Сжатие страниц с Gzip
  • Уход от jQuery на нативный JS
  • Выделение бандлов для разных разделов
  • Конвертация изображений в WebP
  • Отложенная загрузка изображений с Intersection Observer

Для удобства локальной разработки сделаны:

  • Фикстуры с демо-данными и демо-фотографиями
  • Локальный эмулятор почтового сервера MailHog
  • Локальная эмуляция сторонних API с WireMock
  • Локальный эмулятор S3-хранилища для бэкапов

Дополнительно сделаны:

  • Бэкап БД в S3-хранилище по Cron
  • Бэкап папки upload в S3-хранилище по Cron
  • Хранение сессий и кэша данных в Redis

Что бы хотелось сделать в будущем:

  • Перейти на нативную OAuth-аутентификацию вместо uLogin
  • Избавиться от монструозного CategoryBehavior
  • Избавить сущности от зависимостей от сервисов
  • Вынести генерацию адресов из самих комментариев
  • Перейти с Yii2 на более свежий фреймворк или микрофреймворк
  • ...

Многое из этого сделано по нашим скринкастам по разработке большого проекта. Можете задавать вопросы по разным пунктам в комментариях либо здесь, либо там под соответствующими скринкастами.

Комментарии

 

Vladimir Perepechenko

Уже волноваться начал после такого долгого молчания.
Спасибо за код!

Ответить

Оставить комментарий

Войти | Завести аккаунт | Войти через


(никто не увидит)





Можно использовать теги <p> <ul> <li> <b> <i> <a> <pre>