Но про backend мы поговорим позже, а пока начнем с фронтов.
"Зачем это надо?" - спросите вы! Все просто. Приложение должно легко переноситься не только кодовой базой из гитов на сервер разработки или production, но и избавлять от головной боли в следующем:
- Нет необходимости тратить время новых разработчиков на настройку workflow
- Легко подниматься если сервер чист, достаточно поднять докер и "стартануть" контейнер
- Проще создавать отказоустойчивые стенды, оркестрируя трафиком на контейнеры и балансируя нагрузку
- Легче осуществлять переход с одной версии приложения на другую, хранить ранее собранные ветки в docker-registry с тегами
- Удобнее пользоваться yml, чем с нуля писать какие-то sh для deploy
- и многое другое, пиши в комментариях если есть предложения
Плоский юмор: Вот мы и создали наш hello world на реакте и готовы подключить бекендеров для разработки. "Мы знаем только Jar", говорят они, а вы нам про какой-то Yarn :-)
Поехали ...
Создаем в корне проекта файл default.conf Зачем? Нам надо чтобы приложение с несколькими роутингами нормально работало как single page application. Внутри него будет конфигурация Nginx. Для начала ничего не надо менять.
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Создадим абсолютно там же на Dockerfile
# Stage 1
FROM node:8 as simple-build
WORKDIR /app
COPY . ./
RUN yarn
RUN yarn build
FROM nginx:alpine
COPY --from=simple-build /app/build /usr/share/nginx/html
COPY /default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Далее собираем контейнер
docker build . -t my-simple-docker
Все! Если настроить docker-registry, то можно сделать так:
docker login
docker push your-host:5000/my-simple-docker:latest
На целевом сервере:
docker login
sudo docker pull your-host:5000/my-simple-docker:latest
sudo docker run -d -p 8000:80 your-host:5000/my-simple-docker:latest
Автоматическая сборка с помощью Gitlab CI
Создаем файл gitlab-ci.yml и пушим его в git репозиторий. Заранее, конечно, в runners необходимо добавить условие запуска, например по тегу deploy-dev-123, где 123 произвольная часть.
image: docker:git
services:
- docker:dind
variables:
DOCKER_DRIVER: overlay
before_script:
- docker login -u user -p password host-to-docker-registry.ru:5000
dev-version:
stage: deploy
script:
- docker build -t host-to-docker-registry.ru:5000/${CI_JOB_NAME}:latest .
- docker push host-to-docker-registry.ru:5000/${CI_JOB_NAME}:latest
only:
- /^deploy-dev-.*$/
Что в итоге? Вы легко можете отдать проект следующему специалисту для настройки бекендной части и как результат получить единый контейнер для удобного деплоя на сервер. Надеюсь вам пригодится эта информация и вы обязательно найдете применение этому у себя в проекте. А на этом желаю успехов!
Подписывайтесь на канал, делитесь статьей и задавайте вопросы, я постараюсь ответить.