# radapi SARLINK FreeRADIUS management stack: a REST API over the FreeRADIUS schema and a web admin portal for it. ``` . ├── backend/ FastAPI REST API over the FreeRADIUS MySQL/MariaDB schema └── frontend/ React + Vite admin portal (radui) ``` ## Components | Dir | What | Stack | |-------------|----------------------------------------|--------------------------------------------| | `backend/` | RESTful CRUD over FreeRADIUS tables | FastAPI, SQLAlchemy 2.0, PyMySQL, Pydantic v2 | | `frontend/` | Admin UI for clients, devices and VLANs | React 19, Vite, TypeScript, Tailwind v4 | Auth across both is a shared secret sent in the **`X-API-Key`** header — the frontend collects the key on a login screen and the backend validates it. ## Quick start ### With Docker (dev) Runs both services with hot-reload — the frontend on Vite, the backend on `uvicorn --reload`, each with its source volume-mounted from the host. ```bash cp backend/.env.example backend/.env # edit DB credentials + API_KEY docker compose up --build # frontend :5173, backend :8000 ``` The frontend proxies `/api/*` to the `backend` service over the compose network, so log in at http://localhost:5173 with the `API_KEY` from `backend/.env`. ### Manual **Backend** (see [`backend/README.md`](backend/README.md) for details): ```bash cd backend python3 -m venv venv venv/bin/pip install -r requirements.txt cp .env.example .env # edit DB credentials + API_KEY venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8000 ``` **Frontend** (see [`frontend/README.md`](frontend/README.md) for details): ```bash cd frontend npm install VITE_API_TARGET=http://127.0.0.1:8000 npm run dev # http://localhost:5173 ``` Log in with the same value set as `API_KEY` in `backend/.env`. In dev, Vite proxies `/api/*` to the backend so requests stay same-origin.