Compare commits
31 Commits
update-n8n
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 7b5f66dcdc | |||
| b16124e747 | |||
| fa05314d91 | |||
| a17093f97a | |||
| b3a1548c62 | |||
| 577b0b9bb1 | |||
| b7b6cc5100 | |||
| acd9652c0a | |||
| cbee085e38 | |||
| 8d4a37d4e6 | |||
| 632c764e3d | |||
| 22637db273 | |||
| 9ea1aba119 | |||
| 13d839feba | |||
| 9fe60d208f | |||
| cc0906b5d3 | |||
| df5a7b615b | |||
| b02cdc49e8 | |||
| c59d68b9e1 | |||
| 91b347620c | |||
| bd7b3a6f57 | |||
| 8249784503 | |||
| 03f31d5f5f | |||
| 0c9ee2a9a2 | |||
| 4955f4e95e | |||
| bed771baf4 | |||
| 4b1ad96a5e | |||
| 2f85009ef3 | |||
| 843c4644b8 | |||
| 1dd3e63ed0 | |||
| 8e8da0a135 |
+54
-4
@@ -1,8 +1,58 @@
|
|||||||
ARG N8N_VERSION=1.82.3
|
ARG N8N_VERSION=2.18.6
|
||||||
|
ARG JQ_VERSION=1.7.1
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
# 1) busybox-static (sh, sed, mkdir, chown, su, etc.)
|
||||||
|
# ------------------------------------------------
|
||||||
|
FROM alpine:3.23 AS busybox-builder
|
||||||
|
RUN apk add --no-cache busybox-static
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
# 2) jq static (download correct binary for TARGETARCH)
|
||||||
|
# ------------------------------------------------
|
||||||
|
FROM alpine:3.23 AS jq-builder
|
||||||
|
ARG JQ_VERSION
|
||||||
|
ARG TARGETARCH
|
||||||
|
RUN apk add --no-cache wget ca-certificates
|
||||||
|
|
||||||
|
RUN case "${TARGETARCH}" in \
|
||||||
|
amd64) JQ_ASSET="jq-linux-amd64" ;; \
|
||||||
|
arm64) JQ_ASSET="jq-linux-arm64" ;; \
|
||||||
|
*) echo "Unsupported TARGETARCH=${TARGETARCH}" && exit 1 ;; \
|
||||||
|
esac \
|
||||||
|
&& wget -O /usr/local/bin/jq \
|
||||||
|
"https://github.com/jqlang/jq/releases/download/jq-${JQ_VERSION}/${JQ_ASSET}" \
|
||||||
|
&& chmod +x /usr/local/bin/jq
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
# 3) claude-code
|
||||||
|
# ------------------------------------------------
|
||||||
|
FROM node:20-alpine AS node-builder
|
||||||
|
RUN npm install -g @anthropic-ai/claude-code
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
# 4) Final image (n8n distroless)
|
||||||
|
# ------------------------------------------------
|
||||||
FROM docker.n8n.io/n8nio/n8n:${N8N_VERSION}
|
FROM docker.n8n.io/n8nio/n8n:${N8N_VERSION}
|
||||||
|
|
||||||
USER root
|
USER root
|
||||||
RUN apk add --no-cache --update jq bash
|
|
||||||
|
# busybox (static) + install applets (/bin/sh, /bin/sed, /bin/su, /bin/chown, etc.)
|
||||||
|
COPY --from=busybox-builder /bin/busybox /bin/busybox
|
||||||
|
RUN ["/bin/busybox", "--install", "/bin"]
|
||||||
|
|
||||||
|
# jq (static, correct arch)
|
||||||
|
COPY --from=jq-builder /usr/local/bin/jq /usr/bin/jq
|
||||||
|
|
||||||
|
# claude-code
|
||||||
|
COPY --from=node-builder /usr/local/lib/node_modules /usr/local/lib/node_modules
|
||||||
|
COPY --from=node-builder /usr/local/bin/claude /usr/local/bin/claude
|
||||||
|
|
||||||
|
ENV PATH="/usr/local/bin:/usr/bin:/bin:${PATH}"
|
||||||
|
|
||||||
WORKDIR /data
|
WORKDIR /data
|
||||||
COPY docker-entrypoint.sh /tmp/docker-entrypoint.sh
|
COPY docker-entrypoint.sh /tmp/docker-entrypoint.sh
|
||||||
ENTRYPOINT ["bash", "/tmp/docker-entrypoint.sh"]
|
RUN chmod +x /tmp/docker-entrypoint.sh
|
||||||
EXPOSE 5678/tcp
|
|
||||||
|
ENTRYPOINT ["/bin/sh", "/tmp/docker-entrypoint.sh"]
|
||||||
|
EXPOSE 443
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "Hass n8n",
|
"name": "Hass n8n",
|
||||||
"version": "1.72.1",
|
"version": "2.18.6",
|
||||||
"slug": "hass-n8n",
|
"slug": "hass-n8n",
|
||||||
"description": "Self host your n8n instance",
|
"description": "Self host your n8n instance",
|
||||||
"arch": ["armhf", "armv7", "aarch64", "amd64", "i386"],
|
"arch": ["armhf", "armv7", "aarch64", "amd64", "i386"],
|
||||||
@@ -15,25 +15,25 @@
|
|||||||
],
|
],
|
||||||
"apparmor": true,
|
"apparmor": true,
|
||||||
"ports": {
|
"ports": {
|
||||||
"5678/tcp": 5678
|
"443/tcp": 5678
|
||||||
},
|
},
|
||||||
"ports_description": {
|
"ports_description": {
|
||||||
"5678/tcp": "n8n Web interface"
|
"443/tcp": "n8n Web interface"
|
||||||
},
|
},
|
||||||
"options": {
|
"options": {
|
||||||
"auth": false,
|
"auth": false,
|
||||||
"auth_username": "",
|
"auth_username": "",
|
||||||
"auth_password": "",
|
"auth_password": "",
|
||||||
"n8n_host": "n8n.automator.dedyn.io",
|
"n8n_host": "n8n.aibuddy.dedyn.io",
|
||||||
"n8n_port": "5678",
|
"n8n_port": "443",
|
||||||
"node_env": "production",
|
"node_env": "production",
|
||||||
"webhook_tunnel_url": "https://n8n.automator.dedyn.io/",
|
"webhook_tunnel_url": "https://n8n.aibuddy.dedyn.io/",
|
||||||
"timezone": "Europe/Kiev",
|
"timezone": "Europe/Kiev",
|
||||||
"protocol": "http",
|
"protocol": "http",
|
||||||
"certfile": "fullchain_fixed.pem",
|
"certfile": "fullchain_fixed.pem",
|
||||||
"keyfile": "privkey_fixed.pem",
|
"keyfile": "privkey_fixed.pem",
|
||||||
"env_vars_list": [
|
"env_vars_list": [
|
||||||
"WEBHOOK_URL: https://n8n.automator.dedyn.io"
|
"WEBHOOK_URL: https://n8n.aibuddy.dedyn.io"
|
||||||
],
|
],
|
||||||
"cmd_line_args": "start",
|
"cmd_line_args": "start",
|
||||||
"encryption_key": "",
|
"encryption_key": "",
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
|
set -eu
|
||||||
|
|
||||||
CONFIG_PATH="/data/options.json"
|
CONFIG_PATH="/data/options.json"
|
||||||
N8N_PATH="$(jq --raw-output '.user_folder // empty' $CONFIG_PATH)"
|
N8N_PATH="$(jq -r '.user_folder // empty' "$CONFIG_PATH")"
|
||||||
|
|
||||||
mkdir -p "${N8N_PATH}/.n8n/.cache"
|
mkdir -p "${N8N_PATH}/.n8n/.cache"
|
||||||
|
|
||||||
@@ -9,42 +10,45 @@ mkdir -p "${N8N_PATH}/.n8n/.cache"
|
|||||||
## USER PARAMETERS ##
|
## USER PARAMETERS ##
|
||||||
#####################
|
#####################
|
||||||
|
|
||||||
# REQUIRED
|
# IMPORTANT:
|
||||||
|
# Don't use: jq ... | while ...; do export ...; done
|
||||||
|
# Because in POSIX sh it runs in a subshell and exports won't persist.
|
||||||
|
values="$(jq -r '.env_vars_list[]?' "$CONFIG_PATH")"
|
||||||
|
|
||||||
# Extract the values from env_vars_list
|
# Iterate newline-separated list safely in POSIX sh
|
||||||
values=$(jq -r '.env_vars_list | .[]' "$CONFIG_PATH")
|
set -f
|
||||||
|
IFS='
|
||||||
# Convert the values to an array
|
'
|
||||||
IFS=$'\n' read -r -d '' -a array <<< "$values"
|
for element in $values; do
|
||||||
|
|
||||||
# Export keys and values
|
|
||||||
for element in "${array[@]}"
|
|
||||||
do
|
|
||||||
key="${element%%:*}"
|
key="${element%%:*}"
|
||||||
value="${element#*:}"
|
value="${element#*:}"
|
||||||
value=$(echo "$value" | xargs) # Remove leading and trailing whitespace
|
|
||||||
export "$key"="$value"
|
# trim whitespace (POSIX; busybox sed is fine)
|
||||||
echo "exported ${key}=${value}"
|
value="$(printf '%s' "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
|
||||||
|
|
||||||
|
export "$key=$value"
|
||||||
|
echo "exported $key=$value"
|
||||||
done
|
done
|
||||||
|
unset IFS
|
||||||
|
set +f
|
||||||
|
|
||||||
export N8N_HOST="$(jq --raw-output '.n8n_host // empty' $CONFIG_PATH)"
|
export N8N_HOST="$(jq -r '.n8n_host // empty' "$CONFIG_PATH")"
|
||||||
export N8N_PORT="$(jq --raw-output '.n8n_port // empty' $CONFIG_PATH)"
|
export N8N_PORT="$(jq -r '.n8n_port // empty' "$CONFIG_PATH")"
|
||||||
export NODE_ENV="$(jq --raw-output '.node_env // empty' $CONFIG_PATH)"
|
export NODE_ENV="$(jq -r '.node_env // empty' "$CONFIG_PATH")"
|
||||||
export WEBHOOK_TUNNEL_URL="$(jq --raw-output '.webhook_tunnel_url // empty' $CONFIG_PATH)"
|
export WEBHOOK_TUNNEL_URL="$(jq -r '.webhook_tunnel_url // empty' "$CONFIG_PATH")"
|
||||||
export N8N_BASIC_AUTH_ACTIVE="$(jq --raw-output '.auth // empty' $CONFIG_PATH)"
|
export N8N_BASIC_AUTH_ACTIVE="$(jq -r '.auth // empty' "$CONFIG_PATH")"
|
||||||
export N8N_BASIC_AUTH_USER="$(jq --raw-output '.auth_username // empty' $CONFIG_PATH)"
|
export N8N_BASIC_AUTH_USER="$(jq -r '.auth_username // empty' "$CONFIG_PATH")"
|
||||||
export N8N_BASIC_AUTH_PASSWORD="$(jq --raw-output '.auth_password // empty' $CONFIG_PATH)"
|
export N8N_BASIC_AUTH_PASSWORD="$(jq -r '.auth_password // empty' "$CONFIG_PATH")"
|
||||||
export GENERIC_TIMEZONE="$(jq --raw-output '.timezone // empty' $CONFIG_PATH)"
|
export GENERIC_TIMEZONE="$(jq -r '.timezone // empty' "$CONFIG_PATH")"
|
||||||
export N8N_PROTOCOL="$(jq --raw-output '.protocol // empty' $CONFIG_PATH)"
|
export N8N_PROTOCOL="$(jq -r '.protocol // empty' "$CONFIG_PATH")"
|
||||||
export N8N_SSL_CERT="/ssl/$(jq --raw-output '.certfile // empty' $CONFIG_PATH)"
|
export N8N_SSL_CERT="/ssl/$(jq -r '.certfile // empty' "$CONFIG_PATH")"
|
||||||
export N8N_SSL_KEY="/ssl/$(jq --raw-output '.keyfile // empty' $CONFIG_PATH)"
|
export N8N_SSL_KEY="/ssl/$(jq -r '.keyfile // empty' "$CONFIG_PATH")"
|
||||||
export N8N_ENCRYPTION_KEY="$(jq --raw-output '.encryption_key // empty' $CONFIG_PATH)"
|
export N8N_ENCRYPTION_KEY="$(jq -r '.encryption_key // empty' "$CONFIG_PATH")"
|
||||||
export N8N_USER_FOLDER="${N8N_PATH}"
|
export N8N_USER_FOLDER="$N8N_PATH"
|
||||||
|
export N8N_CMD_LINE="$(jq -r '.cmd_line_args // empty' "$CONFIG_PATH")"
|
||||||
|
export N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS=false
|
||||||
|
|
||||||
export N8N_CMD_LINE="$(jq --raw-output '.cmd_line_args // empty' $CONFIG_PATH)"
|
if [ -z "$N8N_BASIC_AUTH_USER" ] || [ -z "$N8N_BASIC_AUTH_ACTIVE" ]; then
|
||||||
|
|
||||||
|
|
||||||
if [ -z "${N8N_BASIC_AUTH_USER}" ] || [ -z "${N8N_BASIC_AUTH_ACTIVE}" ]; then
|
|
||||||
export N8N_BASIC_AUTH_ACTIVE=false
|
export N8N_BASIC_AUTH_ACTIVE=false
|
||||||
unset N8N_BASIC_AUTH_USER
|
unset N8N_BASIC_AUTH_USER
|
||||||
unset N8N_BASIC_AUTH_PASSWORD
|
unset N8N_BASIC_AUTH_PASSWORD
|
||||||
@@ -54,20 +58,15 @@ fi
|
|||||||
## MAIN ##
|
## MAIN ##
|
||||||
###########
|
###########
|
||||||
|
|
||||||
if [ "$#" -gt 0 ]; then
|
# Fix ownership BEFORE exec (don't fail container if chown can't run)
|
||||||
# Got started with arguments
|
chown -R node:node /home/node 2>/dev/null || true
|
||||||
exec n8n "${N8N_CMD_LINE}"
|
|
||||||
else
|
|
||||||
# Got started without arguments
|
|
||||||
exec n8n start
|
|
||||||
fi
|
|
||||||
|
|
||||||
chown -R node /home/node
|
|
||||||
|
|
||||||
|
# BusyBox 'su' is available (from busybox --install /bin)
|
||||||
|
# Use -s to specify shell and -c to run command.
|
||||||
if [ "$#" -gt 0 ]; then
|
if [ "$#" -gt 0 ]; then
|
||||||
# Got started with arguments
|
# Started with args (keep behavior similar to your original)
|
||||||
exec su-exec node "$@"
|
exec su node -s /bin/sh -c "n8n $N8N_CMD_LINE"
|
||||||
else
|
else
|
||||||
# Got started without arguments
|
# Started without args
|
||||||
exec su-exec node n8n
|
exec su node -s /bin/sh -c "n8n start"
|
||||||
fi
|
fi
|
||||||
Reference in New Issue
Block a user