Кирилл

Вечкасов

Статьи
Наши курсы

Кирилл

Вечкасов

>

>

Обнолвение n8n в Easy Panel

Ежедневное обновление n8n на Beget + создание БД

Данный скрипт писался в рамках 5 урока курса "n8n для чайников" для быстрого удобного запуска новичкам и при этом для удобства и замены Google Таблиц создаёт БД для работы с собственными данными.

1. Создание файла

Ниже копируете код, вставляете в созданный файл с названием "update-n8n.sh" и загружаете его на сервер "/home" в данную папку.

2. Выдайте права на выполнение

chmod +x /home/update-n8n.sh

3. Запуск

В интерфейсе командной строки вводите команду и она сама всё сделает.

bash /home/update-n8n.sh

По завершеню работы появится файл "adminer-info.txt" где будет подобная информация. Где IP - это доступ к интерфейсу для работы с вашей базей данных, доступы и отдельно на всякий случай копируется ключ безопасности которые вам может пригодиться в случае бекапа или копирования БД n8n на новый сервер.

================ Adminer access ================
URL: http://90.156.255.***:8080
Login: user
Password: ***
DB for n8n: n8n
Isolated DB: userdb
================================================

================ n8n database access ===========
Host: postgres
Port: 5432
Database: n8n
User: user
Password: CpwiFulcIvb3AAn
================================================

================ n8n encryption key ============
19a2f015-9861-5639-a349-62d2d37c8669
================================================

Generated at: 2025-09-29 08:23:50

Видео с таймкодом запуска данного файла и его загрузки на сервер.

Скрипт для установки

#!/bin/bash
set -e

WORKDIR="/opt/beget/n8n"
DOCKER_COMPOSE_FILE="$WORKDIR/docker-compose.yml"
IMAGE="docker.n8n.io/n8nio/n8n:latest"
INFO_FILE="/home/adminer-info.txt"
CRON_TASK="0 0 * * * TZ=Europe/Moscow /home/update-n8n.sh >> /var/log/n8n-update.log 2>&1"

cd "$WORKDIR"

echo "[INFO] Checking n8n updates..."

# === Заменяем любую версию с цифрами на latest в docker-compose.yml ===
echo "[INFO] Проверяем docker-compose.yml перед изменением..."
grep "docker\.n8n\.io/n8nio/n8n:" "$DOCKER_COMPOSE_FILE" || true

sed -i 's|docker\.n8n\.io/n8nio/n8n:[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*|docker.n8n.io/n8nio/n8n:latest|g' "$DOCKER_COMPOSE_FILE"
sed -i 's|docker\.n8n\.io/n8nio/n8n:[0-9]\+\.[0-9]\+\.[0-9]\+|docker.n8n.io/n8nio/n8n:latest|g' "$DOCKER_COMPOSE_FILE"

echo "[INFO] Проверяем docker-compose.yml после изменения..."
grep "docker\.n8n\.io/n8nio/n8n:" "$DOCKER_COMPOSE_FILE" || true
echo "[INFO] Заменил версию образа на latest в docker-compose.yml"

# === Считываем настройки из .env ===
POSTGRES_USER=$(grep "^POSTGRES_NON_ROOT_USER=" .env | cut -d= -f2)
POSTGRES_PASSWORD=$(grep "^POSTGRES_NON_ROOT_PASSWORD=" .env | cut -d= -f2)
POSTGRES_ROOT=$(grep "^POSTGRES_USER=" .env | cut -d= -f2)
POSTGRES_ROOT_PW=$(grep "^POSTGRES_PASSWORD=" .env | cut -d= -f2)
N8N_DB=$(grep "^DB_POSTGRESDB_DATABASE=" .env | cut -d= -f2)
ENCRYPTION_KEY=$(grep "^N8N_ENCRYPTION_KEY=" .env | cut -d= -f2)

# === Получаем внешний IP сервера ===
SERVER_IP=$(curl -s ifconfig.me)

# === Добавляем adminer при первом запуске ===
if ! grep -q "adminer:" "$DOCKER_COMPOSE_FILE"; then
    echo "[INFO] Adminer not found in docker-compose.yml — adding..."

    cat <<EOF >> "$DOCKER_COMPOSE_FILE"

  adminer:
    image: adminer:latest
    restart: always
    environment:
      - ADMINER_DEFAULT_SERVER=postgres
    ports:
      - "8080:8080"
    depends_on:
      - postgres
EOF
fi

# === Проверяем/создаем базу userdb от root ===
docker compose up -d postgres
sleep 10

POSTGRES_CONT=$(docker ps --format '{{.Names}}' | grep postgres | head -n1)
EXISTS=$(docker exec -i "$POSTGRES_CONT" psql -U "$POSTGRES_ROOT" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname='userdb';" || true)

if [ "$EXISTS" != "1" ]; then
    docker exec -i "$POSTGRES_CONT" psql -U "$POSTGRES_ROOT" -d postgres <<SQL
CREATE DATABASE userdb OWNER "$POSTGRES_USER";
GRANT ALL PRIVILEGES ON DATABASE userdb TO "$POSTGRES_USER";
SQL
    echo "[INFO] Database 'userdb' created and privileges granted."
else
    echo "[INFO] Database 'userdb' already exists, skipping."
fi

# === Записываем adminer-info.txt файлик ===
ADMINER_URL="http://$SERVER_IP:8080"
DATE_NOW=$(date '+%Y-%m-%d %H:%M:%S')

cat <<EOF > "$INFO_FILE"
================ Adminer access ================
URL: $ADMINER_URL
Login: $POSTGRES_USER
Password: $POSTGRES_PASSWORD
DB for n8n: $N8N_DB
Isolated DB: userdb
================================================

================ n8n database access ===========
Host: postgres
Port: 5432
Database: $N8N_DB
User: $POSTGRES_USER
Password: $POSTGRES_PASSWORD
================================================

================ n8n encryption key ============
$ENCRYPTION_KEY
================================================

Generated at: $DATE_NOW
EOF

echo "[INFO] Credentials saved in $INFO_FILE"

# === Добавляем задачу в cron (если её нет) ===
if ! crontab -l 2>/dev/null | grep -Fq "/home/update-n8n.sh"; then
    ( crontab -l 2>/dev/null; echo "$CRON_TASK" ) | crontab -
    echo "[INFO] Cron job added: $CRON_TASK"
else
    echo "[INFO] Cron job already exists, skipping."
fi

# === Проверяем наличие новой версии n8n ===
OLD_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $IMAGE 2>/dev/null || echo "none")
docker pull $IMAGE > /tmp/pull.log 2>&1
NEW_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $IMAGE 2>/dev/null || echo "none")

echo "[INFO] Принудительно перезапускаем контейнеры для применения latest версии..."
docker compose down
docker compose up -d

if [ "$OLD_DIGEST" != "$NEW_DIGEST" ]; then
    echo "[INFO] New n8n image found and containers restarted."
else
    echo "[INFO] n8n containers restarted with latest version."
fi

echo "[INFO] Update complete."

Мои соц. сети

Подписывайся на мой Telegram-канал — там регулярно публикую фишки по n8n, кейсы по рекламе и практичные решения для бизнеса.