1
Online53
Users512
Topics6.2k
PostsProblema con le immagini risolto.
Moderazione
2
Posts
2
Posters
59
Views
-
Si trattava, in fondo, di scrivere uno script di avvio per nodebb, che arriva con un container docker che non funziona di suo. (il contrario del concetto di container docker).
#!/bin/bash set -euo pipefail APP_DIR="/usr/src/app" cd "$APP_DIR" die(){ echo "❌ $*" >&2; exit 1; } need_tool(){ command -v "$1" >/dev/null 2>&1 || return 0 return 1 } # ── Tools minimi: se mancano, prova ad installarli (apt o apk), altrimenti abort ── MISSING=0 command -v redis-cli >/dev/null 2>&1 || MISSING=1 command -v jq >/dev/null 2>&1 || MISSING=1 if [[ "$MISSING" -eq 1 ]]; then if command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y --no-install-recommends redis-tools jq curl procps net-tools && apt-get clean elif command -v apk >/dev/null 2>&1; then apk add --no-cache redis jq curl procps-net iproute2 else die "redis-cli/jq mancanti e nessun package manager disponibile" fi fi # ── Leggi config SENZA default (null⇒vuoto). Se mancano host/port/db, abort ── CFG="$APP_DIR/config.json" [[ -f "$CFG" ]] || die "$CFG mancante" json_get(){ jq -r "try $1 catch \"\"" "$CFG" | sed -E 's/^(null|NULL)$//'; } DB_DRIVER=$(json_get '.database') [[ "$DB_DRIVER" == "redis" ]] || die "database='$DB_DRIVER' (serve 'redis')" REDIS_HOST=$(json_get '.redis.host') REDIS_PORT=$(json_get '.redis.port') REDIS_DB=$(json_get '.redis.database') REDIS_USER=$(json_get '.redis.username') REDIS_PASS=$(json_get '.redis.password') REDIS_PREFIX=$(json_get '.redis.prefix') REDIS_TLS=$(json_get '.redis.tls') [[ -n "$REDIS_HOST" && -n "$REDIS_PORT" && -n "$REDIS_DB" ]] || die "Redis host/port/database non impostati in config.json" # ── redis-cli wrapper: passa SOLO ciò che esiste; username senza password ≠ auth ── redis_cli(){ local scheme="redis"; [[ "$REDIS_TLS" == "true" ]] && scheme="rediss" if [[ -n "$REDIS_USER" && -n "$REDIS_PASS" ]]; then local u_enc p_enc u_enc=$(jq -rn --arg s "$REDIS_USER" '$s|@uri') p_enc=$(jq -rn --arg s "$REDIS_PASS" '$s|@uri') redis-cli -u "${scheme}://${u_enc}:${p_enc}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}" "$@" elif [[ -n "$REDIS_PASS" ]]; then redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" -a "$REDIS_PASS" "$@" else redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" "$@" fi } echo "ℹ️ Redis: host='${REDIS_HOST}' port='${REDIS_PORT}' db='${REDIS_DB}' prefix='${REDIS_PREFIX:-}' user=$([[ -n "$REDIS_USER" ]]&&echo set||echo none) pass=$([[ -n "$REDIS_PASS" ]]&&echo set||echo none) tls=$([[ "$REDIS_TLS" == "true" ]]&&echo on||echo off)" # ── NPM: upgrade + audit PRIMA di usare npm (niente unsafe-perm) ── npm config set fund false progress false loglevel=warn || true before="$(npm -v || echo n/a)" npm install -g npm@latest || echo "⚠️ Upgrade npm fallito, continuo" after="$(npm -v || echo n/a)"; echo "ℹ️ npm: $before → $after" npm audit --omit=dev || true npm audit fix --omit=dev --force || true # ── Build check ── NEED_BUILD=0 [[ -f "$APP_DIR/build/manifest.json" && -f "$APP_DIR/build/public/src/client.js" ]] || NEED_BUILD=1 # ── Scopriamo la chiave plugins:active: prefix→nodebb:→none + SCAN fallback ── discover_plugins_key(){ local try=() [[ -n "$REDIS_PREFIX" ]] && try+=("${REDIS_PREFIX}:plugins:active") try+=("nodebb:plugins:active" "plugins:active") local k t for k in "${try[@]}"; do t="$(redis_cli TYPE "$k" 2>/dev/null || true)" [[ "$t" == "set" || "$t" == "zset" ]] && { echo "$k"; return 0; } done local hit hit="$(redis_cli --raw SCAN 0 MATCH '*:plugins:active' COUNT 200 2>/dev/null | awk '/:plugins:active$/ {print; exit}')" [[ -n "$hit" ]] && { echo "$hit"; return 0; } echo ""; return 1 } PLUG_KEY="$(discover_plugins_key || true)" [[ -n "$PLUG_KEY" ]] || echo "⚠️ Nessuna chiave plugins:active trovata; proseguo senza auto-install" # ── Leggi plugin attivi ── PLUGINS=() if [[ -n "$PLUG_KEY" ]]; then TYPE="$(redis_cli TYPE "$PLUG_KEY" 2>/dev/null || true)" case "$TYPE" in set) readarray -t PLUGINS < <(redis_cli SMEMBERS "$PLUG_KEY" | tr -d '\r');; zset) readarray -t PLUGINS < <(redis_cli ZRANGE "$PLUG_KEY" 0 -1 | tr -d '\r');; *) echo "⚠️ Tipo chiave non gestito: ${TYPE:-none}";; esac fi # ── Mapping pacchetto (placeholder emailer) ── plugin_pkg(){ case "$1" in nodebb-plugin-emailer) echo "nodebb-plugin-emailer-local" ;; # scegliamo il nostro emailer reale se diverso *) echo "$1" ;; esac } # ── Verifica, installa, attiva ── MISSING_PKGS=() TO_ACTIVATE=() for plugin in "${PLUGINS[@]}"; do [[ -z "$plugin" ]] && continue pkg="$(plugin_pkg "$plugin")" if [[ "$plugin" == "nodebb-plugin-emailer" ]]; then echo "❌ Placeholder emailer attivo → userò '$pkg'" ./nodebb deactivate "nodebb-plugin-emailer" >/dev/null 2>&1 || true [[ -d "$APP_DIR/node_modules/$pkg" ]] || { MISSING_PKGS+=("$pkg"); NEED_BUILD=1; } TO_ACTIVATE+=("$pkg") continue fi [[ -d "$APP_DIR/node_modules/$pkg" ]] || { echo "❌ Mancante: $plugin (pkg: $pkg)"; MISSING_PKGS+=("$pkg"); TO_ACTIVATE+=("$plugin"); NEED_BUILD=1; } done if [[ ${#MISSING_PKGS[@]} -gt 0 ]]; then echo "📦 npm install: ${MISSING_PKGS[*]}" npm install --omit=dev "${MISSING_PKGS[@]}" || echo "⚠️ Installazione plugin fallita (continuo)" fi if [[ ${#TO_ACTIVATE[@]} -gt 0 ]]; then echo "🔌 Attivo: ${TO_ACTIVATE[*]}" for p in "${TO_ACTIVATE[@]}"; do ./nodebb activate "$p" || echo "⚠️ Attivazione fallita: $p" done fi # Audit post plugin (best-effort) npm audit --omit=dev || true npm audit fix --omit=dev --force || true # ── Build se necessario ── if [[ "$NEED_BUILD" -eq 1 ]]; then echo "🔧 npm install (deps app) & ./nodebb build…" npm install --omit=dev || true ./nodebb build else echo "✅ Nessuna ricostruzione necessaria" fi # ── Avvio & log ── echo "🚀 Avvio NodeBB…" ./nodebb start # daemonizza echo "📜 Tail logs…" mkdir -p ./logs : > ./logs/output.log [ -e ./logs/error.log ] || : > ./logs/error.log exec tail -n +1 -F ./logs/output.log ./logs/error.log
-
Si trattava, in fondo, di scrivere uno script di avvio per nodebb, che arriva con un container docker che non funziona di suo. (il contrario del concetto di container docker).
#!/bin/bash set -euo pipefail APP_DIR="/usr/src/app" cd "$APP_DIR" die(){ echo "❌ $*" >&2; exit 1; } need_tool(){ command -v "$1" >/dev/null 2>&1 || return 0 return 1 } # ── Tools minimi: se mancano, prova ad installarli (apt o apk), altrimenti abort ── MISSING=0 command -v redis-cli >/dev/null 2>&1 || MISSING=1 command -v jq >/dev/null 2>&1 || MISSING=1 if [[ "$MISSING" -eq 1 ]]; then if command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y --no-install-recommends redis-tools jq curl procps net-tools && apt-get clean elif command -v apk >/dev/null 2>&1; then apk add --no-cache redis jq curl procps-net iproute2 else die "redis-cli/jq mancanti e nessun package manager disponibile" fi fi # ── Leggi config SENZA default (null⇒vuoto). Se mancano host/port/db, abort ── CFG="$APP_DIR/config.json" [[ -f "$CFG" ]] || die "$CFG mancante" json_get(){ jq -r "try $1 catch \"\"" "$CFG" | sed -E 's/^(null|NULL)$//'; } DB_DRIVER=$(json_get '.database') [[ "$DB_DRIVER" == "redis" ]] || die "database='$DB_DRIVER' (serve 'redis')" REDIS_HOST=$(json_get '.redis.host') REDIS_PORT=$(json_get '.redis.port') REDIS_DB=$(json_get '.redis.database') REDIS_USER=$(json_get '.redis.username') REDIS_PASS=$(json_get '.redis.password') REDIS_PREFIX=$(json_get '.redis.prefix') REDIS_TLS=$(json_get '.redis.tls') [[ -n "$REDIS_HOST" && -n "$REDIS_PORT" && -n "$REDIS_DB" ]] || die "Redis host/port/database non impostati in config.json" # ── redis-cli wrapper: passa SOLO ciò che esiste; username senza password ≠ auth ── redis_cli(){ local scheme="redis"; [[ "$REDIS_TLS" == "true" ]] && scheme="rediss" if [[ -n "$REDIS_USER" && -n "$REDIS_PASS" ]]; then local u_enc p_enc u_enc=$(jq -rn --arg s "$REDIS_USER" '$s|@uri') p_enc=$(jq -rn --arg s "$REDIS_PASS" '$s|@uri') redis-cli -u "${scheme}://${u_enc}:${p_enc}@${REDIS_HOST}:${REDIS_PORT}/${REDIS_DB}" "$@" elif [[ -n "$REDIS_PASS" ]]; then redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" -a "$REDIS_PASS" "$@" else redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -n "$REDIS_DB" "$@" fi } echo "ℹ️ Redis: host='${REDIS_HOST}' port='${REDIS_PORT}' db='${REDIS_DB}' prefix='${REDIS_PREFIX:-}' user=$([[ -n "$REDIS_USER" ]]&&echo set||echo none) pass=$([[ -n "$REDIS_PASS" ]]&&echo set||echo none) tls=$([[ "$REDIS_TLS" == "true" ]]&&echo on||echo off)" # ── NPM: upgrade + audit PRIMA di usare npm (niente unsafe-perm) ── npm config set fund false progress false loglevel=warn || true before="$(npm -v || echo n/a)" npm install -g npm@latest || echo "⚠️ Upgrade npm fallito, continuo" after="$(npm -v || echo n/a)"; echo "ℹ️ npm: $before → $after" npm audit --omit=dev || true npm audit fix --omit=dev --force || true # ── Build check ── NEED_BUILD=0 [[ -f "$APP_DIR/build/manifest.json" && -f "$APP_DIR/build/public/src/client.js" ]] || NEED_BUILD=1 # ── Scopriamo la chiave plugins:active: prefix→nodebb:→none + SCAN fallback ── discover_plugins_key(){ local try=() [[ -n "$REDIS_PREFIX" ]] && try+=("${REDIS_PREFIX}:plugins:active") try+=("nodebb:plugins:active" "plugins:active") local k t for k in "${try[@]}"; do t="$(redis_cli TYPE "$k" 2>/dev/null || true)" [[ "$t" == "set" || "$t" == "zset" ]] && { echo "$k"; return 0; } done local hit hit="$(redis_cli --raw SCAN 0 MATCH '*:plugins:active' COUNT 200 2>/dev/null | awk '/:plugins:active$/ {print; exit}')" [[ -n "$hit" ]] && { echo "$hit"; return 0; } echo ""; return 1 } PLUG_KEY="$(discover_plugins_key || true)" [[ -n "$PLUG_KEY" ]] || echo "⚠️ Nessuna chiave plugins:active trovata; proseguo senza auto-install" # ── Leggi plugin attivi ── PLUGINS=() if [[ -n "$PLUG_KEY" ]]; then TYPE="$(redis_cli TYPE "$PLUG_KEY" 2>/dev/null || true)" case "$TYPE" in set) readarray -t PLUGINS < <(redis_cli SMEMBERS "$PLUG_KEY" | tr -d '\r');; zset) readarray -t PLUGINS < <(redis_cli ZRANGE "$PLUG_KEY" 0 -1 | tr -d '\r');; *) echo "⚠️ Tipo chiave non gestito: ${TYPE:-none}";; esac fi # ── Mapping pacchetto (placeholder emailer) ── plugin_pkg(){ case "$1" in nodebb-plugin-emailer) echo "nodebb-plugin-emailer-local" ;; # scegliamo il nostro emailer reale se diverso *) echo "$1" ;; esac } # ── Verifica, installa, attiva ── MISSING_PKGS=() TO_ACTIVATE=() for plugin in "${PLUGINS[@]}"; do [[ -z "$plugin" ]] && continue pkg="$(plugin_pkg "$plugin")" if [[ "$plugin" == "nodebb-plugin-emailer" ]]; then echo "❌ Placeholder emailer attivo → userò '$pkg'" ./nodebb deactivate "nodebb-plugin-emailer" >/dev/null 2>&1 || true [[ -d "$APP_DIR/node_modules/$pkg" ]] || { MISSING_PKGS+=("$pkg"); NEED_BUILD=1; } TO_ACTIVATE+=("$pkg") continue fi [[ -d "$APP_DIR/node_modules/$pkg" ]] || { echo "❌ Mancante: $plugin (pkg: $pkg)"; MISSING_PKGS+=("$pkg"); TO_ACTIVATE+=("$plugin"); NEED_BUILD=1; } done if [[ ${#MISSING_PKGS[@]} -gt 0 ]]; then echo "📦 npm install: ${MISSING_PKGS[*]}" npm install --omit=dev "${MISSING_PKGS[@]}" || echo "⚠️ Installazione plugin fallita (continuo)" fi if [[ ${#TO_ACTIVATE[@]} -gt 0 ]]; then echo "🔌 Attivo: ${TO_ACTIVATE[*]}" for p in "${TO_ACTIVATE[@]}"; do ./nodebb activate "$p" || echo "⚠️ Attivazione fallita: $p" done fi # Audit post plugin (best-effort) npm audit --omit=dev || true npm audit fix --omit=dev --force || true # ── Build se necessario ── if [[ "$NEED_BUILD" -eq 1 ]]; then echo "🔧 npm install (deps app) & ./nodebb build…" npm install --omit=dev || true ./nodebb build else echo "✅ Nessuna ricostruzione necessaria" fi # ── Avvio & log ── echo "🚀 Avvio NodeBB…" ./nodebb start # daemonizza echo "📜 Tail logs…" mkdir -p ./logs : > ./logs/output.log [ -e ./logs/error.log ] || : > ./logs/error.log exec tail -n +1 -F ./logs/output.log ./logs/error.log
Amiga Unicorn denghiu