The bundle pool is ~884 MB and now travels through Git LFS, so a plain clone materialises all of it. Measured on this repository: 2.7 GB working tree, against 20 MB with smudge disabled -- the same 135x that decides whether one device or seven hundred can be provisioned from a git remote. bf-bootstrap exports GIT_LFS_SKIP_SMUDGE=1 for every git operation it performs (clone and fetch), so provisioning a device no longer implies downloading the package payload. The trade is explicit and documented rather than hidden: with smudge off the pool files on disk are 131-byte pointer texts, and the installer must not mistake one for a package. So the installer gained a guard. A pointer text satisfies every existence check, so without it the run died later inside `sha256sum -c` and reported a checksum mismatch -- a misdiagnosis that sends an operator looking for corruption when the payload was simply never fetched. It now recognises the pointer by content and names the remedy instead. Getting the payload is a deliberate second step, and both documented routes are real: a local mirror (the offline-correct path, and the one the fleet uses) or `git lfs pull --include='provisioning/offline-repo/built/pool/*'`, which fetches only the delivery pool and leaves the intake copy under packages/ unfetched -- verified: 1.8 GB and a real .deb in built/pool, 131-byte stub still in packages/. Tests: test-field-os-lifecycle.sh gains a scenario that lays down a pointer text where a .deb belongs and asserts three things -- the run refuses, the message names the cause, and it does not blame a checksum. Also asserts apt-get is never invoked. 16 scenarios, all passing. docs/27 is corrected where it had gone stale: it claimed a clone carries the packages and the installer downloads nothing, which stopped being true the moment the payload moved to LFS. |
||
|---|---|---|
| .. | ||
| installer | ||
| optional/anydesk | ||
| .gitkeep | ||
| blueforce-install.sh | ||
| README.md | ||
Blueforce kurulumu (scripts/install/)
Bu klasör cihazı kuran betiği içerir. Kurulumu yapan kişinin bilmesi gereken her şey bu sayfada.
1. Kurulum yapan kişi ne yapar?
Tek komut:
sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678
--dealer-idtek zorunlu bilgidir: 8 haneli bayi numarası.- Betik numaradan ana makine adını (
bf-12345678) ve cihaz kimliğini (BF-12345678) kendisi üretir. - Kurulum sırasında başka hiçbir soru sorulmaz. Onay istemeyen (fabrika/otomatik)
senaryoda sonuna
--yesekleyin. - Kurulum bittiğinde cihaz yerinde kurulmuş olur ve
PROVISIONED_OFFLINEdurumuna geçer. Cihazın READY sayılması için merkeze kayıt (enrollment) gerekir; bu ayrı bir adımdır, kuruluma dahil değildir.
Paket aramaz, paket indirmez, apt kaynağı eklemez, anahtar getirmez. Bunların hepsi zaten hazırdır.
2. Paketler nereden gelir?
Paketler git deposunun içinde taşınır:
provisioning/offline-repo/built/ hazır paket seti (pool/, Packages, SHA256SUMS, packages.lock.tsv)
Bunları repo sorumlusu hazırlar ve commit eder; kurulumu yapan kişi sadece depoyu çeker. Paket setinin nasıl üretildiği, hangi paketlerin neden gerektiği ve sorun giderme adımları:
provisioning/offline-repo/README.md
Kurucu paket setini kendi kendine bulur. Arama sırası:
| Sıra | Yer | Ne zaman kullanılır |
|---|---|---|
| 1 | BF_OFFLINE_REPO ortam değişkeni |
Repo sorumlusu farklı bir dizin verdiyse (nadir) |
| 2 | provisioning/offline-repo/built |
Normal durum: kurucu betiğin bulunduğu repo |
| 3 | /opt/blueforce/offline-repo |
Paket seti cihaza ISO/medya ile kopyalanmışsa |
Bulunan depo kurulumdan önce baştan sona doğrulanır: dosya listesi,
checksum (SHA256SUMS) ve pinlenen her paketin depoda gerçekten durması.
Doğrulama geçmezse kurulum hiç başlamaz.
3. İnternet gerekmez — neden?
- Sahada internet yok veya güvenilmez; kurulumun ihtiyaç duyduğu her paket yanında taşınır ve cihazdaki tek kaynak yerel depodur.
- Kurulum çalışırken Apt kaynakları yalnızca bu yerel depoyu gösterir. Dış adreslere, DNS çözümlemesine veya indirmeye ihtiyaç duyulmaz.
- Bu yüzden internet erişimi kontrolü kurulumu durdurmaz:
01-precheckmodülü interneti sadece bilgi olarak yazar.05-networkmodülü de bağlantı yokken geçer (yerel ağ, internet ve merkez bağlantısı ayrı ayrı raporlanır; hiçbiri kurulum için şart değildir). - Merkez bağlantısı (WireGuard, izleme, kayıt) kurulumdan sonra, enrollment aşamasında doğrulanır.
Yalnızca geliştirme/test makinesi için --online vardır: paketleri internetten
çeker. Üretimde kullanmayın — sahada kurulum yerel depodan yapılır.
4. Bir şey ters giderse
"Yerel paket deposu yok" hatası
HATA: Yerel paket deposu yok. Repo sorumlusuna başvurun: provisioning/offline-repo/README.md
Anlamı: cihazda kullanılacak paket seti yok. Kurulum başlamadı, sistemde hiçbir değişiklik yapılmadı. Yapılacaklar:
- Depoyu tam olarak çekin (
git pull) veya repo sorumlusunun verdiği kopyayı/opt/blueforce/offline-repoaltına koyun. - Komutu yeniden çalıştırın. Aynı numarayla devam edebilirsiniz.
Ekranda aranan yerlerin listesi yazar; o listeyi repo sorumlusuna iletmek yeterlidir.
OFFLINE BLOCKED mesajları
Depo bulundu ama eksik ya da bozuk demektir (checksum tutmuyor, pinlenen paket
depoda yok, kilit/indeks dosyası boş...). Kurulum yine başlamaz ve sistem
değişmez. Mesajın altındaki "Ne yapmalı" satırı depoyu nasıl düzelteceğinizi
söyler; ayrıntılı tablo provisioning/offline-repo/README.md içindedir.
Sahada çözülmez — depoyu düzeltip yeniden getirmek gerekir.
Kurulum kesildi, devam etmek istiyorum
sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678 --resume
--resume daha önce tamamlanmış adımları atlar. Bütün adımlar tekrar
çalıştırılabilir (idempotent); bir adımı iki kez çalıştırmak zarar vermez.
Kurulum yapıldı mı, kontrol etmek istiyorum
sudo ./scripts/install/blueforce-install.sh --dealer-id 12345678 --check
--check hiçbir şeyi değiştirmez (log, durum dosyası, dizin oluşturmaz);
yalnızca rapor verir. Denetim de aynı paket sözleşmesini doğruladığı için
depo yine gerekir.
Kayıtlar nerede?
| Ne | Yer |
|---|---|
| Kurulum günlüğü | /var/log/blueforce-install.log |
| Adım adım durum | /var/lib/blueforce/install-state |
| Cihaz durumu | /var/lib/blueforce/state.json |
5. Seçenekler (normalde gerekmez)
| Seçenek | Ne yapar |
|---|---|
--dealer-id NUMARA |
Zorunlu. 8 haneli bayi numarası. |
--yes, -y |
Onay sormadan başla. |
--check |
Salt okunur denetim. |
--from NN |
NN numaralı adımdan başla (örn. --from 06). |
--only AD |
Yalnız tek adımı çalıştır (örn. --only 05-network). |
--resume |
Daha önce tamamlanan adımları atla. |
--help, -h |
Yardım metni. |
--offline |
Yerel depoyu kullanmayı zorlar. Artık gerekmez; varsayılan davranış zaten budur (eski komutlar bozulmasın diye duruyor). |
--online |
Yalnız geliştirme/test: paketleri internetten çeker. Üretimde kullanılmaz. |
Kurulum sonucu: 0 başarılı · 1 kurulum durdu (depo ya da adım hatası) ·
2 komut/parametre hatası.
6. Kurulum adımları (modül haritası)
Her adım tekrar çalıştırılabilir ve --check destekler.
01-precheck · 02-system · 03-user · 04-hostname · 05-network ·
06-wireguard · 07-ssh · 08-rdp · 09-rustdesk · 10-docker · 11-meg ·
12-monitoring · 13-firewall · 14-update-policy · 15-logrotate ·
16-gui · 17-healthcheck · 18-final-check
Uzak erişim için her cihaza özel değerler gerekir: WG_ADDRESS, WG_ENDPOINT,
WG_PEER_PUBKEY, RUSTDESK_SERVER ve yerel RUSTDESK_DEB. Yer tutucu
değerler kabul edilmez; WireGuard erişimi BF_WG_HANDSHAKE_MAX_AGE saniyeden
(öntanımlı 180) daha yeni bir eş el sıkışması ister (REQUIRE_WIREGUARD=false
ile kapatılabilir).
Docker'ın dışa açtığı portlar öntanımlı olarak kapalıdır. Yalnız incelenmiş
tcp PORT / udp PORT satırları
/etc/blueforce/docker-published-port-allowlist.conf dosyasına eklenir;
blueforce-docker-firewall.service bu politikayı Docker her başladığında
yeniden uygular.
Not: AnyDesk bilinçli olarak yoktur. Uzak erişim SSH-over-WireGuard, xRDP ve RustDesk ile sağlanır; AnyDesk elle yapılan cihaz başına bir istisnadır.