npm install
NODE_ENV=production VUE_APP_API_URL=http://localhost:8081 npm run serve
go run ./cmd/api
go test -v ./...
Ссылка на развернутое приложение: momo-store.hopto.org.
IP: 84.201.129.209
- Код хранится в GitLab с использованием модели ветвления github flow.
- В проекте присутствует модульный .gitlab-ci.yml, в котором описаны шаги сборки. Изменения в папках frontend и backend запускаются дочерние пайплайны, который лежат в соответствующих папках.
- Артефакты сборки публикуются в систему хранения Nexus (архивы фронтенда, бинарные файлы бэкенда, docker-образы хранятся в Gitlab Container Registry.
- Артефакты сборки версионируются по правилам SemVer2.
- Написаны Dockerfile'ы для сборки Docker-образов бэкенда и фронтенда.
- Бэкенд: бинарный файл Go в Docker-образе.
- Фронтенд: HTML-страница раздаётся с Nginx.
- В GitLab CI описаны шаги сборки и публикации артефактов.
- В GitLab CI описаны шаги тестирования (тесты Sonarqube для фронтенда: eslint-sast, gosec-sast, nodejs-scan-sast, semgrep-sast, sonarqube-frontend; тесты unit и Sonarqube для бэкенда: semgrep-sast, sonarqube-backend).
- В GitLab CI описан шаг деплоя в кластер Docker Swarm из трех нод (manager и 2 worker).
- Кластер Docker Swarm развернут в облаке Yandex.Cloud.
- Кластер Docker Swarm описан в виде кода Terraform, код хранится в GitLab.
- Конфигурация всех необходимых ресурсов описана согласно IaC.
- Состояние Terraform'а хранится в S3.
- Картинки, которые использует сайт, хранятся в S3.
- Секреты не хранятся в открытом виде.
- Для удобства визуального контроля за кластером установлен Portainer (http://84.201.129.209:9000/, гостевые парамерты входа: guest:DF2cUq5pxphgEBude68w).
- Дашборд мониторинга Grafana (http://84.201.129.209:3000, гостевые парамерты входа: guest:DF2cUq5pxphgEBude68w).
Развертываение инфраструктуры проводить Terraform'ом с установленным провайдером Yandex.Cloud, ключи запуска:
terraform init -backend-config "access_key=$YC_STORAGE_ACCESS_KEY" -backend-config "secret_key=$YC_STORAGE_SECRET_KEY" -reconfigure
terraform apply --auto-approve -var=s3_access_key=$YC_STORAGE_ACCESS_KEY -var=s3_secret_key=$YC_STORAGE_SECRET_KEY -var=IAM_token=$IAM_token
terraform destroy --auto-approve -var=s3_access_key=$YC_STORAGE_ACCESS_KEY -var=s3_secret_key=$YC_STORAGE_SECRET_KEY -var=IAM_token=$IAM_token
Terraform поднимает в облаке указанное в переменных variables.tf
количество виртуальных машин для управляющих и рабочих нод кластера (по-умолчанию 1 и 2 соответственно), параметры RAM, CPU, disk и т.д. задаются в том же файле.
Также Terraform:
- устанавливает на все виртуальные машины пакеты, необходимые для работы docker,
- на мастер-ноде запускает команду инициализации кластера на дефолтном сетевом интерфейсе
docker swarm init --advertise-addr eth0
и устанавливает Portainer, - рабочие ноды добавляются в кластер с полученным на предыдущем шаге токеном командой
docker swarm join {ip_master_node}:2377 --token $TOKEN
После завершения работы Terraform получаем полностью работоспособный и готовый к работе кластер из 3 нод. Внешний IP-адрес управляющей ноды следует через веб-интерфейс console.cloud.yandex.ru назначить статическим и добавить в переменную Gitlab как SWARM_HOST
. Последний шаг - скопировать картинки сайта в s3 бакет и облачная инфраструктура готова к деплою приложения.
В переменные Gitlab SSH_PRIVATE_KEY_SWARM
и SSH_PUBLIC_KEY_SWARM
положить предварительно сгенерированные SSH ключи для авторизации раннеров на нодах кластера.
При запуске Run pipeline
или изменении файлов проекта в директориях frontend или backend, после выполнения всех этапов и шагов, произойдет автоматический деплой в подготовленную облачную инфраструктуру.