Docker Compose is the fastest way to stand up a Skillset Registry. The officialDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/org-quicko/skillset/llms.txt
Use this file to discover all available pages before exploring further.
docker-compose.yml provisions two services — the app container running the labsatquicko/skillset image and a postgres container running postgres:18-alpine — and a named volume that persists database state across restarts. Object storage for Skill and Plugin Artifacts is handled externally; the .env.example defaults point at a local MinIO instance for development.
Prerequisites
- Docker Engine 24+ with the Compose plugin (
docker compose, not legacydocker-compose) - A terminal with access to the host where the Registry will run
- An S3-compatible bucket (MinIO works for local dev; a real AWS S3 or compatible service for production)
Setup
The
.env.example is pre-populated with values that work against the MinIO defaults for local development. Open .env and fill in the required variables before proceeding.Open
.env in an editor and provide values for every required variable. See Configuration for the full reference; the five you must set before first boot are:BETTER_AUTH_SECRETopenssl rand -base64 32 and paste the outputPUBLIC_URLhttp://localhost:3000STORAGE_BUCKETPOSTGRES_USERPOSTGRES_PASSWORDPOSTGRES_DBDATABASE_URLPOSTGRES_* values aboveThe app refuses to start if
BETTER_AUTH_SECRET, PUBLIC_URL, STORAGE_BUCKET, or DATABASE_URL is missing. A missing secret would silently invalidate every session on restart, so there is no generated fallback.The
app service declares a depends_on health check against postgres, so it will not receive traffic until Postgres passes a pg_isready probe. On a fresh database the app then runs all migrations — including creating the pg_trgm extension needed for fuzzy search — before serving the API.On first boot, before any user has registered, Skillset redirects to a setup wizard where you create the Superadmin account. Open the
PUBLIC_URL in a browser and complete the form. The Superadmin is permanent and unique — only one exists per Registry at any time.The Superadmin is the only role that cannot be removed or demoted. Keep the credentials safe and consider creating a named Admin account for day-to-day administration.
Both
app and postgres should show status running (healthy). The API exposes a health endpoint you can probe directly:The docker-compose.yml in full
The compose file shipped with the repository provisions the two services and the persistent volume:
appwaits for Postgres: thedepends_onwithcondition: service_healthymeans theappcontainer only starts once Postgres is accepting connections. This prevents migration races on slow hardware.- Port is configurable:
PORTdefaults to3000if unset in.env. POSTGRES_*are required: Docker Compose will refuse to start if any of the three Postgres variables are missing — they carry the:?mandatory syntax.- MinIO is not in
docker-compose.yml: for local development the.env.examplepointsSTORAGE_ENDPOINTandSTORAGE_PUBLIC_ENDPOINTat a separately-run MinIO instance. See Storage for details.
The container image
Thelabsatquicko/skillset image is built from the repository’s multi-stage Dockerfile. It runs as the non-root bun user and ships a built-in health check that calls GET /api/health via Bun’s own HTTP client — no curl is needed or included in the image.
The image bundles both the API server (apps/api) and the compiled web interface (apps/web/dist), so the Registry’s API and UI are served from the same origin and the same container.
Production considerations
For a production deployment, make the following changes to your.env:
- Use real S3: replace the MinIO
STORAGE_ENDPOINT,STORAGE_ACCESS_KEY_ID, andSTORAGE_SECRET_ACCESS_KEYwith your actual S3 configuration, or unset the key variables entirely to use the AWS default credential chain (instance/task role). - Use an external Postgres: swap
DATABASE_URLto point at a managed database (RDS, Cloud SQL, etc.) and remove or comment out thepostgresservice from the compose file. - Set
TRUSTED_PROXY_IPS: add your load balancer or reverse proxy address. - Set a strong
BETTER_AUTH_SECRET: generate one fresh withopenssl rand -base64 32— never reuse a development secret in production.