Skip to Content
TestingApp deployment

App deployment

OpenFactory can turn a supported Git repository into an immutable app variant, boot a replacement VM, health-check it, and switch the app route only after the candidate is healthy. Web services and static sites receive a URL under https://<slug>.apps.openfactory.tech when the public ingress path is available.

Availability: the deployment pipeline and public-route path have been validated end to end. The Apps and deployment-history UI is not finished, scheduled jobs are rejected, and WebSocket/SSE pass-through still needs a dedicated production acceptance test. Treat a returned URL as usable only after deployment status is live and your own request succeeds.

What a deployment does

  1. Resolves the exact Git revision with the account’s connected source credentials.
  2. Stages source without copying Git credentials or .git history into the image.
  3. Packages the app through OBS when selected and supported, or uses the image build hook.
  4. Builds and boots a fresh app-specific variant.
  5. Writes runtime environment values after boot, starts the service, and runs a health check.
  6. Switches the gateway route and removes the previous VM only after the new candidate is healthy.

The live VM is a deployment artifact. OpenFactory does not install, build, or edit source inside it.

Deploy a registered app

Register the source once:

create_app( name="my-shop", git_url="https://github.com/example/my-shop", branch="main", deployment_type="web-service", port=3000, visibility="private" )

Then queue a deployment:

deploy_app(app_id="<app-id>")

deploy_app is asynchronous by default. Keep the returned app_id, deploy_id, and build_id, and poll:

get_app_deploy_status(app_id="<app-id>", deploy_id="<deploy-id>")

The deployment continues if an MCP client times out. Do not submit a duplicate deployment merely because a wait ended. Check the existing deployment first.

Success and failure

A successful queue response is not proof that the app is live. Require all of the following:

  • deployment status is live;
  • the health-check stage passed;
  • the returned URL serves the expected revision; and
  • an authenticated check succeeds when visibility is private.

On failure, record the failed stage, error, build_id, and deploy_id. Because cutover is health-gated, a failed candidate should leave the previous healthy route in place.

Build strategy

use_obs=true requires a healthy, supported OBS path and fails closed if that path is unavailable. use_obs=false selects the image-build hook. Omitting the argument lets the service choose OBS for supported Node/static projects and fall back to the hook.

Only public-prefix values may be baked into a variant. Secrets and other runtime values belong in the encrypted app environment and are applied after boot.

Testing an app hosted elsewhere

You do not need to deploy an app through OpenFactory to test it. Any URL that is reachable from the tester VM can be used with an app scenario or an autonomous walk.

Current limits

  • Web services and static sites are supported; scheduled jobs are not.
  • The management UI for app history is pending, so MCP status is the source of truth.
  • Preview availability depends on the app gateway, wildcard ingress, DNS, and the candidate VM.
  • Private previews are owner-gated today; organization-member sharing is not implemented.
  • Checkpoint rollback has not yet been migrated to this immutable deployment model. See Checkpoints and rollback.