This patch adds worker and scheduler execution, personal appearance customization,
and managed Cloudflare Tunnel setup for self-hosted servers. Cloud spaces, reusable
build caches, more catalog apps and safer storage cleanup improve everyday
operations. These notes cover all merged changes since 0.9.1.
Workers and schedulers
- Run roles beside your web app — declare workers and schedulers in
openship.jsonor the project API. Single-app Docker deployments start separate
containers from the app image, with shared environment, volumes and connected
networks, their own commands and shutdown settings, and no published ports.
Roles follow pause, resume, restart, rollback and project deletion. - Hand over singletons safely — scheduler renames, command changes, name swaps
and conversions into workers stop and retain outgoing singletons before starting
potentially conflicting replacements. Failed deployments restore them only after
those replacements are confirmed removed. Failed retirement of an old role is
surfaced in the deployment warning with its container identity. - Require a verified startup — every replica needs exactly one stable result
for its container ID before optional exec health checks run. Missing inspections,
duplicate results and processes that already exited successfully fail startup.
Both project-defined and image-inheritedPORTvalues are removed from roles. - Make role configuration explicit — move and copy refuse active, unfinished
or preserved-cancelled role workloads even after saved roles are cleared.
Preset-onlywhenandunlesskeys in declared roles produce warnings rather
than silently appearing to control execution. Automatic framework role selection
and cross-server role migration are not included. - Improve framework shutdown defaults — Rails presets have measured stop
settings, and Laravel's scheduler preset uses SIGTERM with a 10-second grace
period while queue and Horizon workers retain 90 seconds. Customize these bounds
for long-running tasks; they do not guarantee task completion or exactly-once
scheduling. Laravel web-role cache warming is available as an opt-in setting.
Appearance and dashboard
- Customize your own appearance — Settings → General → Customize previews
color tokens and typography live, with explicit Save, Discard and Reset.
Import themes from JSON, a file or an HTTPS URL; export themes and libraries,
including supported WOFF2 fonts. Preferences belong to the signed-in user and
stay isolated across accounts and instances. API, SDK, CLI and MCP operations
use the same theme format. - Keep operational tools together — project monitoring and logs share one
navigation entry with their own views. Backups moves under Infrastructure.
Project sidebars show assigned domains, migration retries retain destination
choices, and migrated service deployments use the correct icons. - Reduce false outage alerts — the health watcher confirms repeated bounded
Docker probe failures before announcing a server outage. Late probe replies
cannot falsely announce recovery. Self-hosted administrators can clear resolved
monitoring history with confirmation while retaining open incidents. - Improve navigation and terminal reliability — GitHub discovery no longer
blocks dashboard pages, selection controls use consistent states, and leaving a
server terminal during WebGL loading cancels setup and disposes the terminal.
Instance connection and move actions have clearer setup and recovery guidance.
Cloudflare Tunnel and domains
- Manage self-hosted ingress from Openship — Server → Security can connect or
create a remotely managed named Cloudflare Tunnel using saved credentials,
configure proxied DNS and optionally apply an existing reusable Access policy.
Install a pinned connector on a supported Linux server or use its existing
connector. Managed Openship Cloud routing retains its existing path. - Enroll domains with recoverable setup — explicitly enable automatic tunnel
enrollment for new custom domains or connect existing domains individually.
Setup records Access, tunnel and DNS progress, supports retry after interrupted
requests, and removes only owned resources. External edits remain visible for
review instead of being overwritten. Exact hostnames andwwwcompanions are
supported; wildcard auto-enrollment is not. - Choose primary and www behavior — the deployment wizard defaults a newly
included companion hostname to a 301 redirect to the entered primary. Choose
bare primary, www primary or Serve both on Cloud and self-hosted destinations.
Redirect rows show their target instead of duplicate runtime inputs. - Keep domain operations consistent — service aliases on the same port are
preserved, domains added through the CLI receive routing, and Cloud routing
retries recover missing Pages through the owning Cloud connection. - Honor trusted proxies on containerized edges — operator-declared proxy IPs
reach the edge without rebuilding its image. Invalid addresses and CIDR prefixes
are discarded. Failed configuration updates restore the previous shared trust
include, and an incomplete rollback cannot activate a partial configuration.
Cloud spaces, billing and connections
- See managed capacity as Cloud spaces — a shared picker, Overview and
Activity views show projects, purchased capacity and measured usage, with clear
retry states for unavailable readings. Existing allocations and subscriptions
keep their identity; connected self-hosted server tools remain available. - Use the owning Cloud account consistently — connected Desktop and
self-hosted installations create Cloud projects through Cloud's API. Server,
project and deployment operations enforce their organization and provider
namespace. Cloud consent shows the actual account and organization and lets you
switch either before explicitly authorizing the connection. - Continue purchases without repeating plan selection — pricing links carry
the chosen plan into the signed-in app's checkout flow. Pending unpaid payments
can be cancelled when supported by the provider so another plan can be selected;
retries retain the original payment identity. Server cancellation is easier to
find and repeated requests cannot create duplicate operations. - Configure Actions on existing spaces — Cloud's Add runner flow opens the
capability form directly with the space picker. Local Actions lists remain
available when Cloud discovery fails, and official runner containers support
non-root SSH supervisors. Temporary runner profiles retain their separate
funding flow. - Keep instance handoff with its source — control-plane provisioning on a
linked managed destination stays owned by the source controller until the move
transfers the instance, including resumed API-only and dashboard installations.
Build performance and resource control
- Keep unconfigured resources uncapped — omitted build and service CPU/RAM
limits no longer become sampled capacity caps or catalog sizing recommendations.
Containers share the selected server's capacity unless limits are explicitly
configured. Cloud plans and VM capacity still apply. Existing saved limits are
preserved; select Full capacity to remove an older unwanted limit. - Allow concurrent Cloud submissions — different projects can submit builds
while a sibling build is active. Unspecified resource dimensions remain shared;
explicit limits, saved plan concurrency and exclusive maintenance protection
remain enforced. - Reuse bounded project build caches — compatible builds retain project-owned
BuildKit state and supported package/compiler caches while temporary workers
are removed. Idle cache collection uses retention targets and storage-pressure
checks, preserving active workers, release images and application data. - Optionally warm new Cloud spaces — operators can select a provider software
disk with public build-image layers for new spaces. Matching images are pinned
against their current upstream digest; unavailable or outdated packs fall back
to registry resolution. Existing spaces are not reattached by an API redeploy. - Show what image preparation is doing — registry pulls stream progress,
preparation heartbeats and elapsed time into deployment logs. Build cleanup
waits for tracked Docker commands to acknowledge completion, and static export
publication normalizes public file permissions.
Catalog, GPUs and shared databases
- Add document, dashboard and media apps — install Paperless-ngx, Wiki.js,
Homepage, Immich and Jellyfin using pinned published images, persistent storage
and protected initial setup. Homepage does not require a Docker socket. - Run self-hosted AI apps — Ollama offers CPU or one NVIDIA GPU, and Open WebUI
connects to an existing backend with protected chat access. These templates use
connected self-hosted destinations, not managed Cloud capacity. vLLM remains a
disabled preview pending hardware verification. - Deploy NVIDIA GPU services — Compose import, SDK/CLI sync and adoption share
validated GPU selection and Docker device requests. Server detection and picker
hints help choose a compatible destination. Unsupported or conflicting requests
fail before image acquisition or service replacement. - Skip unnecessary WordPress and Odoo builds — new catalog installs pull the
official images and mount setup helpers through the normal deployment engine.
Existing installations retain their saved recipes; reviewed catalog repair can
update the application service while preserving database siblings, credentials
and data. - Share native databases explicitly — Use in a project can connect ready
native PostgreSQL or Redis databases to authorized projects in the same cluster.
Saved grants and private network rules are checked together; ownership, backups
and database management stay with the source project.
Storage, deletion and migration safety
- Separate fresh Cloud app data — new logical volume names use immutable
project IDs so reinstalling a deleted slug cannot adopt another project's data.
Owned legacy mounts and explicitly imported volume identities remain intact. - Recover failed deletion clearly — failed first installs offer the existing
explicit data-removal option, including owned volumes with no container. Data
retention stays the default. Cleanup failures remain retryable operations
instead of making a partly deleted project appear Live again. - Preserve resources belonging to other projects — teardown can retain stale
Cloud route and network references whose foreign ownership is confirmed.
Unreadable or ambiguous ownership still blocks cleanup, and owned networks are
removed by immutable identity rather than a potentially reused name. - Avoid ephemeral host-port collisions — Docker allocation checks the target
kernel's ephemeral range for both saved preferred ports and fresh candidates.
Unsafe legacy allocations move to a safe port during deployment; if no safe
candidate exists, allocation fails before reserving a replacement.
Mail, security and localization
- Persist webmail backend connectivity — webmail deployed on its mail server
saves the host-gateway mapping through normal service settings and deployment
snapshots while retaining the certificate hostname for TLS. Sign-in connection
attempts have bounded timeouts rather than hanging indefinitely. - Connect existing mailboxes from Cloud — the Emails screen installs the
standard webmail client for existing IMAP/SMTP servers. It does not provision or
administer a self-hosted mail server in Cloud; managed email remains Coming soon. - Repair containerized mail operations — boot restores maildir ownership,
backups and restores use the actual host-mounted mail path, and fail2ban uses
valid nftables syntax and explicit private PostgreSQL sidecar credentials.
Database and unban failures no longer report success. - Resize your inbox and reading pane — drag the divider or use its keyboard
controls. Desktop widths are remembered separately from the mobile layout. - Prevent dashboard clickjacking — dashboard pages, authentication routes and
redirects deny framing through CSP and X-Frame-Options. Customer application
routing and headers are unchanged. - Expand translated guidance and documentation — supported dashboard locales
include preferences, transfer, jobs, issues, pricing, diagnostics and audit
descriptions. The website adds a blog and broader feature discovery, alongside
updated catalog, runtime-role, Cloud, API, SDK, CLI and MCP documentation.
Update the API as well as Desktop/dashboard clients before using the new settings,
managed tunnel operations or catalog recipes that require 0.9.2. The included
database migrations run through normal API startup.