Данный скрипт писался в рамках 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."