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
liveand your own request succeeds.
What a deployment does
- Resolves the exact Git revision with the account’s connected source credentials.
- Stages source without copying Git credentials or
.githistory into the image. - Packages the app through OBS when selected and supported, or uses the image build hook.
- Builds and boots a fresh app-specific variant.
- Writes runtime environment values after boot, starts the service, and runs a health check.
- 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.