CareerBot/app/main.py
ln0422 501f8985ec Add /careerbot base path for www.ityb.me/careerbot deployment
- Add BASE_PATH config, include all routers with prefix
- Inject {{ base }} Jinja2 global for all template URLs
- Add window.BASE_PATH for static JS files
- Update Nginx to proxy /careerbot/ path
- Add OPS_MANUAL.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 22:07:34 +08:00

61 lines
1.8 KiB
Python

import os
from fastapi import FastAPI
from fastapi.responses import RedirectResponse
from fastapi.staticfiles import StaticFiles
from app.config import settings
from app.database import init_db, SessionLocal
from app.models import AdminUser, Profile
from app.routers import auth, public, admin, chat
from app.routers.auth import hash_password
BASE = settings.BASE_PATH
app = FastAPI(title="CareerBot", description="Personal Career Showcase with AI Assistant")
# Mount static files and uploads under BASE_PATH
app.mount(f"{BASE}/static", StaticFiles(directory="app/static"), name="static")
os.makedirs(settings.UPLOAD_DIR, exist_ok=True)
app.mount(f"{BASE}/uploads", StaticFiles(directory=settings.UPLOAD_DIR), name="uploads")
# Include routers with BASE_PATH prefix
app.include_router(auth.router, prefix=BASE)
app.include_router(public.router, prefix=BASE)
app.include_router(admin.router, prefix=BASE)
app.include_router(chat.router, prefix=BASE)
# Set Jinja2 template globals for BASE_PATH
admin.templates.env.globals["base"] = BASE
public.templates.env.globals["base"] = BASE
# Root redirect to CareerBot
@app.get("/")
def root_redirect():
return RedirectResponse(url=f"{BASE}/", status_code=302)
@app.on_event("startup")
def startup():
init_db()
db = SessionLocal()
try:
# Ensure admin user exists
admin_user = db.query(AdminUser).filter(AdminUser.email == "ln0422@gmail.com").first()
if not admin_user:
admin_user = AdminUser(
email="ln0422@gmail.com",
password_hash=hash_password("qshs123456"),
)
db.add(admin_user)
db.commit()
# Ensure profile exists
profile = db.query(Profile).first()
if not profile:
db.add(Profile())
db.commit()
finally:
db.close()