Skip to content

Docker image with every release: the Linux app as a container for the SuperCloud #41

Open

Description

@Erika98-be

Goal

Publish a Docker image with every release in which the Linux build of this tool runs and is viewable in the browser. The OpenAEC SuperCloud gives each user their own Linux environment on the server, with one container per tool, so the tool opens as a regular Linux program instead of loading in the browser.

This is the regular graphical app streamed to the browser, not a headless API or library.

The common contract for all OpenAEC tools is OpenAEC-Blueprint#61. Open PDF Studio follows the same model in open-pdf-studio#863. The Blueprint provides a ready template in templates/docker/ (Dockerfile, start script, container test and the release-workflow steps; in review on the Blueprint branch feat/docker-image), so this tool only says which package goes in and which program starts.

Requirements

  • Name and version: ghcr.io/openaec-foundation/open-pointcloud-studio:<YYYY.W.N> plus latest, same version as the release. linux/amd64 for now.
  • Built from the release itself: install the release's .deb (or the extracted AppImage, --appimage-extract, so no FUSE is needed). No separate build of the app.
  • One app, no desktop: the container starts only this tool, full screen, in a minimal graphical session, streamed to the browser on one HTTP port (3000).
  • Fixed folders: /openaec for the user's files (mounted from outside; open/save dialogs start here) and /config for the app's settings (volume, persisted).
  • No root: runs as a regular user; no --privileged, no FUSE, no GPU in the first version.
  • Configuration via environment variables, documented in the README (language, theme, optional file to open on start).
  • Health: a HEALTHCHECK and an endpoint (GET /gezond) that only reports OK when the app is actually running.
  • Network: no outgoing connections beyond those documented in the README; update checks off in the container (updates come with a new image).
  • AI integration (if the tool has one): the tool's MCP server runs in the same container on its own port, for the internal network only.
  • Light at rest: the memory use of the container with no file open goes in the release notes.
  • Signed: image signed with cosign (keyless via GitHub OIDC), with a build attestation and an SBOM, like the other release files.
  • Tested before publishing: in the release workflow the container starts, becomes healthy, the app process runs and a screenshot of the stream can be taken.
  • README: a short "Docker" section with docker run -p 3000:3000 -v <folder>:/openaec ghcr.io/openaec-foundation/open-pointcloud-studio:latest and the variables the tool supports.

How

  1. Copy the files from the Blueprint's templates/docker/ unchanged to packaging/docker/ in this repository.
  2. Put tool-specific preparation (for example writing a theme or language from an environment variable to the settings file) in packaging/docker/setup.d/*.sh.
  3. Take over the docker job and the image steps of the publish job from the Blueprint's .github/workflows/release.yml, with this tool's package name, program and description.

Activity

  1. boazeggs commented on Nov 5, 2026

    @boazeggs
    Contributor

    Implementation prepared in #58 (draft while final native checks run).

    Add the supported native SuperCloud route B described by the current Blueprint contract. Managed windows honour OPENAEC_MAP, OPENAEC_TAAL and OPENAEC_THEMA without overwriting desktop preferences, and handle SIGTERM through the normal application exit path. A separate --mcp-http process exposes the exact desktop MCP operations under pointcloud_ names, including pointcloud_open and pointcloud_opslaan, with bearer authentication, Origin refusal, bounded sessions/calls, cancellation and a health endpoint that checks the GUI command path. Stdio MCP names remain compatible.

    The Linux package matrix now exercises the extracted AppImage under headless labwc/Wayland with Mesa lavapipe, without FUSE or a GPU. The repeatable probe checks authentication, session lifecycle, 166 tool definitions, opening/saving 1,000 points, screenshots, SIGTERM and unhealthy status after exit.

    Validation so far:

    • Three managed-configuration unit tests and two HTTP authentication/tool-parity tests pass.
    • The earlier full desktop run passed 734 tests, with 9 ignored; its three README/locale consistency failures have been corrected and await the final rerun.
    • Local X11 and headless Wayland/lavapipe probes pass. The recorded Wayland idle RSS after rendering is 243,764 KiB (~238 MiB). This used the development binary; release AppImage and arm64 results are left to CI.
    • Bash syntax, Python compilation and git diff checks pass. Final native tests/clippy are pending; this PR stays draft until those checks pass.

    Refs #41 and #52; neither is automatically closed. The current central-image contract supersedes #41's per-tool Docker image request. Browser-only route A and recovery of arbitrary unsaved point edits are outside this implementation. SIGTERM flushes the existing drawing project and cancels background work, but does not invent a persistent scan-edit project format. Deployment and platform-side TLS/mount isolation remain to be verified in the actual host.

  2. boazeggs commented on Nov 6, 2026

    @boazeggs
    Contributor

    PR #58 staat nu samen met de overige wijzigingen in integratie-PR #53. De gecombineerde native GUI is daadwerkelijk getest via 167 desktop-MCP-tools: 1.000 punten openen en opslaan, authenticatie/Origin-weigering, afsluiten via SIGTERM en ongezonde status na afsluiten. Ook een belangrijke combinatie is opgelost en getest: wanneer de gebruiker MCP pauzeert, blijven opdrachten geblokkeerd terwijl de draaiende GUI gezond blijft. Hiervoor gebruikt /gezond een afzonderlijke GUI-heartbeat. Beide modi zijn aangesloten op de Linux-pakketcontroles.

    De native app gebruikte lokaal ongeveer 250 MiB in rust met software-Vulkan; dit is het app-proces, geen meting van een gedeployde container. De volledige gecombineerde Rust-workspace heeft 1.424 geslaagde tests zonder fouten.

    Dit issue blijft open voor de daadwerkelijke SuperCloud-host/Docs-koppeling en deploymentacceptatie. De implementatie volgt de ondersteunde native route B en het huidige gedeelde Blueprint-contract zoals in #58 beschreven; er wordt geen ondersteunde browsereditie of reeds uitgevoerde clouddeployment geclaimd.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions