2 Commits

Author SHA1 Message Date
jeanGaston 3ac68a88d0 docs: lead Quick start with the published GHCR image
Publish Docker image / build-and-push (push) Successful in 3m31s
Running the app no longer requires cloning the repo: pull the
published ghcr.io image directly via docker-compose. Move the
build-from-source flow (existing docker-compose.yml + Dockerfile) to
a secondary section for contributors.
2026-07-30 12:03:29 +02:00
jeanGaston 94b02198dd ci: build images from a dev branch and release tags, not every commit
Every push to master was triggering a build+push, since that's where
day-to-day commits land. Switch to two deliberate channels instead:
pushing to dev produces a rolling :dev tag for testing, and pushing a
v* tag produces :latest + the version tag for real releases. Plain
commits/merges to master/main no longer build anything on their own.
2026-07-30 12:03:20 +02:00
3 changed files with 72 additions and 10 deletions
+24 -6
View File
@@ -1,8 +1,12 @@
name: Publish Docker image name: Publish Docker image
# Two channels, not one-image-per-commit:
# - push to `dev` -> rolling `:dev` tag, for testing in-progress work
# - push tag `v*` -> `:latest` + the version tag, for actual releases
# Plain commits/merges to master/main build nothing on their own.
on: on:
push: push:
branches: [main, master] branches: [dev]
tags: ['v*'] tags: ['v*']
permissions: permissions:
@@ -20,6 +24,24 @@ jobs:
- name: Compute lowercase image name - name: Compute lowercase image name
run: echo "IMAGE_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV" run: echo "IMAGE_NAME=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Compute image tags
run: |
if [ "${{ github.ref_type }}" = "tag" ]; then
VERSION="${{ github.ref_name }}"
TAGS="${{ vars.REGISTRY_HOST }}/${IMAGE_NAME}:latest
${{ vars.REGISTRY_HOST }}/${IMAGE_NAME}:${VERSION}
ghcr.io/${IMAGE_NAME}:latest
ghcr.io/${IMAGE_NAME}:${VERSION}"
else
TAGS="${{ vars.REGISTRY_HOST }}/${IMAGE_NAME}:dev
ghcr.io/${IMAGE_NAME}:dev"
fi
{
echo "TAGS<<TAGS_EOF"
echo "$TAGS"
echo "TAGS_EOF"
} >> "$GITHUB_ENV"
- name: Log in to Gitea container registry - name: Log in to Gitea container registry
uses: docker/login-action@v3 uses: docker/login-action@v3
with: with:
@@ -39,8 +61,4 @@ jobs:
with: with:
context: . context: .
push: true push: true
tags: | tags: ${{ env.TAGS }}
${{ vars.REGISTRY_HOST }}/${{ env.IMAGE_NAME }}:latest
${{ vars.REGISTRY_HOST }}/${{ env.IMAGE_NAME }}:${{ github.sha }}
ghcr.io/${{ env.IMAGE_NAME }}:latest
ghcr.io/${{ env.IMAGE_NAME }}:${{ github.sha }}
+13
View File
@@ -51,6 +51,19 @@ Types: `feat`, `fix`, `refactor`, `style`, `docs`, `chore`, `test`.
Tag production releases as `v<major>.<minor>.<patch>` (semver) once this Tag production releases as `v<major>.<minor>.<patch>` (semver) once this
project has a deployment cadence worth marking. Not required for every merge. project has a deployment cadence worth marking. Not required for every merge.
## Docker images
CI (`.gitea/workflows/docker-publish.yml`) only builds an image on two
events, not on every commit:
- push to `dev` — builds a rolling `:dev` tag, for testing in-progress work
before it's ready to release.
- push a `v*` tag — builds `:latest` plus the version tag, for actual
releases.
Push to `dev` when you want a throwaway build to test; tag a release on
`main`/`master` when you want a real one.
## What not to commit ## What not to commit
- Anything in `.gitignore` (`.env`, `/data`, `.next`, `node_modules`, prisma - Anything in `.gitignore` (`.env`, `/data`, `.next`, `node_modules`, prisma
+35 -4
View File
@@ -10,7 +10,40 @@ No accounts, no friction, just a sweet little link. Everything personal is encry
## Quick start ## Quick start
You need [Docker](https://www.docker.com/) installed. That's it. You need [Docker](https://www.docker.com/) installed. That's it — no clone required, the image is published on GHCR.
Create a `docker-compose.yml`:
```yaml
services:
app:
image: ghcr.io/jeangaston/lovelope:latest
ports:
- "3000:3000"
environment:
DATABASE_URL: "file:/app/data/askedout.db"
APP_URL: "http://localhost:3000"
GIPHY_API_KEY: "${GIPHY_API_KEY:-}"
volumes:
- ./data:/app/data
restart: unless-stopped
```
Then:
```bash
docker compose up -d
```
Open **http://localhost:3000**. Your data lives in `./data/askedout.db` on your machine.
Want GIF search to work? Grab a free key at [developers.giphy.com](https://developers.giphy.com/), export it as `GIPHY_API_KEY` before running `docker compose up` (or drop it in a `.env` file next to `docker-compose.yml`), then restart. Without it, the app still runs fine, GIF search is just disabled.
Pin a specific version instead of always tracking `latest` by using a release tag, e.g. `ghcr.io/jeangaston/lovelope:v0.1.0`.
### Build from source
If you'd rather build the image yourself instead of pulling from GHCR:
```bash ```bash
git clone https://github.com/jeangaston/lovelope.git && cd lovelope git clone https://github.com/jeangaston/lovelope.git && cd lovelope
@@ -18,9 +51,7 @@ cp .env.example .env
docker compose up --build docker compose up --build
``` ```
Open **http://localhost:3000**. Everything (the app and its database) runs in one container; your data lives in `./data/askedout.db` on your machine. This uses the [docker-compose.yml](docker-compose.yml) in the repo, which builds from the local [Dockerfile](Dockerfile) instead of pulling a published image.
Want GIF search to work? Grab a free key at [developers.giphy.com](https://developers.giphy.com/) and put it in `.env` as `GIPHY_API_KEY`, then restart. Without it, the app still runs fine, GIF search is just disabled.
## Features ## Features