Compare commits
31 Commits
8e8da0a135
...
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 | |||
| 8c94a9327d |
+54
-4
@@ -1,8 +1,58 @@
|
||||
ARG N8N_VERSION=1.72.1
|
||||
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}
|
||||
|
||||
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
|
||||
COPY docker-entrypoint.sh /tmp/docker-entrypoint.sh
|
||||
ENTRYPOINT ["bash", "/tmp/docker-entrypoint.sh"]
|
||||
EXPOSE 5678/tcp
|
||||
RUN chmod +x /tmp/docker-entrypoint.sh
|
||||
|
||||
ENTRYPOINT ["/bin/sh", "/tmp/docker-entrypoint.sh"]
|
||||
EXPOSE 443
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "Hass n8n",
|
||||
"version": "1.82.3",
|
||||
"version": "2.18.6",
|
||||
"slug": "hass-n8n",
|
||||
"description": "Self host your n8n instance",
|
||||
"arch": ["armhf", "armv7", "aarch64", "amd64", "i386"],
|
||||
@@ -15,25 +15,25 @@
|
||||
],
|
||||
"apparmor": true,
|
||||
"ports": {
|
||||
"5678/tcp": 5678
|
||||
"443/tcp": 5678
|
||||
},
|
||||
"ports_description": {
|
||||
"5678/tcp": "n8n Web interface"
|
||||
"443/tcp": "n8n Web interface"
|
||||
},
|
||||
"options": {
|
||||
"auth": false,
|
||||
"auth_username": "",
|
||||
"auth_password": "",
|
||||
"n8n_host": "n8n.automator.dedyn.io",
|
||||
"n8n_port": "5678",
|
||||
"n8n_host": "n8n.aibuddy.dedyn.io",
|
||||
"n8n_port": "443",
|
||||
"node_env": "production",
|
||||
"webhook_tunnel_url": "https://n8n.automator.dedyn.io/",
|
||||
"webhook_tunnel_url": "https://n8n.aibuddy.dedyn.io/",
|
||||
"timezone": "Europe/Kiev",
|
||||
"protocol": "http",
|
||||
"certfile": "fullchain_fixed.pem",
|
||||
"keyfile": "privkey_fixed.pem",
|
||||
"env_vars_list": [
|
||||
"WEBHOOK_URL: https://n8n.automator.dedyn.io"
|
||||
"WEBHOOK_URL: https://n8n.aibuddy.dedyn.io"
|
||||
],
|
||||
"cmd_line_args": "start",
|
||||
"encryption_key": "",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#!/bin/bash
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
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"
|
||||
|
||||
@@ -9,42 +10,45 @@ mkdir -p "${N8N_PATH}/.n8n/.cache"
|
||||
## 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
|
||||
values=$(jq -r '.env_vars_list | .[]' "$CONFIG_PATH")
|
||||
|
||||
# Convert the values to an array
|
||||
IFS=$'\n' read -r -d '' -a array <<< "$values"
|
||||
|
||||
# Export keys and values
|
||||
for element in "${array[@]}"
|
||||
do
|
||||
# Iterate newline-separated list safely in POSIX sh
|
||||
set -f
|
||||
IFS='
|
||||
'
|
||||
for element in $values; do
|
||||
key="${element%%:*}"
|
||||
value="${element#*:}"
|
||||
value=$(echo "$value" | xargs) # Remove leading and trailing whitespace
|
||||
export "$key"="$value"
|
||||
echo "exported ${key}=${value}"
|
||||
|
||||
# trim whitespace (POSIX; busybox sed is fine)
|
||||
value="$(printf '%s' "$value" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
|
||||
|
||||
export "$key=$value"
|
||||
echo "exported $key=$value"
|
||||
done
|
||||
unset IFS
|
||||
set +f
|
||||
|
||||
export N8N_HOST="$(jq --raw-output '.n8n_host // empty' $CONFIG_PATH)"
|
||||
export N8N_PORT="$(jq --raw-output '.n8n_port // empty' $CONFIG_PATH)"
|
||||
export NODE_ENV="$(jq --raw-output '.node_env // empty' $CONFIG_PATH)"
|
||||
export WEBHOOK_TUNNEL_URL="$(jq --raw-output '.webhook_tunnel_url // empty' $CONFIG_PATH)"
|
||||
export N8N_BASIC_AUTH_ACTIVE="$(jq --raw-output '.auth // empty' $CONFIG_PATH)"
|
||||
export N8N_BASIC_AUTH_USER="$(jq --raw-output '.auth_username // empty' $CONFIG_PATH)"
|
||||
export N8N_BASIC_AUTH_PASSWORD="$(jq --raw-output '.auth_password // empty' $CONFIG_PATH)"
|
||||
export GENERIC_TIMEZONE="$(jq --raw-output '.timezone // empty' $CONFIG_PATH)"
|
||||
export N8N_PROTOCOL="$(jq --raw-output '.protocol // empty' $CONFIG_PATH)"
|
||||
export N8N_SSL_CERT="/ssl/$(jq --raw-output '.certfile // empty' $CONFIG_PATH)"
|
||||
export N8N_SSL_KEY="/ssl/$(jq --raw-output '.keyfile // empty' $CONFIG_PATH)"
|
||||
export N8N_ENCRYPTION_KEY="$(jq --raw-output '.encryption_key // empty' $CONFIG_PATH)"
|
||||
export N8N_USER_FOLDER="${N8N_PATH}"
|
||||
export N8N_HOST="$(jq -r '.n8n_host // empty' "$CONFIG_PATH")"
|
||||
export N8N_PORT="$(jq -r '.n8n_port // empty' "$CONFIG_PATH")"
|
||||
export NODE_ENV="$(jq -r '.node_env // empty' "$CONFIG_PATH")"
|
||||
export WEBHOOK_TUNNEL_URL="$(jq -r '.webhook_tunnel_url // empty' "$CONFIG_PATH")"
|
||||
export N8N_BASIC_AUTH_ACTIVE="$(jq -r '.auth // empty' "$CONFIG_PATH")"
|
||||
export N8N_BASIC_AUTH_USER="$(jq -r '.auth_username // empty' "$CONFIG_PATH")"
|
||||
export N8N_BASIC_AUTH_PASSWORD="$(jq -r '.auth_password // empty' "$CONFIG_PATH")"
|
||||
export GENERIC_TIMEZONE="$(jq -r '.timezone // empty' "$CONFIG_PATH")"
|
||||
export N8N_PROTOCOL="$(jq -r '.protocol // empty' "$CONFIG_PATH")"
|
||||
export N8N_SSL_CERT="/ssl/$(jq -r '.certfile // empty' "$CONFIG_PATH")"
|
||||
export N8N_SSL_KEY="/ssl/$(jq -r '.keyfile // empty' "$CONFIG_PATH")"
|
||||
export N8N_ENCRYPTION_KEY="$(jq -r '.encryption_key // empty' "$CONFIG_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
|
||||
unset N8N_BASIC_AUTH_USER
|
||||
unset N8N_BASIC_AUTH_PASSWORD
|
||||
@@ -54,20 +58,15 @@ fi
|
||||
## MAIN ##
|
||||
###########
|
||||
|
||||
if [ "$#" -gt 0 ]; then
|
||||
# Got started with arguments
|
||||
exec n8n "${N8N_CMD_LINE}"
|
||||
else
|
||||
# Got started without arguments
|
||||
exec n8n start
|
||||
fi
|
||||
|
||||
chown -R node /home/node
|
||||
# Fix ownership BEFORE exec (don't fail container if chown can't run)
|
||||
chown -R node:node /home/node 2>/dev/null || true
|
||||
|
||||
# BusyBox 'su' is available (from busybox --install /bin)
|
||||
# Use -s to specify shell and -c to run command.
|
||||
if [ "$#" -gt 0 ]; then
|
||||
# Got started with arguments
|
||||
exec su-exec node "$@"
|
||||
# Started with args (keep behavior similar to your original)
|
||||
exec su node -s /bin/sh -c "n8n $N8N_CMD_LINE"
|
||||
else
|
||||
# Got started without arguments
|
||||
exec su-exec node n8n
|
||||
# Started without args
|
||||
exec su node -s /bin/sh -c "n8n start"
|
||||
fi
|
||||
Reference in New Issue
Block a user