Adds opt-in Git LFS support for plain gitea (Forgejo already bundles it).
What changed
New compose.lfs.yml overlay — sets GITEA_LFS_START_SERVER=true and mounts the lfs_jwt_secret secret.
app.ini.tmpl — emit LFS_JWT_SECRET whenever the LFS server is on (FORGE==forgejoorGITEA_LFS_START_SERVER==true), not only for forgejo. A stable, mounted JWT secret is required because app.ini is a read-only Docker config, so a gitea-generated secret would churn on every restart and invalidate LFS tokens.
.env.sample — documents the opt-in overlay + SECRET_LFS_JWT_SECRET_VERSION.
Version bump 3.5.2 → 3.6.0 (minor; feature addition).
Adds opt-in Git LFS support for **plain gitea** (Forgejo already bundles it).
### What changed
- New `compose.lfs.yml` overlay — sets `GITEA_LFS_START_SERVER=true` and mounts the `lfs_jwt_secret` secret.
- `app.ini.tmpl` — emit `LFS_JWT_SECRET` whenever the LFS server is on (`FORGE==forgejo` **or** `GITEA_LFS_START_SERVER==true`), not only for forgejo. A stable, mounted JWT secret is required because `app.ini` is a read-only Docker config, so a gitea-generated secret would churn on every restart and invalidate LFS tokens.
- `.env.sample` — documents the opt-in overlay + `SECRET_LFS_JWT_SECRET_VERSION`.
- Version bump `3.5.2 → 3.6.0` (minor; feature addition).
### How to enable
```
COMPOSE_FILE="\$COMPOSE_FILE:compose.lfs.yml"
SECRET_LFS_JWT_SECRET_VERSION=v1 # length=43
abra app secret generate <app> lfs_jwt_secret v1
```
### Tested on cctest
- Deploy 🟢, container healthy on `3.6.0+1.24.2-rootless`.
- Rendered `app.ini` has `LFS_START_SERVER = true` and a templated `LFS_JWT_SECRET` for plain gitea.
- Full LFS object upload→download round-trip via the batch API (HTTP 200; downloaded bytes hash to the OID).
- JWT secret identical across `abra app restart` (stable — the regression this fixes).
cc @trav @notplants
Add an opt-in compose.lfs.yml that mounts the lfs_jwt_secret secret and
enables GITEA_LFS_START_SERVER for plain gitea (forgejo already bundles
LFS). Emit LFS_JWT_SECRET in app.ini whenever the LFS server is on so the
JWT secret is stable across redeploys instead of being regenerated on
every restart (app.ini is a read-only config mount).
Bump version 3.5.2 -> 3.6.0.
autonomic-bot
requested review from trav 2026-06-15 19:19:25 +00:00
autonomic-bot
requested review from notplants 2026-06-15 19:19:25 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Adds opt-in Git LFS support for plain gitea (Forgejo already bundles it).
What changed
compose.lfs.ymloverlay — setsGITEA_LFS_START_SERVER=trueand mounts thelfs_jwt_secretsecret.app.ini.tmpl— emitLFS_JWT_SECRETwhenever the LFS server is on (FORGE==forgejoorGITEA_LFS_START_SERVER==true), not only for forgejo. A stable, mounted JWT secret is required becauseapp.iniis a read-only Docker config, so a gitea-generated secret would churn on every restart and invalidate LFS tokens..env.sample— documents the opt-in overlay +SECRET_LFS_JWT_SECRET_VERSION.3.5.2 → 3.6.0(minor; feature addition).How to enable
Tested on cctest
3.6.0+1.24.2-rootless.app.inihasLFS_START_SERVER = trueand a templatedLFS_JWT_SECRETfor plain gitea.abra app restart(stable — the regression this fixes).cc @trav @notplants
!testme
e6e4048ecfto9bc97fd298!testme
!testme
9bc97fd298to357926f26e!testme
🌻 cc-ci —
gitea@357926f2❌ failurefull logs · dashboard
!testme
🌻 cc-ci —
gitea@357926f2✅ passedfull logs · dashboard
Auto-closed by cc-ci canonical sweep: its changes are already in upstream main (merged upstream); mirror main re-synced
Pull request closed