#!/bin/sh set -eu : "${PORT:=7860}" : "${SERVER_HOST:=0.0.0.0}" : "${SERVER_PORT:=$PORT}" : "${SERVER_MODE:=release}" : "${RUN_MODE:=standard}" : "${AUTO_SETUP:=true}" : "${TZ:=Asia/Shanghai}" : "${DATA_DIR:=/tmp/sub2api}" : "${BIN_DIR:=/tmp/sub2api/bin}" mkdir -p "$DATA_DIR" "$BIN_DIR" || true chmod 777 "$DATA_DIR" "$BIN_DIR" 2>/dev/null || true strip_quotes() { val="$1" case "$val" in "\""*"\"") val="${val#\"}"; val="${val%\"}" ;; esac case "$val" in "'"*"'") val="${val#'}"; val="${val%'}" ;; esac printf '%s' "$val" } url_decode() { printf '%b' "$(printf '%s' "$1" | sed 's/+/ /g; s/%/\\x/g')" } get_query_param() { query="$1" key="$2" if [ -z "$query" ]; then return 0 fi printf '%s' "$query" | tr '&' '\n' | awk -F= -v k="$key" '$1==k {print $2; exit}' } require_env() { name="$1" eval "val=\${$name:-}" if [ -z "$val" ]; then echo "ERROR: $name is required" >&2 exit 1 fi } parse_database_url() { url="$1" rest="${url#*://}" base="$rest" query="" if [ "$rest" != "${rest%%\?*}" ]; then base="${rest%%\?*}" query="${rest#*\?}" fi userinfo="${base%%@*}" hostport_db="${base#*@}" if [ "$hostport_db" = "$base" ]; then userinfo="" hostport_db="$base" fi hostport="${hostport_db%%/*}" dbname="${hostport_db#*/}" if [ "$dbname" = "$hostport_db" ]; then dbname="" fi user="" pass="" if [ -n "$userinfo" ]; then case "$userinfo" in *:*) user="${userinfo%%:*}" pass="${userinfo#*:}" ;; *) user="$userinfo" pass="" ;; esac fi host="${hostport%%:*}" port="${hostport#*:}" if [ "$port" = "$hostport" ]; then port="" fi [ -n "$user" ] && export DATABASE_USER="$(url_decode "$user")" [ -n "$pass" ] && export DATABASE_PASSWORD="$(url_decode "$pass")" [ -n "$host" ] && export DATABASE_HOST="$(url_decode "$host")" [ -n "$dbname" ] && export DATABASE_DBNAME="$(url_decode "$dbname")" [ -n "$port" ] && export DATABASE_PORT="$port" sslmode="$(get_query_param "$query" "sslmode")" if [ -n "$sslmode" ]; then export DATABASE_SSLMODE="$(url_decode "$sslmode")" else : "${DATABASE_SSLMODE:=require}" fi } parse_redis_url() { url="$1" scheme="${url%%://*}" rest="${url#*://}" base="$rest" query="" if [ "$rest" != "${rest%%\?*}" ]; then base="${rest%%\?*}" query="${rest#*\?}" fi userinfo="${base%%@*}" hostport_db="${base#*@}" if [ "$hostport_db" = "$base" ]; then userinfo="" hostport_db="$base" fi hostport="${hostport_db%%/*}" dbname="${hostport_db#*/}" if [ "$dbname" = "$hostport_db" ] || [ -z "$dbname" ]; then dbname="" fi pass="" if [ -n "$userinfo" ]; then case "$userinfo" in *:*) pass="${userinfo#*:}" ;; *) pass="" ;; esac fi host="${hostport%%:*}" port="${hostport#*:}" if [ "$port" = "$hostport" ]; then port="" fi [ -n "$host" ] && export REDIS_HOST="$(url_decode "$host")" [ -n "$port" ] && export REDIS_PORT="$port" [ -n "$pass" ] && export REDIS_PASSWORD="$(url_decode "$pass")" db_query="$(get_query_param "$query" "db")" if [ -n "$db_query" ]; then dbname="$db_query" fi [ -n "$dbname" ] && export REDIS_DB="$(url_decode "$dbname")" tls="false" tls_query="$(get_query_param "$query" "ssl")" if [ -z "$tls_query" ]; then tls_query="$(get_query_param "$query" "tls")" fi if [ -n "$tls_query" ]; then case "$(url_decode "$tls_query")" in 1|true|TRUE|True|yes|YES|on|ON) tls="true" ;; *) tls="false" ;; esac else if [ "$scheme" = "rediss" ]; then tls="true" fi fi export REDIS_ENABLE_TLS="$tls" } require_env DATABASE_URL require_env REDIS_URL DATABASE_URL="$(strip_quotes "$DATABASE_URL")" REDIS_URL="$(strip_quotes "$REDIS_URL")" export DATABASE_URL REDIS_URL parse_database_url "$DATABASE_URL" parse_redis_url "$REDIS_URL" : "${DATABASE_DBNAME:=sub2api}" : "${DATABASE_PORT:=5432}" : "${DATABASE_SSLMODE:=require}" : "${REDIS_PORT:=6379}" : "${REDIS_DB:=0}" require_env DATABASE_HOST require_env DATABASE_USER require_env DATABASE_PASSWORD require_env REDIS_HOST export PORT SERVER_HOST SERVER_PORT SERVER_MODE RUN_MODE AUTO_SETUP TZ DATA_DIR copy_and_exec() { src="$1" dst="$BIN_DIR/sub2api" cp "$src" "$dst" chmod +x "$dst" exec "$dst" } if [ -x /app/sub2api ]; then copy_and_exec /app/sub2api fi if command -v sub2api >/dev/null 2>&1; then copy_and_exec "$(command -v sub2api)" fi echo "ERROR: sub2api executable not found." >&2 ls -la /app >&2 || true ls -la / >&2 || true exit 1