Vite serves on <http://localhost:5173> and proxies `/api/*` to `http://localhost:8080`. To point at another API host, set `VITE_API_BASE_URL` at build/dev time:
```bash
VITE_API_BASE_URL=http://localhost:8080 npm run dev
2. Update `image:` and the Ingress host in [`deploy/k8s.yaml`](../deploy/k8s.yaml).
3. Apply:
```bash
kubectl apply -f deploy/k8s.yaml
kubectl -n kereru-forms rollout status deployment/kereru-forms
```
The manifest includes a namespace, config map, 1 GiB `ReadWriteOnce` PVC mounted at `/data`, a `Recreate` deployment (SQLite is single-writer), liveness/readiness probes on `/health`, a service on port 80 and an Ingress. A writable `/tmp` emptyDir is mounted because the container root filesystem is read-only.
### Scaling notes
SQLite requires a single writer. Keep `replicas: 1` and use the `Recreate` strategy. To scale horizontally, implement a network database adapter (PostgreSQL/MariaDB) behind `database.Store`, then switch `dbDriver`/`dbDsn` and lift the Deployment restrictions.
Use a `ReadWriteMany` volume only if you replace SQLite; do not share a SQLite file across pods.
## Configuration in production
Prefer environment variables (twelve-factor) or a mounted YAML/JSON file:
```bash
kereru-forms --conf /etc/kereru/config.yaml
```
Typical production settings:
-`KERERU_LOG_FORMAT=json`
-`KERERU_ENVIRONMENT=production`
-`KERERU_CORS_ORIGINS=https://forms.example.com`
-`KERERU_TELEMETRY_ENABLED=true` and `OTEL_EXPORTER_OTLP_ENDPOINT=http://collector:4318`
-`KERERU_STATIC_DIR=/app/static`
- SQLite DSN on a persistent volume: `file:/data/kereru.db?_pragma=busy_timeout(5000)&_pragma=foreign_keys(1)`
For SQLite, back up the database file while the service is stopped, or use the SQLite online backup API/`.backup` command. Keep the volume and file permissions owned by the runtime user (UID used in the container image).