Skip to content

feat(deploy): one-click deploy buttons and README screenshots - #39

Merged
loan-talvat merged 1 commit into
mainfrom
feat/one-click-deploy
Aug 13, 2026
Merged

feat(deploy): one-click deploy buttons and README screenshots#39
loan-talvat merged 1 commit into
mainfrom
feat/one-click-deploy

Conversation

@loan-talvat

Copy link
Copy Markdown
Contributor

One-click deploy

Adds the two manifests that Render and Heroku require in the repository (they are the only platforms whose button reads files from the source repo — every other catalog hosts the template on its side, and those PRs are open upstream).

File Role
render.yaml App + private MySQL + MinIO. Render prompts once for a database password and derives the public URL from RENDER_EXTERNAL_URL.
app.json + heroku.yml Builds the image from source, attaches JawsDB MySQL as DATABASE_URL, asks for AUTH_URL.
docker/Dockerfile.minio MinIO with the product bucket pre-created — Render passes its start command to the image entrypoint instead of replacing it, and MinIO's entrypoint prepends minio to whatever it receives.

docker/entrypoint.sh adopts JAWSDB_URL and RENDER_EXTERNAL_URL when the operator sets neither DATABASE_URL nor AUTH_URL, so both buttons boot without a manual configuration pass. Tested against the published image: with only those two variables set, the process resolves both and reports healthy.

README

The demo section rendered nothing: GitHub strips <video> tags, so <video src="demo.mp4"> has been an empty block for every visitor since it was added (verified — zero <video> elements in the rendered HTML returned by the API). It is replaced with real screenshots taken from a seeded instance, plus:

  • a Docker pulls badge instead of the static one (4.7k pulls is a stronger signal than the star count today)
  • a star call to action in the hero and right after the install command

Upstream catalogs (separate, already open)

Their buttons get added to the README as each one merges.

Verified

Both the Dokploy and Coolify stacks were deployed locally end to end before submitting anything: three services healthy, schema installed on first boot, account created, product image uploaded through the app into the MinIO bucket and served back byte-identical from /files.

Render and Heroku are the two platforms whose deploy button requires
manifests in the repository:

- render.yaml deploys the app with a private MySQL and a MinIO service
  built from docker/Dockerfile.minio (Render passes its start command to
  the image entrypoint rather than replacing it, and MinIO's entrypoint
  prepends `minio` to whatever it receives).
- app.json + heroku.yml build the image from source and attach JawsDB as
  DATABASE_URL.

The container entrypoint now adopts JAWSDB_URL and RENDER_EXTERNAL_URL
when the operator sets neither DATABASE_URL nor AUTH_URL, so both buttons
boot without a manual configuration pass.

The README demo section showed nothing: GitHub strips <video> tags, so
every visitor saw an empty block. Replaced with real screenshots of the
storefront and dashboard, a Docker pulls badge, and a star call to action.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 85b18c2f2d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread app.json
Comment on lines +46 to +48
"S3_ENDPOINT": {
"description": "S3-compatible endpoint for product images (AWS S3, Cloudflare R2, Scaleway, Backblaze B2...). Image uploads stay disabled until the five S3 values are set. Everything else works without them.",
"required": false

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Provision the storage variables required at startup

When a user accepts the default Heroku deployment and leaves these fields blank, the container cannot start: apps/web/env.ts:46-50 declares all five S3 settings as required URL/non-empty values, and runtime validation is enabled in the final image. Marking them optional while supplying only S3_PUBLIC_URL therefore produces an environment-validation failure rather than the documented deployment with uploads disabled; either provision storage or make the application schema genuinely support missing S3 configuration.

Useful? React with 👍 / 👎.

Comment thread render.yaml
type: pserv
name: louez-minio
envVarKey: MINIO_ROOT_PASSWORD
dockerCommand: sh -c 'export DATABASE_URL="mysql://root:$MYSQL_PASSWORD@louez-mysql:3306/louez"; exec node apps/web/server.js'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Encode the prompted password before building DATABASE_URL

If the password entered in Render contains URI delimiters such as #, /, or ?, interpolating it directly into this MySQL URL changes how the value is parsed and the web service fails authentication or targets a malformed database URL. The Blueprint merely comments that users should choose alphanumeric characters, but that comment is not an enforced constraint in Render's sync: false prompt; construct the URL with percent-encoding or otherwise generate and enforce a URL-safe password.

Useful? React with 👍 / 👎.

@loan-talvat
loan-talvat merged commit 4772504 into main Aug 13, 2026
1 of 2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant