Skip to content

Concourse

Concourse is the inboard backend server. It handles authentication, user management, extension hosting, query dispatch, and audit logging.

Terminal window
docker run -d --name concourse \
-p 8080:8080 \
-v concourse-data:/data \
-e CONCOURSE_JWT_SECRET=your-secret-at-least-32-bytes-long \
-e CONCOURSE_ADMIN_EMAIL=admin@example.com \
-e CONCOURSE_ADMIN_PASSWORD=changeme \
ghcr.io/inboard-ai/concourse:latest

Verify the server is running:

Terminal window
curl http://localhost:8080/health

Expected response:

{"status": "ok", "version": "0.1.0"}

For production deployments, use Docker Compose with a config file:

services:
concourse:
image: ghcr.io/inboard-ai/concourse:latest
ports:
- "8080:8080"
volumes:
- concourse-data:/data
- ./config.yaml:/etc/concourse/config.yaml:ro
environment:
CONCOURSE_JWT_SECRET: ${CONCOURSE_JWT_SECRET}
CONCOURSE_ADMIN_EMAIL: admin@example.com
CONCOURSE_ADMIN_PASSWORD: changeme
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 3s
start_period: 5s
volumes:
concourse-data:
PathPurpose
/app/concourse-apiServer binary
/etc/concourse/config.yamlConfiguration file (optional, mount read-only)
/dataSQLite databases (primary + audit). Mount a persistent volume here.

On first startup, Concourse creates the database schema and bootstraps an admin user from the CONCOURSE_ADMIN_EMAIL and CONCOURSE_ADMIN_PASSWORD environment variables. These variables are only used when no admin user exists.

Concourse listens on a single port (default 8080) for both HTTP API requests and WebSocket connections. It does not terminate TLS. For HTTPS, place Concourse behind a reverse proxy such as nginx, Caddy, or a cloud load balancer.

Example nginx configuration:

server {
listen 443 ssl;
server_name concourse.example.com;
ssl_certificate /etc/ssl/certs/concourse.pem;
ssl_certificate_key /etc/ssl/private/concourse.key;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Terminal window
# Stop
docker stop concourse
# Pull new version
docker pull ghcr.io/inboard-ai/concourse:latest
# Start with same volumes
docker start concourse

Database migrations run automatically on startup. Back up the /data volume before upgrading.