Environment Variables
Overview
SpeedPy uses django-environ for environment variable management. Variables are read from a .env file in the project root.
The Docker setup uses .docker.env as the template (copied to .env during make init).
Variable Reference
Core
| Variable |
Type |
Default |
Description |
DEBUG |
bool |
False |
Enable debug mode |
LOG_LEVEL |
string |
DEBUG if DEBUG else INFO |
Root log level. See Logging — boto and urllib3 are pinned to WARNING regardless, so raising this does not leak request bodies. |
SECRET_KEY |
string |
"change_me" |
Django secret key |
SALT_KEY |
string |
"changeme" |
Encryption salt for Fernet encrypted fields |
ALLOWED_HOSTS |
list |
["*"] |
Comma-separated list of allowed hostnames |
ADMIN_URL |
string |
"admin/" |
URL path for the Django admin |
SITE_URL |
string |
auto-detected |
Full URL of the site (e.g., https://example.com) |
Database
| Variable |
Type |
Default |
Description |
DATABASE_URL |
string |
"sqlite:///db.sqlite3" |
Database connection string |
CONN_MAX_AGE |
int |
60 |
Persistent database connection lifetime (seconds, PostgreSQL only) |
Cache
| Variable |
Type |
Default |
Description |
CACHE_URL |
string |
"dummycache://" |
Cache backend connection string |
Redis & Celery
| Variable |
Type |
Default |
Description |
REDIS_URL |
string |
None |
Redis URL for Celery broker, result backend, and Redbeat |
Email
EMAIL_PROVIDER selects the sending backend behind django-post_office. See the Email page for full details. Provider credentials default to placeholders so the app boots without them; real keys are required to actually send.
| Variable |
Type |
Default |
Description |
EMAIL_PROVIDER |
string |
"console" |
Sending backend: console, smtp, ses, mailgun, sendgrid, postmark, resend. Invalid values fail at startup. |
EMAIL_URL |
string |
"smtp://user:password@localhost:25" |
SMTP connection string (used when EMAIL_PROVIDER=smtp) |
DEFAULT_FROM_EMAIL |
string |
"admin@example.com" |
Default sender address |
SERVER_EMAIL |
string |
value of DEFAULT_FROM_EMAIL |
Sender for Django error/admin emails |
AWS_SES_ACCESS_KEY_ID |
string |
"change_me" |
AWS SES access key (provider ses) |
AWS_SES_SECRET_ACCESS_KEY |
string |
"change_me" |
AWS SES secret key (provider ses) |
AWS_SES_REGION_NAME |
string |
"eu-central-1" |
AWS SES region (provider ses) |
MAILGUN_API_KEY |
string |
"change_me" |
Mailgun API key (provider mailgun) |
MAILGUN_SENDER_DOMAIN |
string |
"example.com" |
Mailgun sender domain (provider mailgun) |
MAILGUN_API_URL |
string |
"https://api.mailgun.net/v3" |
Mailgun API base URL; use the EU endpoint for EU accounts |
SENDGRID_API_KEY |
string |
"change_me" |
SendGrid API key (provider sendgrid) |
POSTMARK_SERVER_TOKEN |
string |
"change_me" |
Postmark server token (provider postmark) |
RESEND_API_KEY |
string |
"change_me" |
Resend API key (provider resend) |
| Variable |
Type |
Default |
Description |
STATIC_URL |
string |
"/static/" |
URL prefix for static files |
STATIC_ROOT |
string |
BASE_DIR / "staticfiles" |
Directory for collected static files |
MEDIA_ROOT |
string |
BASE_DIR / "media" |
Directory for uploaded media files. On Appliku, a volume with prefix MEDIA sets this for you. |
MEDIA_URL |
string |
"/media/" |
URL prefix for media files. On Appliku, a volume with prefix MEDIA sets this too; an empty value or the literal "None" falls back to the default, and a trailing slash is added. |
PRIVATE_MEDIA_ROOT |
string |
BASE_DIR / "private-media" |
Local-disk home for private uploads. Deliberately outside MEDIA_ROOT, which the web server serves. |
Object Storage (S3-compatible)
Optional. Local disk is the default — see Media Storage. Requires
uv sync --extra s3.
| Variable |
Type |
Default |
Description |
USE_S3 |
bool |
False |
Move uploaded media to S3-compatible object storage |
S3_ACCESS_KEY_ID |
string |
"" |
Access key. Required when USE_S3=True |
S3_SECRET_ACCESS_KEY |
string |
"" |
Secret key. Required when USE_S3=True |
S3_BUCKET_NAME |
string |
"" |
Bucket name. Required when USE_S3=True |
S3_REGION_NAME |
string |
"" |
Region, if your provider uses one |
S3_ENDPOINT_URL |
string |
"" |
Provider endpoint. Empty means AWS S3; this is the only setting that selects a provider |
S3_CDN_BASE |
string |
"" |
CDN or custom domain used for public URLs |
S3_DEFAULT_ACL |
string |
"" |
Object ACL for public files. Empty works everywhere. public-read on DigitalOcean Spaces / Wasabi. Must stay empty on AWS with ACLs disabled and on Cloudflare R2, which reject uploads carrying an ACL |
S3_SEND_PRIVATE_ACL |
bool |
True |
Send private ACL on private uploads. Turn off for providers without ACLs |
S3_SIGNED_URL_EXPIRE |
int |
600 |
Lifetime in seconds of signed URLs for private files |
S3_ADDRESSING_STYLE |
string |
"" |
Set to path for MinIO and some self-hosted gateways |
Authentication & Security
| Variable |
Type |
Default |
Description |
RECAPTCHA_PUBLIC_KEY |
string |
"" |
Google reCAPTCHA site key |
RECAPTCHA_PRIVATE_KEY |
string |
"" |
Google reCAPTCHA secret key |
RECAPTCHA_REQUIRED_SCORE |
float |
0.5 |
Minimum reCAPTCHA score (0.0–1.0) |
OTP_TOTP_ISSUER |
string |
"uptimefor.me" |
Name shown in authenticator apps |
TOS_LINK |
string |
"/" |
Terms of Service URL |
DPA_LINK |
string |
"/" |
Privacy Policy URL |
Features
| Variable |
Type |
Default |
Description |
SPEEDPY_TEAMS_ENABLED |
bool |
True |
Enable/disable teams functionality |
SPEEDPY_TOURS_ENABLED |
bool |
True |
Enable/disable onboarding tours |
DEMO_MODE |
bool |
False |
Pre-fill login form with demo credentials |
DEFAULT_ADMIN_PASSWORD |
string |
None |
Password for the auto-created superuser |
Docker Default Environment
The .docker.env file used by Docker Compose:
DEBUG=True
DATABASE_URL=postgres://speedpycom:speedpycom@db:5432/speedpycom
REDIS_URL=redis://redis:6379/0
SECRET_KEY=changeme