У меня есть шаблон, который похож на другой, но разница в том, что для него требуется 3 приложения в heroku.
Поскольку каждый контейнер работает в отдельном приложении, все они открыты для внешнего мира.
Этот шаблон использует travis для создания и развертывания контейнеров для heroku.
Шаблон имеет 3 изображения
* Внешний интерфейс (Nginx - React)
* Внутренний интерфейс (Nodejs - экспресс)
* Сервер(Nginx)
Ниже приведены URL-адреса для моего шаблона.
https://medium.com/@javierfernandes/continuous-deployment-con-docker-travis-heroku-c24042fb830b
Вариант среды PORT среды Heroku (Docker) в nginx
Ниже приведеноURL репозитория.
https://github.com/pramodramdas/heroku_multi_dockers
Шаги
- Создайте 3 приложения в heroku.
- Получить ключ API из heroku -> Настройки аккаунта -> Ключ API
Создать следующие переменные среды в travis
HEROKU_USERNAME = _ // подчеркивание
HEROKU_PASSWORD = // Ключ API от heroku
HEROKU_API_KEY = // тот же APIключ как указано выше
HEROKU_APP_BACKEND = // имя приложения конечного пользователя heroku без ".herokuapp.com"
HEROKU_APP_CLIENT = // имя приложения внешнего интерфейса heroku без ".herokuapp.com"
HEROKU_APP_NGINX = // heroku nginxимя приложения без ".herokuapp.com"
DOCKER_USERNAME = // использование dockerhubrname
DOCKER_PASSWORD = // пароль dockerhub
Создать следующие переменные окружения в приложении nginx heroku
HEROKU_APP_BACKEND_URL = // URL-адрес вспомогательного приложения heroku, пример: xxxxxx.herokuapp.com
HEROKU_APP_CLIENT_URL = // пример URL внешнего приложения heroku: xxxxxx.herokuapp.com
Моя конфигурация сервера nginx.
upstream client {
server $HEROKU_APP_CLIENT_URL;
}
upstream backend {
server $HEROKU_APP_BACKEND_URL;
}
server {
listen $PORT;
location / {
proxy_pass http://client;
proxy_set_header Host $HEROKU_APP_CLIENT_URL;
}
location /api {
proxy_pass http://backend;
proxy_set_header Host $HEROKU_APP_BACKEND_URL;
}
}
пакет внешнего интерфейсаРазделяется через отдельный сервер nginx внутри контейнера Frontend.Ниже приведен файл config
server {
listen $PORT;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
Файл Docker должен содержать команды для копирования пакета в nginx и
CMD /bin/bash -c "envsubst '\$PORT \$HEROKU_APP_CLIENT_URL \$HEROKU_APP_BACKEND_URL' < /etc/nginx/conf.d/default.conf > /etc/nginx/conf.d/default.conf" && nginx -g 'daemon off;'
в конце файла Docker для выбора переменных env.
Ниже приведена конфигурация travis
sudo: required
language: node_js
node_js:
- "9"
services:
- docker
before_install:
- wget -qO- https://toolbelt.heroku.com/install.sh | sh
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
- echo "$HEROKU_PASSWORD" | docker login -u "$HEROKU_USERNAME" --password-stdin registry.heroku.com
script:
- docker build -t $DOCKER_USERNAME/docker_client ./frontend_heroku;
- docker tag $DOCKER_USERNAME/docker_client registry.heroku.com/$HEROKU_APP_CLIENT/web;
- docker build -t $DOCKER_USERNAME/docker_backend ./backend_heroku;
- docker tag $DOCKER_USERNAME/docker_backend registry.heroku.com/$HEROKU_APP_BACKEND/web;
- docker build -t $DOCKER_USERNAME/docker_nginx ./nginx_heroku;
- docker tag $DOCKER_USERNAME/docker_nginx registry.heroku.com/$HEROKU_APP_NGINX/web;
deploy:
provider: script
script:
# push to dockerhub & heroku
docker push $DOCKER_USERNAME/docker_client;
docker push registry.heroku.com/$HEROKU_APP_CLIENT/web;
heroku container:release web --app $HEROKU_APP_CLIENT;
docker push $DOCKER_USERNAME/docker_backend;
docker push registry.heroku.com/$HEROKU_APP_BACKEND/web;
heroku container:release web --app $HEROKU_APP_BACKEND;
docker push $DOCKER_USERNAME/docker_nginx;
docker push registry.heroku.com/$HEROKU_APP_NGINX/web;
heroku container:release web --app $HEROKU_APP_NGINX;
on:
branch: master