Skip to content

Add LibreDB Studio to the DigitalOcean Marketplace (Kubernetes 1-Click + Droplet 1-Click) and ship an App Platform deploy button #72

Description

@cevheri

Note: This issue was rewritten after an end-to-end, source-verified research pass over the official DigitalOcean docs and digitalocean/* GitHub repos. Every requirement below is tagged [verified] (confirmed from a primary source), [undocumented] (not in any public doc — must be confirmed via the Vendor Portal / Publishing Guidelines), or [risk] (a plausible blocker to validate before committing). An earlier draft proposed an image:-based App Platform deploy button; that was wrong and is corrected below.

Goal

List LibreDB Studio on the DigitalOcean Marketplace so DO users can launch it in one click, and ship a standalone App Platform deploy button. This continues the cloud one-click strategy after CapRover (official one-click-apps PR #1303, merged), Railway (template published), and Koyeb (button + catalog outreach drafted).

Background — the Marketplace has FOUR listing types [verified]

Per the official Marketplace docs:

Type What it is Fit for LibreDB
Droplet 1-Click Pre-built Droplet image with software preconfigured ✅ viable (Packer snapshot of our container)
Kubernetes 1-Click Pre-configured Helm-based app for DOKS best fit — we already publish a Helm 3 chart
SaaS Add-On Hosted third-party SaaS sold through DO ❌ only if LibreDB were a hosted service
1-Click Models Third-party genAI models on GPU Droplets ❌ N/A

All vendor listings are submitted through the Vendor Portal and gated by an interest form + the Marketplace Vendor Terms ("DigitalOcean reserves the right to reject any Vendor application for any or no reason.").

The App Platform "Deploy to DigitalOcean" button (Path C) is NOT a Marketplace vendor listing — it is a separate, README-hosted distribution channel that needs no vendor account. It's included here because it's the fastest user-facing win.

Project facts (shared)

  • Image: ghcr.io/libredb/libredb-studio — multi-arch (amd64/arm64), GHCR canonical. Pin a fixed tag (current 0.9.25), never :latest.
  • Port 3000 · Health GET /api/db/health.
  • Helm chart: charts/libredb-studio — published at https://libredb.org/libredb-studio/ (HTTP repo) and OCI oci://ghcr.io/libredb/charts/libredb-studio.
  • Env: JWT_SECRET (32+), ADMIN_EMAIL/ADMIN_PASSWORD, USER_EMAIL/USER_PASSWORD, NEXT_PUBLIC_AUTH_PROVIDER (local|oidc + OIDC_*), STORAGE_PROVIDER (local|sqlite+STORAGE_SQLITE_PATH|postgres+STORAGE_POSTGRES_URL), optional LLM_*.

Proposed in-repo source of truth (mirrors deploy/caprover|railway|koyeb):

deploy/digitalocean/
├── kubernetes/   # mirror of the stacks/libredb-studio/ PR + README
├── droplet/      # Packer dir (template.json, scripts/, files/) + README
├── app-platform/ # .do/deploy.template.yaml copy + README (button)
├── libredb-studio.png
└── README.md

Prerequisite — Vendor onboarding (gates Paths A & B, not C) [verified]

  • Submit the "Become a Vendor" interest form at https://marketplace.digitalocean.com/vendors.
  • Obtain Vendor Portal access (https://cloud.digitalocean.com/vendorportal); if no login arrives after the form, email one-clicks-team@digitalocean.com.
  • Accept the Marketplace Vendor Terms.
  • [undocumented] Capture the exact listing asset specs (logo dimensions/format, description length limits, screenshot count/resolution, categories) and review-timeline from the Publishing Guidelines once inside the portal — these are not in any public doc (the pages are JS-rendered SPAs; the guidelines subpage 404s to fetch).

Path A — Kubernetes 1-Click (recommended primary) [verified]

Strongest fit: LibreDB already ships a Helm 3 chart, so this is mostly wiring it into DO's stacks/ structure. Source: digitalocean/marketplace-kubernetes + its CONTRIBUTING.md.

Tasks

  • Fork digitalocean/marketplace-kubernetes; create branch libredb-studio-first-pr.
  • Scaffold the stack with the generator:
    export HELM_REPO_NAME=libredb
    export HELM_REPO_URL=https://libredb.org/libredb-studio/
    export STACK_NAME=libredb-studio
    export CHART_NAME=libredb/libredb-studio
    export CHART_VERSION=<chart version>     # e.g. 1.0.0
    export NAMESPACE=libredb-studio
    ./utils/generate-stack.sh
    → produces stacks/libredb-studio/{deploy.sh,upgrade.sh,uninstall.sh,values.yml}. Then chmod +x stacks/libredb-studio/*.sh.
  • Confirm deploy.sh shape (template does helm repo add {{HELM_REPO_NAME}} {{HELM_REPO_URL}} + helm repo update + helm upgrade "$STACK" "$CHART" --atomic --create-namespace --install --timeout 8m0s --namespace "$NAMESPACE" --values "$values" --version "$CHART_VERSION"). The chart must resolve from a reachable HTTP(S) Helm repohttps://libredb.org/libredb-studio/ qualifies.
    • [risk] The template uses helm repo add <https-url>; an oci:// chart source is not documented as supported. Plan to rely on the HTTPS repo, not OCI, unless we confirm otherwise.
  • Tune values.yml for DOKS defaults: pinned image tag, Service/Ingress, persistence (SQLite PVC) or document postgres storage, sane resource requests/limits. Note values.yml is environment-aware — under MP_KUBERNETES it is fetched from master on GitHub, so the committed file is what Marketplace deploys.
  • Test on a real DOKS cluster: ./stacks/libredb-studio/deploy.shupgrade.shuninstall.sh (all clean).
  • Open the PR. After DO reviews + merges, submit the App Listing in the Vendor Portal referencing the PR"Your new PR will not take effect until you do this final step in the Vendor Portal."
  • Per-release maintenance: bump CHART_VERSION in deploy.sh, re-PR, update the Vendor Portal listing with the merged PR URL.

Path B — Droplet 1-Click (Packer snapshot) [verified]

The classic marketplace.digitalocean.com listing — highest visibility, heaviest build/maintenance. Canonical build tooling: digitalocean/droplet-1-clicks (DEVELOPER-GUIDE.md); validation source: digitalocean/marketplace-partners.

Per-app file layout (mirror of _template/)

libredb-studio-24-04/
├── template.json                                  # Packer: provisioners (file uploads + shell scripts), user vars
├── scripts/installer.sh                           # installs Docker + runs ghcr.io/libredb/libredb-studio:<tag>
└── files/
    ├── etc/update-motd.d/99-one-click             # first-login MOTD: access URL + generated credentials
    └── var/lib/cloud/scripts/per-instance/001_onboot   # first boot: generate random JWT_SECRET + admin/user passwords
# app metadata (name/version) → /var/lib/digitalocean/application.info via application_name / application_version vars

Tasks

  • Fork digitalocean/droplet-1-clicks; copy _template/libredb-studio-24-04/ (Ubuntu 24.04 LTS).
  • scripts/installer.sh: install Docker + Compose; run ghcr.io/libredb/libredb-studio:<tag> on port 3000 as a boot-enabled systemd/compose unit.
  • files/.../per-instance/001_onboot: generate random JWT_SECRET + admin/user passwords on first boot (no default passwords — Marketplace requirement) and restore SSH access (sed out the ForceCommand/Match User root lines + systemctl restart ssh, per the dev guide).
  • files/etc/update-motd.d/99-one-click: print access URL + generated credentials at first login.
  • In template.json, chain the shared security/cleanup scripts after installer.sh: common/scripts/014-ufw-nginx.sh, 018-force-ssh-logout.sh, 020-application-tag.sh, 900-cleanup.sh. Set application_name/application_version user vars.
  • Build: export DIGITALOCEAN_API_TOKEN=<pat> then make build-libredb-studio-24-04 (≡ packer build libredb-studio-24-04/template.json). Packer ≥ 1.7 needs the DO builder plugin (plugins.pkr.hcl).
  • Validate: refresh the checker with make update-scripts (pulls 99-img-check.sh from marketplace-partners into common/scripts/999-img_check.sh); it checks OS, cloud-init, ufw, credentials/passwords, SSH keys, bash history, unwanted agents → target PASSED / 0 FAILED.
  • Open a PR against digitalocean/droplet-1-clicks, then submit the snapshot listing via the Vendor Portal.
  • Storage default: sqlite on the Droplet disk is the natural single-node fit; document postgres for production.
  • [undocumented] Optional: a Droplet 1-Click can offer a DigitalOcean Managed Database (DBaaS) at spin-up — pairs well with STORAGE_PROVIDER=postgres. No official procedure was found for this; confirm in the Vendor Portal before relying on it.

Note: droplet-1-clicks uses env var DIGITALOCEAN_API_TOKEN; the older marketplace-partners sample uses DIGITALOCEAN_TOKEN. Use droplet-1-clicks (the canonical build repo).


Path C — App Platform "Deploy to DigitalOcean" button (separate channel, fastest) [verified + open item]

Not a Marketplace vendor listing — a button in our README that launches the app on App Platform. No vendor account needed. Source: add-deploy-do-button docs.

Verified constraints: button supports public repos only; documented configs are One Service / One Service + Dev Database / One Static Site / + Dev Database; Dev Databases only ("can't connect to managed databases"); the spec must live under a top-level spec: key; there is no auto-random-secret function (unlike CapRover/Railway), so secrets are SECRET-typed placeholders the user fills.

The open question: the button docs only show git sources. App Platform's app spec fully supports prebuilt images including registry_type: GHCR (deploy-from-container-images), but whether the button/deploy.template.yaml accepts an image: source is [undocumented].

Tasks

  • First, validate whether an image:-based .do/deploy.template.yaml (GHCR) works with the button.
    • If yes → use the image: block (registry_type: GHCR, registry: libredb, repository: libredb-studio, tag: "<tag>", http_port: 3000, health_check.http_path: /api/db/health).
    • If no → fall back to a git: source that builds from our existing Dockerfile, or document the manual "Create from container image" App Platform flow.
  • Add JWT_SECRET/ADMIN_PASSWORD/USER_PASSWORD as type: SECRET placeholders; STORAGE_PROVIDER=local default (App Platform service FS is ephemeral); document postgres via a managed DB for persistence.
  • Add the button to README.md:
    [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/libredb/libredb-studio/tree/main)
  • Verify first login + /api/db/health on the live app.

Recommended sequencing

  1. Path C (App Platform button) — fastest user win, no vendor account; just resolve the image-vs-git question.
  2. Path A (Kubernetes 1-Click) — cleanest real Marketplace listing; reuses the published Helm chart.
  3. Path B (Droplet 1-Click) — highest visibility, heaviest; do after A proves the vendor/portal flow.

Shared assets

  • Logo — reuse deploy/caprover/libredb-studio.png; [undocumented] confirm exact DO dimensions per surface in the Vendor Portal.
  • 1–2 screenshots (editor + results grid / ERD).
  • Reuse the existing one-liner + short description from CapRover/Railway/Koyeb.
  • Add live DO links to README.md beside the other one-click buttons once each ships.

Acceptance criteria

  • deploy/digitalocean/ exists in-repo as the documented source of truth for shipped paths.
  • At least Path C is live and verified end-to-end from a clean account.
  • Each shipped path pins a fixed image/chart version (never :latest) with a documented per-release bump step.
  • First login (admin + user) works and /api/db/health is healthy on each shipped path.
  • All [undocumented] items (asset specs, review timelines, DBaaS-at-spin-up, OCI/image-source acceptance) are resolved from the Vendor Portal and folded back into this issue before the corresponding path is submitted.

Open questions — need Vendor Portal / live pages (not in public docs)

  1. Exact listing asset specs (logo px/format, description char limits, screenshot count/resolution) and review/approval timelines.
  2. Does the Deploy-to-DO button accept an image: (GHCR) deploy.template.yaml, or only git?
  3. Does the K8s deploy.sh flow accept an OCI Helm source, or must we use the HTTPS repo?
  4. Documented procedure for DBaaS at Droplet spin-up, and full SaaS Add-On onboarding (billing/metering/SSO) — only confirmed as named offerings.

References (verified primary sources)

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationenhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions