Spaces:
Paused
Paused
| set -euo pipefail | |
| echo "[boot] starting postgres + redis + sub2api" | |
| # ========== 1) 启动 Redis ========== | |
| redis-server --bind 127.0.0.1 --port 6379 --daemonize yes | |
| echo "[boot] redis started on 127.0.0.1:6379" | |
| # ========== 2) 初始化并启动 PostgreSQL ========== | |
| PG_BIN="/usr/lib/postgresql/15/bin" | |
| mkdir -p "${PGDATA}" | |
| chown -R postgres:postgres "${PGDATA}" | |
| if [ ! -s "${PGDATA}/PG_VERSION" ]; then | |
| echo "[boot] initdb at ${PGDATA}" | |
| gosu postgres "${PG_BIN}/initdb" -D "${PGDATA}" > /dev/null | |
| fi | |
| # 固定监听本地 5432 | |
| cat >> "${PGDATA}/postgresql.conf" <<EOF | |
| listen_addresses = '127.0.0.1' | |
| port = 5432 | |
| max_connections = 100 | |
| EOF | |
| # 允许本地密码连接(容器内) | |
| cat > "${PGDATA}/pg_hba.conf" <<EOF | |
| local all all trust | |
| host all all 127.0.0.1/32 scram-sha-256 | |
| host all all ::1/128 scram-sha-256 | |
| EOF | |
| gosu postgres "${PG_BIN}/pg_ctl" -D "${PGDATA}" -w start | |
| # 创建用户和库(幂等) | |
| gosu postgres psql -v ON_ERROR_STOP=1 --username postgres <<SQL | |
| DO \$\$ | |
| BEGIN | |
| IF NOT EXISTS (SELECT FROM pg_roles WHERE rolname = '${POSTGRES_USER}') THEN | |
| CREATE ROLE ${POSTGRES_USER} LOGIN PASSWORD '${POSTGRES_PASSWORD}'; | |
| ELSE | |
| ALTER ROLE ${POSTGRES_USER} WITH PASSWORD '${POSTGRES_PASSWORD}'; | |
| END IF; | |
| END | |
| \$\$; | |
| SQL | |
| gosu postgres psql -v ON_ERROR_STOP=1 --username postgres <<SQL | |
| DO \$\$ | |
| BEGIN | |
| IF NOT EXISTS (SELECT FROM pg_database WHERE datname = '${POSTGRES_DB}') THEN | |
| CREATE DATABASE ${POSTGRES_DB} OWNER ${POSTGRES_USER}; | |
| END IF; | |
| END | |
| \$\$; | |
| SQL | |
| echo "[boot] postgres started on 127.0.0.1:5432" | |
| # ========== 3) 导出给 sub2api 的连接变量 ========== | |
| export DATABASE_URL="postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@127.0.0.1:5432/${POSTGRES_DB}" | |
| export POSTGRES_URL="${DATABASE_URL}" | |
| export DB_URL="${DATABASE_URL}" | |
| export REDIS_URL="${REDIS_URL}" | |
| # 常见应用端口变量 | |
| export PORT="${PORT:-8080}" | |
| export APP_PORT="${PORT}" | |
| export HOST="${HOST:-0.0.0.0}" | |
| echo "[boot] DATABASE_URL=${DATABASE_URL}" | |
| echo "[boot] REDIS_URL=${REDIS_URL}" | |
| echo "[boot] APP PORT=${PORT}" | |
| # ========== 4) 启动 sub2api ========== | |
| # 情况A:基础镜像有默认 CMD(最理想) | |
| if [ "$#" -gt 0 ]; then | |
| exec "$@" | |
| fi | |
| # 情况B:基础镜像没有 CMD,手动指定 SUB2API_CMD | |
| if [ -n "${SUB2API_CMD:-}" ]; then | |
| exec bash -lc "${SUB2API_CMD}" | |
| fi | |
| echo "[error] No base CMD and SUB2API_CMD not set." | |
| echo "[hint] set Space variable SUB2API_CMD, e.g. 'python main.py' or 'node server.js'" | |
| exit 1 |