Files
hassio-addons/ente/rootfs/etc/cont-init.d/99-run.sh
2025-07-17 15:02:55 +02:00

222 lines
6.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bashio
# shellcheck shell=bash
set -euo pipefail
############################################
# Persistent dirs
############################################
mkdir -p /config/ente/custom-logs
mkdir -p /config/data
mkdir -p /config/minio-data
mkdir -p /config/postgres
mkdir -p /config/scripts/compose
############################################
# Config / options
############################################
USE_EXTERNAL_DB=false
if bashio::config.true 'USE_EXTERNAL_DB'; then
USE_EXTERNAL_DB=true
fi
DB_NAME="$(bashio::config 'DB_DATABASE_NAME')"
DB_USER="$(bashio::config 'DB_USERNAME')"
DB_PASS="$(bashio::config 'DB_PASSWORD')"
DB_HOST_INTERNAL=127.0.0.1
DB_PORT_INTERNAL=5432
DB_HOST_EXT="$(bashio::config 'DB_HOSTNAME')"
DB_PORT_EXT="$(bashio::config 'DB_PORT')"
MINIO_USER="$(bashio::config 'MINIO_ROOT_USER')"
MINIO_PASS="$(bashio::config 'MINIO_ROOT_PASSWORD')"
S3_BUCKET="b2-eu-cen"
DISABLE_WEB_UI=false
if bashio::config.true 'DISABLE_WEB_UI'; then
DISABLE_WEB_UI=true
fi
############################################
# Paths to binaries (discover; DO NOT mv)
############################################
INITDB="$(command -v initdb || echo /usr/bin/initdb)"
POSTGRES_BIN="$(command -v postgres || echo /usr/bin/postgres)"
MINIO_BIN="/usr/local/bin/minio"
MC_BIN="/usr/local/bin/mc"
MUSEUM_BIN="$(command -v museum || true)"
[ -z "$MUSEUM_BIN" ] && [ -x /app/museum ] && MUSEUM_BIN=/app/museum
[ -z "$MUSEUM_BIN" ] && [ -x /museum ] && MUSEUM_BIN=/museum
[ -z "$MUSEUM_BIN" ] && MUSEUM_BIN=museum # last resort: PATH
WEB_BIN="$(command -v ente-web || true)"
[ -z "$WEB_BIN" ] && [ -x /app/ente-web ] && WEB_BIN=/app/ente-web
[ -z "$WEB_BIN" ] && [ -x /ente-web ] && WEB_BIN=/ente-web
PGDATA="/config/postgres"
############################################
# Functions
############################################
start_postgres() {
if $USE_EXTERNAL_DB; then
bashio::log.info "External DB enabled; skipping internal Postgres start."
return 0
fi
mkdir -p /run/postgresql
chown postgres:postgres /run/postgresql
chmod 775 /run/postgresql
mkdir -p "$PGDATA"
chown -R postgres:postgres "$PGDATA"
chmod 0700 "$PGDATA"
if [[ ! -s "$PGDATA/PG_VERSION" ]]; then
bashio::log.info "Initializing Postgres data directory..."
su - postgres -c "$INITDB -D $PGDATA"
fi
bashio::log.info "Starting Postgres (127.0.0.1:5432)..."
su - postgres -c "$POSTGRES_BIN -D $PGDATA -c listen_addresses='127.0.0.1'" &
PG_PID=$!
}
wait_postgres_ready() {
local host port
if $USE_EXTERNAL_DB; then
host="$DB_HOST_EXT"
port="$DB_PORT_EXT"
bashio::log.info "Waiting for EXTERNAL Postgres at ${host}:${port}..."
else
host="$DB_HOST_INTERNAL"
port="$DB_PORT_INTERNAL"
bashio::log.info "Waiting for internal Postgres..."
fi
until pg_isready -q -h "$host" -p "$port"; do
sleep 1
done
bashio::log.info "Postgres reachable."
}
bootstrap_internal_db() {
if $USE_EXTERNAL_DB; then
return 0
fi
bashio::log.info "Creating role/database if needed..."
local esc_pass="${DB_PASS//\'/\'\'}"
# role
if ! psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres -tAc \
"SELECT 1 FROM pg_roles WHERE rolname = '${DB_USER}'" | grep -q 1; then
psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres \
-c "CREATE ROLE \"${DB_USER}\" LOGIN PASSWORD '${esc_pass}';"
else
psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres \
-c "ALTER ROLE \"${DB_USER}\" PASSWORD '${esc_pass}';"
fi
# db
if ! psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres -tAc \
"SELECT 1 FROM pg_database WHERE datname = '${DB_NAME}'" | grep -q 1; then
psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres \
-c "CREATE DATABASE \"${DB_NAME}\" OWNER \"${DB_USER}\";"
else
psql -v ON_ERROR_STOP=1 -h "$DB_HOST_INTERNAL" -p "$DB_PORT_INTERNAL" -U postgres \
-c "ALTER DATABASE \"${DB_NAME}\" OWNER TO \"${DB_USER}\";"
fi
bashio::log.info "Internal Postgres ready."
}
start_minio() {
bashio::log.info "Starting MinIO (:3200)..."
mkdir -p /config/minio-data
"$MINIO_BIN" server /config/minio-data --address ":3200" &
MINIO_PID=$!
}
wait_minio_ready_and_bucket() {
bashio::log.info "Waiting for MinIO API..."
until "$MC_BIN" alias set h0 http://127.0.0.1:3200 "$MINIO_USER" "$MINIO_PASS" 2>/dev/null; do
sleep 1
done
bashio::log.info "Ensuring bucket..."
"$MC_BIN" mb -p h0/b2-eu-cen || true
"$MC_BIN" mb -p h0/wasabi-eu-central-2-v3 || true
"$MC_BIN" mb -p h0/scw-eu-fr-v3 || true
bashio::log.info "MinIO bucket ready."
}
start_web() {
if $DISABLE_WEB_UI; then
bashio::log.info "Web UI disabled."
return 0
fi
# Prepare static assets with actual origins (does safe sed replacements).
ENTE_API_ORIGIN="${ENTE_API_ORIGIN:-http://[HOST]:[PORT:8080]}"
ENTE_ALBUMS_ORIGIN="${ENTE_ALBUMS_ORIGIN:-${ENTE_API_ORIGIN}}"
export ENTE_API_ORIGIN ENTE_ALBUMS_ORIGIN
/usr/local/bin/ente-web-prepare || bashio::log.warning "Web env substitution step returned nonzero; continuing."
# nginx expects runtime dirs
mkdir -p /run/nginx
# log dir
mkdir -p /var/log/nginx
bashio::log.info "Starting Ente web (nginx, ports 30003004)..."
nginx -c /etc/ente-web/nginx.conf -g 'daemon off;' &
WEB_PID=$!
}
start_museum_foreground() {
local cfg=/config/museum.yaml
if ! bashio::fs.file_exists "$cfg"; then
bashio::log.error "$cfg missing; cannot start museum."
return 1
fi
if [ ! -x "$MUSEUM_BIN" ] && ! command -v "$MUSEUM_BIN" >/dev/null 2>&1; then
bashio::log.error "Museum binary not found; cannot launch Ente API."
return 1
fi
# Export ENTE_* overrides to guarantee correct credentials parsing.
# (Museum merges env vars over YAML.)
# Ref: environment override mechanism in museum docs. :contentReference[oaicite:2]{index=2}
if $USE_EXTERNAL_DB; then
export ENTE_DB_HOST="$DB_HOST_EXT"
export ENTE_DB_PORT="$DB_PORT_EXT"
else
export ENTE_DB_HOST="$DB_HOST_INTERNAL"
export ENTE_DB_PORT="$DB_PORT_INTERNAL"
fi
export ENTE_DB_USER="$DB_USER"
export ENTE_DB_PASSWORD="$DB_PASS"
export ENTE_DB_NAME="$DB_NAME"
export ENTE_DB_SSLMODE=disable
bashio::log.info "Starting museum (foreground)..."
exec "$MUSEUM_BIN" --config "$cfg"
}
############################################
# Main orchestration
############################################
bashio::log.info "=== Ente startup sequence ==="
start_postgres
wait_postgres_ready
bootstrap_internal_db
start_minio
wait_minio_ready_and_bucket
start_web
start_museum_foreground