В этом руководстве мы рассмотрим, как развернуть n8n приложение на виртуальном сервере (VDS) с использованием Nginx.
Содержание
1. Создание пользователя для запуска приложения
2. Установка n8n
3. Настройка безопасности приложения
4. Настройка Nginx
5. Настройка SSL-сертификата
Создайте VDS на дистрибутиве docker в личном кабинете. Отметим, что для запуска n8n потребуется VDS с минимум 1 Гб оперативной памяти.
Далее подключитесь к VDS по SSH (инструкция) под пользователем root.
Создайте пользователя web с домашним каталогом /home/web:
adduser --home /home/web --gecos "" web
После выполнения команды, введите пароль для пользователя web. Пароль не будет отображаться на экране при его вводе.
Выдайте права администратора пользователю web:
usermod -aG sudo web
Перед установкой нужно переключитесь на пользователя web.
su - web
Создайте папку для хранения файлов n8n
mkdir n8n
Далее создайте файл docker-compose.yml командой
nano docker-compose.yml
Добавьте в него следующие строки
version: '3.3'
services:
n8n:
container_name: n8n
ports:
- ':5678:5678'
environment:
- GENERIC_TIMEZONE=Europe/Moscow
- TZ=Europe/Moscow
- N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=true
- N8N_RUNNERS_ENABLED=true
- WEBHOOK_URL=http://sitename.ru
volumes:
- './n8n:/home/node/.n8n'
image: docker.n8n.io/n8nio/n8n
В переменной WEBHOOK_URL нужно указать домен, по которому будет работаьб Ваш сайт.
В этом файле можно добавить нужные вам переменные, для более тонкой настройки n8n.
Теперь зайпустите n8n командой
sudo docker compose up -d
Переключитесь обратно на пользователя root.
Так как по умолчанию docker запускает приложение на всех доступных портах, то это может быть небезопасно, поэтому нужно ограничить возможность подключение к приложению снаружи напрямую по порту. Для этого установим iptables и iptables-persistent командой.
apt install iptables iptables-persistent
Далее настроим, чтобы iptables блокировало внешнее подключение по порту к приложению
sudo iptables -I DOCKER-USER -p tcp --dport 5678 ! -s 127.0.0.1 -j DROP
Чтобы правило сохранялось при перезагрузке, воспользуемся netfilter-persistent, это подпрограмма iptables-persistent.
netfilter-persistent save
Установите nginx:
apt install nginx -y
Создайте конфигурационный файл для сайта:
nano /etc/nginx/sites-available/sitename.ru.conf
Пример конфигурации:
server {
listen 80;
server_name sitename.ru;
access_log /var/log/nginx/sitename_ru.log combined;
location / {
try_files $uri @backend;
}
location @backend {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120s;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 256;
gzip_comp_level 5;
gzip_vary on;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
Вместо sitename.ru нужно указать домен, по которому будет работать Ваш сайт.
Здесь мы опишем некоторые настройки, которые нужно корректировать для запуска вашего приложения.
Переменная server_name - указывает по какому домену будет работать данный конфигурационный файл nginx
Переменная proxy_pass - указывает по какому адресу работает ваше nodejs-приложение и куда нужно проксировать запросы, для работы сайта.
Активируйте конфигурационный файл и перезапустите Nginx:
ln -s /etc/nginx/sites-available/sitename.ru.conf /etc/nginx/sites-enabled/
nginx -t
nginx -s reload
Нужно настроить SSL-сертификат для работы сайта. Для выпуска сертификата установите утилиту dehydrated:
apt-get update
apt-get install dehydrated
Создайте файл со списком доменов для вашего сертификата:
nano /etc/dehydrated/domains.txt
В нём напишите список доменов. Для каждого отдельного сертификата список доменов пишется в одной отдельной строке:
sitename.ru
Вместо sitename.ru нужно указать домен, по которому будет работать Ваш сайт.
Далее в файле /etc/nginx/sites-available/sitename.ru.conf после строки access_log /var/log/nginx/sitename_ru.log combined; добавьте строки
location /.well-known/acme-challenge {
alias /var/lib/dehydrated/acme-challenges/;
}
Перезапустите Nginx
nginx -t
nginx -s reload
Выпустите SSL-сертификат командами
dehydrated --register --accept-terms
dehydrated c
Для расширения количества поддерживаемых протоколов шифрования сгенерируйте файл dhparam
openssl dhparam -out /etc/nginx/dhparam.pem 2048
Теперь нужно подключить SSL-сертификат к сайту. Для этого откройте файл /etc/nginx/sites-available/sitename.ru.conf и перепишити конфигурационный файл следующим образом
server {
listen 80;
server_name testvds.wiki11.ru;
access_log /var/log/nginx/sitename_ru.log combined;
location /.well-known/acme-challenge {
alias /var/lib/dehydrated/acme-challenges/;
}
if ($scheme = http) {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name testvds.wiki11.ru;
access_log /var/log/nginx/sitename_ru.log combined;
location /.well-known/acme-challenge {
alias /var/lib/dehydrated/acme-challenges/;
}
ssl_certificate /var/lib/dehydrated/certs/testvds.wiki11.ru/fullchain.pem;
ssl_certificate_key /var/lib/dehydrated/certs/testvds.wiki11.ru/privkey.pem;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
try_files $uri @backend;
}
location @backend {
proxy_pass http://localhost:5678;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120s;
}
gzip on;
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
gzip_min_length 256;
gzip_comp_level 5;
gzip_vary on;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
}
Перезапустите Nginx
nginx -t
nginx -s reload
Откройте менеджер cron-заданий командой
crontab -e
Добавьте в открывшемся текстовом редакторе строку
0 2 */3 * * /usr/bin/dehydrated -c -g && /usr/sbin/nginx -s reload
Поздравляем, теперь приложение n8n запущено на VDS.