Pull to refresh

Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx

Level of difficultyEasy

История о том, как попытка автоматизировать рутину привела к открытию и прокачке моих технических навыков в DevOps.

Сначала я думал, что справлюсь за пару часов. В итоге — несколько суток, десятки ошибок, и первый боевой сервер с доменом, Docker и полноценным развертыванием n8n. История о том, как попытка автоматизировать рутину привела к открытию и прокачке моих технических навыков.

Я создал свой проект с полноценной документацией с сылкой на Github по развертыванию n8n на собственном сервере.

Завязка

Изначально я хотел лишь сократить рутинные задачи. Создавал контент, работал над свежими идеями и понимал — мне не хватает времени на то, что действительно важно. На горизонте замаячила идея: создать собственного ИИ-ассистента, который автоматизирует мелочи вроде шаблонов, публикаций и повседневных действий.

В сети крутился хайп вокруг n8n — open-source, который можно развернуть на любом сервере, и с полной свободой действий. Конечно, до меня не сразу дошло, на официальном сайте очень дорогие тарифы. Поэтому я начал изучать туториалы на Ютубе. В этот момент я даже не подозревал, что эта идея затянет меня на неделю, подарит десятки ошибок и первый полноценный сервер.

Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 1
Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 1

Развитие: от ноды до ноды

Railway: первая проба пера

Самые простые туториалы были про развертывание n8n на собственном компьютере. Некоторые комментарии под такими видео ссылались на то, что развертывание n8n на собственной машине — не самая лучшая идея, и возможно, не самая удачная. Я тогда прислушался к их мнению и решил попробовать сразу поискать другие способы.

Подходящей оказалась платформа Railway. Бесплатный пробный период, $5 бонуса за привязку GitHub — всё выглядело перспективно. Я:

  • подключил GitHub;

  • получил API-ключ;

  • запустил n8n;

  • настроил Telegram-бота.

И всё шло нормально, пока не начались проблемы с Telegram Trigger — он просто не отвечал. Ошибок в логах почти не было, но и связи — тоже. Я тратил часы, пробовал разные переменные, гуглил, спрашивал у нейросетей — без толку. Тогда в рекламе мне попался Yandex Cloud с двухмесячным бесплатным периодом. Я решил попробовать развернуть n8n на нем.

Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 2
Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 2

Виртуалка, SSH и первый затык

Я развернул ВМ на Ubuntu 20.04 LTS, выбрав её за стабильность и поддержку. Конфигурация:

  • 2 vCPU

  • 50 ГБ SSD

  • Снятие с бонуса: 2683.50 руб/мес

Сгенерировал SSH-ключ через Git Bash. Первый облом: ключ исчез. После нескольких безуспешных попыток изменить его, понял — проще пересоздать ВМ. У Yandex Cloud есть ограничения:

ssh-keys

нельзя обновить на лету.

Подключение выглядело так:

ssh -i /c/Users/username/.ssh/n8n_key ubuntu@

Когда получилось зайти — был настоящий кайф. Я обновил систему, установил Docker, понял, что GUI у сервера не будет — только терминал. Ну что ж, поехали.

Docker, docker-compose, и n8n-raw.env

Следующим шагом стал

docker-compose.yml

и файл

n8n-raw.env

В нём я прописал:

N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=securepass123
N8N_HOST=mydomain.ru

Это позволило не держать всё в голове и запускать конфигурации быстрее. Первые ошибки появились почти сразу — что-то не так с путями, потом — с переменными. Без ChatGPT и stackoverflow не обошлось.

Домены и HTTPS

Купил домен

.ru

настроил A-записи, скачал сертификаты. Nginx — отдельная песня. Нужно было:

  1. Объединить три сертификата в один;

  2. Подключить его через конфиг;

  3. Настроить редирект на HTTPS.

Вот пример из моего nginx.conf:

server {
    listen 443 ssl;
    server_name mydomain.ru;
    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    location / {
        proxy_pass http://localhost:5678;
        proxy_set_header Host $host;
    }
}
Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 3
Как я хотел создать ИИ-ассистента, а в итоге развернул свой первый сервер с n8n, Docker и Nginx 3

Telegram и «почему ты не работаешь?!»

Подключил Telegram Trigger — ноль. Ни один запрос не проходил. Ошибки:

  • Lost connection to the server

  • Webhook error: unexpected status code 403

  • Логи молчали или выдавали бессмысленное.

Проблема оказалась в том, что webhooks шли через HTTP, а всё у меня уже работало через HTTPS. Куки не обрабатывались, туннель API оказался лишним, docker не доверял IP клиента. Пришлось в docker-compose.yml прописывать:

networks:
      default:
        ipv4_address: 172.20.0.2

Потом был конфликт сертификатов, SSE и WebSocket. Я потратил день на всё это — и наконец бот ответил.

Разгрузка: спасение в Obsidian и GitHub

Всю документацию, команды, даже ошибки я хранил в Obsidian. Там же создавал шаблоны, чтобы не печатать одни и те же команды. Это было моим вторым спасением после ChatGPT.

Когда всё начало получаться — создал репозиторий. Сейчас там:

  • README.md с пошаговыми действиями;

  • n8n-raw.env для автоматизации запуска;

  • Docker-конфиги.

Проект пока не идеален, но рабочий и повторяемый.

Финал: в этой истории я вырос

Когда Telegram наконец сработал — было 3 часа ночи. Я сидел в темноте, всматривался в терминал и не верил. Всё. Бот работает. HTTPS есть. Docker жив. Я сам развернул свой первый полноценный сервер. Сам. С нуля. С ошибками. Без опыта.

Теперь я могу:

  • Развернуть ВМ и подключиться через SSH;

  • Настроить Docker и Nginx;

  • Создать и связать домен;

  • Конфигурировать n8n под прод;

  • Документировать всё на GitHub.

Я только начал, но теперь точно знаю — могу не просто тестировать, а создавать решения с нуля.

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.