Quickstart
This page gets a working server and one connected firewall as fast as possible. It uses plain HTTP and no TLS, so use it on a lab or trusted network only. The tutorials cover the same ground with more explanation, and Day 0 covers production.
You need: a Linux host with Docker and Docker Compose, and a pfSense 2.7 or later firewall that can reach that host.
In the examples the host’s IP address is 192.168.1.50. Replace it with yours.
-
Create a project folder and a Compose file.
Terminal window mkdir pf-central && cd pf-centralopenssl rand -hex 32 # copy the output; it is your token pepperSave this as
compose.yaml. Replace the IP address, the database password and the pepper:compose.yaml services:postgres:image: postgres:17restart: unless-stoppedenvironment:POSTGRES_DB: pf_centralPOSTGRES_USER: pf_centralPOSTGRES_PASSWORD: change-this-db-passwordvolumes:- pgdata:/var/lib/postgresql/datahealthcheck:test: ["CMD-SHELL", "pg_isready -U pf_central -d pf_central"]interval: 5sretries: 10pf-central:image: ghcr.io/danielmichaels/pf-central:latestrestart: unless-stoppeddepends_on:postgres:condition: service_healthyports:- "2808:2808" # web UI, API and enrollment- "24222:24222" # NATS, for agentsenvironment:PFCENTRAL_DATABASE_URL: postgres://pf_central:change-this-db-password@postgres:5432/pf_central?sslmode=disablePFCENTRAL_SERVER_BASE_URL: http://192.168.1.50:2808PFCENTRAL_TRUSTED_ORIGINS: http://192.168.1.50:2808PFCENTRAL_COOKIE_SECURE: "false" # plain HTTP only; remove behind HTTPSPFCENTRAL_TOKEN_PEPPER_CURRENT: paste-your-pepper-herePFCENTRAL_TOKEN_PEPPER_VERSIONS: paste-your-pepper-herePFCENTRAL_LOG_JSON: "false"PFCENTRAL_LOG_LEVEL: infovolumes:- state:/datavolumes:pgdata:state: -
Start it.
Terminal window docker compose up -ddocker compose logs pf-central | grep -A1 "first-run setup"The server creates its database tables, its keys and its NATS broker, then prints a one-time setup link:
╔══ pf-central first-run setup ══════════════════════╗║ Visit: http://192.168.1.50:2808/setup?token=setup_vafr…║ Expires in 24h; single-use -
Create the owner account. Open the link, enter your email and a password of 12 characters or more, and click the button. Then sign in at
http://192.168.1.50:2808/login. -
Find the firewall’s hardware ID. On the firewall, open Diagnostics → Command Prompt and run:
Terminal window kenv smbios.system.uuidCopy the UUID it prints.
-
Add the device in pfCentral. Click Add in the left rail, paste the UUID, give it a name, and click Add & generate token. Copy the token. It is shown once and expires in one hour.
-
Install the agent on the firewall. In Diagnostics → Command Prompt (or over SSH as root), run the installer with your server address and the token:
Terminal window fetch -o - https://github.com/danielmichaels/pf-central-artifacts/releases/latest/download/install.sh \| NATS_URL=nats://192.168.1.50:24222 \ENROLL_URL=http://192.168.1.50:2808/enroll \BOOTSTRAP_TOKEN=device_paste_your_token_here \sh -
Watch it come online. Within a few seconds the device in pfCentral changes from Awaiting enrollment to Online, and the overview starts to show live CPU, memory and traffic.
It did not work
Section titled “It did not work”| Symptom | Likely cause |
|---|---|
| The sign-in page reloads with no error | PFCENTRAL_COOKIE_SECURE is not false on plain HTTP, or the URL you use is not in PFCENTRAL_TRUSTED_ORIGINS. |
| No setup link in the logs | It is printed only on the very first start. Run docker compose exec pf-central pf-central admin setup token for a new one. |
| Device stays Awaiting enrollment | The firewall cannot reach port 2808, or the token expired. Generate a new token from the device page. |
| Enrolled but offline | The firewall cannot reach port 24222. Check host firewall rules and the NATS_URL. |
More in Troubleshooting.
Next steps
Section titled “Next steps”- Walk through the same steps slowly, with screenshots: Tutorial 1: Deploy your first server.
- Make your first change from pfCentral: Tutorial 3.
- Plan a production install: Plan your deployment.