Есть проект на 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 – иллюзия безопасности, что поделаешь 😈), поэтому:
- На сам Nginx надо поставить самоподписанный сертификат, сроком действия в 1 месяц (с даты сборки образа), выданный на
localhost
(приватный ключ и сертификат положить в/etc/nginx/keys
в виде файловserver.key
иserver.crt
, соответственно)- Сертификат генерировать отдельным шагом в сборке через openssl (нужен RSA 4096 бит)
- Поддерживать нужно только TLS1.3 (поддержка 1.2 и 1.1 не требуется), выставьте соответствующие настройки в конфигурации Nginx
- http запускать на порту 8080, https на 8443, выставьте соответствующие настройки в конфигурации Nginx
- Редиректить с http на https (т.е. с 8080 на 8443 порт)
Конфигурация Nginx должна располагаться в файле
nginx.conf.template
и копироваться в/etc/nginx/templates/default.conf.template
, дополнительных действий с конфигурацией производить не нужно
Важно: использовать образ планируется только для тестирования и локальной разработки (не production), поэтому будем считать, что упаковка в образ приватного ключа и доступ к хосту допустимы
Что нужно сделать:
- Упаковать Frontend в Docker-образ, при этом распарралелить:
- сборку приложения
- тестирование приложения (линтинг не нужен)
- генерацию приватного ключая и сертификата (берите образ Ubuntu LTS)
- Выложить всё в виде публичного образа на GHCR (GitHub Container Registry), чтобы мы могли сами затестить и переиспользовать
Чего не нужно делать (дословно):
Никаких
entrypoint.sh
и других sh-скриптов писать не нужноПеределывать приложение (редактировать исходный код) тоже не нужно
- Всё должно быть оформлено в виде публичного репозитория на GitHub
- Вся сборка образов должна проходить через GitHub Actions
- Образ должен выкладываться в GitHub Container Registry (GHCR)
К текущему заданию дополнительно предъявляются требования:
- Docker Buildx Build (указывайте явно при сборке
docker buildx build
) - Multi-Stage