Rundeck とは
n8n とは
乗り換えた理由(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 の実行時刻タイムゾーンの間には直接の関係はない
ざっと使ってみての感想
メモリ使用量が激減した
動作がサクサクになった
- 起動も早い
プラグインや自前コードを書かなくても大抵の Integration や "node" が用意されている
UIが直感的、UXも高い
困ったら JavaScript
- 予め用意されている変数 も充実していて、便利*2
- ただし、JavaScript を使うのは、あくまで代替手段に乏しいときにして、基本は用意されているものを使ったほうがいい*3
シェルスクリプトを書く場所が広い
ワンライナーである必要なし。別途スクリプトファイルを用意する必要なし。
メモを貼り付けることができる
地味に便利。
ワークフローをコードベース (JSON) でエクスポート・インポートできる
内容にもよるが、一つの ワークフロー あたりの JSON が 100行 ~ 数100行 で、Git で管理できるし、大量複製、変更もできるはず*4。
「ワークフロー」はタグ付けは出来るがフォルダ分けはできない
ここらへんは IFTTT とおそらく一緒で、タグ付けで頑張ったり、名前で擬似フォルダを作って頑張ったりする*5しかなさそう。 ワークフローが一定数を超えると、探索的に検索するのは厳しくなりそう。
「適用」ボタンなどが原則ない
昨今のフロントエンドっぽく、変更のフォーカスが外れた時点で Update の API が飛ぶ。
cron の実行スケジュールを一覧できない
これは仕方がない。cron 特化ではないから。
やりたいならば、ワークフローのコード (JSON) を引っ張ってきて、それらから自分で組み立てて表示させるような仕組みがあればいい。
Workflows の一覧の並び順のデフォルト値が "Sort by last updated" で決め打ち
環境変数などで設定できるところがなさそう。
細かい不具合はある
- 例えば Twitter の認証が失敗する など*6
- 例えば Google Sheets で "Update" する場合には日本語はエラーになるっぽい など*7
使っている .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