Blueforce-Linux/scripts/install
emirhanmamak-blueforce 06c96690ca fix(offline): keep the package payload out of a clone, and say so when it is missing
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.
2026-09-16 22:41:53 +03:00
..
installer feat(offline-repo): build the APT index so installs work without network 2026-09-16 21:42:27 +03:00
optional/anydesk feat(field-os): provisioning layer, real ISO build, offline contracts 2026-09-16 11:14:42 +03:00
.gitkeep docs: Blueforce 700-device fleet architecture (TR) - GNOME baseline 2026-09-15 17:03:02 +03:00
blueforce-install.sh fix(offline): keep the package payload out of a clone, and say so when it is missing 2026-09-16 22:41:53 +03:00
README.md feat(install): internet-free install flow, auto-discovered local packages 2026-09-16 16:53:24 +03:00

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-id tek 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 --yes ekleyin.
  • Kurulum bittiğinde cihaz yerinde kurulmuş olur ve PROVISIONED_OFFLINE durumuna 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-precheck modülü interneti sadece bilgi olarak yazar. 05-network modü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:

  1. Depoyu tam olarak çekin (git pull) veya repo sorumlusunun verdiği kopyayı /opt/blueforce/offline-repo altına koyun.
  2. 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.