# Updates

Lalabase aktualisierst du, indem du das neue Image ziehst und die Migrationen ausführst.

## Vor dem Update

<div class="docs-callout docs-callout--warning">
  <div class="docs-callout__title">Immer zuerst sichern</div>
  <p>Lege vor jedem Update ein frisches <a href="https://lalabase.com/docs/de/self-hosting/operation/backups">Backup</a> an. Datenbank-Migrationen sind nicht immer rückwärtskompatibel.</p>
</div>

## Update durchführen

```bash
# Neue Version ziehen
docker compose pull

# Container mit neuem Image neu starten
docker compose up -d

# Migrationen ausführen
docker compose exec web bin/rails db:migrate
```

## Datenaufgaben nach der Migration

Manche Updates bringen neben den Migrationen eine **einmalige Datenaufgabe** mit. Sie steht
getrennt, weil sie Daten umschreibt und nicht das Schema, und sie gehört unmittelbar hinter
`db:migrate`. Alle diese Aufgaben sind idempotent: ein zweiter Lauf kostet nichts.

**Dieses Update bringt zwei mit.** Der Betreiber-Schalter für die Code-Indexierung heißt
jetzt `code_indexing_enabled`; er hieß vorher nach einer Oberfläche, die es nicht mehr
gibt. Die Aufgabe kopiert den alten Wert in die neue Spalte:

```bash
docker compose exec web bin/rails organisations:backfill_code_indexing DRY_RUN=1
docker compose exec web bin/rails organisations:backfill_code_indexing
```

<div class="docs-callout docs-callout--warning">
  <div class="docs-callout__title">Ohne diesen Lauf schaltet sich die Code-Indexierung ab</div>
  <p>Die Umbenennung läuft über drei Versionen. Der Zwischenschritt liest beide Spalten, damit nichts ausfällt. Wer den Lauf überspringt und die übernächste Version einspielt, dessen Organisationen verlieren die Code-Indexierung stillschweigend: die neue Spalte ist leer, und die alte wird nicht mehr gelesen. Der Lauf repariert das jederzeit nachträglich, und ein zweiter Lauf kostet nichts.</p>
</div>

**Codebase-Importe.** Die Zuordnungen eines CodebaseHQ-Imports gehören jetzt zu der
Organisation, die importiert hat. Vorher konnte der Import einer Organisation Tickets,
Abrechnungsgruppen und Personen einer anderen Organisation aufgreifen, wenn beide denselben
Export eingespielt hatten. Die Aufgabe ordnet die bestehenden Zuordnungen zu und listet
importierte Zeitbuchungen, die ein früherer Import über Organisationsgrenzen verknüpft hat;
diese Buchungen ändert sie nicht:

```bash
docker compose exec web bin/rails codebase_import:scope_mappings DRY_RUN=1
docker compose exec web bin/rails codebase_import:scope_mappings
```

<div class="docs-callout docs-callout--warning">
  <div class="docs-callout__title">Vor dem nächsten Import ausführen</div>
  <p>Bis zu diesem Lauf sieht ein neuer Import die alten Zuordnungen nicht und legt schon importierte Tickets noch einmal an. Personen, die sich keiner Organisation eindeutig zuordnen lassen, bleiben ohne Zuordnung; ein erneuter Benutzer-Import in der Organisation ordnet sie per E-Mail wieder zu.</p>
</div>

## Architektur beachten

Lalabase wird auf x86_64 betrieben. Baust du eigene Images, baue sie immer auf der
**Zielarchitektur** — native Erweiterungen sind nicht zwischen ARM und x86_64 übertragbar.

## Rollback

Geht etwas schief, setze auf das vorherige Image-Tag zurück und stelle bei Bedarf das
Backup wieder her. Pinne in der Produktion konkrete Versions-Tags statt `latest`, damit
Rollbacks reproduzierbar bleiben.

Eine Ausnahme betrifft die Hilfetexte, die der Assistent liest. Lalabase gleicht sie nie
von selbst an ältere Dateien an, damit ein Prozess der alten Version während eines Updates
nichts zurückdreht. Nach einem Rollback liest der Assistent deshalb die neueren Texte weiter,
bis du sie abgleichst:

```bash
docker compose exec web bin/rails product_knowledge:sync
```
