Build PROMPT media library with masonry UI and persistent PostgreSQL S3 storage
PROMPT CI and deployment / verify-and-deploy (push) Successful in 8m18s

This commit is contained in:
2026-10-22 22:18:11 +08:00
parent 68419e3852
commit 8b650fdf78
42 changed files with 1631 additions and 54 deletions
+36 -1
View File
@@ -49,6 +49,11 @@ if ! id "$SERVICE_USER" >/dev/null 2>&1; then
useradd --system --home "$DATA_ROOT" --shell /usr/sbin/nologin "$SERVICE_USER"
fi
install -d -o "$SERVICE_USER" -g "$SERVICE_USER" -m 0750 "$DATA_ROOT"
bash scripts/infra.sh "$NODE_SOURCE" "$RELEASE_SHA"
set -a
. /etc/prompt.env
set +a
"$NODE_SOURCE" node_modules/tsx/dist/cli.mjs scripts/bootstrap.ts
# Keep runtime data outside the checkout and releases; future modules can use it.
if [ ! -d "$RELEASE_DIR" ]; then
STAGING=$(mktemp -d "$APP_ROOT/releases/.staging.XXXXXX")
@@ -57,6 +62,7 @@ if [ ! -d "$RELEASE_DIR" ]; then
cp -a .next/static "$STAGING/.next/static"
if [ -d public ]; then cp -a public "$STAGING/public"; fi
install -m 0755 "$NODE_SOURCE" "$STAGING/bin/node"
install -m 0644 dist/worker.cjs "$STAGING/worker.cjs"
printf 'RELEASE_SHA=%s\n' "$RELEASE_SHA" > "$STAGING/release.env"
chmod -R a+rX "$STAGING"
chmod 0755 "$STAGING"
@@ -79,6 +85,7 @@ Environment=HOSTNAME=0.0.0.0
Environment=PORT=$PORT
Environment=PROMPT_DATA_DIR=$DATA_ROOT
EnvironmentFile=$APP_ROOT/current/release.env
EnvironmentFile=/etc/prompt.env
ExecStart=$APP_ROOT/current/bin/node server.js
Restart=always
RestartSec=5
@@ -89,6 +96,29 @@ UMask=0027
WantedBy=multi-user.target
EOF
cat > /etc/systemd/system/prompt-worker.service <<EOF
[Unit]
Description=PROMPT media processing
After=network-online.target docker.service
[Service]
Type=simple
User=$SERVICE_USER
Group=$SERVICE_USER
WorkingDirectory=$APP_ROOT/current
Environment=NODE_ENV=production
EnvironmentFile=/etc/prompt.env
ExecStart=$APP_ROOT/current/bin/node worker.cjs
Restart=always
RestartSec=5
TimeoutStopSec=650
NoNewPrivileges=true
UMask=0027
[Install]
WantedBy=multi-user.target
EOF
SWITCHED=0
rollback() {
local code=$?
@@ -99,9 +129,11 @@ rollback() {
ln -sfn "$PREVIOUS" "$APP_ROOT/.current.rollback"
mv -Tf "$APP_ROOT/.current.rollback" "$APP_ROOT/current"
systemctl restart "$SERVICE"
if [ -f "$PREVIOUS/worker.cjs" ]; then systemctl restart prompt-worker.service; else systemctl disable --now prompt-worker.service; fi
echo 'Restored previous release'
else
systemctl disable --now "$SERVICE"
systemctl disable --now prompt-worker.service
rm -f "$APP_ROOT/current"
echo 'Stopped failed first deployment'
fi
@@ -116,10 +148,12 @@ SWITCHED=1
systemctl daemon-reload
systemctl enable "$SERVICE"
systemctl restart "$SERVICE"
systemctl enable --now prompt-worker.service
systemctl restart prompt-worker.service
HEALTHY=0
for attempt in $(seq 1 30); do
if "$NODE_SOURCE" -e "fetch('http://127.0.0.1:$PORT/api/health').then(async r=>{const d=await r.json();if(!r.ok||d.service!=='prompt'||d.release!=='$RELEASE_SHA')process.exit(1)}).catch(()=>process.exit(1))"; then
if "$NODE_SOURCE" -e "Promise.all([fetch('http://127.0.0.1:$PORT/api/health'),fetch('http://127.0.0.1:$PORT/api/ready')]).then(async ([r,s])=>{const d=await r.json();if(!r.ok||!s.ok||d.service!=='prompt'||d.release!=='$RELEASE_SHA')process.exit(1)}).catch(()=>process.exit(1))"; then
HEALTHY=1
break
fi
@@ -131,6 +165,7 @@ if [ "$HEALTHY" -ne 1 ]; then
fi
systemctl is-enabled "$SERVICE"
systemctl is-active "$SERVICE"
systemctl is-active prompt-worker.service
echo "Persistent deployment verified: service=$SERVICE port=$PORT release=$RELEASE_SHA"
echo "Host: $(hostname)"
hostname -I || true