oasm-platform/oasm-docker. It packages the platform as ready-to-run container images — oasm/oasm-console, oasm/oasm-api, and oasm/oasm-worker — together with a compose file, a Makefile, an nginx configuration, and a .env.example that wires the whole stack together.
The two repositories have different roles:
oasm-platform/open-asmis the source-code monorepo where the platform is developed. It is for building and running from source — see the Developer guide.oasm-platform/oasm-dockeris the deployment repository used to run the platform in production. Clone this repo, configure.env, and start the stack withmake.
open-asm — cloning the dev repository and copying its compose file — is not the supported path. Always deploy from oasm-docker, which pins the runtime configuration, nginx routing, and image tags for production.
Prerequisites
- Docker Engine with Compose V2 — included with Docker Desktop on Windows and macOS; install the standalone plugin on Linux servers. See the Docker installation guide.
- Make — required: the repository’s
Makefiledrives pull, run, update, and cleanup.- Windows — use Git Bash or WSL, or install
makevia Chocolatey (choco install make). - macOS —
brew install make. - Linux —
sudo apt install make(Debian/Ubuntu) orsudo yum install make(RHEL-family).
- Windows — use Git Bash or WSL, or install
- Resources — at minimum 4 CPU cores, 4 GB RAM, and 20 GB free disk space. Scanning workloads benefit from more.
The stack runs eight services:
console, core-api, migration, oasm-worker, postgres, redis, geo-ip-database, and rustfs. Give the stack a few minutes on first start while images are pulled and the database is initialized.Deployment stack overview
Deploy with Docker Compose
1
Clone the deployment repository
2
Prepare the environment file
3
Edit .env — set your secrets
Replace every default credential before going live:
OASM_CLOUD_APIKEY— set to your OASM Cloud API key (defaultchange_me).POSTGRES_PASSWORD— replace the default.REDIS_PASSWORD— replace the default, and mirror the new value inREDIS_URL(redis://:PASSWORD@redis:6379/0).ENCRYPTION_KEYS— replace the defaultsuper_secret_key.
IMAGE_TAG to a specific release (for example v1.2.0) instead of latest so upgrades are deliberate. Keep the file out of version control.4
Start the stack
5
Wait for core-api to become healthy
The console depends on The console’s nginx routes
core-api being healthy, so it may take a moment to come online. Check the API health endpoint:/api/ to core-api, so this host port works even though the API container listens on the internal PORT. When it returns a healthy response, the stack is ready.6
Open the console and bootstrap the admin
Open http://localhost:6276 in your browser. On first run, use the
/init-admin route to bootstrap the initial admin account before signing in.Running with the default secrets (
change_me, the sample PostgreSQL and Redis passwords) exposes your deployment to credential abuse. Rotate every default before exposing the stack beyond localhost.First-run admin setup
OASM exposes the/init-admin route for the initial admin bootstrap. The first account created through it receives admin privileges automatically. After the admin exists, invite additional members through the members flow — see Members.
Verify the deployment
After the stack is up, confirm each layer is healthy before relying on it:- API health —
curl http://localhost:6276/api/healthreturns a healthy response when the Core API is ready. - Console — open http://localhost:6276; you should reach the login page and, on first run, the admin bootstrap flow.
- Workers — open the Workers section of the console: the
oasm-workerinstances (3 replicas by default) should appear connected. - Job execution — enqueue a small discovery job and watch it move from Queued to Completed in the job registry. This proves the full path from API to worker to tools.
Port reference
In the production
oasm-docker stack the web console is on 6276. In the open-asm dev source tree the compose file maps the dev console to 3000 and the Vite dev server serves on 5173; neither applies to production. Keep the two deployment modes separate when troubleshooting.Scaling workers
Workers connect to the Core API over gRPC and scale horizontally:-
Default replicas — the
oasm-workerservice declaresdeploy.replicas: 3; compose starts three workers by default. -
Add more replicas — scale the service to any count:
-
Per-worker concurrency —
WORKER_MAX_CONCURRENCY(default10) in theoasm-workerservice environment limits how many jobs a single worker executes at once. Raise it for faster throughput on capable hosts, lower it to reduce load. - Scope awareness — a worker runs under Workspace or Global scope, which determines which jobs it may pull. See Workers.
/app/oasm-tools volume, so tool installation happens once per worker environment rather than once per job.
Updates
make update— pulls the latest commit and images, then restarts the stack.make update-main— refreshes the images and restarts the stack without pulling a new commit.
migration service applies TypeORM migrations before core-api starts (its depends_on requires service_completed_successfully), so upgrading the images applies schema changes in order. Watch the migration service log to confirm migrations applied, and check release notes for any manual steps before upgrading major versions.
Storage considerations
rustfs is the stack’s S3-compatible object store, reachable by the API at http://rustfs:9000 (internal). core-api writes scan artifacts there; they are stored in the rustfs-data volume. Losing it loses enrichment data, but the inventory itself survives; artifacts can be regenerated by rescanning. All other services are stateless or rebuildable, so the stack can be recreated from the compose files without data loss.
Environment variables reference
All variables below come from the.env.example shipped with oasm-docker; defaults are shown.
Production checklist
Before exposing a deployment beyond your network, verify each item:- Default secrets replaced:
OASM_CLOUD_APIKEY,POSTGRES_PASSWORD,REDIS_PASSWORD(mirrored inREDIS_URL),ENCRYPTION_KEYS,RUSTFS_SECRET_KEY -
IMAGE_TAGpinned to a specific release instead oflatest - TLS termination configured in front of 6276
- Postgres backups scheduled and a restore tested once
- Upgrade path rehearsed with
make update -
docker compose psshows every service up and the API health endpoint responds
Best practices
- Secrets management — keep credentials in an environment file or secret manager, never commit them. Rotate the database and Redis passwords on a schedule and whenever access may have leaked.
- TLS termination — terminate TLS at a reverse proxy (for example nginx, Caddy, or a load balancer) in front of the console on 6276. The compose stack does not serve HTTPS by itself.
- Back up PostgreSQL — schedule regular backups of the
pgdatavolume. It holds assets, scan results, vulnerabilities, and system state — the rest of the stack can be rebuilt, the data cannot. Test a restore into a scratch environment periodically; an untested backup is a guess. Store encrypted backups off the host. - Upgrades — upgrade with
make update(ormake update-mainto refresh images without pulling a new commit). Migrations apply automatically before the API starts; check release notes for manual steps before major versions. - Log retention — keep compose logs long enough to diagnose failed jobs. A failed scan is only debuggable while its worker and API logs still exist.
Related
Onboarding
Set up your workspace after the first login
Developer guide
Run and develop the platform from the source tree
Architecture
Understand the distributed system you are deploying
Troubleshooting
Resolve common deployment and runtime issues
