Production Deployment
Not sure you need a server? Most people run OpenCompany on their own computer — see Choose how to run.
- Cloud CLI (auth + context) - the provider adapter (currently
gcloud; AWS is a follow-on) verifies your cloud CLI is installed and authenticated, resolves the project/region/zone, checks Application Default Credentials, and enables the required cloud APIs. - Terraform - generates fresh secrets and owner credentials, packages your local build, then creates all resources: the VM (resource id
opencompanyfor new deployments; pre-rebrand deployments keepmachinaos, retained for upgrade compatibility), firewall rule, artifact bucket, and service account. A cloud-init startup script installs Node.js and uv, installs the package, and runscompany serveunder systemd on a single public port.
company serve fronts the API, WebSocket, and the built single-page app plus the Node.js sidecar all on one port. No separate frontend container or reverse proxy is required for the standard path.Prerequisites
- A cloud account (Google Cloud for the
gcpprovider). - The
gcloudCLI installed and authenticated: - Node.js 22+ and npm on your local machine (used to package the local build via
npm pack). - Terraform is auto-installed by the deploy CLI if it is not already on PATH.
Deploy
--owner-password, a strong password is generated and printed once - save it.
Common options
string
default:"gcp"
Cloud provider.
gcp today; AWS is a follow-on.string
required
Login email for the owner account (single-owner mode).
string
Login password (min 8 chars). Generated and printed once if omitted.
string
default:"e2-standard-2"
VM size.
number
default:"8080"
Public port the app binds and the firewall opens.
string
default:"0.0.0.0/0"
Firewall source range. Restrict to your own IP with something like
203.0.113.4/32.string
Cloud region (provider default if omitted).
string
Cloud zone (provider default if omitted).
string
GCP project (defaults to your
gcloud config).The Login Gate
The deploy path always provisions a login-gated, single-owner instance:VITE_AUTH_ENABLED=trueandAUTH_MODE=single.- The owner credential is generated at deploy time and seeded on first boot.
- Fresh
JWT_SECRET_KEY,SECRET_KEY, andAPI_KEY_ENCRYPTION_KEYare minted per deployment.
Status and Health
/health. The VM takes a few minutes on first boot to install Node, npm, and build the app.
Updating
Re-runningdeploy up re-applies Terraform safely (the VM keeps its durable resource id). To ship a new local build, run company deploy up again from an updated checkout.
Tearing Down
terraform destroy and clears the local deployment state.
Deployment state lives at
<user-data>/deploy/opencompany/ (pre-rebrand deployments keep deploy/machinaos/, retained for upgrade compatibility). It is preserved by company clean - only company deploy destroy removes it, because it tracks live cloud resources.Verify
Security Checklist
Owner login credentials are saved somewhere safe (password shown once)
Firewall source range restricted with —allow-cidr where possible
A TLS terminator + domain in front, with JWT_COOKIE_SECURE=true, before exposing publicly
SSH key authentication only on the VM (disable password auth)
Self-Managed Deployment
Earlier releases shipped a Docker Compose topology; Docker support has been removed. Deploy withcompany deploy (Terraform -> GCP VM -> systemd) as described above.
Related
Installation
Environment variables and local setup