Pазвертывание приложения Node.js с PM2 и traefik!
Данный опус является частью единого цикла заметок o CLI. Для его написания использовалось множество различных источников (скилы крутых специалистов, статьи с тематических сайтов, техническая документация, комментарии с форумов и социальных сетей и т. д и т. п.). К сожалению, указать все источники точно не представляется возможным! По этому, в конце заметки, будет указана ссылка только на основной источник. Материалы, использованные для написания заметки, изменялись автором под конкретную задачу! Вам, скорее всего, тоже придется поступить аналогичным образом для получения желаемого результата)
Нужна консультация или помощь в решении IT вопроса? Пожалуйста, в таком случае заполните форму запроса на Sytes.ru!
Traefik (произносится как трафик) - это современный обратный HTTP-прокси и балансировщик нагрузки, который упрощает развертывание микросервисов. - #traefik.
Traefik интегрируется с существующими компонентами инфраструктуры ( Docker , Swarm , Kubernetes , Marathon , Consul , Etcd , Rancher , File ) и настраивается автоматически и динамически.
Указание Traefik на вашем оркестраторе должно быть единственным шагом настройки, который вам нужен. Но мы начнем со старых способов, аналогичных настройке на основе файлов Nginx (без Docker или Orchestrator) в этом руководстве.
# Почему Traefik?
Traefik встроен в Let's Encrypt и поддерживает автоматическое продление SSL-сертификатов.
Traefik автоматически включает HTTP / 2
Prometheus / Grafana может поддерживаться посредством простой конфигурации Traefik.
В самой версии с открытым исходным кодом есть гораздо больше функций , которые в настоящее время не предлагаются никакими другими веб-серверами с открытым исходным кодом.
# 1. Установите Node.js
sudo apt update
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash
nvm -v
nvm install --lts
nvm use --lts
nvm alias default node
node -v
# Results: v14.15.5
В поисках setcap
Я считаю, setcap
что содержится в этом пакете libcap2-bin
. Я нашел это, прибегая к помощи "debian setcap"
Просто выполните поиск, чтобы увидеть, есть ли в пакете эта команда, используя
apt-file search setcap
если apt-файл не установлен, сначала установите его, а затем повторите выдачу:
sudo apt install apt-file -y && sudo apt-file update
apt-file search setcap
запись, которую вы хотите, отображается как
libcap2-bin: / sbin / setcap
Теперь вы знаете, какой пакет у него есть, поэтому установите его
sudo apt-get install libcap2-bin
чтобы увидеть содержание выпуска пакета
dpkg -L some-package
dpkg -L libcap2-bin
где вы увидите setcap
и его получите аналогgetcap
# 2. Установите PM2 и настройте приложение:
npm -v
# Results: 6.14.11
npm install -g pm2
pm2 -v
# Results: 4.5.4
# Run Node App
npm install
npm build
pm2 start ecosystem.config.js --env production
# or use pm2 start index.js
# Далее нужно перелогиниться!
Файл ecosystem.config.js
Если разработанная вами система состоит из множества приложений, которым к тому же при запуске необходимо указывать массу параметров, то при развертывании на разных серверах этот процесс займет немало времени. Чтобы оптимизировать все это, в pm2
имеется поддержка запуска приложений из конфигурационного файла - ecosystem.config.js
ecosystem.config.js
воспользуйтесь следующей командой.Теперь в директории, откуда была выполнена команда, должен появиться файл ecosystem.config.js
с таким содержимым.
ecosystem.config.js
module.exports = {
apps: [
{
name: 'app',
script: './app.js',
env: {
NODE_ENV: 'development',
},
env_production: {
NODE_ENV: 'production',
},
},
],
};
В массиве apps
каждый элемент является объектом, описывающим конфигурацию для запуска одного приложения набором параметров. Рассмотрим основные из них:
name
- имя приложения, которое будет отображаться в списке процессов при выполнении командыpm2 list
;script
- путь к главному файлу приложения, который отвечает за запуск;instances
- запускает процесс в кластерном режиме, в качестве значения передается количество дополнительных экземпляров;disable_logs
- если задатьtrue
, то логи вестись не будут;env
- значение переменной среды окруженияNODE_ENV
в режиме разработки;env_production
- значение переменной среды окруженияNODE_ENV
в режиме эксплуатации.
Для запуска описанных в ecosystem.config.js
приложений, выполните команду start
с указанием пути к файлу.
pm2 start ecosystem.config.js
# 3. Установите Traefik:
# go to https://github.com/containous/traefik/releases and download the latest binary.
# downloading using v2.4.5
wget https://github.com/traefik/traefik/releases/download/v2.4.5/traefik_v2.4.5_linux_amd64.tar.gz
# extract the binary tar -zxvf traefik_${traefik_version}_linux_${arch}.tar.gz
tar -zxvf traefik_v2.4.5_linux_amd64.tar.gz
# check help
./traefik --help
# make executable and move to /usr/local/bin
sudo chmod +x traefik
sudo cp /home/$USER/traefik /usr/local/bin
sudo chown root:root /usr/local/bin/traefik
sudo chmod 755 /usr/local/bin/traefik
# give the traefik binary the ability to bind to privileged ports (80, 443) as non-root
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/traefik
# setup traefik user and group and permissions
sudo groupadd -g 321 traefik
sudo useradd -g traefik --no-user-group --home-dir /var/www --no-create-home --shell /usr/sbin/nologin --system --uid 321 traefik
sudo usermod -aG traefik
sudo mkdir /etc/traefik
sudo mkdir /etc/traefik/acme
sudo mkdir /etc/traefik/dynamic
sudo chown -R root:root /etc/traefik
sudo chown -R traefik:traefik /etc/traefik/dynamic /etc/traefik/acme
sudo mkdir /var/log/traefik
sudo touch /var/log/traefik/debug.log
sudo touch /var/log/traefik/access.log
sudo chown traefik:traefik /var/log/traefik/ /var/log/traefik/access.log /var/log/traefik/debug.log
4. Настройка Traefik:
Traefik поддерживает несколько поставщиков конфигураций .
Самый простой способ - начать с поставщика конфигурации файлов, как мы это делаем в Nginx.
Конфигурация файлов может быть выполнена в 2-х форматах: tomlиyaml
Создайте файл /etc/traefik/traefik.toml(основной файл conf, похожий на /etc/nginx/nginx.confnginx) со следующим содержимым:
# /etc/traefik/traefik.toml
[log]
level = "DEBUG"
filePath = "/var/log/traefik/debug.log"
[accessLog]
filePath = "/var/log/traefik/access.log"
bufferingSize = 100
[providers]
[providers.file]
filename = "/etc/traefik/traefik-dynamic.toml"
[api]
dashboard = true
debug = true
[entryPoints]
[entryPoints.web]
address = ":80"
[entryPoints.web-secure]
address = ":443"
[entryPoints.dashboard]
address = ":8080"
[certificatesResolvers.sample.acme]
email = "mymail@example.com"
storage = "/etc/traefik/acme/acme.json"
[certificatesResolvers.sample.acme.httpChallenge]
# used during the challenge
entryPoint = "web"
Создайте файл /etc/traefik/traefik-dynamic.toml ( файл конфигурации веб-сайта, похожий на /etc/nginx/sites-enabled/example.conf в nginx) со следующим содержимым:
# /etc/traefik/traefik-dynamic.toml
[http]
# Redirect to https
[http.middlewares]
[http.middlewares.test-redirectscheme.redirectScheme]
scheme = "https"
[http.middlewares.auth.basicAuth]
# generate password hash form cli or online generators like https://www.web2generators.com/apache-tools/htpasswd-generator
users = ["admin:$apr1$npasswordhash"]
[http.routers]
# node app
[http.routers.my-router]
rule = "Host(`www.example.com`)"
service = "node-pm2"
entryPoints = ["web-secure"]
[http.routers.my-router.tls]
certResolver = "sample"
# traefik dashboard
[http.routers.dashboard]
rule = "Host(`traefik.example.com`) && (PathPrefix(`/api`) || PathPrefix(`/dashboard`))"
entryPoints = ["web-secure"]
service = "api@internal"
middlewares = ["auth"]
[http.routers.dashboard.tls]
certResolver = "sample"
# similar to proxy_pass in nginx, traefik maps services
[http.services]
[http.services.node-pm2.loadbalancer]
[[http.services.node-pm2.loadbalancer.servers]]
url = "http://127.0.0.1:1337"
# 5. Служба настройки
Создайте файл /etc/systemd/system/traefik.service со следующим содержимым:
[Unit]
Description=traefik proxy
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Restart=on-abnormal
; User and group the process will run as.
User=traefik
Group=traefik
; Always set "-root" to something safe in case it gets forgotten in the traefikfile.
ExecStart=/usr/local/bin/traefik --configfile=/etc/traefik/traefik.toml
; Limit the number of file descriptors; see `man systemd.exec` for more limit settings.
LimitNOFILE=1048576
; Use private /tmp and /var/tmp, which are discarded after traefik stops.
PrivateTmp=true
; Use a minimal /dev (May bring additional security if switched to 'true', but it may not work on Raspberry Pi's or other devices, so it has been disabled in this dist.)
PrivateDevices=false
; Hide /home, /root, and /run/user. Nobody will steal your SSH-keys.
ProtectHome=true
; Make /usr, /boot, /etc and possibly some more folders read-only.
ProtectSystem=full
; … except /etc/ssl/traefik, because we want Letsencrypt-certificates there.
; This merely retains r/w access rights, it does not add any new. Must still be writable on the host!
ReadWriteDirectories=/etc/traefik/acme
; The following additional security directives only work with systemd v229 or later.
; They further restrict privileges that can be gained by traefik. Uncomment if you like.
; Note that you may have to add capabilities required by any plugins in use.
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
[Install]
WantedBy=multi-user.target
Затем выполните следующие команды:
sudo chown root:root /etc/systemd/system/traefik.service
sudo chmod 644 /etc/systemd/system/traefik.service
sudo systemctl daemon-reload
sudo systemctl start traefik.service
#чтобы включить автозагрузку, используйте эту команду
sudo systemctl enable traefik.service
Управление сервисом:
# to restart
sudo systemctl restart traefik.service
используйте эту команду для исследования и проверки журналов
journalctl --boot -u traefik.service