/0202_react

Primary LanguageJavaScript

Week 02. React Task (Slurm Навыкум "Build Containers!")

Задача

Есть проект на React (исходники хранятся в этом каталоге), который представляет собой Frontend к одному из веб-сервисов

Так получилось, что разработчики запилили Frontend раньше, чем Backend, поэтому Backend'ерам нужно пилить и свою часть, и тестировать всё вместе

Поэтому они (Backend'еры) просят нас упаковать Frontend в Docker-образ, используя в качестве базы конечного образа Nginx версии 1.22 (alpine)

Для промежуточных этапов (сборка) необходимо использовать Node Alpine LTS

Формулировка разработчика

Разработчик сказал следующее* (дословно):

Frontend делает запросы на /api, поэтому нужно, чтобы данные запросы проксировались Nginx'ом на локальную машину, порт 9999 (именно там в среде разработчиков будет работать сервер, который мы и разрабатываем)

При этом, возможно, у Docker есть какое-то готовое решение для таких сценариев (по крайней мере, так говорят коллеги), вроде какого-то "специального имени" хоста

Для тестирования мы приложили "заглушку" сервиса в каталоге server (запускать через node server/index.js)

Если при загрузке Frontend'а туда придёт запрос, то в консоль сервера выведется сообщение: received request to: /api

Сам сервер упаковывать в Docker-образ не нужно

Frontend должен отдаваться по HTTPS (хотя между Nginx и сервером пока будет HTTP – иллюзия безопасности, что поделаешь 😈), поэтому:

  1. На сам Nginx надо поставить самоподписанный сертификат, сроком действия в 1 месяц (с даты сборки образа), выданный на localhost (приватный ключ и сертификат положить в /etc/nginx/keys в виде файлов server.key и server.crt, соответственно)
  2. Сертификат генерировать отдельным шагом в сборке через openssl (нужен RSA 4096 бит)
  3. Поддерживать нужно только TLS1.3 (поддержка 1.2 и 1.1 не требуется), выставьте соответствующие настройки в конфигурации Nginx
  4. http запускать на порту 8080, https на 8443, выставьте соответствующие настройки в конфигурации Nginx
  5. Редиректить с http на https (т.е. с 8080 на 8443 порт)

Конфигурация Nginx должна располагаться в файле nginx.conf.template и копироваться в /etc/nginx/templates/default.conf.template, дополнительных действий с конфигурацией производить не нужно

Важно: использовать образ планируется только для тестирования и локальной разработки (не production), поэтому будем считать, что упаковка в образ приватного ключа и доступ к хосту допустимы

Что нужно сделать:

  1. Упаковать Frontend в Docker-образ, при этом распарралелить:
  • сборку приложения
  • тестирование приложения (линтинг не нужен)
  • генерацию приватного ключая и сертификата (берите образ Ubuntu LTS)
  1. Выложить всё в виде публичного образа на GHCR (GitHub Container Registry), чтобы мы могли сами затестить и переиспользовать

Чего не нужно делать (дословно):

Никаких entrypoint.sh и других sh-скриптов писать не нужно

Переделывать приложение (редактировать исходный код) тоже не нужно

Требования

  1. Всё должно быть оформлено в виде публичного репозитория на GitHub
  2. Вся сборка образов должна проходить через GitHub Actions
  3. Образ должен выкладываться в GitHub Container Registry (GHCR)

К текущему заданию дополнительно предъявляются требования:

  1. Docker Buildx Build (указывайте явно при сборке docker buildx build)
  2. Multi-Stage