| #!/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
|
|
|