gitea 1.27.0 con sqlite y bindata: el binario sellado no podía abrir la base de datos

La mudanza de gioser pasa por levantar su gitea del otro lado — 28 repos, 26 sin copia fuera. El
corpus ya tenía `gitea` sellado (1.26.4, `b3:35bb4f04…`) y NO sirve, medido contra el artefacto:

    $ gitea --config app.ini migrate
    Error: sqlite3 requires: -tags sqlite,sqlite_unlock_notify
    this Gitea binary was not built with SQLite3 support

Construía, reproducía y no podía abrir la sqlite en la que gioser guarda TODO (`DB_TYPE = sqlite3`).
Y `gitea --version` decía `version development`. Es subcomando-sin-driver un piso más abajo.

Tres cambios, y el tercero es el que no se ve venir:

· Pin 1.27.0 (gioser corre 1.27.0). No es cosmético: gitea migra el esquema hacia adelante y se
  planta si la DB trae migraciones más nuevas que el binario, así que el pin va por delante del
  origen, nunca por detrás.
· Tags `sqlite,sqlite_unlock_notify` (⇒ `cgo = true`, el driver de mattn es C) y `bindata`, que
  embebe `public/` y `templates/`: sin él la receta publica sólo el ejecutable y el servidor
  arrancaría sin UI.
· La fuente pasa de `repo`+`commit` al TARBALL DE RELEASE. El clon no alcanza: la UI se compila
  con Node y las deps Go no están vendoreadas en git. El `gitea-src-1.27.0.tar.gz` trae las dos
  cosas hechas — medido: `public/assets/` 764, `vendor/` 11246, `templates/` 663 — así que
  construye con el lab tal cual, sin Node y sin red. La URL es locator (ADR 0013); ancla el sha256.

Nuevo hash: `b3:391a613e…`. Declarado en `perfil.servidor` como paquete y NO en `servicios`:
arrancarlo necesita el [[service]] del SDD 30 con su app.ini, y declarar un arranque que no existe
sería la mentira que ese campo existe para no tener.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016Tf9T4vGzsMoT7eS8YzMFn
This commit is contained in:
Sergio
2026-09-14 14:17:52 +00:00
co-authored by Claude Opus 5
parent 0a75414da0
commit 74151a2b0c
2 changed files with 55 additions and 8 deletions
+8
View File
@@ -1287,6 +1287,14 @@ paquetes = [
# dependencias — y es el mismo que ya sirve los 19 dominios de gioser, así que la migración no
# cambia de servidor web además de cambiar de sistema.
"caddy",
# `gitea` (2026-09-14): el servidor git que hoy corre en gioser y que la mudanza tiene que levantar
# del otro lado. Entra al perfil porque es el PASO 1 del plan de mudanza visto por el lado bueno:
# los 26 repos que sólo existen en la máquina que se borra dejan de estar solos en cuanto su origen
# vive acá. Sus datos son 2,0 G de ficheros y una sqlite (`DB_TYPE = sqlite3`), así que mudarlos es
# copiar un directorio — lo que NO es trivial es el binario, ver el encabezado de `recipes/gitea.toml`.
# ⚠ Declarado como PAQUETE, todavía no en `servicios`: para arrancarlo hace falta el `[[service]]`
# del SDD 30 con su `app.ini`, su usuario y su ruta de datos. Instalado y sin levantar es honesto;
# ponerlo en `servicios` sin la Card sería declarar un arranque que no existe.
# `curl`/`wget`: bajar del mirror y del repo. `takana install --repo https://…` los necesita del
# lado del cliente, y son también la única forma de diagnosticar un origen caído desde la caja.
"curl", "wget",
+47 -8
View File
@@ -1,21 +1,60 @@
# Importada de nixpkgs por `takana import-nix` (Etapa G). PUNTO DE PARTIDA, no final:
# - el build usa el lab de takana (zig-cc / musl estático), NO el stdenv de nix ⇒ revisá
# compiler/link/phases y adaptá hasta que compile.
# - las deps van con su nombre NIX; remapealas a las recetas del corpus si difieren.
# gitea — el servidor git que hoy corre en gioser y que la mudanza tiene que levantar del otro lado.
#
# ══ POR QUÉ EL TARBALL DE RELEASE Y NO `repo` + `commit` ═══════════════════════════════════════
# El clon del repo NO alcanza para construir un gitea que sirva: la UI se compila con Node
# (`make frontend` ⇒ `public/assets/`) y las deps Go no están vendoreadas en git. El tarball
# `gitea-src-<ver>.tar.gz` que publica upstream trae las dos cosas ya hechas — medido sobre el de
# 1.27.0: `public/assets/` 764 entradas, `vendor/` 11246, `templates/` 663 — así que se construye
# con el lab tal cual, sin Node y sin red (`GOFLAGS=-mod=vendor GOPROXY=off`). Es también lo que
# hacen Alpine y nixpkgs. La URL es locator y no entra en `hash_inputs` (ADR 0013): lo que ancla
# la identidad es el `sha256`.
#
# ══ LOS TRES TAGS, Y POR QUÉ SIN ELLOS EL BINARIO SELLA Y NO SIRVE ═════════════════════════════
# La receta anterior (1.26.4, sin tags, CGO off) producía un gitea que construye, reproduce y
# **no puede abrir la base de datos**. Medido contra el binario sellado `b3:35bb4f04…`:
#
# $ gitea --config app.ini migrate
# Error: sqlite3 requires: -tags sqlite,sqlite_unlock_notify
# this Gitea binary was not built with SQLite3 support
#
# y `gitea --version` decía `version development` (sin el `-X main.Version`). gioser guarda sus 28
# repos con `DB_TYPE = sqlite3`, así que ese artefacto no sirve para la mudanza: es
# [[subcomando-sin-driver]] otra vez — sellado, con contenido, reproducible e inútil.
#
# · `sqlite` + `sqlite_unlock_notify` → el driver de mattn, que es C ⇒ obliga a `cgo = true`.
# · `bindata` → embebe `public/` y `templates/` en el binario. Sin él el
# servidor los busca en disco y la receta sólo publica el
# ejecutable: arrancaría sin UI.
#
# ⚠ La versión se PASA por `-ldflags -X`: no se deduce del árbol. Y no es cosmética — gitea migra
# el esquema hacia adelante al arrancar y se planta si la DB trae migraciones más nuevas que el
# binario, así que el pin tiene que ir por delante del que corre en el origen (gioser: 1.27.0).
name = "gitea"
version = "1.26.4"
version = "1.27.0"
license = "MIT"
[source]
repo = "https://github.com/go-gitea/gitea"
commit = "95ba37d9af58db7d9163f9e92e07b5eb4f792bbc"
tarball = "https://github.com/go-gitea/gitea/releases/download/v1.27.0/gitea-src-1.27.0.tar.gz"
sha256 = "012df875bfa7764ade92301ac5e4225fc2c2aab7b3b40b4d6e7149a926253496"
[build]
compiler = "zig-cc"
target = "x86_64-linux-musl"
link = "static"
flags = []
cgo = true # driver sqlite3 (mattn) con C bundled — necesita cgo, igual que usql/sq
# buildInputs de nix (no usados con CGO off): go
[deps]
build = ["go"]
[build.phases]
configure = "true"
compile = """
export GOCACHE=/src/.gocache GOTMPDIR=/src/.gotmp GOPATH=/tmp/gopath GOTOOLCHAIN=local \
CGO_ENABLED=1 CC="zig cc" CXX="zig c++" GOFLAGS=-mod=vendor GOPROXY=off
mkdir -p /src/.gotmp /out/usr/bin
go build -trimpath -tags 'bindata sqlite sqlite_unlock_notify' \
-ldflags '-buildid= -linkmode=external -extldflags=-static -X "main.Version=1.27.0" -X "main.Tags=bindata sqlite sqlite_unlock_notify"' \
-o /out/usr/bin/gitea .
"""
install = "true"