Немного больше, чем пет-проект. Часть 1
Внимание: данный пост несет больше художественный, нежели научный характер и призван для духовного самовыражения автора, поэтому приношу заранее извинения за размытые описания.
Первый проект.
Начал разработку проекта, мотивируя себя закреплением навыков бэкенда. Выбор фронтенда объясняю тем, что давно хотел пощупать Angular.
Функционал: простая лента постов и чат (пока что с возможностью писать админу). Всё это дело собираю в монорепе через docker compose, фронтенд проксирую через nginx.
Стек: Angular, Go, Postgres.
Второй проект.
Более сложный. В основу заложил архитектуру модульной ERP и практики низкой связанности таблиц с возможностью разбить всё на микросервисы.
Фронтенд выбрал максимально привычный для себя, чтобы не тратить время на нюансы работы. Отказался от ORM для более комфортного масштабирования и накатывания миграций в будущем. Думаю, для такой системы это критически важно.
Тут я уже разделил бекенд и фронтенд по разным репозиториям. Первым модулем решил реализовать ведение привычек и добавил заглушки еще для 7 потенциальных в самой базе.
Стек: Go, Postgres, Vue.
Масштабирование инфраструктуры
Итого у меня получилось 2 приложения: монорепа и отдельно бэкенд с фронтендом для второго.
Было принято решение вынести docker-compose из первого проекта в централизованный репозиторий под соответствующие нужды и полностью избавить проекты от лишних зависимостей, оставив только Dockerfile.
На первом этапе у меня был такой принцип работы:
Каждый репозиторий тянет сам себя на сервер через GitHub Actions. Основной deployment-репозиторий запускает docker-compose с двумя базами, двумя фронтенд-приложениями и двумя API. Nginx забирает образы фронтендов под себя. Через nginx.conf настраиваю маршруты приложений и вешаю сертификаты на основной домен и поддомен для второго приложения.
Первые проблемы наскоро собранного docker-compose
Основная проблема, как это часто бывает даже в больших проектах, — сборка фронтенд-приложения, которая крутит Node.js и неплохо нагружает сервер, особенно когда у тебя базовые мощности (1 ядро, 1 GB RAM). Весь косяк был в том, что я всё это делал прямо на сервере.
Поэтому я переписал деплой-файлы во всех приложениях (2 API, 2 UI). Теперь они собирают образы в Docker Registry, а мой deployment тянет уже готовое на сервер.
Разница колоссальная. Вместо трёхминутной сборки фронтенд-приложений на сервере я делегирую сборку Docker Hub, а мой деплоймент стягивает образы буквально за 30 секунд и перезапускает контейнеры.
SSL-сертификаты
Так как у меня есть домен, который я начал расширять поддоменами, встал вопрос доставки SSL без лишних заморочек.
В первый раз по неопытности я приобрёл сертификат у поставщика домена за достаточно кругленькую сумму, хотя его можно было сделать бесплатно.
Теперь на сервере стоит скрипт, который каждую неделю запускается через cron и отправляет мне отчёт в телегу о сроке службы сертификатов. Если сертификаты не протухли, скрипт ничего не делает. Если истекают — запускает автоматическую генерацию для всех указанных доменов и перезапускает контейнеры.
Следующая задача — сделать максимально безопасную авторизацию для второго проекта, в которую уже заложен подход с http-only cookies.
#pet_project #golang #vue #angular #postgres #docker #nginx #vps #ssl #github_actions #cicd #devops #frontend #backend #опыт #резюме #фронтенд #бекенд #linux #bash