# Offline APT deposu (paketler git ile taşınır) Saha cihazı internetsiz kuruluyor. Bu dizin, kurulumda kullanılacak Ubuntu paketlerini ve bunların APT indeksini **bu git deposunun içinde** taşır. İki kural: 1. **Paketleri repo sorumlusu toplar** ve bu dizine commit eder (Ubuntu makinesi gerekir). 2. **Kuran kişi hiçbir şey indirmez.** Cihazdaki kurucu yalnızca git'ten gelen yerel depoyu okur; internet, apt kaynağı, anahtar indirme, `apt download` gibi hiçbir yol kullanılmaz. ## Roller | Rol | Kimdir | Ne yapar | |---|---|---| | Repo sorumlusu | bu depoyu yöneten kişi | Ubuntu 26.04 makinesinde paketleri toplar, doğrular, indeksi üretir, commit eder | | Kuran kişi | sahada cihazı kuran teknisyen | ISO/seed ile kurar, `blueforce-install.sh --dealer-id ` çalıştırır (kurucu yerel depoyu kendisi bulur); paket aramaz, depoyu göstermek veya indirmek zorunda değildir | ## Dosya haritası | Dosya / dizin | Ne işe yarar | Kim çalıştırır | |---|---|---| | `packages/` | Doğrulanmış `.deb` dosyaları (kaynak havuz) | repo sorumlusu (`add-packages.sh` ile doldurur) | | `add-packages.sh` | `.deb` doğrular, `packages/` altına ekler, Türkçe rapor verir | repo sorumlusu (Ubuntu) | | `build-index.sh` | `packages/`tan offline indeksi üretir (`built/`), `repo-manifest.yaml` yazar | repo sorumlusu (Ubuntu) | | `built/` | Git'e giren hazır depo: `pool/`, `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS` | üretilir | | `repo-manifest.yaml` | Deponun künyesi: sürüm, mimari, paket listesi, boyut, tarih | `build-index.sh` üretir | | `build-offline-repo.sh` | Sözleşme doğrulayıcı (`--dry-run-plan`) ve alternatif derleyici | repo sorumlusu / CI | | `manifests/*.txt` | Pin listesi: `paket=sürüm`. Cihazda **ne olması gerektiği** | repo sorumlusu doldurur | | `manifests/requirements.tsv` | Hangi paket neden gerekli (denetim tablosu) | insan okur | | `manifests/packages.lock.schema.tsv` | `packages.lock.tsv` biçiminin tanımı | insan okur | | `packages/.gitkeep` | Boş dizinin git'te durması için yer tutucu | — | --- # 1. Repo sorumlusu: sıfırdan adım adım ## 1.0 Gereksinimler * Ubuntu 26.04 LTS makinesi, mimari **amd64**, internet erişimi var (paketleri toplamak için). Docker CE ve RustDesk paketleri Ubuntu arşivinde değildir; aşağıda ayrı anlatılıyor. * Şu iki araç kurulu olmalı: ```bash sudo apt-get install -y dpkg apt-utils dpkg-deb --version # okunur: .deb künyesini okur apt-ftparchive --version # okunur: APT indeksini üretir ``` CachyOS/Arch gibi bir makinede `apt-ftparchive` ve `dpkg-deb` yoktur; orada paket toplanamaz ve indeks üretilemez. Toplama işi Ubuntu makinesinde yapılır, sonuç bu depoya commit edilir. ## 1.1 Paketleri indir Çalışma dizini açın: ```bash mkdir -p ~/bf-debs && cd ~/bf-debs ``` Hangi sürümün "aday" olduğunu görün (pini bu sürümle dolduracaksınız): ```bash apt-cache policy openssh-server | head -n 3 ``` Paketleri **ve bağımlılıklarını** indirin (`--download-only` hiçbir şey kurmaz): ```bash sudo apt-get install --download-only --reinstall -y \ curl wget ca-certificates gnupg lsb-release apt-transport-https \ openssh-server wireguard-tools smartmontools ufw iptables \ prometheus-node-exporter xrdp xorgxrdp gnome-session ubuntu-desktop-minimal cp /var/cache/apt/archives/*.deb ~/bf-debs/ rm -f ~/bf-debs/*partial* ``` `ubuntu-desktop-minimal` çok sayıda bağımlılık getirir; bu normaldir ve offline kurulum için gereklidir. **Docker CE** (Ubuntu arşivinde yok, Docker deposundan gelir): ```bash sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg \ | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \ | sudo tee /etc/apt/sources.list.d/docker.list sudo apt-get update sudo apt-get install --download-only --reinstall -y \ docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin cp /var/cache/apt/archives/*.deb ~/bf-debs/ ``` `containerd.io` Docker'ın kendi çalışma zamanıdır; Ubuntu'nun `containerd` paketi ile karıştırmayın. **RustDesk** (Ubuntu arşivinde yok, üretici `.deb` dosyası): * Projenin sürüm sayfasından amd64 paketini indirin: `https://github.com/rustdesk/rustdesk/releases` → `rustdesk--x86_64.deb` * Dosyayı `~/bf-debs/` içine kopyalayın. Kullanılacak sürüm, incelenmiş (self-hosted sunucuya bağlanan) istemci sürümü olmalıdır. ## 1.2 Paketleri depoya ekle ```bash cd provisioning/offline-repo # Ön izleme: hiçbir dosya kopyalanmaz, ne olacağını söyler ./add-packages.sh --from ~/bf-debs --check # Gerçek ekleme (pinlenen + bağımlılıklar) ./add-packages.sh --from ~/bf-debs ``` Yalnız manifestte pinlenen paketleri eklemek isterseniz: ```bash ./add-packages.sh --from ~/bf-debs --manifest manifests/base-packages.txt # bağımlılıkları da eklemek için sonuna --include-all ekleyin ``` Araç her dosyayı denetler ve Türkçe yazar: * `EKLENDİ:` → eklendi, * `ATLANDI: aynı dosya zaten repoda` → tekrar eklemeye çalıştınız (zararsız), * `HATA: mimari uyumsuz` → paket `amd64`/`all` değil; o dosyayı kullanmayın, * `HATA: çakışma: repoda ile duruyor` → aynı paketin ikinci bir sürümü. Manifestler tek sürüm pinler, bu yüzden otomatik üzerine yazılmaz; ekranda yazan `rm` komutu ile eski dosyayı kaldırıp yeniden ekleyin, * `ATLANDI: manifestte istenen sürüm farklı` → manifestteki pin başka bir sürümü istiyor; pini güncelleyin ya da doğru sürümün `.deb` dosyasını indirin. Sonda `MANIFEST GÜNCELLEMESİ GEREKİYOR` listesi çıkar: bu araç manifest dosyalarını **değiştirmez**, yalnızca yazmanız gereken satırı söyler. ## 1.3 Manifest pinlerini doldur `manifests/base-packages.txt`, `remote-access.txt`, `docker.txt` içindeki her satır şu biçimdedir: ```text openssh-server=UNPINNED ``` `UNPINNED` bir yer tutucudur, sürüm değildir. `add-packages.sh` çıktısındaki listeyi kullanarak gerçek sürümü yazın: ```text openssh-server=9.6p1-3ubuntu13 ``` Kurallar: küçük harfli paket adı, `=` çevresinde boşluk yok, satır sonuna not yazılmaz, bir paket yalnızca bir manifestte pinlenir. Yeni paket ekler/çıkarırsanız `manifests/requirements.tsv` tablosunu **aynı işlemde** güncelleyin. Kontrol: ```bash ./build-offline-repo.sh --dry-run-plan # PLAN READY görmelisiniz ``` `PLAN READY` görünene kadar derleme yapmayın. Bir sürümden emin değilseniz elinizdeki dosyadan okuyun: ```bash dpkg-deb -f ~/bf-debs/openssh-server_*.deb Package Version Architecture ``` ## 1.4 İndeksi üret ```bash ./build-index.sh --check # yalnızca doğrular, hiçbir şey yazmaz ./build-index.sh # built/ altına indeksi yazar ``` Çıktı: ```text built/pool/*.deb paketlerin kopyası built/Packages APT indeksi (apt-ftparchive) built/Packages.gz sıkıştırılmış indeks (zaman damgasız) built/packages.lock.tsv SBOM: package/version/architecture/sha256/source built/SHA256SUMS indeks dosyalarının özetleri repo-manifest.yaml deponun künyesi (güncellenir) ``` Araç fail-closed çalışır: * manifestteki bir pin repoda yoksa **hiçbir şey yazmaz** ve eksikleri liste hâlinde söyler (`manifestlerde istenen şu paketler eksik:`), * bir pin hâlâ `UNPINNED` ise yine yazmaz; önce manifesti doldurun, * aynı havuzla tekrar çalıştırıldığında indeks birebir aynı çıkar; içerik değişmediyse `DEĞİŞİKLİK YOK` yazar ve dizini yeniden yazmaz. ## 1.5 Git'e ekle ve commit et ```bash # Paketler ve manifestler: git add provisioning/offline-repo/packages provisioning/offline-repo/manifests # İndeks: .gitignore, Packages / Packages.gz / packages.lock.tsv adlarını her # dizinde yok sayar (eski LAB akışından kalma kural), bu yüzden -f gerekir: git add -f provisioning/offline-repo/built git add provisioning/offline-repo/repo-manifest.yaml git commit -m "offline repo: paket, offline APT indeksi" ``` `build-index.sh` çalıştığınızda bu komutları ekrana da yazar (kopyala-yapıştır). `.gitignore` dosyasının sahibi isterse bu üç ad için daha sonra istisna kuralı ekleyebilir; o zaman `-f` gereksizleşir. ## 1.6 Bitirmeden önce kontrol ```bash bash tests/check-offline-repo-static.sh ./build-offline-repo.sh --dry-run-plan cd built && sha256sum -c SHA256SUMS # OK görmelisiniz ``` --- # 2. Kuran kişi neden hiç indirme yapmaz * Saha cihazında internet yok (ya da güvenilmez). Bu yüzden kurulumun ihtiyaç duyduğu her şey **medyanın ve git deposunun içinde** taşınır. * Kurucu paket setini **kendi kendine bulur**; `--offline` bayrağı artık gerekmez (geriye uyumluluk için duruyor ve yalnızca yerel depoyu zorlar). Arama sırası — ilk eksiksiz aday kazanır: | Sıra | Yer | Ne zaman kullanılır | |---|---|---| | 1 | `BF_OFFLINE_REPO` ortam değişkeni | Repo sorumlusu bilinçli olarak başka bir dizin verdiyse | | 2 | `/provisioning/offline-repo/built` | Normal durum: git checkout'un içindeki hazır set | | 3 | `/opt/blueforce/offline-repo` | Paket seti cihaza ISO/medya ile kopyalanmışsa | * Kurucu yerel depo dışında hiçbir kaynak kullanmaz: uzak APT kaynağı, anahtar indirme, `curl`, `wget`, `apt download` çağrılmaz. Cihazdaki tek APT kaynağı `deb [trusted=yes] file: ./` satırıdır. İnternet kurulum için gerekmez. * Kurucu şu dosyaları arar ve doğrular: `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS` ve `pool/` içinde manifestlerdeki pinlere karşılık gelen `.deb` dosyaları. * Kurucu kurulum sonunda cihazı `PROVISIONED_OFFLINE` durumuna getirir. Cihaz, bir kerelik enrollment ve merkezi kanal doğrulaması yapılmadan `READY` olmaz. * Sonuç: kuran kişinin yaptığı tek şey `git`/ISO'dan gelen dosyaları yerine koymak ve kurucuyu çalıştırmaktır. **Hiçbir şey indirmez, depoyu elle göstermek zorunda değildir.** Hangi sürümün kurulduğu `packages.lock.tsv` ve `repo-manifest.yaml` ile kanıtlanır. Kuran kişinin komutu (bayrak gerekmez): ```bash sudo ./scripts/install/blueforce-install.sh --dealer-id <8 haneli numara> ``` Konsoldan kullanmak için: `sudo bf` (Python operatör konsolu; bash yedek yolu `sudo bf --tui`). Depo bulunduğunda kurucu şu duyuruyu yazar: ```text Yerel paket deposu bulundu: paket, Depo : Kaynak : Kip : yerel kurulum. İnternet, paket indirme ve ek anahtar gerekmez. ``` --- # 3. Eksik paket ya da eksik depo olursa ne olur? Cihazdaki kurucu, paket modüllerinden **önce** yerel depoyu arar ve doğrular. Burada **birbirinden farklı iki durum** vardır; ikisi de kurulumu başlatmadan durdurur ve sistemde hiçbir değişiklik bırakmaz, ama mesajları ve anlamları farklıdır. ## 3.1 Depo hiç yok (kurucu bulamadı) Aranan üç yer de yoksa — ya da var ama dizin `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS` dosyalarının hepsini taşımıyorsa — kurucu Türkçe yazar ve `exit 1` verir: ```text HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md Kurulum paketleri yalnız yerel depodan kurar; bu makinede internetten paket alınmaz. Depo olmadığı için paket adımları çalışamaz. Aranan yerler: - depodaki hazır paket seti — yok: /provisioning/offline-repo/built - cihazdaki kurulu paket deposu — yok: /opt/blueforce/offline-repo ... ÇIKIŞ NEDENİ: yerel paket deposu bulunamadı. ``` Var olan ama eksiksiz olmayan bir dizin, "Aranan yerler" listesinde şu satırla görünür (yine de kurulum başlamaz): ```text - depodaki hazır paket seti — eksik/bozuk: (Packages, Packages.gz, packages.lock.tsv ve SHA256SUMS dosyalarının hepsi gerekli) ``` Anlamı: **kurucu paket setini bulamadı.** Sistem değişmedi; yapılacak şey depoyu tam olarak getirmektir (git'ten veya repo sorumlusunun verdiği kopyayı `/opt/blueforce/offline-repo` altına koyarak) ve komutu tekrar çalıştırmaktır. ## 3.2 Depo bulundu ama doğrulanamadı (`OFFLINE BLOCKED`) Depo bulunduysa (dört indeks/kilit dosyası da var) kurucu onu baştan sona doğrular. Doğrulama katmanı geçmezse kurulum durur ve ekrana **`OFFLINE BLOCKED`** ile başlayan bir satır yazar. `OFFLINE BLOCKED` demek: "depo bulundu ama güvenilir değil; cihazda kurulum yapılmadı, sorumluya haber verin". ```text OFFLINE BLOCKED: Depo : Ne yapmalı : paket setini yeniden üretip git ile getirin (provisioning/offline-repo/README.md) ÇIKIŞ NEDENİ: yerel paket deposu doğrulanamadı; kurulum başlamadı ve sistemde hiçbir değişiklik yapılmadı. ``` Doğrulama katmanının **gerçek** sebepleri (mesajdaki ``): | Ekranda ne yazar (kısaltılmış) | Ne anlama gelir | Sorumlu tarafında çözüm | |---|---|---| | `BF_OFFLINE_REPO mutlak bir yerel dizin olmalıdır.` | `BF_OFFLINE_REPO` ile verilen yol mutlak bir dizin değil | Doğru yolu verin ya da değişkeni kaldırın; varsayılan keşif kullanılsın | | `Yerel APT indeksi, kilit dosyası ya da checksum kaydı eksik; paket seti tamamlanmamış.` | `Packages`, `Packages.gz`, `packages.lock.tsv` veya `SHA256SUMS` boş/eksik | `./build-index.sh` çalıştırıp `built/` dizinini commit edin | | `Yerel APT deposunun checksum doğrulaması başarısız.` | Dosyalar elle değişmiş ya da kopyalama bozulmuş (`sha256sum -c SHA256SUMS` hatası) | Depoyu git'ten yeniden alın; indeksi yeniden üretin | | `Paket kilidi boş ya da biçimi bozuk.` | `packages.lock.tsv` başlığı/kolonları bozuk ya da dosya boş | `./build-index.sh` ile yeniden üretin, elle düzenlemeyin | | `Kilitte yazılı paket depoda yok: ().` | Kilit dosyasındaki bir satırın `.deb` dosyası `pool/` içinde yok | `add-packages.sh` ile paketi ekleyip indeksi yeniden üretin | | `Gerekli pin manifestosu boş: .` | `manifests/*.txt` dosyalarından biri boş | Pini doldurun; `requirements.tsv` ile birlikte güncelleyin | | `Gerekli pin manifestosunda paket pini yok: .` | Manifestte yalnız yorum satırı var, paket pini yok | Manifeste `paket=sürüm` satırlarını yazın | | `Geçersiz paket pini: içinde ''.` | Pin biçimi bozuk ya da `placeholder`/`REPLACE` içeriyor | Satırı `paket=sürüm` biçimine getirin | | `Pinlenen paket depoda yok: =.` | Manifestteki sürüm depoda yok: pin ile paket eşleşmiyor | `add-packages.sh` ile doğru sürümü ekleyip pini güncelleyin | Yani "eksik paket" sahada değil, **commit öncesinde** çözülür: `./build-index.sh` eksikleri listeler ve yazmadan durur. Sahada `OFFLINE BLOCKED` görürseniz depo, bilgi eksik ya da bozuk bir hâlde yayınlanmış demektir; çözüm depoyu düzeltip yeni bir sürüm yayınlamaktır. ## 3.3 Kuran kişi ne yapar? Hiçbir şey indirmez: ne `.deb`, ne anahtar, ne APT listesi. Paketler zaten git deposunun içinde taşınır ve kurucu yerel depoyu kendisi bulur. Depo yoksa veya `OFFLINE BLOCKED` görürse yapılacak tek şey **ekrandaki mesajı repo sorumlusuna iletmektir**; düzeltme sorumlunun işidir. Kurulum yapan kişi yalnız komutu tekrar çalıştırır: ```bash sudo ./scripts/install/blueforce-install.sh --dealer-id <8 haneli numara> ``` --- # 4. Hangi paketler gerekli ve neden? Liste `manifests/requirements.tsv` dosyasının okunabilir hâlidir; kaynak doğrudur. Her satır bir `paket=sürüm` pinidir ve kurucu bu pinlerin **tamamını** depoda arar; biri eksikse `OFFLINE BLOCKED` ile durur. ## Temel araçlar — `manifests/base-packages.txt` | Paket | Neden gerekli | Nerede kullanılır | |---|---|---| | `curl` | HTTPS aktarımı yapan temel araç | `02-system.sh` | | `wget` | Saha runbook'larının beklediği dosya çekme aracı | `02-system.sh` | | `ca-certificates` | TLS doğrulaması için kök sertifika deposu | `02-system.sh` | | `gnupg` | İncelenmiş dosyaların imza işlemleri | `02-system.sh` | | `lsb-release` | Dağıtım sürümünü tanıma | `02-system.sh` | | `apt-transport-https` | apt 2.0+ üzerinde geçiş (dummy) paket; referans derlemeyle uyum için tutuluyor | `02-system.sh` | | `openssh-server` | Yönetilen SSH erişim kanalı | `07-ssh.sh` | | `wireguard-tools` | `wg` komutu (VPN tüneli) | `06-wireguard.sh` | | `smartmontools` | Disk sağlığı kanıtı (SMART) | `scripts/diagnostics/bf-diagnostics` | | `ufw` | Güvenlik duvarı temeli | `13-firewall.sh` | | `iptables` | Güvenlik duvarı kural arka ucu | `13-firewall.sh` | | `prometheus-node-exporter` | Cihaz metrikleri (textfile collector paketin içinde) | `12-monitoring.sh` | ## Uzak erişim ve masaüstü — `manifests/remote-access.txt` | Paket | Neden gerekli | Nerede kullanılır | |---|---|---| | `xrdp` | RDP erişim kanalı | `08-rdp.sh` | | `xorgxrdp` | xRDP için X11 arka ucu (bağımlılık kapatması LAB'da doğrulanır) | `08-rdp.sh` | | `gnome-session` | xRDP oturumunda başlatılan masaüstü oturumu | `08-rdp.sh` | | `ubuntu-desktop-minimal` | En küçük masaüstü yığını | `16-gui.sh` | | `rustdesk` | Uzak masaüstü istemcisi. **Ubuntu arşivinde yoktur**: üreticinin incelenmiş `.deb` dosyası | `09-rustdesk.sh` | ## Docker CE — `manifests/docker.txt` | Paket | Neden gerekli | Nerede kullanılır | |---|---|---| | `docker-ce` | Konteyner motoru | `10-docker.sh` | | `docker-ce-cli` | `docker` komutu | `10-docker.sh` | | `containerd.io` | Docker CE ile gelen çalışma zamanı (Ubuntu'nun `containerd` paketi değil) | `10-docker.sh` | | `docker-buildx-plugin` | buildx eklentisi | `10-docker.sh` | | `docker-compose-plugin` | Compose v2 eklentisi | `10-docker.sh` | Notlar: * Pinler sürüm doldurulmadan `UNPINNED` görünür ve bu hâlde derleme yapılmaz. * Bu 22 paketin dışındaki paketler (bağımlılıklar) da depoda bulunur; ancak yalnız **pinlenen 22 paket** sözleşmedir. * Çekirdek modülleri gibi `.deb` olarak taşınmayan dosyalar bu deponun kapsamı dışındadır. --- # 5. `repo-manifest.yaml` ve `built/` nedir? * `repo-manifest.yaml` = deponun künyesi (kimlik kartı): hedef Ubuntu sürümü, mimari, kaç paket, toplam boyut, üretim tarihi ve her paketin adı/sürümü/ sha256'sı. ISO release manifesti ve denetim kaydı ile birlikte saklanır. * `built/` = cihaza gidecek depo. Hedef cihazda `/opt/blueforce/offline-repo` olur; içinde `pool/`, `Packages`, `Packages.gz`, `packages.lock.tsv`, `SHA256SUMS` bulunur. Kurucu bu dosyaları `sha256sum -c SHA256SUMS` ile ve manifestteki her pini `pool/` içindeki bir dosyayla eşleştirerek doğrular. --- # 6. Sık karşılaşılan durumlar | Belirti | Neden / çözüm | |---|---| | `apt-ftparchive bulunamadı` | Ubuntu makinesinde kurun: `sudo apt-get install -y apt-utils` | | `dpkg-deb bulunamadı` | `sudo apt-get install -y dpkg` (Arch/CachyOS'ta yoktur; orada derleme yapılamaz) | | `git add` indeks dosyalarını almıyor | `.gitignore` bu adları yok sayıyor; `git add -f provisioning/offline-repo/built` kullanın | | `HATA: çakışma` | Aynı paketin ikinci sürümü eklenmeye çalışıldı. Manifestler tek sürüm pinler; ekrandaki `rm` ile eskiyi kaldırın | | `mimari uyumsuz` | Yalnız `amd64` ve `all` kabul edilir; `arm64`/`i386` paketi eklemeyin | | `manifestlerde istenen şu paketler eksik` | Paketi indirip `add-packages.sh` ile ekleyin; pin hâlâ `UNPINNED` ise sürümü yazın | | ISO betiği depoyu bulamıyor | `provisioning/iso/build-blueforce-iso.sh` şu an `provisioning/offline-repo/build` adını arıyor; `built/` kullanacaksanız `./build-index.sh --output build` ile de üretin ya da ISO betiğinin otomatik bulma yolunu güncelleyin | | Depo boyutu beklenenden büyük | `packages/` ve `built/pool/` aynı `.deb` dosyalarını iki kez tutar (git içeriği bir kez saklar, çalışma kopyasında iki dosya durur). Kasıtlıdır: biri kaynak, diğeri teslim depo | --- # 7. Commit öncesi kontrol listesi - [ ] `./add-packages.sh --from --check` temiz geçti. - [ ] `manifests/*.txt` içinde `UNPINNED` kalmadı. - [ ] `./build-offline-repo.sh --dry-run-plan` → `PLAN READY`. - [ ] `./build-index.sh` eksiksiz geçti, eksik paket listesi boş. - [ ] `cd built && sha256sum -c SHA256SUMS` → `OK`. - [ ] `repo-manifest.yaml` güncel (paket sayısı ve tarih yazılmış). - [ ] `bash tests/check-offline-repo-static.sh` geçti. - [ ] Commit: paketler, manifestler, `built/` (`-f` ile) ve `repo-manifest.yaml`.