Host Requirements
FreeSDN runs as a Docker Compose stack. The host requirements depend on which deployment tier you choose, but the baseline prerequisites are the same for every tier.
Software prerequisites
Section titled “Software prerequisites”| Requirement | Candidate qualification boundary |
|---|---|
| Docker Engine | Use a maintained Engine with current security updates. The September 26 qualification VM runs Engine 29.8.1; older-version compatibility has not been established by that run. |
| Docker Compose | Use the docker compose plugin. The qualification VM runs 5.5.1; a check that insists the version start with v2 would incorrectly reject it. Legacy docker-compose v1 is not supported. |
| Operating system / architecture | Linux amd64 / x86-64 for the appliance candidate, on a filesystem that enforces Unix ownership and private mode-0600 configuration. |
| Python on the host | Python 3 is required by the installer configuration helper. Backend Python and application dependencies are built into the images; installing them globally on the host is unnecessary. |
Database and broker maintenance prerequisites
Section titled “Database and broker maintenance prerequisites”Valkey and the host memory policy
Section titled “Valkey and the host memory policy”On Linux, check the host setting before deployment:
sysctl vm.overcommit_memoryValkey recommends vm.overcommit_memory = 1 so that its fork-based persistence
can start without Linux requiring space for a complete second copy of the
process. Review this host-wide allocation policy with the host administrator.
On a dedicated host where that change is appropriate, apply it with
sudo sysctl -w vm.overcommit_memory=1 and persist the same setting through the
host’s managed /etc/sysctl.d/ configuration. Do not overwrite an existing
policy or change a shared host silently. Check the value again after a reboot.
FreeSDN’s installer does not make this privileged host change for you.
This setting does not supply more RAM or prevent an out-of-memory failure. Keep the container budgets, broker memory limit and host headroom under observation; persistence can use additional memory while pages change during a save. See Valkey’s persistence explanation.
TimescaleDB scheduled policies
Section titled “TimescaleDB scheduled policies”A database accepting connections does not prove that compression, retention or
aggregate refresh jobs can run. The September 26 maintenance qualification
candidate sets max_worker_processes = 32 in
docker/postgres/logdb-custom.conf. This accommodates the configured 16
TimescaleDB background slots, eight parallel-query slots and additional worker
headroom. It is a ceiling on slots, not 32 permanently busy processes. Older
releases may still have PostgreSQL’s eight-slot default; inspect the actual
checkout and database settings.
The configuration is mounted read-only by Compose. Changing this parameter
requires a planned LogDB restart, not just a configuration reload. Do not change
memory or concurrency limits without measuring the resulting workload. After
installation or recovery, inspect timescaledb_information.jobs together with
timescaledb_information.job_stats: the four application compression policies,
four retention policies and three aggregate-refresh policies should be enabled
and should report successful executions. Investigate failures or jobs that have
never run instead of relying only on pg_isready.
The candidate’s isolated acceptance check now requires successful executions of all eleven application policies. This small synthetic check does not establish retention performance, recovery objectives or capacity for your device fleet.
CPU and RAM by tier
Section titled “CPU and RAM by tier”The numbers below are planning starting points, not measured fleet capacities or acceptance guarantees. Check the exact checkout’s container limits, reserve headroom for source builds and backups, and measure your own workload. A Max preset is not an enterprise certification.
| Tier | Planning use case | Starting CPU | Starting RAM | Additional RAM headroom |
|---|---|---|---|---|
| Lite | Homelab, a handful of devices, personal use | 2 cores | 4 GB | 6 GB |
| Pro | SMB, dozens to hundreds of managed devices | 4 cores | 8 GB | 12 GB |
| Max | Enterprise, multi-site, high concurrency | 8 cores | 16 GB | 24 GB+ |
| Dev | Local development with hot-reload | 2 cores | 4 GB | 6 GB |
Raising WEB_CONCURRENCY or Celery concurrency increases memory demand. Review
API_MEM_LIMIT, worker budgets and measured cgroup peaks together. Do not assume
an old per-worker RSS estimate is valid for the current dependencies or enabled
modules. A container memory limit is a ceiling, not a reservation or a capacity
measurement.
Budget all of these separately:
| Storage | Budget considerations |
|---|---|
| Source builds and images | Include temporary layers, compiler downloads, build cache, and both the old and candidate images. A blanket 10 GB free-space claim does not cover release builds and rollback retention. |
| Primary database | Inventory, vault, authorization, schedules and audit history; measure growth and index maintenance space. |
| LogDB | Event and time-series ingestion, chunks, indexes and the configured retention window. |
| Backups | Completed encrypted pairs, temporary archive space, off-site staging and the chosen retention window. A dump count alone does not establish recoverability. |
| Application and broker volumes | Report archives, queue state, CA data, artifacts, media and any enabled optional profiles. |
| Recovery | Isolated target databases and application files in addition to retained source volumes and images. |
Use monitored storage with enough free space for the next build or restore as well as normal growth. The internal qualification pipeline uses its own explicit free-space guards; those thresholds are not universal installation minimums. Prefer SSD-backed databases and test latency and I/O under your intended load. Do not remove existing volumes or unverified recovery evidence to make space.
Only the edge container (Caddy by default) publishes host ports. All data-tier ports (Postgres, Valkey/Redis, the API) are on an internal Docker network and are not accessible from the host by default.
Caddy’s internal listen ports depend on CADDY_SITE_ADDRESS:
:80(the Lite default) - Caddy binds only port 80 and serves plain HTTP. Restrict it to local evaluation or a reviewed upstream TLS terminator; browser authentication in production/staging uses Secure cookies and remote access needs HTTPS. Port 443 is not opened inside the container; theEDGE_HTTPS_PORTmapping exists in the compose file but is a no-op in this mode.localhostor127.0.0.1- Caddy binds both 80 and 443, terminating HTTPS with its internal CA. The client must trust that specific CA and use a matching certificate name; a localhost certificate does not authenticate a remote VM’s LAN name or IP.- A domain name (e.g.
freesdn.example.com) - Caddy binds both 80 and 443, obtaining and renewing a Let’s Encrypt certificate automatically.
The host port it binds to is controlled by EDGE_HTTP_PORT and EDGE_HTTPS_PORT in your tier’s env file:
| Tier | Host HTTP port (EDGE_HTTP_PORT) |
Host HTTPS port (EDGE_HTTPS_PORT) |
|---|---|---|
| Lite | 8080 | 8443 (mapped but unused in default :80 mode) |
| Pro | 80 | 443 |
| Max (example default) | 80 | 443 |
You can override these values in your .env.* file at any time.
| Container port | Service | Required | Notes |
|---|---|---|---|
80 → host EDGE_HTTP_PORT |
Caddy edge (HTTP) | Yes | In HTTPS modes, also needed for the ACME HTTP-01 challenge. In :80 mode this is the only port Caddy uses. |
443 → host EDGE_HTTPS_PORT |
Caddy edge (HTTPS) | Conditional (HTTPS mode only) | Unused when CADDY_SITE_ADDRESS=:80. Required when using a domain name (Let’s Encrypt) or localhost (internal CA). |
When running behind a corporate firewall or cloud security group, open the host HTTPS port (and the host HTTP port for Let’s Encrypt renewals) inbound; no other port is needed for normal user traffic. For Pro/Max domain deployments this is 443/80; for Lite homelab installs it is 8443/8080.
Supported architectures
Section titled “Supported architectures”| Architecture | Status |
|---|---|
linux/amd64 (x86-64) |
Prepared candidate qualification only; Community / Early Access, no enterprise-stable claim |
linux/arm64 |
Not qualified for this candidate; do not treat development builds as a supported appliance release |
Multi-arch images are not currently published to a public registry. You build the images from source with docker compose build using the repo’s Dockerfiles.
Network access from the host to managed devices
Section titled “Network access from the host to managed devices”The FreeSDN API containers make outbound HTTPS (and, for some adapters, other vendor-specific ports) calls to managed controllers, cameras, PBX systems, and hypervisors. The host’s Docker bridge network must have IP routing to these devices. Confirm before deploying:
Validate the intended controller hostname, route, port and certificate chain with your own lab CA where required. Do not disable TLS verification as a normal setup step or assume an arbitrary API path exists on every firmware. Use operation-specific read-only acceptance before enabling writes, and keep lab credentials out of shared logs.
If the host is behind NAT or a strict egress firewall, open outbound rules for the port ranges used by your adapters (Omada 8043 (controller REST API default), OPNsense 443, Hikvision 80/443, etc.).
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.