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. 80 dışındaki portlara proxy yönlendirmesi içinrediacc.service_portetiketini 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
- The compose service name becomes the auto-route URL prefix.
- Grand repos:
https://{service}.{repo}.{machine}.{baseDomain}(ör.:https://myapp.marketing.server-1.example.com). - Fork repos:
https://{service}-{tag}.{machine}.{baseDomain}— uses the machine wildcard cert to avoid Let’s Encrypt rate limits. - Ö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). SERVICE_IP’ye bağlanın — her servis benzersiz bir loopback IP alır.- Health check’ler
${SERVICE_IP}kullanmalıdır,localhostdeğil. Örnek:healthcheck: test: ["CMD", "curl", "-f", "http://${SERVICE_IP}:8080/health"] - Servisler arası iletişim: Loopback IP’leri veya
SERVICE_IPortam değişkenini kullanın. Docker DNS adları host modunda ÇALIŞMAZ. - 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> --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. backup push --checkpointetiketli konteynerler için çalışan süreçlerin bellek durumunu + disk durumunu yakalar.repo fork --checkpointfork öncesi süreç durumunu yakalar — forkrepo upile otomatik geri yüklenir.repo down --checkpointdurdurmadan önce süreç durumunu kaydeder — sonrakirepo upotomatik geri yükler.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. - Docker deneysel modu repo başına daemonlarda otomatik olarak etkinleştirilir.
- CRIU yüklenir
rdc config machine setupsırasında. /etc/criu/runc.confTCP bağlantı koruması içintcp-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 şablonuna 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.
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.
Dağıtım
rdc repo uptüm Rediaccfile’lardaup()çalıştırır.rdc repo up --mountönce LUKS birimini açar, sonra yaşam döngüsünü çalıştırır. Yeni bir makineyebackup pushsonrasında gereklidir.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. Fork, üst öğenin şifreleme anahtarını paylaşır. - Takeover (
rdc repo takeover <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 <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.
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.SERVICE_IP’ye bağlanmamak — depolar arasında port çakışmalarına neden olur.- IP’leri sabit kodlamak —
SERVICE_IPortam değişkenini kullanın; IP’ler networkId başına dinamik olarak atanır. backup pushsonrası ilk dağıtımda--mount’u unutmak — LUKS birimi açık bir şekilde açılmalıdır.- Başarısız komutlar için geçici çözüm olarak
rdc term -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>çalıştırın.