110 lines
2.7 KiB
Python
110 lines
2.7 KiB
Python
"""Archivium Launcher"""
|
|
import subprocess
|
|
import os
|
|
import sys
|
|
import time
|
|
import shutil
|
|
|
|
|
|
def check_dependencies():
|
|
"""Check if required packages are installed"""
|
|
packages = ["uvicorn", "fastapi", "sqlalchemy", "passlib"]
|
|
missing = []
|
|
|
|
for package in packages:
|
|
try:
|
|
__import__(package.split("[")[0].replace("-", "_"))
|
|
except ImportError:
|
|
missing.append(package)
|
|
|
|
if missing:
|
|
print(f"Missing dependencies: {', '.join(missing)}")
|
|
print("\nInstall with:")
|
|
print(" cd backend/app")
|
|
print(" uv sync")
|
|
sys.exit(1)
|
|
|
|
|
|
def check_node_js():
|
|
"""Check if Node.js is available"""
|
|
return shutil.which("node") is not None and shutil.which("npm") is not None
|
|
|
|
|
|
def run_backend():
|
|
"""Run backend only"""
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
backend_dir = os.path.join(base_dir, "backend", "app")
|
|
|
|
print("Starting backend on port 8000...")
|
|
|
|
backend_process = subprocess.Popen(
|
|
["uv", "run", "python", "main.py"],
|
|
cwd=backend_dir
|
|
)
|
|
|
|
try:
|
|
backend_process.wait()
|
|
except KeyboardInterrupt:
|
|
backend_process.terminate()
|
|
backend_process.wait()
|
|
|
|
|
|
def run_full_stack():
|
|
"""Run backend and frontend"""
|
|
check_dependencies()
|
|
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
backend_dir = os.path.join(base_dir, "backend", "app")
|
|
frontend_dir = os.path.join(base_dir, "frontend")
|
|
|
|
if not check_node_js():
|
|
if not sys.stdin.isatty():
|
|
run_backend()
|
|
return
|
|
|
|
response = input("Node.js not found. Run backend only? (y/n): ").strip().lower()
|
|
if response == 'y':
|
|
run_backend()
|
|
return
|
|
|
|
print("Starting backend and frontend...")
|
|
|
|
backend_process = subprocess.Popen(
|
|
["uv", "run", "python", "main.py"],
|
|
cwd=backend_dir
|
|
)
|
|
|
|
time.sleep(2)
|
|
|
|
frontend_process = subprocess.Popen(
|
|
"npm start",
|
|
shell=True,
|
|
cwd=frontend_dir,
|
|
)
|
|
|
|
try:
|
|
backend_process.wait()
|
|
frontend_process.wait()
|
|
except KeyboardInterrupt:
|
|
backend_process.terminate()
|
|
frontend_process.terminate()
|
|
backend_process.wait()
|
|
frontend_process.wait()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) > 1:
|
|
if sys.argv[1] == "--backend-only":
|
|
check_dependencies()
|
|
run_backend()
|
|
elif sys.argv[1] == "--help":
|
|
print("Usage: python main.py [option]")
|
|
print("\nOptions:")
|
|
print(" --backend-only Run backend only")
|
|
print(" --help Show this message")
|
|
else:
|
|
print(f"Unknown option: {sys.argv[1]}")
|
|
else:
|
|
run_full_stack()
|
|
|