Rundeck から n8n に乗り換えた

Rundeck とは

www.rundeck.com

n8n とは

n8n.io

乗り換えた理由(Rundeck のつらみ)

  • 重い
    • メモリ 2GB の VPS で Rundeck 専用につかっても重い
    • ジョブの一括削除すると必ずタイムアウトするか 30分 ぐらい待ってエラーとかでどうにもならなくなった
  • 起動が遅い
  • メモリ使用量が常時上限張り付き

乗り換えにあたって要した条件

  • 軽いこと
  • コードベースでジョブが扱えること
    • IFTTT は全部ポチポチ GUI なのでジョブが増えると手に負えなくなる
  • 柔軟性が高いこと
    • n8n は多くの Integration に対応している
    • n8n は多くの node*1 が予め用意されている
    • 困ったら最後の手段として JavaScript 直書き が用意されている

乗り換えてみた

  • Docker で使うのが結構推奨されているっぽいけど、普通に npm で入れて pm2 でバックグラウンド起動した
  • データベースは PostgreSQL を用いた
    • SSL 接続 OK
    • execution_entity テーブルの startedAt stoppedAt カラムは timestamp 型 ではなく timestamptz 型にしないと UTC 時刻で記録されてしまう
      • cron の実行時刻タイムゾーンについては別の箇所での設定なので、このカラムのタイムゾーンと cron の実行時刻タイムゾーンの間には直接の関係はない

ざっと使ってみての感想

メモリ使用量が激減した

gyazo.com

動作がサクサクになった

  • 起動も早い

プラグインや自前コードを書かなくても大抵の Integration や "node" が用意されている

n8n.io

UIが直感的、UXも高い

gyazo.com

困ったら JavaScript

  • 予め用意されている変数 も充実していて、便利*2
  • ただし、JavaScript を使うのは、あくまで代替手段に乏しいときにして、基本は用意されているものを使ったほうがいい*3

gyazo.com

gyazo.com

gyazo.com

シェルスクリプトを書く場所が広い

ワンライナーである必要なし。別途スクリプトファイルを用意する必要なし。

gyazo.com

メモを貼り付けることができる

地味に便利。

gyazo.com

gyazo.com

ワークフローをコードベース (JSON) でエクスポート・インポートできる

内容にもよるが、一つの ワークフロー あたりの JSON が 100行 ~ 数100行 で、Git で管理できるし、大量複製、変更もできるはず*4

docs.n8n.io

docs.n8n.io

「ワークフロー」はタグ付けは出来るがフォルダ分けはできない

ここらへんは IFTTT とおそらく一緒で、タグ付けで頑張ったり、名前で擬似フォルダを作って頑張ったりする*5しかなさそう。 ワークフローが一定数を超えると、探索的に検索するのは厳しくなりそう。

「適用」ボタンなどが原則ない

昨今のフロントエンドっぽく、変更のフォーカスが外れた時点で Update の API が飛ぶ。

cron の実行スケジュールを一覧できない

これは仕方がない。cron 特化ではないから。

やりたいならば、ワークフローのコード (JSON) を引っ張ってきて、それらから自分で組み立てて表示させるような仕組みがあればいい。

Workflows の一覧の並び順のデフォルト値が "Sort by last updated" で決め打ち

環境変数などで設定できるところがなさそう。

gyazo.com

細かい不具合はある

使っている .envrc

direnv を使って環境変数 を設定しているところ、 .envrc の内容です。

# Credentials
# CREDENTIALS_OVERWRITE_DATA
# CREDENTIALS_OVERWRITE_ENDPOINT
# CREDENTIALS_DEFAULT_NAME

# Database
export DB_TYPE=postgresdb
# DB_TABLE_PREFIX

# MySQL
# 省略

# PostgreSQL
export DB_POSTGRESDB_DATABASE=n8n
export DB_POSTGRESDB_HOST=123.456.789.012
export DB_POSTGRESDB_PORT=5432
export DB_POSTGRESDB_USER=USERNAME
export DB_POSTGRESDB_PASSWORD=PASSWORD
export DB_POSTGRESDB_SCHEMA=public
export DB_POSTGRESDB_SSL_CA_FILE="/path/to/server.crt"
export DB_POSTGRESDB_SSL_CERT_FILE="/path/to/client.crt"
export DB_POSTGRESDB_SSL_KEY_FILE="/path/to/client.key"
export DB_POSTGRESDB_SSL_REJECT_UNAUTHORIZED=false

# SQLite
# export DB_SQLITE_VACUUM_ON_STARTUP=false

# Deployment
export N8N_EDITOR_BASE_URL="https://n8n.example.com/"
# export N8N_CONFIG_FILES=/home/FOOBAR/n8n/config.json
export N8N_DISABLE_UI=false
export N8N_TEMPLATES_ENABLED=true
export N8N_TEMPLATES_HOST="https://api.n8n.io"
export N8N_ENCRYPTION_KEY="hoge"
export N8N_USER_FOLDER="/home/FOOBAR/n8n/HOGEFUGA"
export N8N_PATH=/
export N8N_HOST=localhost
export N8N_PORT=5678
export N8N_LISTEN_ADDRESS="0.0.0.0"
export N8N_PROTOCOL=http
# export N8N_SSL_KEY
# export N8N_SSL_CERT
export N8N_PERSONALIZATION_ENABLED=true
export N8N_VERSION_NOTIFICATIONS_ENABLED=true
export N8N_VERSION_NOTIFICATIONS_ENDPOINT="https://api.n8n.io/versions/"
export N8N_VERSION_NOTIFICATIONS_INFO_URL="https://docs.n8n.io/getting-started/installation/updating.html"
export N8N_DIAGNOSTICS_ENABLED=false
export N8N_DIAGNOSTICS_CONFIG_FRONTEND="1zPn9bgWPzlQc0p8Gj1uiK6DOTn;https://telemetry.n8n.io"
export N8N_DIAGNOSTICS_CONFIG_BACKEND="1zPn7YoGC3ZXE9zLeTKLuQCB4F6;https://telemetry.n8n.io/v1/batch"
export N8N_AVAILABLE_BINARY_DATA_MODES=filesystem
export N8N_BINARY_DATA_STORAGE_PATH="HOGEFUGA/binaryData"
export N8N_BINARY_DATA_TTL=60
export N8N_DEFAULT_BINARY_DATA_MODE=default
export N8N_PERSISTED_BINARY_DATA_TTL=1440
export VUE_APP_URL_BASE_API="https://n8n.example.com/"
export N8N_HIRING_BANNER_ENABLED=false

# User management and SMTP
export N8N_USER_MANAGEMENT_DISABLED=false
export N8N_EMAIL_MODE=smtp
export N8N_SMTP_HOST="smtp.sendgrid.net"
export N8N_SMTP_PORT=587
export N8N_SMTP_USER=apikey
export N8N_SMTP_PASS="foobarfoobar"
export N8N_SMTP_SENDER="hoge@example.com"
export N8N_SMTP_SSL=false
# export N8N_UM_EMAIL_TEMPLATES_INVITE
# export N8N_UM_EMAIL_TEMPLATES_PWRESET
# export N8N_USER_MANAGEMENT_JWT_SECRET

# Endpoints
export N8N_PAYLOAD_SIZE_MAX=16 # MB
export N8N_METRICS=false
export N8N_METRICS_PREFIX="n8n_"
export N8N_ENDPOINT_REST=rest
export N8N_ENDPOINT_WEBHOOK=webhook
export N8N_ENDPOINT_WEBHOOK_TEST="webhook-test"
export N8N_ENDPOINT_WEBHOOK_WAIT="webhook-waiting"
# export WEBHOOK_URL
export N8N_DISABLE_PRODUCTION_MAIN_PROCESS=false
export N8N_SKIP_WEBHOOK_DEREGISTRATION_SHUTDOWN=false

# External hooks
# export EXTERNAL_HOOK_FILES

# Executions
export EXECUTIONS_PROCESS=own
export EXECUTIONS_MODE=regular
export EXECUTIONS_TIMEOUT=3600
export EXECUTIONS_TIMEOUT_MAX=7200
export EXECUTIONS_DATA_SAVE_ON_ERROR=all
export EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
export EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
export EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false
export EXECUTIONS_DATA_PRUNE=false
export EXECUTIONS_DATA_MAX_AGE=336 # Hours
export EXECUTIONS_DATA_PRUNE_TIMEOUT=3600

# Logs
export N8N_LOG_LEVEL=info
export N8N_LOG_OUTPUT="console,file"
export N8N_LOG_FILE_COUNT_MAX=100
export N8N_LOG_FILE_SIZE_MAX=16
export N8N_LOG_FILE_LOCATION="/home/FOOBAR/n8n/logs"
export DB_LOGGING_ENABLED=true
export DB_LOGGING_OPTIONS="error,schema,warn,info,log"
export DB_LOGGING_MAX_EXECUTION_TIME=1000

# Nodes
# export NODES_INCLUDE
# export NODES_EXCLUDE
# export NODE_FUNCTION_ALLOW_BUILTIN
# export NODE_FUNCTION_ALLOW_EXTERNAL
# export NODES_ERROR_TRIGGER_TYPE
# export N8N_CUSTOM_EXTENSIONS

# Queues
# export QUEUE_BULL_PREFIX
# export QUEUE_BULL_REDIS_DB
# export QUEUE_BULL_REDIS_HOST
# export QUEUE_BULL_REDIS_PORT
# export QUEUE_BULL_REDIS_PASSWORD
# export QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD
# export QUEUE_RECOVERY_INTERVAL
# export QUEUE_WORKER_TIMEOUT
# export QUEUE_HEALTH_CHECK_ACTIVE
# export QUEUE_HEALTH_CHECK_PORT

# Security
# export N8N_AUTH_EXCLUDE_ENDPOINTS
export N8N_BASIC_AUTH_ACTIVE=false
# export N8N_BASIC_AUTH_USER
# export N8N_BASIC_AUTH_PASSWORD
export N8N_BASIC_AUTH_HASH=false
export N8N_BLOCK_ENV_ACCESS_IN_NODE=false
export N8N_JWT_AUTH_ACTIVE=false
# export N8N_JWT_AUTH_HEADER
# export N8N_JWT_AUTH_HEADER_VALUE_PREFIX
# export N8N_JWKS_URI
# export N8N_JWT_ISSUER
# export N8N_JWT_NAMESPACE
# export N8N_JWT_ALLOWED_TENANT
# export N8N_JWT_ALLOWED_TENANT_KEY

# Timezone and localization
export GENERIC_TIMEZONE="Asia/Tokyo"
export N8N_DEFAULT_LOCALE="ja"

# Workflows
export WORKFLOWS_DEFAULT_NAME=MyWorkflow
export N8N_ONBOARDING_FLOW_DISABLED=false
export N8N_WORKFLOW_TAGS_DISABLED=false

*1:一つ一つの実行単位のこと

*2:ドキュメントも整備されている

*3:特に "Expression" の場合は書式も制限されている https://docs.n8n.io/code-examples/expressions/

*4:まだ実際に試してはいない

*5:名前順ソートはできる

*6:この記事が公開されている頃には直っているかも

*7:この記事が公開されている頃には直っているかも

Powered by はてなブログ