You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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]
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.
Port3000 · HealthGET /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.
[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]
→ 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 repo → https://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.sh → upgrade.sh → uninstall.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]
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: [](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
Path C (App Platform button) — fastest user win, no vendor account; just resolve the image-vs-git question.
Path A (Kubernetes 1-Click) — cleanest real Marketplace listing; reuses the published Helm chart.
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)
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:
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.").
Project facts (shared)
ghcr.io/libredb/libredb-studio— multi-arch (amd64/arm64), GHCR canonical. Pin a fixed tag (current0.9.25), never:latest.3000· HealthGET /api/db/health.charts/libredb-studio— published athttps://libredb.org/libredb-studio/(HTTP repo) and OCIoci://ghcr.io/libredb/charts/libredb-studio.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), optionalLLM_*.Proposed in-repo source of truth (mirrors
deploy/caprover|railway|koyeb):Prerequisite — Vendor onboarding (gates Paths A & B, not C) [verified]
one-clicks-team@digitalocean.com.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+ itsCONTRIBUTING.md.Tasks
digitalocean/marketplace-kubernetes; create branchlibredb-studio-first-pr.stacks/libredb-studio/{deploy.sh,upgrade.sh,uninstall.sh,values.yml}. Thenchmod +x stacks/libredb-studio/*.sh.deploy.shshape (template doeshelm 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 repo →https://libredb.org/libredb-studio/qualifies.helm repo add <https-url>; anoci://chart source is not documented as supported. Plan to rely on the HTTPS repo, not OCI, unless we confirm otherwise.values.ymlfor DOKS defaults: pinned image tag,Service/Ingress, persistence (SQLite PVC) or documentpostgresstorage, sane resource requests/limits. Notevalues.ymlis environment-aware — underMP_KUBERNETESit is fetched frommasteron GitHub, so the committed file is what Marketplace deploys../stacks/libredb-studio/deploy.sh→upgrade.sh→uninstall.sh(all clean).CHART_VERSIONindeploy.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.comlisting — 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/)Tasks
digitalocean/droplet-1-clicks; copy_template/→libredb-studio-24-04/(Ubuntu 24.04 LTS).scripts/installer.sh: install Docker + Compose; runghcr.io/libredb/libredb-studio:<tag>on port 3000 as a boot-enabled systemd/compose unit.files/.../per-instance/001_onboot: generate randomJWT_SECRET+ admin/user passwords on first boot (no default passwords — Marketplace requirement) and restore SSH access (sedout theForceCommand/Match User rootlines +systemctl restart ssh, per the dev guide).files/etc/update-motd.d/99-one-click: print access URL + generated credentials at first login.template.json, chain the shared security/cleanup scripts afterinstaller.sh:common/scripts/014-ufw-nginx.sh,018-force-ssh-logout.sh,020-application-tag.sh,900-cleanup.sh. Setapplication_name/application_versionuser vars.export DIGITALOCEAN_API_TOKEN=<pat>thenmake build-libredb-studio-24-04(≡packer build libredb-studio-24-04/template.json). Packer ≥ 1.7 needs the DO builder plugin (plugins.pkr.hcl).make update-scripts(pulls99-img-check.shfrommarketplace-partnersintocommon/scripts/999-img_check.sh); it checks OS, cloud-init, ufw, credentials/passwords, SSH keys, bash history, unwanted agents → target PASSED / 0 FAILED.digitalocean/droplet-1-clicks, then submit the snapshot listing via the Vendor Portal.sqliteon the Droplet disk is the natural single-node fit; documentpostgresfor production.STORAGE_PROVIDER=postgres. No official procedure was found for this; confirm in the Vendor Portal before relying on it.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 areSECRET-typed placeholders the user fills.The open question: the button docs only show
gitsources. App Platform's app spec fully supports prebuilt images includingregistry_type: GHCR(deploy-from-container-images), but whether the button/deploy.template.yamlaccepts animage:source is [undocumented].Tasks
image:-based.do/deploy.template.yaml(GHCR) works with the button.image:block (registry_type: GHCR,registry: libredb,repository: libredb-studio,tag: "<tag>",http_port: 3000,health_check.http_path: /api/db/health).git:source that builds from our existingDockerfile, or document the manual "Create from container image" App Platform flow.JWT_SECRET/ADMIN_PASSWORD/USER_PASSWORDastype: SECRETplaceholders;STORAGE_PROVIDER=localdefault (App Platform service FS is ephemeral); documentpostgresvia a managed DB for persistence.README.md:[](https://cloud.digitalocean.com/apps/new?repo=https://github.com/libredb/libredb-studio/tree/main)/api/db/healthon the live app.Recommended sequencing
Shared assets
deploy/caprover/libredb-studio.png; [undocumented] confirm exact DO dimensions per surface in the Vendor Portal.README.mdbeside the other one-click buttons once each ships.Acceptance criteria
deploy/digitalocean/exists in-repo as the documented source of truth for shipped paths.:latest) with a documented per-release bump step./api/db/healthis healthy on each shipped path.Open questions — need Vendor Portal / live pages (not in public docs)
image:(GHCR)deploy.template.yaml, or onlygit?deploy.shflow accept an OCI Helm source, or must we use the HTTPS repo?References (verified primary sources)
one-clicks-team@digitalocean.comdeploy/caprover/(official PR #1303),deploy/railway/,deploy/koyeb/.