Container image'larını deploy edin ve domain'lerini r3v3rs3 üzerinden yönlendirin

Deploy platformu

Deploy platformu, uygulamaları r3v3rs3 sunucusunun Docker Engine'inde container olarak çalıştırır ve domain'lerini r3v3rs3 proxy'leri üzerinden yönlendirir. Yeni bir deployment, çalışan container'ın yanında başlar. Proxy yeni container'a ancak container health check'ten geçince geçer.

Platform geliştirme aşamasındadır. Bu sürüm, yönetim API'si üzerinden yerel Docker Engine'e registry'deki hazır bir image'ı deploy eder, bir Git reposundaki Dockerfile ile image build eder veya bir Git reposundaki Docker Compose dosyasını başlatır. WebUI sayfaları ve uzak sunucular sonraki sürümlerde gelir.

Platformu açma

config.toml dosyasına bir [platform] bölümü ekleyin ve sunucuyu yeniden başlatın:

[platform]
enabled = true
docker = "unix:///var/run/docker.sock"
proxy_ports = ["http", "https"]
acme = "bcd-fgh"
KeyVarsayılanAçıklama
enabledfalsePlatformu başlatır. Cluster node'u platformu çalıştırmaz.
dockerunix:///var/run/docker.sockDocker Engine API'si: bir Unix socket'i veya düz TCP. TLS desteklenmez.
proxy_portsboşUygulamaları sunan portların adları veya id'leri, örneğin HTTP portu ve HTTPS portu.
acmeyokUygulama domain'lerinin sertifikalarını sipariş eden ACME kaydının id'si. Bu değer yoksa uygulamalar sertifika almaz.

Yönetim API'si [platform] bölümünü değiştirmez. Bir değişiklik yeniden başlatmadan sonra geçerli olur.

Platform ilk başlangıçta config dizininde iki dosya oluşturur:

Docker socket'ine erişim, host üzerinde root erişimine eşittir. Platformu yalnız r3v3rs3'ün her container'ı yönetebileceği bir sunucuda açın. r3v3rs3 bir container içinde çalışıyorsa Docker ile kurulum rehberindeki gibi -platform tag son ekli image'ı, host networking'i ve Docker socket'ini kullanın.

Uygulamalar

Bir uygulama bir image'ı, container'ın dinlediği portu ve uygulamaya yönlenen domain'leri belirtir:

{
  "name": "shop",
  "target": "local",
  "spec": {
    "source": {"type": "image", "image": "nginx:1.27"},
    "port": 80,
    "domains": ["shop.example.com"],
    "health_check_path": "/healthz",
    "volumes": [{"volume": "shop-data", "target": "/data"}],
    "restart": "unless-stopped",
    "limits": {"memory_bytes": 268435456, "nano_cpus": 500000000}
  }
}

Uygulamanın, domain'lerinin veya environment değişkenlerinin değişikliği sonraki deployment'ta geçerli olur.

Git kaynağı

git kaynağı olan bir uygulama, image'ını bir reponun bir branch'inden, reponun Dockerfile'ı ile build eder:

"source": {
  "type": "git",
  "repository": "https://github.com/owner/shop.git",
  "branch": "main",
  "context": ".",
  "dockerfile": "Dockerfile"
}
AlanVarsayılanAçıklama
repositoryKullanıcı adı, parola, query veya fragment içermeyen bir https:// URL'si.
branchmainBir branch veya tag.
context.Docker'ın build context olarak aldığı repo dizini.
dockerfileDockerfilecontext dizinine göre Dockerfile yolu.

Private bir repo bir access token gerektirir. Örnekler: reponun içeriğini okuma izni olan bir GitHub fine-grained token'ı, veya read_repository scope'u olan bir GitLab ya da Gitea token'ı. PUT /api/apps/{id}/git_token, {"token": "..."} gövdesiyle token'ı ayarlar. DELETE /api/apps/{id}/git_token token'ı siler. r3v3rs3 token'ı platform.key ile şifreler. Yönetim API'si token'ı hiçbir zaman döndürmez, uygulamada yalnız "git_token_set": true görünür. git token'ı x-access-token kullanıcı adıyla HTTP basic authentication olarak alır. Token URL'de veya komut satırında yer almaz, git'e bir environment değişkeniyle ulaşır.

r3v3rs3'ü çalıştıran sunucuda git binary'si bulunmalıdır. r3v3rs3, git'i host'un yapılandırması ve hook'lar olmadan, yalnız HTTPS üzerinden çalıştırır. Build context'inde .git dizini yer almaz. Context'teki bir sembolik link link olarak kalır. Bu yüzden bir build, repo dışındaki bir dosyayı okuyamaz. Context en fazla 512 MiB olabilir.

Docker image'ı klasik builder ile build eder. Aynı anda iki build çalışır, diğerleri sırada bekler. Builder, multi-stage bir Dockerfile'ın stage'lerini build cache'i olarak saklar. Bu yüzden aynı uygulamanın sonraki build'i daha hızlı biter. docker image prune bu cache'i siler.

Compose kaynağı

compose kaynağı olan bir uygulama, bir reponun bir branch'indeki Docker Compose dosyasını başlatır:

"source": {
  "type": "compose",
  "repository": "https://github.com/owner/shop.git",
  "branch": "main",
  "file": "deploy/compose.yaml",
  "service": "web"
}
AlanVarsayılanAçıklama
repositoryGit kaynağındaki gibi bir https:// URL'si. Uygulamanın Git token'ı private bir repoyu clone eder.
branchmainBir branch veya tag.
filecompose.yaml, compose.yml, docker-compose.yaml ve docker-compose.yml dosyalarından ilk bulunanReponun köküne göre Compose dosyası. Dosyadaki göreli yollar dosyanın kendi dizinine göre çözülür.
serviceDomain isteklerini port üzerinde alan servis. Servis adı küçük harf, rakam ve _.- içerir.

Sunucuda git binary'si ve Compose plugin'i olan docker binary'si bulunmalıdır. r3v3rs3, docker compose komutunu r3v3rs3-<app id> Compose projesiyle çalıştırır ve service servisi için şu ayarları yapan bir dosya ekler:

Compose dosyasındaki başka bir servis port publish edemez, çünkü publish edilmiş bir port r3v3rs3'ü atlar. Böyle bir port içeren Compose dosyası, hiçbir servis başlamadan deployment'ı başarısız yapar. Hata mesajı servisin adını verir. Servisler birbirine projenin network'ü üzerinden ulaşır.

Compose uygulaması volumes, restart ve limits ayarlarını Compose dosyasında yapar. Bu yüzden uygulama spec'i bu alanları kabul etmez. service servisi tek bir container olarak çalışır, çünkü bir container adı vardır.

Compose deployment'ı service servisini yeniden oluşturur: Docker yeni container başlamadan önce eskisini durdurur. Bu yüzden uygulama, yeni container health check'ten geçene kadar cevap vermez. Health check'ten geçemeyen bir deployment yeni container'ı log'u için saklar. Uygulamanın sonraki deployment veya rollback'e kadar sağlıklı bir container'ı olmaz. Çalışan deployment'ın checkout'u config dizinindeki compose/<app id>/ altında kalır, çünkü Compose dosyasındaki bir bind mount onu okuyabilir.

r3v3rs3, Compose dosyasının diğer ayarlarını denetlemez. Bir Compose dosyası host path'i bağlayabilir, privileged container çalıştırabilir veya host'un network'ünü kullanabilir. Bu yüzden uygulama düzenleyebilen her hesap, bu yolla host'u ele geçirebilir. Edit iznini yalnız buna yetkisi olan hesaplara verin.

Environment değişkenleri

PUT /api/apps/{id}/env bir uygulamanın environment değişkenlerini değiştirir. "secret": true olan bir değişkenin değeri yönetim API'sinden bir daha çıkmaz: API değişkeni değeri olmadan döndürür, değersiz bir güncelleme de mevcut değeri korur. r3v3rs3 her değeri platform.key ile şifreler ve yalnız bir container başlarken açar.

Deployment'lar

POST /api/apps/{id}/deploy bir deployment başlatır ve onu queued durumuyla döndürür. GET /api/deployments/{id} ilerlemeyi gösterir.

  1. r3v3rs3 image'ı çeker ve digest'ini kaydeder. Git kaynağında branch'i clone eder, commit'i kaydeder, image'ı r3v3rs3/<app id>:<deployment id> adıyla build eder ve image id'sini kaydeder. Compose kaynağında branch'i clone eder, commit'i kaydeder, docker compose up --build çalıştırır ve 3. adımla devam eder.
  2. r3v3rs3-<app id>-<deployment id> container'ını r3v3rs3-<app id> network'ünde oluşturur. Böylece farklı uygulamaların container'ları birbirine ulaşamaz. Container portunu 127.0.0.1 üzerindeki boş bir porta publish eder. Böylece container'a yalnız host üzerindeki r3v3rs3 ulaşır.
  3. Health check için en fazla 120 saniye bekler. Duran veya check'ten geçemeyen bir container deployment'ı failed ile bitirir. Hata mesajı container log'unun son satırlarını içerir. Eski container istekleri karşılamaya devam eder.
  4. Deployment'ı running, öncekini superseded olarak işaretler ve domain'leri yeni container'a yönlendirir.
  5. 10 saniye sonra eski container'ı durdurur ve siler. Bu süre, eski container'daki açık isteklerin bitmesi içindir.

Bir uygulama aynı anda tek bir deployment çalıştırır. Bir deployment sürerken gelen ikinci deploy, rollback veya silme isteği 409 app_busy alır. Sunucu yeniden başlarsa bitmemiş deployment failed olur.

DurumAnlamı
queuedDeployment başlamayı bekliyor.
buildingr3v3rs3 branch'i clone ediyor ve image'ı build ediyor veya Compose dosyasını okuyor.
deployingImage çekiliyor, docker compose up çalışıyor veya yeni container health check'i bekliyor.
runningDeployment'ın container'ı uygulamayı sunuyor.
supersededDaha yeni bir deployment bunun yerini aldı.
failedDeployment durdu. Nedeni message alanındadır.

Rollback

POST /api/deployments/{id}/rollback, önceki bir deployment'ın image digest'i, uygulama ayarları ve environment değişkenleriyle yeni bir deployment başlatır. Image'ı tag değil digest seçer. Bu yüzden tag değişse bile rollback aynı image'ı çalıştırır. Image'ını çekmeden önce başarısız olan bir deployment'ın digest'i yoktur. Bu deployment için rollback isteği 400 rollback_unavailable alır.

Bir Git uygulamasının rollback'i build yapmaz, build edilmiş image'ı yeniden başlatır. r3v3rs3, bir uygulamanın en yeni 5 deployment'ının ve çalışan deployment'ının image'larını saklar, daha eskilerini siler. Image'ı silinmiş bir deployment'a rollback the image ... is no longer present mesajıyla başarısız olur.

Bir Compose uygulamasının rollback'i, önceki deployment'ın kaydedilmiş commit'ini clone eder ve docker compose up --build komutunu o deployment'ın uygulama ayarları ve environment değişkenleriyle yeniden çalıştırır. Commit'ini kaydetmeden önce başarısız olan bir Compose deployment'ı için rollback isteği 400 rollback_unavailable alır.

Yönlendirme

Platform, en az bir domain'i olan her çalışan uygulama için bir proxy ekler. Bu proxy'ler Platform provider'ından gelir. Bu yüzden servis keşfi proxy'leri gibi salt okunurdur ve proxy listesi provider durumunu gösterir. Her proxy:

Domain'i olmayan bir uygulama proxy almaz. Container'ı olmayan veya durmuş olan çalışan bir deployment, provider durumunda bir sorun olarak görünür. r3v3rs3 container'ları 15 saniyede bir okur. Bu yüzden Docker'ın yeni bir portta yeniden başlattığı container yönlendirmesini geri alır.

Uygulamayı silme

DELETE /api/apps/{id} uygulamanın container'larını, network'ünü ve build edilmiş image'larını durdurup siler, proxy'sini kaldırır, environment değişkenlerini ve deployment'larını siler. Adlandırılmış volume'lar kalır. Compose uygulamasında docker compose down çalıştırır, projenin build ettiği image'ları ve checkout'u siler. Compose projesinin volume'ları kalır.

Yönetim API'si

RouteİzinAçıklama
GET /api/targetsReadUygulamaları çalıştıran Docker host'ları.
GET /api/appsReadUygulamalar.
POST /api/appsEditUygulama ekler.
GET /api/apps/{id}ReadBir uygulamayı döndürür.
PUT /api/apps/{id}EditBir uygulamayı değiştirir.
DELETE /api/apps/{id}EditBir uygulamayı container'larıyla birlikte siler.
GET /api/apps/{id}/envEditSecret değerleri olmadan environment değişkenleri.
PUT /api/apps/{id}/envEditEnvironment değişkenlerini değiştirir.
PUT /api/apps/{id}/git_tokenEditPrivate bir reponun token'ını ayarlar.
DELETE /api/apps/{id}/git_tokenEditToken'ı siler.
GET /api/apps/{id}/deploymentsReadBir uygulamanın son 100 deployment'ı.
GET /api/apps/{id}/logs?tail=200ReadÇalışan deployment'ın container log'unun son satırları, 1 ile 1000 satır arası. Uygulamanın çalışan deployment'ı yoksa running değeri false olur.
POST /api/apps/{id}/deployEditBir deployment başlatır.
GET /api/deployments/{id}ReadBir deployment'ı döndürür.
POST /api/deployments/{id}/rollbackEditÖnceki bir deployment'ı tekrarlar.

Proxy listesi olan hesap, her platform route'u için 403 forbidden alır. Bkz. Hesaplar. Audit log, uygulamanın her değişikliğini, her deployment'ı ve her rollback'i kaydeder. Environment değişikliğinin özeti key'leri adlandırır, hiçbir değeri içermez. Token değişikliğinin özeti yalnız uygulamayı adlandırır.