Skip to content

Quickstart

This page walks you from zero to a running FreeSDN instance using the Lite tier - the path for a homelab or evaluation. Deployment Tiers describes resource presets, not an enterprise support commitment.

Requirement Minimum
Docker Engine and Compose plugin Maintained versions with security updates; use docker compose, not legacy docker-compose
Python on the host Python 3, required by the installer configuration helper
CPU / RAM / disk Budget source builds, running services, retained images, databases and recoverable backups separately; see Host Requirements
Qualified candidate platform Linux amd64 (x86-64); a native Linux filesystem that can enforce private file permissions
Terminal window
git clone https://github.com/freesdn/freesdn.git
cd freesdn

Review the selected release notes and check out the intended existing release tag before installing. Do not assume the default branch or a candidate version is a stable release, and do not invent a tag for the prepared candidate.

install.sh configures a tier and builds the application images from source. For a named domain with automatic HTTPS, first provision DNS and the required inbound ports, then substitute your own domain and operator email:

Terminal window
./install.sh --tier lite --domain freesdn.example.com --email operator@example.com

The default ./install.sh uses the Lite template’s plain HTTP mapping on port 8080. Keep that mode restricted to disposable local evaluation or a reviewed upstream TLS terminator. Production/staging authentication uses Secure cookies: use an HTTPS browser origin for remote access. Do not disable cookie security or switch the backend to development mode to make remote HTTP login work. For an isolated local-CA setup, see Networking and TLS and the port/origin notes below.

The installer copies the right .env.<tier>.example to .env.<tier>, generates strong random secrets, then runs docker compose --env-file .env.<tier> build followed by docker compose --env-file .env.<tier> up -d. The first build compiles the backend and frontend images from source and takes several minutes.

For a fresh installation, use the same configuration helper without starting services. It creates a private mode-0600 file with random secrets and preserves existing credentials if the file already exists:

Terminal window
python3 scripts/install_config.py --tier lite --domain freesdn.example.com --email operator@example.com

Review .env.lite privately. Do not commit it or paste its contents into a bug report. The helper refuses files or filesystems that cannot enforce its ownership and permission checks. If you manually provision additional secrets, generate independent values with:

Terminal window
python3 -c "import secrets; print(secrets.token_urlsafe(48))"

Set at minimum:

Variable Purpose
SECRET_KEY Application/vault key material and legacy JWT fallback; strong, non-default and preserved with existing encrypted data
JWT_SIGNING_KEY Optional independent authentication signing key; recovery requires a coordinated new key on all target backend processes, without rotating vault keys
ENCRYPTION_SALT Fernet credential encryption salt
POSTGRES_PASSWORD Primary database password
LOGDB_PASSWORD TimescaleDB (metrics) password (Compose assembles the full connection URL from this)
REDIS_PASSWORD Valkey cache / broker password

Configure encrypted backups separately; a running pg-backup container does not mean encryption, off-site transfer or recoverability is configured. Read Backups and Restore before retaining useful data.

For this fresh installation, build the source images and then start the stack:

Terminal window
docker compose --env-file .env.lite build
docker compose --env-file .env.lite up -d

Do not use this sequence to replace an existing installation; follow the coordinated upgrade procedure instead.

Terminal window
docker compose --env-file .env.lite logs -f api

The first boot initializes fresh databases and runs the candidate’s normal startup checks. Wait for the actual services and backend readiness, not only a running container or the edge’s static /healthz endpoint. A startup refusal is not permission to force-stamp the database revision or delete volumes.

For the domain command above, use https://freesdn.example.com after DNS and certificate issuance succeed. The installer sets host ports 80/443 and matching public/browser origins for that domain.

With the unchanged Lite template, CADDY_SITE_ADDRESS=:80 serves only HTTP at http://localhost:8080; the 8443 mapping does not itself enable TLS. Changing CADDY_SITE_ADDRESS=localhost enables the internal CA, but Lite still maps HTTPS to 8443 unless EDGE_HTTPS_PORT is changed. Use https://localhost:8443 and configure the matching public/browser origin and CORS origin. Trust only the root certificate from your own fixture, after verifying its origin; never trust an arbitrary downloaded CA or use a browser security bypass.

A localhost certificate does not identify a remote VM’s IP address or LAN hostname. For remote access, configure a hostname and a certificate that matches it. See Networking and TLS.

The edge exposes these paths:

Path What
/ React SPA
/api/v1/ REST API (JSON)
/api/v1/docs Swagger UI (dev tier only - disabled when ENVIRONMENT=production)
/api/v1/redoc ReDoc (dev tier only - disabled when ENVIRONMENT=production)

There is no default admin password. On first boot FreeSDN presents a web wizard that creates the initial super-admin account. Follow the wizard to:

  1. Set the admin email and password (minimum 12 characters).
  2. Name your first Organization.
  3. Choose which modules to enable for your organization.
  4. Add your first controller (IP/hostname and adapter type).

(The wizard also runs automated Welcome and Database health-check steps before these.)

Once the wizard completes you land on the main dashboard. To invite additional users, go to Administration → Users after setup.

  1. Overview → Sites - create a Site (e.g. “Main Office”).
  2. Credentials - store the username/password for your first controller.
  3. Controllers - point FreeSDN at your controller’s IP or hostname and select the adapter (e.g. Omada, OPNsense).
  4. Enable the modules your site needs (Network, Cameras, etc.) under Settings → Modules.

FreeSDN discovers devices registered in that controller on the next sync cycle.

To stop this evaluation while preserving its volumes:

Terminal window
docker compose --env-file .env.lite down

An upgrade is not a generic fetch/build/restart operation. The database runtime stays on Debian, so a 26.09.0 volume is adopted in place, but the HA cache topology did change. Retain the old images, configuration and volumes, verify encrypted backups in isolation, and follow the database transition and coordinated application cutover from the exact target checkout. Never use down -v for an upgrade or attempt a blind application downgrade after accepting new writes.

Source builds remain the distribution path. Pre-built application images, signatures and provenance must be verified independently when they are actually published; a local image ID or version string does not establish publication.

Goal Where to go
Plan evaluation resources Deployment Tiers
Understand the data model Concepts
Configure TLS / domain Configuration
Enable cameras or HA Deployment Tiers
Set up roles and access Roles and Permissions

All product names, logos, and brands are property of their respective owners. FreeSDN is an independent project and is not affiliated with or endorsed by the vendors it integrates with. See Trademarks.