Docker Quickstart
Run Infracast locally using Docker Compose. Perfect for evaluation, development, or air-gapped environments.
Prerequisites
- Docker 20.10+ and Docker Compose v2
- 4 GB RAM minimum (8 GB recommended)
- 10 GB disk space
Step 1: Clone and Configure
# Clone the repository
git clone https://github.com/azgardtek/vulcan.git
cd vulcan
# Copy the example environment file
cp .env.example .env
Edit .env with your configuration:
.env
# Database
POSTGRES_USER=vulcan
POSTGRES_PASSWORD=change-me-in-production
POSTGRES_DB=vulcan
# API Configuration
API_SECRET_KEY=generate-a-32-byte-random-string
JWT_SECRET=another-32-byte-random-string
# License (optional - Free tier works without)
LICENSE_PUBLIC_KEY=
# Admin bootstrap
ADMIN_USERNAME=admin
ADMIN_PASSWORD=change-me-immediately
Step 2: Start the Stack
docker compose up -d
This starts:
- vulcan-api — Go API server on port 8080
- vulcan-ui — React dashboard on port 3000
- postgres — PostgreSQL 15 database
Step 3: Verify Installation
# Check services are running
docker compose ps
# Check API health
curl http://localhost:8080/healthz
# Expected: {"status":"ok","db_connected":true}
# Check UI
open http://localhost:3000
Step 4: Bootstrap Admin User
On first run, create the admin user:
docker compose exec vulcan-api ./vulcan bootstrap \
--username admin \
--password 'YourSecurePassword123!'
Step 5: Seed Demo Data (Optional)
For evaluation, seed sample infrastructure data:
# Get an auth token
TOKEN=$(curl -s -X POST http://localhost:8080/api/v1/auth/token \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"YourSecurePassword123!"}' | jq -r '.token')
# Seed demo data
docker compose exec vulcan-api ./vulcan demo seed \
--api-url http://localhost:8080 \
--token "$TOKEN" \
--tenant demo
This creates:
- 167 sample nodes (AWS, on-prem, AD)
- 189 relationship edges
- 22 compliance findings
Step 6: Log In
- Open http://localhost:3000
- Log in with
admin/YourSecurePassword123! - Select the
demotenant (if seeded) or create a new one
Docker Compose Services
docker-compose.yml (excerpt)
services:
vulcan-api:
image: ghcr.io/azgardtek/vulcan:latest
ports:
- "8080:8080"
environment:
- DATABASE_URL=postgres://vulcan:${POSTGRES_PASSWORD}@postgres:5432/vulcan?sslmode=disable
depends_on:
- postgres
vulcan-ui:
image: ghcr.io/azgardtek/vulcan-ui:latest
ports:
- "3000:80"
environment:
- VITE_API_URL=http://localhost:8080
postgres:
image: postgres:15-alpine
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_USER=vulcan
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=vulcan
volumes:
pgdata:
Production Considerations
Not for Production
This quickstart uses default credentials and single-node PostgreSQL. For production:
- Use managed PostgreSQL (RDS, Cloud SQL)
- Configure TLS termination (nginx, ALB)
- Use proper secrets management
- Set up monitoring and alerting
- See Terraform Deployment for production setup
Upgrading
# Pull latest images
docker compose pull
# Restart with new images
docker compose up -d
# Run database migrations (automatic in most versions)
docker compose exec vulcan-api ./vulcan migrate
Troubleshooting
Database connection errors
# Check postgres is running
docker compose logs postgres
# Verify connection
docker compose exec postgres psql -U vulcan -c "SELECT 1"
API won't start
# Check logs
docker compose logs vulcan-api
# Common issues:
# - DATABASE_URL misconfigured
# - Port 8080 already in use
# - Missing required env vars
UI shows "Network Error"
- Ensure API is running:
curl http://localhost:8080/healthz - Check VITE_API_URL matches your API address
- If using different ports, update CORS settings