Знакът на КАГАМИ КАГАМИ
kagami.bg/academy · lesson · machine-readable viewVERIFIED 2026-10-01 · UPDATED 2026-10-01
IDENTITY
module
GX10-04-01 · n8n automation with a local AI model
series
GX10 (local AI server class: NVIDIA GB10, e.g. ASUS Ascent GX10 / DGX Spark)
level
Intermediate
duration
1–2 h
prerequisites
A GB10-class machine with DGX OS (Ubuntu 24.04, Arm64), shell access (local or SSH), Docker and the NVIDIA Container Toolkit (preinstalled on DGX Spark per NVIDIA)
trust_label
VERIFIED 2026-10-01 (against official n8n, Docker, Ollama and NVIDIA DGX Spark documentation; image tags and arm64 builds checked on Docker Hub) · UPDATED 2026-10-01 · NOT TESTED end to end (no GB10 machine available during the check)
versions
n8n 2.41.4 (pinned via env) · PostgreSQL 18 · Ollama 0.35.0 (pinned via env) · Docker Compose v2 plugin · all images published for linux/arm64
language
human view: bg · english edition: /en/academy/gx10/ (same file name)
previous / next
GX10 series index (first lesson) / 04-116_Morning_Dashboard_Appsmith.html
PURPOSE

Run a local automation stack on a GB10-class AI server: one Docker Compose project with n8n (workflow automation) on PostgreSQL and Ollama (local LLM runtime with GPU access), secrets in an .env file, only the n8n port published and only to loopback. Reach the editor through an SSH tunnel. Build a first workflow in which a local model scores an incoming message, without any external API.

KEY CONCEPTS
COMMANDS / PATHS
CHECKLIST
NEXT MODULE

04-116 · Appsmith dashboard over Postgres and Ollama (04-116_Morning_Dashboard_Appsmith.html) · series index: kagami.bg/academy/gx10/ · offer: Quick experiment (kagami.bg/stalbata/)

SOURCES
TAGS
gx10nvidia-gb10arm64docker-composen8npostgresollamaself-hostingautomation
ПРОВЕРЕНО · 01.10.2026 ОБНОВЕНО · 01.10.2026

n8n на GX10: автоматизации с локален AI

Вдигаме на локален AI сървър от класа NVIDIA GB10 работилница за автоматизации: n8n за работните процеси, Postgres за паметта му и Ollama за модела. Всичко върви в Docker с една команда, моделът не напуска машината, а тайните стоят в отделен файл.

⏱ 1–2 ч Средно GX10 NVIDIA GB10 · 20 ядра Arm · 128 GB обща памет Docker · n8n · Postgres · Ollama
Docker · Compose (ARM64)🔒 локално n8n · Postgres🔒 локално Ollama (моделът)🔒 локално
🔄
ОБНОВЕНО · 01.10.2026 — какво
Стекът е преработен по текущите документи. Махнахме остарялото: основната автентикация на n8n (N8N_BASIC_AUTH_* не съществува в днешните версии — първото отваряне създава собственически акаунт), версиите latest (сега са закачени във .env: n8n 2.41.4, Ollama 0.35.0, Postgres 18), Postgres 16, реда platform: linux/arm64 (образите са многоархитектурни и Docker взема сам ARM64), ръчната инсталация на Docker (на DGX OS той е предварително инсталиран), отварянето на порт 5678 в защитната стена и публичния Caddy като стандартен път. Добавихме: Ollama като вътрешна услуга без публикуван порт (нищо не слуша на 0.0.0.0), достъп до редактора през SSH тунел, затворени портове (само 127.0.0.1), именувани томове, проверка на ARM64 и на достъпа до видеокартата, генерирани тайни, копия и обновяване. Поправихме числата: „1 PetaFLOP“ е при FP4 с разреждане (sparsity), не обща мощност; 128 GB памет е обща за процесора и видеокартата. Съкратихме петте работни процеса до един подробен (оценка на запитване с локален модел) и таблица с идеи — конкретните връзки към външни услуги (CRM, социални мрежи, Clearbit) не са сверени, затова не ги даваме като готови рецепти.
⚠️
Какво не сме пускали сами
При проверката нямахме машина от класа GB10. Файловете са сверени с официалните документи и са синтактично валидни, но не са тествани от край до край — затова няма етикет „ТЕСТВАНО“. Особено непроверени са работата на Ollama в контейнер върху GB10 и скоростта на моделите.

01Какво ще научиш

02Преди да започнеш

КаквоСтойност (по ASUS и NVIDIA)
Процесор20 ядра Arm: 10 × Cortex-X925 + 10 × Cortex-A725
ВидеокартаNVIDIA Blackwell (GB10, вградена); Tensor ядра 5-о поколение
Памет128 GB LPDDR5x, обща за процесора и видеокартата
Мощност за ИИдо 1 PFLOP при FP4 с разреждане (sparsity)
Мрежа10 Gbit Ethernet, Wi-Fi 7, ConnectX-7
СистемаNVIDIA DGX OS (Ubuntu 24.04)
💡
Защо ARM64 има значение
Процесорът не е x86. Образът трябва да е изграден за linux/arm64. Проверихме в Docker Hub: n8n 2.41.4, Postgres 18, Ollama 0.35.0 и Caddy 2 имат такива образи. Docker сам избира правилния — не е нужен ред platform.

03Стъпки

  1. Какво ще стои къде

    Накрая ще имаш три контейнера в един проект. Защо контейнери? Всяка програма идва с всичко нужно, не пречи на другите и се маха с една команда.

    УслугаЗа какво еДостъп
    n8nРедактор и двигател за автоматизациисамо 127.0.0.1:5678 на машината
    PostgresБазата на n8nвътрешна, без публикуван порт
    OllamaЛокалните езикови моделивътрешна, без публикуван порт
  2. Провери машината

    Първите две команди показват архитектурата и версиите. Третата пуска малък контейнер с достъп до видеокартата — така знаем, че Docker вижда GPU, преди да сложим Ollama.

    bash · на машината
    uname -m
    docker --version
    docker compose version
    docker run --rm --gpus=all nvcr.io/nvidia/cuda:13.0.1-devel-ubuntu24.04 nvidia-smi

    Очакваш aarch64, Compose v2 и таблица с видеокартата. В нея редът за памет може да казва „Memory-Usage: Not Supported“ — това е нормално: видеокартата няма отделна памет, а ползва общата (потвърждава NVIDIA).

    ⚠️
    Не тръгва с GPU?
    Виж раздела за отстраняване на неизправности в документацията на NVIDIA за контейнерната среда: проверка на nvidia-ctk --version, на /etc/docker/daemon.json и рестарт на Docker. Версията на образа на CUDA в командата е по документацията към 01.10.2026 — при по-нова система провери актуалния таг.
  3. Папка и файл с тайните

    Тайните (пароли, ключ за криптиране) не се пишат в compose файла. Държим ги в .env — Compose го чете сам. Генерираме ги на място, за да няма две инсталации с една и съща „тайна“.

    bash · ~/n8n-gx10/.env
    mkdir -p ~/n8n-gx10 && cd ~/n8n-gx10
    
    cat > .env <<EOF
    N8N_VERSION=2.41.4
    OLLAMA_VERSION=0.35.0
    POSTGRES_USER=n8n
    POSTGRES_PASSWORD=$(openssl rand -hex 24)
    POSTGRES_DB=n8n
    N8N_ENCRYPTION_KEY=$(openssl rand -hex 32)
    TZ=Europe/Sofia
    EOF
    
    chmod 600 .env
    ✅
    Запази ключа извън стека
    N8N_ENCRYPTION_KEY шифрова всичките ти достъпи в n8n. Без него, след възстановяване от копие, достъпите не могат да се разшифроват. Препиши го в мениджър на пароли. Версиите са текущите към 01.10.2026 — виж „Обновяване“ по-долу.
  4. Файлът compose.yaml

    Един файл описва целия стек. Четири правила си заслужава да запомниш: версиите са закачени (не latest), данните са в именувани томове, единственият публикуван порт е на n8n и то само към 127.0.0.1, а n8n чака Postgres да е „здрав“, преди да стартира.

    yaml · ~/n8n-gx10/compose.yaml
    name: n8n-gx10
    
    services:
      postgres:
        image: postgres:18
        restart: unless-stopped
        environment:
          POSTGRES_USER: ${POSTGRES_USER}
          POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
          POSTGRES_DB: ${POSTGRES_DB}
          PGDATA: /var/lib/postgresql/data
        volumes:
          - db_data:/var/lib/postgresql/data
        healthcheck:
          test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
          interval: 5s
          timeout: 5s
          retries: 10
    
      ollama:
        image: ollama/ollama:${OLLAMA_VERSION}
        restart: unless-stopped
        volumes:
          - ollama_models:/root/.ollama
        deploy:
          resources:
            reservations:
              devices:
                - driver: nvidia
                  count: all
                  capabilities: [gpu]
    
      n8n:
        image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
        restart: unless-stopped
        depends_on:
          postgres:
            condition: service_healthy
        environment:
          TZ: ${TZ}
          GENERIC_TIMEZONE: ${TZ}
          DB_TYPE: postgresdb
          DB_POSTGRESDB_HOST: postgres
          DB_POSTGRESDB_PORT: "5432"
          DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
          DB_POSTGRESDB_USER: ${POSTGRES_USER}
          DB_POSTGRESDB_PASSWORD: ${POSTGRES_PASSWORD}
          N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
          N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
        ports:
          - "127.0.0.1:5678:5678"
        volumes:
          - n8n_data:/home/node/.n8n
    
    volumes:
      db_data:
      ollama_models:
      n8n_data:
    💡
    Защо точно така
    PGDATA — Postgres 18 смени мястото на данните по подразбиране; без този ред базата започва празна (предупреждение от документацията на n8n). Ollama без ports — моделът е достъпен само за другите контейнери в проекта, а не за мрежата; така не отваряме Ollama на 0.0.0.0. deploy.devices — така Compose иска достъп до видеокартата (формата е от документацията на Docker). 127.0.0.1 — портът на n8n не е видим за другите в мрежата ти.

    Провери, че файлът е четим (Compose замества променливите и показва резултата — тайните също, затова не го пращай никому):

    bash
    docker compose config --quiet && echo "compose: OK"
  5. Стартирай и провери

    bash
    docker compose up -d
    docker compose ps
    curl -sf http://localhost:5678/healthz && echo " n8n е жив"

    Първия път се теглят образите. След това docker compose ps трябва да покаже postgres като healthy, а n8n и ollama като running. Ако нещо не стои, виж логовете: docker compose logs -f n8n (изход с Ctrl+C).

  6. Отвори редактора от своя компютър

    n8n слуша само на самата машина. От твоя компютър стигаш до него през SSH тунел — защитен коридор, който не отваря нищо към мрежата. Адресът на машината е този, с който вече се свързваш по SSH.

    bash · на твоя компютър
    ssh -L 5678:localhost:5678 <потребител>@<адрес-на-машината>

    Остави връзката отворена и отвори http://localhost:5678 в браузъра си. При първо отваряне n8n те кара да създадеш собственически акаунт (имейл, име, парола) — няма друга „основна автентикация“. Ако работиш директно на машината, просто отвори същия адрес.

    🌐
    Нужен ти е публичен адрес?
    Това е друг, по-рисков урок: нужен е домейн, обратен прокси (например Caddy, който сам урежда HTTPS), променливите N8N_HOST, N8N_PROTOCOL, WEBHOOK_URL и N8N_PROXY_HOPS — виж документацията на n8n. Не го правим тук и не сме го пробвали на GB10. Докато не ти трябва външен webhook, тунелът е достатъчен.
  7. Ollama: изтегли модел

    Моделите се теглят вътре в контейнера на Ollama и стоят в тома ollama_models — оцеляват при рестарт.

    bash
    docker compose exec ollama ollama pull llama3.1
    docker compose exec ollama ollama list
    docker compose exec ollama ollama run llama3.1 "Кажи „Стекът работи!“ на 3 езика"

    По ollama.com: llama3.1 (8B) е около 4,9 GB, mistral (7B) — 4,4 GB, gemma2:27b — 16 GB, llama3.1:70b — 43 GB. Паметта е обща: моделът, системата и контейнерите делят едни и същи 128 GB, затова не пускай няколко големи модела наведнъж. ⚠️ Скоростта на отговорите на твоята машина не сме мерили.

    ⚠️
    Вече имаш Ollama, инсталиран направо в системата?
    Той по подразбиране слуша само на loopback и контейнерът на n8n не може да го достигне. Най-простото е да ползваш Ollama от този compose (както по-горе). Ако държиш системния, задай адреса му през sudo systemctl edit ollama (променливата OLLAMA_HOST) — но не на 0.0.0.0, защото така моделът става достъпен за цялата мрежа. ⚠️ Този вариант не е тестван от нас; виж настройките в документацията на Ollama.
  8. Първи работен процес: локален модел оценява запитване

    В n8n: Credentials → Create credential → Ollama → Base URL http://ollama:11434 (името на услугата от compose; вътре в контейнера localhost е самият контейнер) → Save.

    След това Workflows → Create workflow и добави:

    1. възел Webhook — метод POST, път lead-demo;
    2. възел Basic LLM Chain с промпт „Define below“, например: Оцени от 1 до 10 колко е готово за покупка това запитване и обясни в едно изречение: {{ $json.body.message }};
    3. към веригата закачи под-възела Ollama Chat Model с твоя credential и модел llama3.1.

    Натисни Listen for test event във Webhook възела и от терминала на машината прати измислено запитване на тестовия адрес:

    bash
    curl -X POST http://localhost:5678/webhook-test/lead-demo \
      -H "Content-Type: application/json" \
      -d '{"message":"Здравейте, търсим автоматизация за обработка на заявки, бюджет до 2000 EUR, стартираме този месец."}'

    Отговорът на модела се появява в изхода на веригата (полето text). Докато редактираш, работи тестовият адрес /webhook-test/…; за постоянно действие работният процес трябва да е публикуван (бутонът Publish) и да се вика на /webhook/….

    ✅
    Човек одобрява всяко действие с реален ефект
    Оценката е препоръка. Изпращането на имейл, публикуването в социална мрежа или записът в CRM трябва да минат през одобрение от човек — докато не си сигурен как моделът греши.
  9. Какво още можеш да автоматизираш

    Същият модел „вход → локален модел → одобрение → действие“ върши работа на много места. Идеи, които можеш да изградиш по образеца от стъпка 8 (конкретните възли за външните услуги избери по документацията на n8n):

    ИдеяВходКакво прави локалният модел
    Оценка на запитванияWebhook от формата на сайтаОценка и обобщение за екипа
    Серия имейлиГрафик (Schedule) + таблица в PostgresПерсонализира текста; изпращането минава през одобрение
    Чернови за социални мрежиГрафик + списък с темиПише варианти; публикува човек
    Седмичен отчетДанни от твои източнициРезюме на български с числата

    Данните на тези процеси (запитвания, имейли) не напускат машината, докато моделът е локален — това е причината да ги вдигнеш тук, а не при облачен доставчик.

  10. Сигурност — минимумът

    • .env е с права 600, не е в Git и не се праща никому.
    • Ключът N8N_ENCRYPTION_KEY е препис на сигурно място.
    • Публикуван е само 127.0.0.1:5678; Postgres и Ollama нямат публикувани портове.
    • Не слагай 0.0.0.0 пред Ollama и не отваряй n8n към интернет без HTTPS и защита.
    • Паролата на собственическия акаунт е дълга и уникална, а двуфакторното удостоверяване е включено (Settings → Personal → Enable 2FA — по документацията на n8n; пази кодовете за възстановяване).
  11. Копия, обновяване и следене

    bash · от ~/n8n-gx10
    mkdir -p backups
    docker compose exec -T postgres sh -c 'pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB"' > backups/n8n-db-$(date +%Y%m%d).sql

    Пълното копие има две части: базата и ключът за криптиране (той е във .env — копирай и този файл на сигурно място). Пази копията и на друго място извън машината — копие на същия диск не пази от повреда на диска.

    Всеки ден, без да помниш. Сложи горната команда във файл backup.sh в папката на стека (с cd към нея в началото) и го пусни по график с crontab -e, например всеки ден в 03:00: 0 3 * * * <пълен-път>/backup.sh. Старите копия чисти отделно (например find backups -name '*.sql' -mtime +30 -delete) — но едва след като си проверил, че копията извън машината стигат.

    История на изпълненията. n8n сам чисти старите изпълнения: по подразбиране пази до 14 дни (EXECUTIONS_DATA_MAX_AGE=336 часа) и до 10 000 записа (EXECUTIONS_DATA_PRUNE_MAX_COUNT). Ако ти трябват по-кратко или по-дълго, добави тези променливи в environment на n8n.

    Обновяване. Сменяш числото в .env (N8N_VERSION, OLLAMA_VERSION) по текущите издания в Docker Hub на n8n и на Ollama, и пускаш (първо направи копие):

    bash
    docker compose pull
    docker compose up -d --remove-orphans
    docker compose logs -f n8n --tail=50

    Не сменяй основната версия на Postgres просто с нов таг — това изисква отделна процедура (виж документацията на Postgres).

    Следене.

    bash
    docker compose ps
    docker stats --no-stream
    nvidia-smi

    docker stats показва процесор и памет на контейнерите, nvidia-smi — натоварването на видеокартата (без брояч за памет — виж стъпка 2).

04Проверка

Тест

1. Как контейнерът на n8n достига до Ollama в този стек?

2. Защо Ollama няма ред ports в compose файла?

3. Къде е правилно да стои паролата на базата и ключът за криптиране на n8n?

4. Редът „Memory-Usage: Not Supported“ в nvidia-smi на GB10 означава:

05Какво следва

06Източници

  1. ASUS Ascent GX10: технически данни — процесор, памет, мрежа, система.
  2. NVIDIA DGX Spark: хардуер · контейнерна среда за Docker · известни особености — 1 PFLOP при FP4 с разреждане, предварително инсталиран Docker, „Memory-Usage: Not Supported“.
  3. n8n: инсталиране с Docker Compose — Postgres 18 и PGDATA.
  4. n8n: Ollama credential — Base URL, Ollama в друг контейнер.
  5. n8n: променливи за средата — N8N_ENCRYPTION_KEY, WEBHOOK_URL, N8N_PROXY_HOPS.
  6. n8n: двуфакторно удостоверяване · n8n: данни за изпълненията — 2FA, автоматично чистене (336 часа, 10 000 записа).
  7. Docker Compose: достъп до GPU · Ollama в Docker 🔒 локално.
  8. n8n в Docker Hub · Ollama в Docker Hub — тагове и архитектури (arm64).
  9. llama3.1 · mistral · gemma2 🔒 локално — размери на моделите.