---
name: adopt-service
description: Przenosi do repo usługę, która już działa na serwerze (kontener albo projekt docker compose), jako stack hosts/<host>/services/<stack>/ - tak, żeby pyinfra --dry pokazał zero zmian. Używaj, gdy użytkownik chce "przenieść do pyinfra", "zakodować", "objąć zarządzaniem" coś działającego, opisać w repo kontener z tabeli "Kontenery spoza repo" albo pyta, jak zacząć zarządzać konkretną aplikacją.
---

# Adopcja usługi

Opisujesz w repo to, co już działa, i udowadniasz to suchym przebiegiem. Gotowe, gdy
`pyinfra inventory.py deploys/compose_stacks.py --limit <host> --data only=<stack> --dry` ma w kolumnie
Change same `-` (`1` w Conditional Change jest w porządku). Host w observe: `--data adopt_check=true`;
przed utworzeniem sekretu: `--data no_secrets=true`.

- Tylko `--dry`, nigdy `-y`. Pierwszy deploy i przełączenie na `managed` to decyzje użytkownika.
- Pliki z serwera czytasz przez `python tools/host_exec.py <host> [--sudo] -- cat <ścieżka>`. Linia
  zamaskowana przez narzędzie to sekret - wartość wpisuje użytkownik do sops.
- `.env` z serwera nie wyświetlasz; nazwy zmiennych są w facts.yaml (`env_var_names`).
- Jedna usługa naraz. Bez poprawiania w trakcie - ulepszenia zapisujesz na później.
- Tylko compose. Usługa natywna (pakiet + OpenRC/systemd) albo konfiguracja systemu to jednostka
  `hosts/<host>/system/<unit>.yaml` (`deploys/system_units.py`, wzór `templates/system/unit.yaml`).

1. Wybierz usługę z tabeli "Kontenery spoza repo" w README hosta. Fakty starsze niż kilka dni:
   `python tools/collect_facts.py <host>`.
2. Ścieżki: `compose_file` i `compose_workdir` z faktów, do tego każdy plik montowany do kontenerów.
   Danych (bazy, uploady) nie przenosisz.
3. `hosts/<host>/services/<stack>/`, nazwa = projekt compose. Inny katalog niż `<stacks_dir>/<stack>`:
   `remote_dir` w stack.yaml. Przeprowadzki nie robisz przy adopcji.
4. Pliki 1:1, bajt w bajt. Configi do `files:` z `mode` jak na serwerze (`stat -c '%a' <plik>`).
5. Sekrety: nazwy zmiennych dla użytkownika i `python tools/edit_secret.py <host> <stack>`.
6. `--dry` aż do zera. Każdą różnicę wyjaśnij: [references/patterns.md](references/patterns.md).
   Różnicę, której nie da się usunąć bez zmiany na serwerze, opisz i zostaw użytkownikowi.
7. README stacka wg szablonu (ważne: gdzie dziś są dane i czy ktoś je backupuje), zdanie z linkiem
   w README hosta, `python tools/build_docs.py`.
8. Podsumowanie: wynik `--dry`, `git diff --stat`, commit `stack(<host>/<stack>): adopt` po zgodzie.
