#!/usr/bin/env bash set -euo pipefail DATA_DIR="${DOSFRONTEND_CONFIG_DIR:-/app/data}" DB_PATH="${DATA_DIR}/roms.db" # Make sure data dir exists & is writable for uid 1000 mkdir -p "$DATA_DIR" "$DATA_DIR/images" "$DATA_DIR/logs" "$DATA_DIR/roms" "$DATA_DIR/metadata" # Attempt to fix perms when volume mounted as root if [ "$(id -u)" -ne 0 ]; then # we're not root; try a writable touch to detect perms if ! touch "$DATA_DIR/.permcheck" 2>/dev/null; then echo "WARNING: $DATA_DIR not writable by current user. Consider running as root or fixing volume ownership." else rm -f "$DATA_DIR/.permcheck" fi else chown -R 1000:1000 "$DATA_DIR" || true fi # Initialize / migrate DB if [ ! -f "$DB_PATH" ]; then echo "No database found. Initializing…" python /app/src/migrate.py init || true fi # Always try to move to latest python /app/src/migrate.py upgrade || true # Non-interactive admin creation (optional) if [ "${DOSVAULT_ADMIN_USERNAME:-}" ] && [ "${DOSVAULT_ADMIN_EMAIL:-}" ] && [ "${DOSVAULT_ADMIN_PASSWORD:-}" ]; then python - <<'PY' from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from os import getenv from libs.config import Config from libs.database import User_table, UserRole from libs.auth import AuthManager cfg=Config() engine=create_engine(f"sqlite+pysqlite:///{cfg.database_path}") Session=sessionmaker(bind=engine) db=Session() try: existing = db.query(User_table).filter(User_table.role==UserRole.SUPER.value).first() if not existing: AuthManager.create_user( db, getenv("DOSVAULT_ADMIN_USERNAME"), getenv("DOSVAULT_ADMIN_EMAIL"), getenv("DOSVAULT_ADMIN_PASSWORD"), UserRole.SUPER.value ) print("Admin user created.") else: print(f"Admin already exists: {existing.username}") finally: db.close() PY fi # Execute rom scan exec python ./src/__main__.py || true & # Run app exec python -m uvicorn src.webapp:app --host 0.0.0.0 --port 8080