self / start.sh
cnxqchen's picture
Upload 3 files
bad302e verified
#!/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