http://localhost:8080, a frontend on http://localhost:5173, one connected AWS account, and one completed drift scan.
Budget 15 to 30 minutes — most of it is the Supabase setup.
Before you start
Supabase project (required)
InfraAudit’s auth layer is backed by Supabase. The backend will not start without valid Supabase credentials. This is the most common place new self-hosters get stuck, so do this first.Create a Supabase account
Go to supabase.com and create a free account.
Create a project
Create a new project. Any region works; the smallest tier is sufficient for development.
Copy your API credentials
Go to Project Settings → API and copy three values:
- Project URL (e.g.
https://xxxxxxxxxxxxxx.supabase.co) →SUPABASE_URL - anon public key →
SUPABASE_ANON_KEY - service_role secret →
SUPABASE_SERVICE_ROLE_KEY
.env shortly.
System requirements
- Docker 24+ and Docker Compose v2
- 4 GB free RAM (8 GB if you enable the Prometheus/Grafana monitoring profile)
- 10 GB free disk
Gemini API key (optional)
If you want AI-generated recommendations rather than the rule-based fallback, grab a Gemini API key from ai.google.dev. The key is not required to start the stack.Install and configure
Start the stack
| Service | Port | Purpose |
|---|---|---|
api | 8080 | InfraAudit Go backend |
postgres | 5432 | Primary database |
redis | 6379 | Cache |
frontend | 5173 | React web UI |
SUPABASE_URL and SUPABASE_JWT_SECRET. The process refuses to start without them.First login
Create your account
Click Sign up and register with any email and password. Supabase stores the credentials; InfraAudit resolves the Supabase user on first login.
Connect your first cloud account
- Web UI
- CLI
- API
- Click Cloud Providers in the sidebar.
- Click Connect AWS.
- Paste your AWS access key ID, secret access key, and choose a region (e.g.
us-east-1). - Click Connect. InfraAudit encrypts the credentials using your
ENCRYPTION_KEYand kicks off an initial resource sync.
Run your first scan
Once the initial resource sync finishes (typically under a minute for a small account), trigger a drift scan:- CLI
- API
- Web UI
Troubleshooting
The API container exits with 'SUPABASE_JWT_SECRET is required'
The API container exits with 'SUPABASE_JWT_SECRET is required'
You skipped the Supabase setup or used the wrong variable name. Check
.env against .env.example and make sure SUPABASE_JWT_SECRET is set.I can log in on the frontend but API calls return 401
I can log in on the frontend but API calls return 401
The frontend proxies through
FRONTEND_URL but the API validates tokens against SUPABASE_URL. Make sure both point to the same Supabase project.docker compose up says port 8080 is already in use
docker compose up says port 8080 is already in use
Another service is bound to that port. Change
SERVER_PORT in .env and update the port mapping in docker-compose.yml to match.Drift detection runs but never finds anything
Drift detection runs but never finds anything
Drift compares against baselines, and a fresh install has none yet. The first sync captures baselines automatically. Make a manual change to a resource in your cloud account and scan again to see drift appear.
What to do next
- Enable vulnerability scans — run
infraudit vuln scanor enable the scheduled job - Set up Slack alerts — add
SLACK_WEBHOOK_URLto.env, restart the API, and configure notification preferences - Enable a compliance framework — run
infraudit compliance enable cis-awsand theninfraudit compliance assess - Review cost data — billing syncs daily by default; force an immediate sync with
infraudit cost sync