Kendi sunucunda barındırma

Vestyn'i denetiminizdeki altyapıda çalıştırın.

Vestyn, HTTPS ters vekil sunucunuzun arkasında Postgres kullanan bir Docker sistemi olarak çalışır. Kasa verilerinizin bulunmasını istediğiniz bir VPS'e, ev sunucusuna veya NAS'a kurun.

Gereksinimler

Docker Compose v2 çalıştıran, yaklaşık 1 GB RAM'e sahip ve alan adınızı yönlendirebileceğiniz bir sunucu. amd64 ve arm64 mimarileri desteklenir.

İlk çalıştırma

Yeni bir örnekte kaydedilen ilk hesap yönetici olur; sonraki tüm hesaplar davet gerektirir.

Bakım

VESTYN_IMAGE_TAG değerini bir sürüme sabitleyin, güncellemeleri bilinçli uygulayın ve Postgres ile imzalama anahtarını yedekleyin.

Vestyn, yayımlanmış iki konteyner imajı ve Postgres ile sunulur. Aşağıdaki iki dosyayı sunucunuza kopyalayıp sistemi başlatın. Kaynak kod erişimi hakkında: Vestyn AGPL-3.0 ile lisanslanmıştır; ancak proje kapalı alfa aşamasındayken kaynak kod deposu henüz herkese açık değildir. Depoyu açmadan önce güvenlik ve geçmiş incelemesi yapıyoruz. Bu sırada kendi sunucunuzda çalıştırabilmeniz için derleme kaynağı ve SBOM doğrulamaları bulunan hazır imajlar yayımlanır. Güncel sürümü oluşturan kaynak kodu şuradan indirebilirsiniz: Karşılık Gelen Kaynak Kodu arşivi.

1 · Sistem dosyalarını oluşturun

Sistem için bir dizin oluşturun ve aşağıdaki Compose dosyasını buraya kaydedin. İki dosya da aynı dizinde bulunmalıdır; Compose .env dosyasını kabuğun geçerli dizininden değil, Compose dosyasının bulunduğu dizinden okur.

# sunucunuzda uygun bir konumda mkdir -p /srv/vestyn && cd /srv/vestyn

Şu adla kaydedin: docker-compose.yml:

name: vestyn services: db: image: postgres:17-alpine restart: unless-stopped environment: POSTGRES_DB: vestyn POSTGRES_USER: vestyn POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env} volumes: - db-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U vestyn -d vestyn"] interval: 5s timeout: 3s retries: 10 security_opt: - no-new-privileges:true api: image: docker.io/mtenekeci/vestyn-server:${VESTYN_IMAGE_TAG:-0.4.200} restart: unless-stopped environment: DATABASE_URL: postgres://vestyn:${POSTGRES_PASSWORD}@db:5432/vestyn VESTYN_DATA_DIR: /data VESTYN_LISTEN: 0.0.0.0:8080 APP_URL: ${APP_URL:-http://localhost:8080} volumes: # signing.key dosyasını tutar — aşağıdaki Yedekler bölümüne bakın - api-data:/data depends_on: db: condition: service_healthy networks: default: # zorunlu: web imajındaki nginx bu ada vekillik eder aliases: [vestyn-api] init: true healthcheck: test: ["CMD", "/vestyn-server", "--healthcheck"] interval: 10s timeout: 5s retries: 6 start_period: 15s security_opt: - no-new-privileges:true web: image: docker.io/mtenekeci/vestyn-web:${VESTYN_IMAGE_TAG:-0.4.200} restart: unless-stopped ports: # düz HTTP — önüne bir TLS vekili koyun (4. adım) - "${VESTYN_PORT:-8080}:80" depends_on: api: condition: service_healthy init: true healthcheck: test: ["CMD-SHELL", "curl -sf http://localhost/healthz"] interval: 10s timeout: 3s retries: 6 start_period: 5s security_opt: - no-new-privileges:true volumes: db-data: api-data:

Sabitlenmiş server/web imajlarının Karşılık Gelen Kaynak Kodu: eşleşen kaynak arşivini indirin.

2 · Ortamı yapılandırın

Bunu Compose dosyasının yanına .env adıyla kaydedin. POSTGRES_PASSWORD tek zorunlu değerdir; sistem bu değer olmadan başlamaz.

# zorunlu — openssl rand -base64 32 ile üretin POSTGRES_PASSWORD=paste-a-long-random-string-here # isteğe bağlı — web konteynerinin yayımladığı sunucu portu (varsayılan 8080) # VESTYN_PORT=8080 # isteğe bağlı — alan adı ve TLS hazır olduğunda ayarlayın (4. adım) # APP_URL=https://vault.example.com # isteğe bağlı — yukarıdaki varsayılan yerine bir sürümü sabitleyin # VESTYN_IMAGE_TAG=0.4.200

En son yayımlanan sürüm için değişiklik günlüğüne bakın ve server ile web imajlarını aynı etikette tutun.

3 · Sistemi başlatın

Compose imajları çeker, Postgres'i başlatıp hazır olmasını bekler, ardından API'yi ve web arayüzünü çalıştırır. API veritabanı geçişlerini açılışta otomatik uygular; ilk kurulumda veya güncellemede ayrı bir geçiş adımı yoktur.

docker compose up -d # başlatma durumunu izleyin docker compose ps docker compose logs -f api

api ile web sağlıklı olarak bildirildiğinde kasa şu adreste çalışır: http://localhost:8080. Hesap oluşturmadan önce TLS'i etkinleştirin; ana parolanızı bu sayfaya gireceksiniz.

4 · TLS'i sonlandırın

Web konteyneri yayımlanan portta düz HTTP kullanır. TLS, ters vekil sunucunuzun görevidir. Caddy ile iki satırda otomatik sertifika alabilirsiniz:

vault.example.com { reverse_proxy localhost:8080 }

Traefik ve nginx Proxy Manager da aynı şekilde çalışır; onları aynı porta yönlendirin. Ardından APP_URL in .env değerini gerçek adresiniz olarak ayarlayın; böylece davet bağlantıları doğru sunucu adını kullanır. Ayarı yüklemek için API'yi yeniden başlatın:

# .env APP_URL=https://vault.example.com
docker compose up -d api

Ters vekil ile Vestyn konteyneri arasındaki trafik Docker ağı içinde düz HTTP kullanır. Bu, ikisi aynı sunucuda veya güvenilir bir özel ağda çalışırken güvenli olan standart kendi sunucunda barındırma modelidir. Sunucu her durumda yalnızca şifreli veri tutar. Şifrelemenin işleyişi →

5 · İlk hesabı oluşturun

Alan adınızı tarayıcıda açıp kaydolun. Yeni bir örnekte oluşturulan ilk hesap yönetici olur — ve davetsiz oluşturulabilecek tek hesaptır. Bir deneme hesabı değil, kendi hesabınızı oluşturun.

Başka kişiler eklemek için yönetici olarak giriş yapın, Ayarlar → Üyeler ve Davetler bölümüne gidin ve bir davet bağlantısı oluşturun. Bağlantılar tek kullanımlık bir belirteç taşır, 7 gün sonra sona erer ve yalnızca bir kez çalışır. Geçerli davet olmadan kayıt sunucu tarafından reddedilir.

Ardından Mac uygulamasını açın ve ilk çalıştırmada sunucunuzun adresini girin. Uygulamaları indirin →

6 · Güncelleme

.env dosyasındaki VESTYN_IMAGE_TAG değerini istediğiniz sürüme ayarlayın; ardından imajları çekip konteynerleri yeniden oluşturun. İki imajı da aynı etikette tutun.

# sistem dizininden docker compose pull docker compose up -d

Yeni API konteyneri başladığında geçişler otomatik çalışır. Üretim örneğini güncellemeden önce aşağıdaki şekilde veritabanı dökümü alın.

7 · Yedekler

İki adlandırılmış disk bölümü önemli olan her şeyi saklar. Kasa içeriği cihazlarınızda şifrelenir; ancak kaybolan bir veritabanı yine de kaybolan bir kasa demektir. Sunucu onu yeniden oluşturamaz.

Disk bölümüİçerik
vestyn_db-data
PostgreSQL
Hesaplar, kasa üyelikleri ve tüm şifreli öğeler. Bunu kaybetmek kasayı kaybetmektir.
vestyn_api-data
signing.key
Erişim belirteçlerini imzalar. Kaybolursa herkesin oturumu kapanır, ancak veri kaybı olmaz.

Veritabanı dökümlerini düzenli alın ve bu sunucudan farklı bir yerde saklayın. --clean --if-exists seçenekleri, dökümün mevcut nesneleri yeniden oluşturmadan önce kaldırmasını sağlar; böylece geri yükleme mevcut şema geçişleriyle çakışmaz:

# gecelik döküm docker compose exec -T db \ pg_dump -U vestyn --clean --if-exists vestyn | gzip > vestyn-$(date +%F).sql.gz # geri yükleme — işlem sırasında yazma olmaması için önce API'yi durdurun ve # hata sonrası devam etmek yerine açıkça durdurun (ON_ERROR_STOP) docker compose stop api gunzip -c vestyn-2026-01-01.sql.gz | \ docker compose exec -T db psql -U vestyn -v ON_ERROR_STOP=1 vestyn docker compose up -d

İmzalama anahtarını bir kez yedekleyin; bu anahtar değişmez:

docker compose cp api:/data/signing.key ./signing.key.bak

Dosyanın disk bölümüne sunucunun root olmayan kullanıcısının beklediği sahiplikle yazılması gerektiğinden, geri yükleme için docker compose cp yerine yardımcı bir konteyner kullanın:

docker compose stop api docker run --rm -v vestyn_api-data:/data -v "$PWD":/backup alpine \ sh -c 'cp /backup/signing.key.bak /data/signing.key \ && chown -R 65532:65532 /data && chmod 600 /data/signing.key' docker compose up -d

Veritabanını geri yüklediğinizde tüm hesaplar ve kasalar geri gelir. İmzalama anahtarını da yüklerseniz etkin oturumlar korunur; yüklemezseniz herkes yeniden giriş yapar. Her iki durumda da veri kaybı olmaz. Geri yüklemeyi ihtiyaç duymadan önce prova edin.

Durdurma

docker compose down sistemi durdurur ve verilerinizi korur. docker compose down -v disk bölümlerini ve içlerindeki her şeyi siler; bu işlem geri alınamaz.

Şifrelemenin işleyişi →  ·  Uygulamaları indirin →