# Configuration RenewCMS reads its configuration from environment variables. On startup it also loads a `.env` file from the working directory (or its parent) if one exists. Real environment variables take precedence over `.env`. Copy [`.env.example`](../.env.example) to `.env` to get started. When a required variable is missing, the server refuses to start and names the variable. ## Variables ### Required | Name | Description | Example | |-----------------|---------------------------------------------------------------------------------------------------------------------|----------------------------| | `PUBLIC_URL` | Public base URL of the site, including scheme and no trailing slash. Used for links in emails and in the startup log. | `https://cms.example.com` | | `JWT_SECRET` | Secret used to sign the auth JWT. Use a long random value; changing it logs everyone out. | `openssl rand -hex 32` | | `SMTP_EMAIL` | Sender address and SMTP username. | `noreply@example.com` | | `SMTP_PASSWORD` | SMTP password. | | | `SMTP_HOST` | SMTP server host. | `smtp.example.com` | | `SMTP_PORT` | SMTP server port. | `465` | ### Optional | Name | Default | Description | |------------------------|----------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `ENVIRONMENT` | `production` | `production` or `development`. In `production` the auth cookie is `Secure`, so it is only sent over HTTPS. `development` turns on HTTP request logging. | | `PORT` | `8080` | Port the HTTP server listens on (all interfaces). | | `DB_FILE` | `./data/renewcms.db` | Path to the SQLite database file. Missing parent directories are created. The schema is migrated automatically at startup. | | `UPLOAD_DIR` | `./data/uploads` | Directory where uploaded images are stored. | | `CORS_ALLOWED_ORIGINS` | *(empty)* | Semicolon-separated list of origins allowed to call the API. When empty, no CORS headers are sent. That is the right setting whenever the SPA is served by RenewCMS itself (production) or through the Vite proxy (development). | Relative paths are resolved against the process's working directory. In production, use absolute paths (see [deployment.md](deployment.md)). ## Adding a variable 1. Read it in the code where it is needed (infrastructure or `api/`, never `internal/domain`). 2. Register it in [`cmd/server/main.go`](../cmd/server/main.go): add it to `requiredEnvVars` if it is required, or to `envDefaults` if it has a default. 3. Add it to [`.env.example`](../.env.example) and to the tables above. Never hardcode a secret, and never commit `.env`.