darkfire514 commited on
Commit
62b22d6
·
verified ·
1 Parent(s): af21cdd

Update start.sh

Browse files
Files changed (1) hide show
  1. start.sh +50 -69
start.sh CHANGED
@@ -1,59 +1,60 @@
1
  #!/usr/bin/env bash
2
  set -e
3
 
4
- echo "======================================"
5
- echo "PostgreSQL + Adminer for Hugging Face"
6
- echo "======================================"
 
 
 
 
7
 
8
  if [ -z "$POSTGRES_PASSWORD" ]; then
9
- echo "ERROR: POSTGRES_PASSWORD is not set."
10
- echo "Please set POSTGRES_PASSWORD in Hugging Face Space Secrets."
11
  exit 1
12
  fi
13
 
14
  export POSTGRES_USER="${POSTGRES_USER:-admin}"
15
  export POSTGRES_DB="${POSTGRES_DB:-appdb}"
16
 
17
- # PostgreSQL 运行数据目录:建议使用 Space 本地磁盘
18
  export PGDATA="${PGDATA:-/home/user/pgdata}"
19
 
20
- # 挂载大磁盘目录:用于备份、用户文件、导出文件、生成文件
21
  export DATA_DIR="${DATA_DIR:-/data}"
22
  export BACKUP_DIR="${BACKUP_DIR:-/data/backups}"
23
  export USER_FILE_DIR="${USER_FILE_DIR:-/data/files}"
24
  export EXPORT_DIR="${EXPORT_DIR:-/data/exports}"
25
  export GENERATED_DIR="${GENERATED_DIR:-/data/generated}"
26
 
27
- # 自动备份间隔,默认 1 小时
28
  export BACKUP_INTERVAL_SECONDS="${BACKUP_INTERVAL_SECONDS:-3600}"
29
 
30
- echo "Runtime configuration:"
31
- echo "POSTGRES_USER=$POSTGRES_USER"
32
- echo "POSTGRES_DB=$POSTGRES_DB"
33
- echo "PGDATA=$PGDATA"
34
- echo "DATA_DIR=$DATA_DIR"
35
- echo "BACKUP_DIR=$BACKUP_DIR"
36
- echo "USER_FILE_DIR=$USER_FILE_DIR"
37
- echo "EXPORT_DIR=$EXPORT_DIR"
38
- echo "GENERATED_DIR=$GENERATED_DIR"
39
- echo "BACKUP_INTERVAL_SECONDS=$BACKUP_INTERVAL_SECONDS"
40
-
41
- echo "Creating directories..."
42
-
43
  mkdir -p "$PGDATA"
44
  mkdir -p "$BACKUP_DIR"
45
  mkdir -p "$USER_FILE_DIR"
46
  mkdir -p "$EXPORT_DIR"
47
  mkdir -p "$GENERATED_DIR"
48
 
49
- # PostgreSQL 数据目录需要 postgres 用户权限
50
  chown -R postgres:postgres "$PGDATA" || true
51
  chmod 700 "$PGDATA" || true
52
-
53
- # /data 是挂载大磁盘,可能不支持 chown,这里只尽量设置权限,允许失败
54
  chmod -R 755 "$DATA_DIR" || true
55
 
56
- echo "Directory status:"
57
  ls -ld "$PGDATA" || true
58
  ls -ld "$DATA_DIR" || true
59
  ls -ld "$BACKUP_DIR" || true
@@ -64,46 +65,40 @@ ls -ld "$GENERATED_DIR" || true
64
  RESTORE_BACKUP=0
65
 
66
  if [ ! -s "$PGDATA/PG_VERSION" ]; then
67
- echo "No existing PostgreSQL data directory found."
68
-
69
  if [ -f "$BACKUP_DIR/latest.sql" ]; then
70
- echo "Backup file found: $BACKUP_DIR/latest.sql"
71
- echo "Database will be restored after PostgreSQL initialization."
72
  RESTORE_BACKUP=1
73
  else
74
- echo "No backup file found. A new database will be initialized."
75
  fi
76
  else
77
- echo "Existing PostgreSQL data directory found."
78
  fi
79
 
80
- echo "Starting PostgreSQL..."
81
-
82
  docker-entrypoint.sh postgres &
83
-
84
  POSTGRES_PID=$!
85
 
86
- echo "Waiting for PostgreSQL to become ready..."
87
-
88
  until pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; do
89
  sleep 2
90
  done
91
 
92
- echo "PostgreSQL is ready."
93
 
94
  if [ "$RESTORE_BACKUP" = "1" ]; then
95
- echo "Restoring database from $BACKUP_DIR/latest.sql ..."
96
-
97
  PGPASSWORD="$POSTGRES_PASSWORD" psql \
98
  -h 127.0.0.1 \
99
  -p 5432 \
100
  -U "$POSTGRES_USER" \
101
  -d "$POSTGRES_DB" \
102
  < "$BACKUP_DIR/latest.sql" || {
103
- echo "WARNING: Restore failed. Please check backup file."
104
  }
105
-
106
- echo "Restore process finished."
107
  fi
108
 
109
  create_backup() {
@@ -111,7 +106,7 @@ create_backup() {
111
  BACKUP_FILE="$BACKUP_DIR/backup_${POSTGRES_DB}_${TIMESTAMP}.sql"
112
  LATEST_FILE="$BACKUP_DIR/latest.sql"
113
 
114
- echo "Creating backup: $BACKUP_FILE"
115
 
116
  PGPASSWORD="$POSTGRES_PASSWORD" pg_dump \
117
  -h 127.0.0.1 \
@@ -123,52 +118,38 @@ create_backup() {
123
  mv "$BACKUP_FILE.tmp" "$BACKUP_FILE"
124
  cp "$BACKUP_FILE" "$LATEST_FILE"
125
 
126
- echo "Backup saved:"
127
- echo "- $BACKUP_FILE"
128
- echo "- $LATEST_FILE"
129
  }
130
 
131
  backup_loop() {
132
- echo "Backup loop started. Interval: ${BACKUP_INTERVAL_SECONDS}s"
133
-
134
  while true; do
135
  sleep "$BACKUP_INTERVAL_SECONDS"
136
-
137
  if pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; then
138
- create_backup || echo "WARNING: Backup failed."
139
  else
140
- echo "WARNING: PostgreSQL is not ready. Backup skipped."
141
  fi
142
  done
143
  }
144
 
145
- # 启动后先做一次备份,避免 latest.sql 长时间不存在
146
  if pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; then
147
- create_backup || echo "WARNING: Initial backup failed."
148
  fi
149
 
150
  backup_loop &
151
 
152
- echo "Checking PHP modules..."
153
-
154
  if php -m | grep -Ei "pgsql|pdo_pgsql" > /dev/null; then
155
- echo "PHP PostgreSQL extension loaded."
156
  else
157
- echo "ERROR: PHP PostgreSQL extension is not loaded."
158
- echo "Installed PHP modules:"
159
- php -m
160
- echo ""
161
- echo "Please make sure Dockerfile installs php-pgsql."
162
- exit 1
163
  fi
164
 
165
- echo "Starting Adminer on port 7860..."
166
- echo "Adminer login information:"
167
- echo "System: PostgreSQL"
168
- echo "Server: 127.0.0.1"
169
- echo "Username: $POSTGRES_USER"
170
- echo "Database: $POSTGRES_DB"
171
 
172
- php -S 0.0.0.0:7860 /adminer.php
173
 
174
  wait "$POSTGRES_PID"
 
1
  #!/usr/bin/env bash
2
  set -e
3
 
4
+ log() {
5
+ echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] $*"
6
+ }
7
+
8
+ log "======================================"
9
+ log "PostgreSQL General HF Space starting"
10
+ log "======================================"
11
 
12
  if [ -z "$POSTGRES_PASSWORD" ]; then
13
+ log "ERROR: POSTGRES_PASSWORD is not set."
14
+ log "Please set POSTGRES_PASSWORD in Hugging Face Space Secrets."
15
  exit 1
16
  fi
17
 
18
  export POSTGRES_USER="${POSTGRES_USER:-admin}"
19
  export POSTGRES_DB="${POSTGRES_DB:-appdb}"
20
 
21
+ # PostgreSQL runtime data directory: use Space local disk.
22
  export PGDATA="${PGDATA:-/home/user/pgdata}"
23
 
24
+ # Mounted storage bucket directories.
25
  export DATA_DIR="${DATA_DIR:-/data}"
26
  export BACKUP_DIR="${BACKUP_DIR:-/data/backups}"
27
  export USER_FILE_DIR="${USER_FILE_DIR:-/data/files}"
28
  export EXPORT_DIR="${EXPORT_DIR:-/data/exports}"
29
  export GENERATED_DIR="${GENERATED_DIR:-/data/generated}"
30
 
31
+ # Automatic backup interval, default: 1 hour.
32
  export BACKUP_INTERVAL_SECONDS="${BACKUP_INTERVAL_SECONDS:-3600}"
33
 
34
+ log "Runtime configuration:"
35
+ log "POSTGRES_USER=$POSTGRES_USER"
36
+ log "POSTGRES_DB=$POSTGRES_DB"
37
+ log "PGDATA=$PGDATA"
38
+ log "DATA_DIR=$DATA_DIR"
39
+ log "BACKUP_DIR=$BACKUP_DIR"
40
+ log "USER_FILE_DIR=$USER_FILE_DIR"
41
+ log "EXPORT_DIR=$EXPORT_DIR"
42
+ log "GENERATED_DIR=$GENERATED_DIR"
43
+ log "BACKUP_INTERVAL_SECONDS=$BACKUP_INTERVAL_SECONDS"
44
+
45
+ log "Creating directories..."
 
46
  mkdir -p "$PGDATA"
47
  mkdir -p "$BACKUP_DIR"
48
  mkdir -p "$USER_FILE_DIR"
49
  mkdir -p "$EXPORT_DIR"
50
  mkdir -p "$GENERATED_DIR"
51
 
52
+ # PostgreSQL needs a private data directory. Allow permission changes to fail on restricted runtimes.
53
  chown -R postgres:postgres "$PGDATA" || true
54
  chmod 700 "$PGDATA" || true
 
 
55
  chmod -R 755 "$DATA_DIR" || true
56
 
57
+ log "Directory status:"
58
  ls -ld "$PGDATA" || true
59
  ls -ld "$DATA_DIR" || true
60
  ls -ld "$BACKUP_DIR" || true
 
65
  RESTORE_BACKUP=0
66
 
67
  if [ ! -s "$PGDATA/PG_VERSION" ]; then
68
+ log "No existing PostgreSQL data directory found."
 
69
  if [ -f "$BACKUP_DIR/latest.sql" ]; then
70
+ log "Backup file found: $BACKUP_DIR/latest.sql"
71
+ log "Database will be restored after PostgreSQL initialization."
72
  RESTORE_BACKUP=1
73
  else
74
+ log "No backup file found. A new database will be initialized."
75
  fi
76
  else
77
+ log "Existing PostgreSQL data directory found."
78
  fi
79
 
80
+ log "Starting PostgreSQL..."
 
81
  docker-entrypoint.sh postgres &
 
82
  POSTGRES_PID=$!
83
 
84
+ log "Waiting for PostgreSQL to become ready..."
 
85
  until pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; do
86
  sleep 2
87
  done
88
 
89
+ log "PostgreSQL is ready."
90
 
91
  if [ "$RESTORE_BACKUP" = "1" ]; then
92
+ log "Restoring database from $BACKUP_DIR/latest.sql ..."
 
93
  PGPASSWORD="$POSTGRES_PASSWORD" psql \
94
  -h 127.0.0.1 \
95
  -p 5432 \
96
  -U "$POSTGRES_USER" \
97
  -d "$POSTGRES_DB" \
98
  < "$BACKUP_DIR/latest.sql" || {
99
+ log "WARNING: Restore failed. Please check backup file."
100
  }
101
+ log "Restore process finished."
 
102
  fi
103
 
104
  create_backup() {
 
106
  BACKUP_FILE="$BACKUP_DIR/backup_${POSTGRES_DB}_${TIMESTAMP}.sql"
107
  LATEST_FILE="$BACKUP_DIR/latest.sql"
108
 
109
+ log "Creating backup: $BACKUP_FILE"
110
 
111
  PGPASSWORD="$POSTGRES_PASSWORD" pg_dump \
112
  -h 127.0.0.1 \
 
118
  mv "$BACKUP_FILE.tmp" "$BACKUP_FILE"
119
  cp "$BACKUP_FILE" "$LATEST_FILE"
120
 
121
+ log "Backup saved: $BACKUP_FILE and $LATEST_FILE"
 
 
122
  }
123
 
124
  backup_loop() {
125
+ log "Backup loop started. Interval: ${BACKUP_INTERVAL_SECONDS}s"
 
126
  while true; do
127
  sleep "$BACKUP_INTERVAL_SECONDS"
 
128
  if pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; then
129
+ create_backup || log "WARNING: Backup failed."
130
  else
131
+ log "WARNING: PostgreSQL is not ready. Backup skipped."
132
  fi
133
  done
134
  }
135
 
 
136
  if pg_isready -h 127.0.0.1 -p 5432 -U "$POSTGRES_USER"; then
137
+ create_backup || log "WARNING: Initial backup failed."
138
  fi
139
 
140
  backup_loop &
141
 
142
+ log "Checking PHP PostgreSQL extension for optional Adminer usage..."
 
143
  if php -m | grep -Ei "pgsql|pdo_pgsql" > /dev/null; then
144
+ log "PHP PostgreSQL extension loaded."
145
  else
146
+ log "WARNING: PHP PostgreSQL extension is not loaded. Adminer may not work."
 
 
 
 
 
147
  fi
148
 
149
+ log "Starting FastAPI on port 7860..."
150
+ log "API docs: /docs"
151
+ log "Health: /api/health"
 
 
 
152
 
153
+ uvicorn api:app --host 0.0.0.0 --port 7860
154
 
155
  wait "$POSTGRES_PID"