All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m43s
- Remove old raw! layout components (~app-head, ~app-layout, ~oob-response, ~header-row, ~menu-row, ~oob-header, ~header-child) from layout.sexp - Convert nav-tree fragment from Jinja HTML to sexp source, fixing the "Unexpected character: ." parse error caused by HTML leaking into sexp - Add _as_sexp() helper to safely coerce HTML fragments to ~rich-text - Fix federation/sexp/search.sexpr extra closing paren - Remove dead _html() wrappers from blog and account sexp_components - Remove stale render import from cart sexp_components - Add dev_watcher.py to auto-reload on .sexp/.sexpr/.js/.css changes - Add test_parse_all.py to parse-check all 59 sexpr/sexp files - Fix test assertions for sx- attribute prefix (was hx-) - Add sexp.js version logging for cache debugging Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
63 lines
2.0 KiB
Bash
Executable File
63 lines
2.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Optional: wait for Postgres to be reachable
|
|
if [[ -n "${DATABASE_HOST:-}" && -n "${DATABASE_PORT:-}" ]]; then
|
|
echo "Waiting for Postgres at ${DATABASE_HOST}:${DATABASE_PORT}..."
|
|
for i in {1..60}; do
|
|
(echo > /dev/tcp/${DATABASE_HOST}/${DATABASE_PORT}) >/dev/null 2>&1 && break || true
|
|
sleep 1
|
|
done
|
|
fi
|
|
|
|
# Create own database + run own migrations
|
|
if [[ "${RUN_MIGRATIONS:-}" == "true" && -n "${ALEMBIC_DATABASE_URL:-}" ]]; then
|
|
python3 -c "
|
|
import os, re
|
|
url = os.environ['ALEMBIC_DATABASE_URL']
|
|
m = re.match(r'postgresql\+\w+://([^:]+):([^@]+)@([^:]+):(\d+)/(.+)', url)
|
|
if not m:
|
|
print('Could not parse ALEMBIC_DATABASE_URL, skipping DB creation')
|
|
exit(0)
|
|
user, password, host, port, dbname = m.groups()
|
|
|
|
import psycopg
|
|
conn = psycopg.connect(
|
|
f'postgresql://{user}:{password}@{host}:{port}/postgres',
|
|
autocommit=True,
|
|
)
|
|
cur = conn.execute('SELECT 1 FROM pg_database WHERE datname = %s', (dbname,))
|
|
if not cur.fetchone():
|
|
conn.execute(f'CREATE DATABASE {dbname}')
|
|
print(f'Created database {dbname}')
|
|
else:
|
|
print(f'Database {dbname} already exists')
|
|
conn.close()
|
|
" || echo "DB creation failed (non-fatal), continuing..."
|
|
|
|
echo "Running orders Alembic migrations..."
|
|
if [ -d orders ]; then (cd orders && alembic upgrade head); else alembic upgrade head; fi
|
|
fi
|
|
|
|
# Clear Redis page cache on deploy
|
|
if [[ -n "${REDIS_URL:-}" && "${REDIS_URL}" != "no" ]]; then
|
|
echo "Flushing Redis cache..."
|
|
python3 -c "
|
|
import redis, os
|
|
r = redis.from_url(os.environ['REDIS_URL'])
|
|
r.flushdb()
|
|
print('Redis cache cleared.')
|
|
" || echo "Redis flush failed (non-fatal), continuing..."
|
|
fi
|
|
|
|
# Start the app
|
|
RELOAD_FLAG=""
|
|
if [[ "${RELOAD:-}" == "true" ]]; then
|
|
RELOAD_FLAG="--reload"
|
|
python3 -m shared.dev_watcher &
|
|
echo "Starting Hypercorn (${APP_MODULE:-app:app}) with auto-reload..."
|
|
else
|
|
echo "Starting Hypercorn (${APP_MODULE:-app:app})..."
|
|
fi
|
|
PYTHONUNBUFFERED=1 exec hypercorn "${APP_MODULE:-app:app}" --bind 0.0.0.0:${PORT:-8000} --workers ${WORKERS:-2} --keep-alive 75 ${RELOAD_FLAG}
|