Исходный код elisdn.ru
Когда-то в докладе о переписывании легаси рассказывал о постепенном обновлении и рефакторинге своего сайта. Теперь выкладываю доработанный исходный код всего PHP-проекта с полной автоматизацией разработки и деплоя и активным использованием Docker.
На странице github.com/elisdnru сейчас опубликованы:
Репозиторий с Ansible-плейбуками для автоматизации поднятия Docker Swarm кластера из одной или более виртуальных машин. Для кэширования публичных Docker-образов по умолчанию регистрируется зеркало mirror.gcr.io от Google.
Общий реверс-прокси Traefik для проксирования доменов и поддоменов всех проектов с общими HTTP-заголовками безопасности и обслуживания Let's Encrypt сертификатов.
Общий планировщик для запуска консольных задач для всех проектов в кластере по расписанию на основе меток у контейнеров.
Репозиторий основного сайта 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 на более свежий фреймворк или микрофреймворк
- ...
Многое из этого сделано по нашим скринкастам по разработке большого проекта. Можете задавать вопросы по разным пунктам в комментариях либо здесь, либо там под соответствующими скринкастами.
Уже волноваться начал после такого долгого молчания.
Спасибо за код!
Большая работа проделана!) Вам уже стоит подумать о выделении сервиса аутентификации в отдельный сервис - SSO)
Предлагаю блог перенести на Next.js + Slim/Symfony. В таком ключе получится рассмотреть популярную фул стек связку, особенно если захватить Redux Toolkit с RTK Query. Тем более что у вас Deworker с использованием Next.js. В будущем можно будет обьединить проекты и рассмотреть микрофронтенд на этих двух примерах.
Кстати интересовал вопрос почему у Deworker не публикуете исходный код, а блог решили опубликовать? Вроде бы у вас везде одинаковые подходы по разработке и выбору инфраструктуры и ничего не скрываете. Мне кажется было бы интересно следить за развитием проекта по комитам. Ну и так же Deworker, как и ElisDN действующие проекты, которые постоянно требуют изменений. Я переодически смотрел репозиторий блога ещё до публикации статей. Было очень интересное хоть и старый Фреймворк.
Возможно, что на Deworker есть что-то особенное, хотя похожий проект по видео хостинга рассматривали в проекте rabbit mq на Slim.