Rediacc Kuralları
Her Rediacc deposu, kendi Docker daemon’ı, şifrelenmiş LUKS birimi ve ayrılmış IP aralığına sahip izole bir ortamda çalışır. Bu kurallar, uygulamanızın bu mimari içinde doğru şekilde çalışmasını sağlar.
Rediaccfile
- Her depo bir Rediaccfile’a ihtiyaç duyar, yaşam döngüsü fonksiyonlarına sahip bir bash betiği.
- Yaşam döngüsü fonksiyonları:
up(),down(). İsteğe bağlı:info(). up()servislerinizi başlatır.down()onları durdurur.info()durum bilgisi sağlar (konteyner durumu, son günlükler, sağlık).- Rediaccfile, renet tarafından source edilir, sadece ortam değişkenlerine değil, kabuk değişkenlerine de erişimi vardır.
Rediaccfile’da kullanılabilir ortam değişkenleri
| Değişken | Örnek | Açıklama |
|---|---|---|
REDIACC_WORKING_DIR | /mnt/rediacc/mounts/abc123/ | Bağlanmış deponun kök yolu |
REDIACC_NETWORK_ID | 6336 | Ağ izolasyon tanımlayıcısı |
REDIACC_REPOSITORY | abc123-... | Depo GUID’i |
{SVCNAME}_IP | HEARTBEAT_IP=127.0.24.195 | Servis başına loopback IP (servis adı büyük harfle) |
Minimal Rediaccfile
#!/bin/bash
_compose() {
renet compose -- "$@"
}
up() {
_compose up -d
}
down() {
_compose down
}
Compose
renet composekullanın, asladocker composekullanmayın, renet ağ izolasyonu, host ağı, loopback IP’leri ve servis etiketlerini enjekte eder.- Compose dosyanızda
network_modeayarlamayın, renet tüm servislerenetwork_mode: hostzorlar. Belirlediğiniz her değer üzerine yazılır. rediacc.*etiketleri ayarlamayın, renet otomatik olarakrediacc.network_id,rediacc.service_ipverediacc.service_nameenjekte eder.ports:eşlemeleri host ağ modunda yok sayılır. HTTP yönlendirmesi içinrediacc.service_portetiketini ekleyin (bu etikete sahip olmayan servisler HTTP rotaları almaz). TCP/UDP yönlendirme içinrediacc.tcp_ports/rediacc.udp_portsetiketlerini kullanın.- Yeniden başlatma politikaları (
restart: always,on-failure, vb.) kullanmak güvenlidir, renet bunları CRIU uyumluluğu için otomatik olarak kaldırır. Router watchdog,.rediacc.jsoniçinde kaydedilen orijinal politikaya göre durmuş konteynerleri otomatik olarak kurtarır. - Tehlikeli ayarlar varsayılan olarak engellenir,
privileged: true,pid: host,ipc: hostve sistem yollarına bind mount’lar reddedilir. Kendi sorumluluğunuzda geçersiz kılmak içinrenet compose --unsafekullanın.
Konteyner içindeki ortam değişkenleri
Renet bunları her konteynere otomatik olarak enjekte eder:
| Değişken | Açıklama |
|---|---|
SERVICE_IP | Bu konteynerin ayrılmış loopback IP’si |
REDIACC_NETWORK_ID | Ağ izolasyon ID’si |
Servis adlandırma ve yönlendirme
- Compose’daki servis adı, otomatik rota URL önekine dönüşür.
- Grand repos:
https://{service}.{repo}.{machine}.{baseDomain}(ör.:https://myapp.marketing.server-1.example.com). - Fork repos:
https://{service}-fork-{tag}.{repo}.{machine}.{baseDomain}(ör.:https://myapp-fork-staging.marketing.server-1.example.com).-fork-ayırıcısı, grand repo servis adlarıyla URL çakışmalarını önler. Fork URL’si her zaman üst deponun mevcut wildcard sertifikasını kullanır, bu nedenle yeni sertifika gerekmez. - Özel alan adları için Traefik etiketlerini kullanın (not: özel alan adları fork ile uyumlu DEĞİLDİR, alan adı grand repo’ya aittir).
Ağ
- Her depo kendi Docker daemon’ını alır,
/var/run/rediacc/docker-<networkId>.sockkonumunda. - Her servis bir /26 alt ağ içinde benzersiz bir loopback IP alır (örn.
127.0.24.192/26). - Bağlama otomatiktir: Servisler
0.0.0.0veyalocalhost’a bağlanabilir, çekirdek adresi şeffaf olarak servisin atanmış loopback IP’sine yeniden yazar.${SERVICE_IP}’ye açık bağlama hala çalışır ancak artık gerekli değildir. - Health check’ler
localhostveya${SERVICE_IP}kullanabilir. Örnek:healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] - Depolar arası bağlantılar çekirdek tarafından engellenir: Çekirdek, depo için
/26alt ağının dışındaki loopback IP’lerine yapılan bağlantıları otomatik olarak engeller. Bir depodaki servis başka bir depodaki servislere erişemez. - Servisler arası iletişim: Servis adlarını kullanın (ör.
db,redis), renet her servis adını otomatik olarak doğru IP’ye çözümlenen bir ana bilgisayar adı olarak enjekte eder. Docker DNS adları host modunda ÇALIŞMAZ, ancak/etc/hostsüzerinden servis adları çalışır. Kalıcı yapılandırma dosyalarına (ör. bir veritabanında saklanan bağlantı dizeleri)${DB_IP}veya benzerini gömmekten kaçının, fork yapıldığında ham IP taşınır ve yanlış depoya işaret eder. Servis adları her zaman depo başına doğru şekilde çözümlenir. - Depolar arasında port çakışmaları imkansızdır, her birinin kendi Docker daemon’ı ve IP aralığı vardır.
- TCP/UDP port yönlendirme: HTTP dışı portları açmak için etiketler ekleyin:
labels: - "rediacc.tcp_ports=5432,3306" - "rediacc.udp_ports=53"
Depolama
- Tüm Docker verileri şifreli depo içinde saklanır, Docker’ın
data-root’u LUKS birimi içindeki{mount}/.rediacc/docker/datakonumundadır. Adlandırılmış birimler, görüntüler ve konteyner katmanlarının tamamı şifrelenir, yedeklenir ve otomatik olarak fork’lanır. ${REDIACC_WORKING_DIR}/...bind mount’ları anlaşılırlık açısından önerilir, ancak adlandırılmış birimler de güvenle çalışır.volumes: - ${REDIACC_WORKING_DIR}/data:/data # bind mount (önerilen) - pgdata:/var/lib/postgresql/data # named volume (aynı zamanda güvenli)- LUKS birimi
/mnt/rediacc/mounts/<guid>/konumuna bağlanır. - BTRFS anlık görüntüleri, tüm bind mount verileri dahil olmak üzere LUKS destek dosyasının tamamını yakalar.
- Veri deposu, sistem diskindeki sabit boyutlu bir BTRFS havuz dosyasıdır. Etkin boş alanı görmek için
rdc machine query --name <name> --systemkullanın.rdc datastore resizeile genişletin.
CRIU (Canlı Geçiş)
- Etiketle etkinleştirme: Checkpoint almak istediğiniz konteynerlere
rediacc.checkpoint=trueekleyin. Bu etiketi olmayan konteynerler (veritabanları, önbellekler) temiz başlar ve kendi mekanizmalarıyla (WAL, LDF, AOF) kurtarılır. repo down --checkpointdurdurmadan önce süreç durumunu kaydeder, sonrakirepo upotomatik geri yükler. Bu, aynı makinedeki birincil akıştır ve çalıştığı doğrulanmıştır.backup push --checkpointetiketli konteynerler için çalışan süreçlerin bellek durumunu + disk durumunu yakalar, ardından birimi başka bir makineye aktarır. Hedef makinederepo upile geri yüklenir.repo fork --checkpointfork öncesi süreç durumunu yakalar ve checkpoint’i fork ile birlikte CoW-klonlar. ⚠️ Aynı makinede, ebeveyn hala çalışırken fork üzerindeki sonrakirepo upsu andacriu failed: type RESTORE errno 0ile başarısız olur. Upstream CRIU hataları checkpoint-restore/criu#478 / #514. Yerinde kayıt/geri yükleme içinrepo down --checkpoint, makineler arası geçiş içinbackup push --checkpointkullanın.repo upcheckpoint verilerini otomatik algılar ve bulunursa geri yükler. Temiz başlatma için--skip-checkpointkullanın.- Bağımlılık farkındalıklı geri yükleme: Compose
depends_onkullanarak veritabanlarını önce başlatır (healthy bekler), ardından uygulama konteynerlerini CRIU ile geri yükler. - TCP bağlantıları geri yüklemeden sonra eski olur, uygulamalar
ECONNRESEThatasını ele almalı ve yeniden bağlanmalıdır. CRIU, desteklenen hiçbir akışta geri yükleme boyunca aktif TCP bağlantı durumunu korumaz. - Docker deneysel modu repo başına daemonlarda otomatik olarak etkinleştirilir.
- CRIU yüklenir
rdc config machine setupsırasında. /etc/criu/runc.confvarsayılan olaraktcp-establishedile yapılandırılır.- Konteyner güvenlik ayarları etiketli konteynerler için otomatik enjekte edilir,
renet compose,rediacc.checkpoint=trueetiketli konteynerlere şunları ekler:cap_add:CHECKPOINT_RESTORE,SYS_PTRACE,NET_ADMIN(çekirdek 5.9+ için minimum CRIU seti)security_opt:apparmor=unconfined(CRIU’nun AppArmor desteği henüz kararlı değil)userns_mode: host(CRIU,/proc/pid/map_filesiçin init namespace erişimi gerektirir)
- Etiketi olmayan konteynerler daha temiz bir güvenlik profiliyle çalışır (ek capability yok).
- Docker’ın varsayılan seccomp profili korunur, CRIU, checkpoint/restore sırasında filtreleri geçici olarak askıya almak için
PTRACE_O_SUSPEND_SECCOMP(çekirdek 4.3+) kullanır. - CRIU capability’lerini compose dosyanızda manuel olarak ayarlamayın, renet etikete göre bununla ilgilenir.
- CRIU uyumlu referans uygulama için heartbeat sablonuna bakın.
CRIU uyumlu uygulama kalıpları
- Tüm kalıcı bağlantılarda (veritabanı havuzları, websocket’ler, mesaj kuyrukları)
ECONNRESET’i işleyin. - Otomatik yeniden bağlanmayı destekleyen bağlantı havuzu kütüphaneleri kullanın.
- Dahili kütüphane nesnelerinden gelen eski soket hataları için güvenlik ağı olarak
process.on("uncaughtException")ekleyin. - Yeniden başlatma politikaları renet tarafından otomatik yönetilir (CRIU için kaldırılır, watchdog kurtarmayı üstlenir).
- Docker DNS’ine güvenmeyin, servisler arası iletişim için loopback IP’leri kullanın.
İsletim sistemine göre host güvenlik politikaları
Resmi olarak desteklenen beş sunucu isletim sisteminde (bkz. Gereksinimler), her deponun Docker daemon’ı ve çalıştırdığı konteynerler varsayılan konteyner etiketleri kullanır. rdc config machine setup, özel bir SELinux politikası veya AppArmor profili yüklemez.
- Ubuntu 24.04 / openSUSE Leap 16.0: AppArmor varsayılan olarak etkindir. Konteynerler varsayılan docker-container profili altında çalışır. Tek istisna CRIU’dur (yukarıdaki nota bakın;
rediacc.checkpoint=trueetiketli konteynerler içinapparmor=unconfinedeklenir). - Fedora 43 / Oracle Linux 10: SELinux varsayılan olarak enforcing modda çalışır. Konteynerler standart
container_tbağlamını alır. Ek politika yüklenmesi gerekmez. Bir kurulum adımı AVC reddiyle başarısız olursa, bkz. Sorun giderme: SELinux redleri. - Debian 13: AppArmor mevcut ancak tüm alanlarda varsayılan olarak uygulanmaz. Konteynerler yine de docker-container profilini kullanır.
İsletim sistemine özgü bir güvenlik duruş bayrağı gerekli değildir; rdc ve renet neyin çalıştığını algılar ve beş dağıtımın tamamında aynı depo başına izolasyonu sağlar.
Güvenlik
- LUKS şifreleme standart depolar için zorunludur. Her deponun kendi şifreleme anahtarı vardır.
- Kimlik bilgileri CLI yapılandırmasında saklanır (
~/.config/rediacc/rediacc.json). Yapılandırmayı kaybetmek, şifreli birimlere erişimi kaybetmek anlamına gelir. - Kimlik bilgilerini asla sürüm kontrolüne commit etmeyin.
env_filekullanın ve sırlarıup()içinde oluşturun. - Depo izolasyonu: Her deponun Docker daemon’ı, ağı ve depolaması aynı makinedeki diğer depolardan tamamen izole edilmiştir.
- Ajan izolasyonu: Yapay zeka ajanları varsayılan olarak yalnızca fork modunda çalışır. Her deponun, sunucu tarafında sandbox uygulaması (ForceCommand
sandbox-gateway) olan kendi SSH anahtarı vardır. Tüm bağlantılar Landlock LSM, OverlayFS home overlay ve depo başına TMPDIR ile sandbox içine alınır. Depolar arası dosya sistemi erişimi çekirdek tarafından engellenir. - Bir depo sandbox’ı içinde
sudotasarım gereği devre dışıdır. Landlock dosya sistemi izolasyonuNoNewPrivsgerektirir ve bu, herhangi bir yetki yükseltmesini engeller, bu nedenlesudokomutuno new privileges flag is sethatasıyla başarısız olur. Deponun sahip kullanıcısı, deponun bağlama noktası ve Docker soketi içindeki her şey için zaten gerekli izinlere sahiptir. Gerçekten ayrıcalıklı işlemler (host paketleri yükleme, çekirdek ayarlama) için bunları sandbox dışında ya da altyapı yolu tarafından çalıştırılan bir Rediaccfileup()fonksiyonundan çalıştırın. - Docker bridge ağı her depo başına daemonda devre dışıdır. Her deponun
daemon.jsondosyası"bridge": "none"ve"iptables": falseiçerir, bu nedenle düz birdocker run <image>komutu yalnızca loopback arayüzü olan ve dışa doğru bağlantısı olmayan bir konteyner oluşturur. Bu bir hata değil, depolar arası izolasyonun uygulanma biçimidir: bir deponun başka bir deponun loopback IP’lerine ulaşmasını engelleyen çekirdek düzeyindeki eBPF kancaları yalnızca host ağ ad alanında yaşayan konteynerlere uygulanır. Üretim servisleri için otomatik olaraknetwork_mode: hostenjekte edenrenet composekullanın. Bir kabukta tek seferlik, geçici konteynerler için--network hostparametresini açıkça geçin.
Dağıtım
rdc repo upLUKS birimi bağlı değilse otomatik olarak bağlar, ardından tüm Rediaccfile’lardaup()çalıştırır.rdc repo downdown()çalıştırır ve Docker daemon’ını durdurur.rdc repo down --unmountayrıca LUKS birimini kapatır (şifreli depolamayı kilitler).- Fork’lar (
rdc repo fork) yeni GUID ve networkId ile bir CoW (copy-on-write) klon oluşturur ve bunu depo boyutundan bağımsız olarak sabit sürede yapar. BTRFS reflink veriyi değil görüntü meta verilerini çoğaltır, bu nedenle 100 GB’lık bir depo 1 GB’lık bir depo ile aynı birkaç saniyede fork edilir. Fork, üst öğenin şifreleme anahtarını paylaşır. - Takeover (
rdc repo takeover --name <fork> -m <machine>) grand deponun verilerini bir fork’un verileriyle değiştirir. Grand kimliğini korur (GUID, networkId, alan adları, otomatik başlatma, yedekleme zinciri). Eski üretim verileri yedekleme fork’u olarak korunur. Kullanım: fork üzerinde yükseltmeyi test edin, doğrulayın, ardından üretime takeover yapın.rdc repo takeover --name <backup-fork> -m <machine>ile geri alın. - Proxy yolları dağıtımdan sonra yaklaşık 3 saniyede aktif olur.
repo upsırasında “Proxy is not running” uyarısı ops/dev ortamlarında bilgilendirme amaçlıdır. rdc repo upverdc repo fork --up, dağıtımın sonundarediacc.service_portile etiketlenmiş servisler için URL kalıbını yazdırır.{service}yerine açığa çıkarılan servis adınızı yazarak tam URL’yi elde edin.rediacc.service_portolmayan servisler (veritabanları, işçiler) rota almaz ve gösterilmez.
Yaygın hatalar
renet composeyerinedocker composekullanmak, konteynerler ağ izolasyonu alamaz.- Yeniden başlatma politikaları güvenlidir, renet bunları otomatik olarak kaldırır ve watchdog kurtarmayı üstlenir.
privileged: truekullanmak, gerekli değildir, renet bunun yerine belirli CRIU capability’lerini enjekte eder.- Ham IP’leri kalıcı yapılandırma dosyalarına sabit kodlamak - fork izolasyonunu sağlam tutmak için bağlantılarda servis adlarını kullanın.
- Başarısız komutlar için geçici çözüm olarak
rdc term connect -ckullanmak, bunun yerine hataları bildirin. repo deleteloopback IP’leri ve systemd birimlerini de dahil ederek tam temizlik yapar. Eski silmelerden kalan artıkları temizlemek içinrdc machine prune --name <name>çalıştırın.