DocumentationSelf-Hosted V1 preview
scenariox.ai

Self-Hosted V1 preview. Check the release limitations before deployment.

OPERATIONS / DEPLOYMENT

Install ScenarioX Self-Hosted V1

This procedure installs the source-free customer package on one Linux x86_64 host. Run every command from the extracted package directory.

Before you begin

Prepare:

  • Docker Engine with the Docker daemon running
  • Docker Compose v2
  • the release ZIP and its matching SHA256SUMS
  • private registry access with permission to read the supplied images
  • DNS names for the recruiter, candidate, and workspace runtime entry points
  • a customer-managed HTTPS endpoint in front of the bundled HTTP edge
  • an Anthropic API key

Self-Hosted V1 has no validated hardware sizing baseline. Test the intended assessment concurrency on representative customer infrastructure before production use.

1. Verify and extract the release

sha256sum -c SHA256SUMS
unzip scenariox-self-hosted-<image-tag>.zip -d scenariox-self-hosted
cd scenariox-self-hosted
cat VERSION
cat release/release-metadata.json

Stop if checksum verification fails or the release metadata does not match the release supplied by ScenarioX.

2. Create configuration and keys

cp .env.example .env
mkdir -p secrets
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:4096 \
  -out secrets/scenariox-jwt-private.pem
openssl rsa -in secrets/scenariox-jwt-private.pem -pubout \
  -out secrets/scenariox-jwt-public.pem
chmod 600 secrets/scenariox-jwt-private.pem secrets/scenariox-jwt-public.pem

Replace every <...> placeholder in .env. Keep .env and secrets/ outside source control. See Configuration for each required value.

3. Authenticate to the image registry

Use a token with package read access. Do not place the token in .env.

export GHCR_USER=<github-user>
export GHCR_TOKEN=<token-with-read-packages>
printf '%s' "$GHCR_TOKEN" | docker login ghcr.io \
  --username "$GHCR_USER" --password-stdin
unset GHCR_TOKEN

If the registry organization enforces SSO, authorize the token before continuing.

4. Validate before startup

./scenariox config-check
./scenariox preflight

config-check verifies required values and key files without printing secrets. preflight also checks the Linux x86_64 host, Docker, Compose v2, and resolved customer Compose configuration.

5. Pull and start

./scenariox pull
./scenariox start
./scenariox health

Do not continue to administrator bootstrap until health reports successful database initialization and all readiness-backed services as healthy. A process-only warning means the container is running but no application readiness probe exists for that service.

6. Create the first administrator

./scenariox bootstrap-admin \
  --organization-name "Example Engineering" \
  --organization-slug "example-engineering" \
  --admin-email "admin@example.com" \
  --admin-full-name "Platform Administrator"

The command prompts twice for a password. Passwords require at least 10 characters with uppercase, lowercase, number, and symbol characters. The organization slug accepts lowercase letters, numbers, and hyphens.

Bootstrap is one-time only. A second attempt exits without changing records.

7. Sign in for the first time

Open the customer HTTPS URL for the recruiter application. You see a sign-in form with three fields.

Field Value from bootstrap
Organization The value you passed to --organization-slug
Email The value you passed to --admin-email
Password The password you entered at the prompt

After a successful sign-in the recruiter dashboard loads and the account menu in the top-right corner shows the organization name and your role (ORG_ADMIN). Access tokens expire after 15 minutes; you will be returned to the sign-in form automatically.

If sign-in fails:

Symptom Likely cause Action
"Invalid email or password" Wrong organization slug, email, or password Verify each field matches the bootstrap input exactly; organization slugs are lowercase
Form submits but returns immediately with no error HTTPS proxy not forwarding the request to the edge Check that your reverse proxy is forwarding to the correct upstream and that CORS_ALLOW_ORIGINS in .env includes the recruiter origin
429 after several failed attempts Login rate limit triggered Wait 5 minutes (default window) and try again; see Monitor login rate limiting
Page loads but shows a blank dashboard Auth token stored but recruiter API unreachable Check ./scenariox health and ./scenariox logs for service errors

Bootstrap is one-time only. Running ./scenariox bootstrap-admin again exits without changing any records. Contact the ScenarioX support channel if you need to reset the initial organization or administrator.

Use Troubleshooting for startup, readiness, or persistent sign-in failures.