n8n-nodes-mysql-variables
v0.5.1
Published
n8n community node to store variables (cookies, API keys, client id/secret) in MySQL or embedded SQLite — flat key→value store with per-credential isolation and AES-256-GCM encryption at rest.
Downloads
1,189
Maintainers
Readme
n8n-nodes-mysql-variables
English | Русский
A custom community node for n8n Community Edition that stores variables (cookies, API keys, client id/secret and any other values) in MySQL or in embedded SQLite (no separate database server — chosen in the credential).
Compared to existing solutions:
| Solution | Persist | Read/Write | Isolation | Encryption |
|---|---|---|---|---|
| $vars (native) | ✅ | ✅ | — | — (Enterprise only) |
| n8n-nodes-globals | ✅ | read only | ❌ | ❌ |
| n8n-nodes-datastore | ❌ (RAM) | ✅ | ❌ | ❌ |
| this package | ✅ SQLite/MySQL | ✅ | ✅ (per credential) | ✅ AES-256-GCM |
Storage: SQLite or MySQL
The Storage field in the credential switches the backend:
- SQLite (embedded) — the default. No database server, nothing to set up.
Data lives in a file inside the n8n data folder; the file path is resolved
automatically from the
Username/Encryption Key (see "Isolation & sharing"). Built onsql.js(WASM) — it compiles inside the n8n Docker image with no native build step. Great when colleagues don't have their own MySQL. Limitation: the store is local to that n8n instance (not shared over the network across multiple servers). - MySQL — a central store, shared across multiple n8n instances, with the option to give each person their own MySQL login.
The logic (flat key→value, AES encryption, operations) is identical for both backends.
Keep the SQLite file on a mounted volume (
~/.n8n), otherwise data won't survive container recreation.
Features
- Operations: Get, Get All Keys, Set (upsert), Create, Update, Delete, Clear (empty a value).
- Flat key→value: one store = one SQLite file (or one MySQL table). Keys are unique within a store.
- Encryption at rest: values are AES-256-GCM encrypted before they are written; the database holds ciphertext.
- Value types: String and JSON.
- Usable as Tool: the node can be attached to n8n AI agents.
Isolation & sharing (SQLite)
The Encryption Key is the store's access secret, not just an encryption key.
The file path is derived from a hash of the Encryption Key (+ an optional
Username), so you cannot open or list someone else's store by knowing only
their Username — you need the exact key.
The path is resolved automatically. Priority:
Usernameset →n8n-vars-<username>-<hash(key)>.sqlite.Usernameis just a label (you can keep several stores under one key); access is governed by the key.Usernameempty →n8n-vars-<hash(key)>.sqlite(one store per key).- Advanced → Custom File Path → an explicit path (for power users), overrides everything.
To share a store with a team:
- share the credential itself with colleagues (n8n credential sharing), or
- give them the same
UsernameandEncryption Key.
⚠️ This protects access through the UI (guessing another user's
Usernameis useless without the key). File storage does not protect against someone with disk access to~/.n8n— for hard multi-user isolation use n8n credential sharing and don't grant direct filesystem access. Values are encrypted with theEncryption Keyeither way.
Table schema
Created automatically (Auto-create Table = on). SQL to create it manually (MySQL):
CREATE TABLE IF NOT EXISTS `n8n_variables` (
`key` VARCHAR(190) NOT NULL,
`value` LONGTEXT NULL,
`type` VARCHAR(20) NOT NULL DEFAULT 'string',
`encrypted` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;With MySQL, isolation is done via a separate table (Table Name) or a separate database per credential.
Install
Recommended — via the Community Nodes UI
Settings → Community nodes → Install a community node, then enter:
n8n-nodes-mysql-variablesRequires N8N_COMMUNITY_PACKAGES_ENABLED=true (default on self-hosted). To use
the node as a tool for AI agents, also set N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true.
Build from source
npm install
npm run build # -> dist/Manual install (Docker, self-hosted)
Option A — local custom folder (quick, no npm publish)
# 1. Build and pack
npm install && npm run build
npm pack # -> n8n-nodes-mysql-variables-<version>.tgz
# 2. Install into the custom folder that is mounted into the container
mkdir -p ~/n8n-data/custom
cd ~/n8n-data/custom
npm init -y
npm install /full/path/n8n-nodes-mysql-variables-<version>.tgz # pulls in mysql2# 3. Start n8n with ~/n8n-data mounted at /home/node/.n8n
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom \
-e N8N_COMMUNITY_PACKAGES_ENABLED=true \
-v ~/n8n-data:/home/node/.n8n \
docker.n8n.io/n8nio/n8nn8n picks up the node from ~/.n8n/custom automatically. After a restart it
appears in the palette as MySQL Variables.
Option B — custom Docker image (for production)
FROM docker.n8n.io/n8nio/n8n:latest
USER root
COPY . /opt/n8n-nodes-mysql-variables
RUN cd /opt/n8n-nodes-mysql-variables && npm install && npm run build \
&& mkdir -p /opt/custom && cd /opt/custom && npm init -y \
&& npm install /opt/n8n-nodes-mysql-variables
ENV N8N_CUSTOM_EXTENSIONS=/opt/custom
USER nodedocker build -t n8n-with-vars .
docker run -it --rm -p 5678:5678 -v ~/n8n-data:/home/node/.n8n n8n-with-varsdocker-compose (example)
services:
n8n:
image: docker.n8n.io/n8nio/n8n
ports:
- "5678:5678"
environment:
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
- N8N_COMMUNITY_PACKAGES_ENABLED=true
volumes:
- ./n8n-data:/home/node/.n8nCredential setup
In n8n, create a MySQL Variables API credential:
| Field | Description |
|---|---|
| Storage | SQLite (embedded) or MySQL. |
| Encryption Key | AES key and the store's access secret (the file is derived from it). |
| Username | SQLite only. Store label (not a secret). Empty → one store per key. |
| Advanced: Custom File Path → SQLite File Path | SQLite only, for power users: an explicit file path. |
| Host / Port / Database / User / Password / SSL | MySQL only. In Docker localhost ≠ host — see below. |
| Table Name | MySQL only. Isolate by using a separate table/database per credential. |
| Auto-create Table | Create the table automatically. |
Docker + MySQL: inside the n8n container
localhostpoints to the container itself. Use the MySQL container/service name (shared docker network) orhost.docker.internalfor a database on the host machine. This is the cause of theconnect ECONNREFUSED ::1:3306error.
Using it in expressions
// read a variable value from the MySQL Variables node
{{ $('MySQL Variables').item.json.value }}Typical pattern: a MySQL Variables (Get) node at the start of the workflow → the value is then used in HTTP Request / other nodes via the expression above.
Operations
| Operation | What it does | |---|---| | Get Variable | Read a value by key | | Get All Keys | List all keys (optionally with values) | | Set Variable | Upsert (create or update) | | Create Variable | Insert, error if it already exists | | Update Variable | Update, error if missing | | Delete Variable | Remove the key entirely | | Clear Variable | Empty the value, keep the key |
License
MIT
🇷🇺 Русский (Russian)
English | Русский
Кастомная community-нода для n8n Community Edition, которая хранит переменные (куки, API-ключи, client id/secret и любые другие значения) в MySQL или во встроенной SQLite (без отдельного сервера БД — выбирается в credential).
В отличие от готовых решений:
| Решение | Persist | Read/Write | Изоляция | Шифрование |
|---|---|---|---|---|
| $vars (native) | ✅ | ✅ | — | — (Enterprise only) |
| n8n-nodes-globals | ✅ | только чтение | ❌ | ❌ |
| n8n-nodes-datastore | ❌ (RAM) | ✅ | ❌ | ❌ |
| этот пакет | ✅ SQLite/MySQL | ✅ | ✅ (по credential) | ✅ AES-256-GCM |
Хранилище: SQLite или MySQL
Поле Storage в credential переключает бэкенд:
- SQLite (embedded) — по умолчанию. Никакого сервера БД, ничего настраивать не надо.
Данные лежат в файле внутри папки данных n8n; путь к файлу подбирается автоматически
по
Username/ключу (см. «Изоляция и шеринг»). Реализовано наsql.js(WASM) — собирается в Docker-образе n8n без нативной компиляции. Подходит, когда у коллег нет своей MySQL. Ограничение: store локален для этого инстанса n8n (не шарится по сети между серверами). - MySQL — централизованное хранилище, общее для нескольких инстансов n8n, с возможностью дать каждому свой MySQL-логин.
Логика (плоский key→value, AES-шифрование, операции) одинакова для обоих бэкендов.
SQLite-файл держи на смонтированном volume (
~/.n8n), иначе данные не переживут пересоздание контейнера.
Возможности
- Операции: Get, Get All Keys, Set (upsert), Create, Update, Delete, Clear (обнулить значение).
- Плоский key→value: один store = один файл SQLite (или одна таблица MySQL). Ключ уникален в рамках store.
- Шифрование at rest: значения шифруются AES-256-GCM перед записью; в БД лежит шифротекст.
- Типы значений: String и JSON.
- Usable as Tool: ноду можно подключать к AI-агентам n8n.
Изоляция и шеринг (SQLite)
Encryption Key — это секрет доступа к стору, а не только ключ шифрования. Путь к файлу
выводится из хеша Encryption Key (+ опционального Username), поэтому открыть или просмотреть
чужой стор, зная только его Username, нельзя — нужен точный ключ.
Путь подбирается автоматически. Приоритет:
Usernameзадан →n8n-vars-<username>-<хеш(ключ)>.sqlite.Username— просто метка (можно держать несколько сторов на один ключ); доступ решает ключ.Usernameпуст →n8n-vars-<хеш(ключ)>.sqlite(один стор на ключ).- Advanced → Custom File Path → явный путь (для профи), перекрывает всё.
Расшарить store на команду:
- расшарить сам credential коллегам (Credential sharing в n8n), или
- сообщить им одинаковый
UsernameиEncryption Key.
⚠️ Это защищает доступ через UI (подбор чужого
Usernameбез ключа бесполезен). Файловое хранилище не защищает от того, у кого есть доступ к диску~/.n8n— для жёсткой многопользовательской изоляции используй credential sharing n8n и не давай прямой доступ к ФС. Значения в любом случае зашифрованыEncryption Key.
Схема таблицы
Создаётся автоматически (Auto-create Table = on). SQL для ручного создания (MySQL):
CREATE TABLE IF NOT EXISTS `n8n_variables` (
`key` VARCHAR(190) NOT NULL,
`value` LONGTEXT NULL,
`type` VARCHAR(20) NOT NULL DEFAULT 'string',
`encrypted` TINYINT(1) NOT NULL DEFAULT 1,
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;При MySQL изоляция делается через отдельную таблицу (Table Name) или отдельную БД на credential.
Установка
Рекомендованный способ — через UI Community Nodes
Settings → Community nodes → Install a community node, затем впиши:
n8n-nodes-mysql-variablesНужен N8N_COMMUNITY_PACKAGES_ENABLED=true (по умолчанию включён на self-hosted). Чтобы
использовать ноду как tool в AI-агентах, добавь ещё N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true.
Сборка из исходников
npm install
npm run build # -> dist/Ручная установка (Docker, self-hosted)
Вариант A — локальная папка custom (быстро, без публикации в npm):
# 1. Собрать и упаковать
npm install && npm run build
npm pack # -> n8n-nodes-mysql-variables-<version>.tgz
# 2. Поставить в папку custom, которая монтируется в контейнер
mkdir -p ~/n8n-data/custom
cd ~/n8n-data/custom
npm init -y
npm install /full/path/n8n-nodes-mysql-variables-<version>.tgz # подтянет mysql2# 3. Запустить n8n, смонтировав ~/n8n-data в /home/node/.n8n
docker run -it --rm \
--name n8n \
-p 5678:5678 \
-e N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom \
-e N8N_COMMUNITY_PACKAGES_ENABLED=true \
-v ~/n8n-data:/home/node/.n8n \
docker.n8n.io/n8nio/n8nПосле рестарта нода появится в палитре как MySQL Variables.
Вариант B — свой Docker-образ (для прода):
FROM docker.n8n.io/n8nio/n8n:latest
USER root
COPY . /opt/n8n-nodes-mysql-variables
RUN cd /opt/n8n-nodes-mysql-variables && npm install && npm run build \
&& mkdir -p /opt/custom && cd /opt/custom && npm init -y \
&& npm install /opt/n8n-nodes-mysql-variables
ENV N8N_CUSTOM_EXTENSIONS=/opt/custom
USER nodeНастройка credential
В n8n создай credential MySQL Variables API:
| Поле | Описание |
|---|---|
| Storage | SQLite (embedded) или MySQL. |
| Encryption Key | Ключ AES и секрет доступа к стору (из него выводится файл). |
| Username | Только SQLite. Метка стора (не секрет). Пусто → один стор на ключ. |
| Advanced: Custom File Path → SQLite File Path | Только SQLite, для профи: явный путь к файлу. |
| Host / Port / Database / User / Password / SSL | Только MySQL. В Docker localhost ≠ хост — см. ниже. |
| Table Name | Только MySQL. Изоляция — своя таблица/БД на credential. |
| Auto-create Table | Создавать таблицу автоматически. |
Docker + MySQL:
localhostвнутри контейнера n8n указывает на сам контейнер. Используй имя сервиса/контейнера MySQL (общая docker-сеть) либоhost.docker.internalдля базы на хост-машине. Это причина ошибкиconnect ECONNREFUSED ::1:3306.
Использование в выражениях
// получить значение переменной из ноды MySQL Variables
{{ $('MySQL Variables').item.json.value }}Типичный паттерн: нода MySQL Variables (Get) в начале workflow → дальше значение используется в HTTP Request / прочих нодах через выражение выше.
Операции
| Операция | Что делает | |---|---| | Get Variable | Читает значение по ключу | | Get All Keys | Список всех ключей (опц. со значениями) | | Set Variable | Upsert (создать или обновить) | | Create Variable | Вставить, ошибка если уже есть | | Update Variable | Обновить, ошибка если нет | | Delete Variable | Удалить ключ целиком | | Clear Variable | Обнулить значение, ключ оставить |
Лицензия
MIT
