В этом руководстве мы научились развертывать серверы Node.js с Docker на VPS на основе Linux и автоматически предоставляют SSL-сертификаты с Traefik.
Предпосылки:
- Основное знакомство с Node.js, Docker и Docker-Compose.
- Виртуальный частный сервер с публичным IP-адресом от любого поставщика облачных услуг по вашему выбору.
- Домен или поддомен и соответствующая запись DNS, указывающая на общедоступный IP-адрес вашего VPS.
Введение
Traefik — это открытый источник, облачный обратный прокси. Обратный прокси по существу сидит на передних серверах и обрабатывает запрос входящих клиентов. Таким образом, вместо этого ваш клиентский запрос напрямую собирается на свой сервер Node.js, запрос сначала проходит через Traefik и Traefik, затем пересылает его на свой сервер. Это позволяет нам делать такие вещи, как SSL шифрование, канареечные развертывания, балансировка нагрузки между другими.
Теперь давайте начнем!
Разорвать VPS Linux
Это может быть экземпляр Amazon EC2, капельку цифрового океана, Linode VMS, и т. Д. или даже машина Linux On-Prom с общедоступным IP-адресом. Для этого демонстрация я использую капельку Ubuntu Digital Ocean.
Установите Docker и Docker Compose.
В этом руководстве ориентировано на этап развертывания. Вы можете прочитать документы Docker о том, как установить Докер и Docker Compose для ваших соответствующих платформ.
Ограничения брандмауэра
В зависимости от вашего VPS и настройки убедитесь, что оба порт 80 и порт 443 доступны снаружи. Это может означать настройку входящих правил вашей группы безопасности в вашу VPC на AWS или открытие портов на UFW.
DNS Records.
Если вы еще этого не сделали, создайте запись DNS для вашего домена или подделки и укажите его на публичный IP-адрес вашего VPS. Вы можете подтвердить размножение DNS, пинговая домен и видим, что он разрешает IP-адрес вашего VPS. Если вы используете поставщик DNS, как CloudFare, который поддерживает прокси, вы можете отключить эту функцию во время тестирования.
ping mydomian.com // should resolve to your VPS IP address
Node.js сервер
В этом примере я буду продемонстрировать, используя простой сервер застегивания.
//server.js file const fastify = require("fastify")({ logger: true }); fastify.get("/", async (request, reply) => { return { message: "Hello world! I'm using fastify" }; }); const start = async () => { try { await fastify.listen(3000, "0.0.0.0"); } catch (err) { fastify.log.error(err); process.exit(1); } }; start();
Dockerise Node.js Server
Мы контейнерируем наш сервер Node.js с Docker, используя Dockerfile ниже.
FROM node:12-alpine RUN mkdir home/node-traefik WORKDIR /home/node-traefik COPY . . RUN npm install EXPOSE 3000 CMD [ "node", "server.js" ]
N/B: Это основной пример о том, как подключить приложение Node.js. Для производства используются случаи, вы, вероятно, должны прочитать руководство лучших практик Node.js и Docker здесь Отказ
Docker Compose
Теперь мы создаем Docker-Compose файл и ссылаться на нашу Dockerfile. На этом этапе мы можем запустить наш Node.js сервер с Docker-Compose up
команда.
services: node-server: build: context: ./ dockerfile: Dockerfile ports: - "3000:3000"
Настройка Traefik.
Чтобы представить Traefik в наш поток, мы создаем новую услугу для Trafik в нашем файле Docker-Compose.
services: reverse-proxy: image: traefik:v2.4 container_name: "traefik" command: - "--api.insecure=true" - "--api.dashboard=true" - "--api.debug=true" - "--providers.docker=true" - "--log.LEVEL=DEBUG" - "--entryPoints.web.address=:80" - "--entryPoints.websecure.address=:443" - "--providers.docker.exposedbydefault=false" - "--certificatesresolvers.myresolver.acme.httpchallenge=true" - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web" - "--certificatesresolvers.myresolver.acme.email=hello@paularah.com" - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json" ports: - "443:443" - "80:80" - "8080:8080" volumes: - "./letsencrypt:/letsencrypt" - "/var/run/docker.sock:/var/run/docker.sock:ro"
Traefik имеет концепцию статических и динамических конфигураций. Статическая конфигурация необходима Trafik при запуске запуска, и если изменения внесены изменения в статические конфигурации, TRAEFIK должен быть перезапущен для этих изменений в силу. При использовании Traefik с Docker-Compose мы определяем статические конфигурации в качестве команд в файле Compose Docker.
Давайте пройдем через каждую команду в статической конфигурации индивидуально.
- «
», рассказывает Trafik, что Docker является нашей ключевой инфраструктурой компонентов и, таким образом, Traefik запрашивает API Docker для соответствующей информации им.--api.insecure
Включает панель инструментов Traefik в небезопасном режиме. Для производства используются случаи, вы хотите использовать базовую аутентификацию и TLS на приборной панели.- «
говорит Trafik, чтобы не разоблачить сервис, если не будет явно сделать это.Установленный объем с
- "/var/run/docker.sock:/var/run/docker.sock:ro"
позволяет Traefik общаться с докером.- "--entrypoints.web.address =: 80"
и- "--entrypoints.websecure.address =: 443"
Линия объявляет сеть и соответствующие пункты входа в порт в Traefik.«- CertificatesResolvers.myresolver.acme.email=hello@paularah.com
создает сертификат Resolver по имениMyResolver
. Resolver сертификата отвечает за генерирование, обновление и распоряжение сертификаты.- «-КертифиндируетResolvers.myresolver.acme.Storage =/leteSensrypt/acme.json»
Сообщает нашему сертификату Resolver для сохранения наших сертификатов в файле ACME.JSON в объеме летесец.-"
Рассказывает сертификат Resolver использовать HTTP-задачу.
На этом этапе, если мы запускаем наши контейнеры, приборная панель Traefik будет доступна на порту 8080 http://
Отказ
Наши серверные услуги Node.js еще не связаны с Traefik. Вот где приходит концепция динамической конфигурации. В отличие от статических конфигураций, динамические конфигурации могут быть обновлены после начала Trafik. Трафик наблюдает за изменениями в динамических конфигурациях и применяет его без необходимости перезапустить Traefik. При использовании Traefik с Docker мы добавляем динамические конфигурации с помощью меток. Traefik читает эти мета-данные и применяет его к соответствующему обслуживанию.
node-server: build: context: . dockerfile: Dockerfile container_name: node-server labels: - "traefik.enable=true" - "traefik.http.routers.node-server.rule=Host(`play.paularah.com`)" - "traefik.http.routers.node-server.entrypoints=websecure" - "traefik.http.routers.node-server.tls.certresolver=myresolver" - "traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https" - "traefik.http.routers.redirs.rule=hostregexp(`{host:.+}`)" - "traefik.http.routers.redirs.entrypoints=web" - "traefik.http.routers.redirs.middlewares=redirect-to-https"
С тех пор, как мы настроили Traefik, чтобы не разоблачить услуги, за исключением того, чтобы быть восприимчивым, чтобы сделать это, то
- «
Этикетка теперь выставляет наш серверный контейнер Node.js в Traefik.- (Play.paularah.com) "
Создает роутер, который маршрутирует сетевой запрос от доменаPlay.paularah.com
на контейнер сервера Node.js.- «
» рассказывает маршрутизатору использовать Resolver сертификата, который мы создали ранее.- «
Создает промежуточное программное обеспечение для принудительного перенаправления сетевого запроса HTTP HTTPS.
Следующие три ярлыка создают маршрутизатор, который соответствует каждому запросу к хосту в порту 80, а затем использует перенаправление на промежуточное программное обеспечение HTTPS, которое мы создали ранее.
Перезапустить контейнеры сейчас и вуаля! Наш сервер Node.js теперь доступен от play.paularah.com
использует SSL и Force Redirects к HTTPS.
Резюме
Traefik делает развертывание HTTP-серверов с Docker очень легко. Мы можем развернуть несколько проектов на одном и том же хосте, просто добавив больше сервисов на наш файл Compose Docker. Одним из основных преимуществ этой настройки является все наши конфигурации в одном месте и в одной команде Docker-Compose up
Все работает и работает. Это также делает всю нашу настройку легко воспроизводимой и позволяет нам легко перемещать проект от одного поставщика услуг облаков к другому.
Исходный код для этого blogpost можно найти в https://github.com/paularah/node-trefik.
Оригинал: «https://dev.to/paularah/deploy-and-automatically-provision-ssl-certs-on-a-node-js-server-with-traefik-and-docker-2j0e»