İçeriğe atla
openplate

Uygulama

Kendi sunucunda barındırma

Compose rehberleri, ilk hesap, Docker olmadan çalıştırma, ilk çalıştırma, HTTPS, yedeklemeler, yükseltme

Bu sayfa, İngilizce belgeden makine çevirisiyle çevrildi.

openplate, GitHub Container Registry üzerinde yayımlanan, önceden derlenmiş çok mimarili bir Docker imajı (linux/amd64 + linux/arm64; Raspberry Pi sınıfı cihazlar birinci sınıf hedeftir) olarak sunulur. latest etiketi en yeni sürümdür. Her sürümün ayrıca kendi sürüm etiketi de vardır. main etiketi, main dalındaki her değişikliği takip eder. Kendi yapay zeka sağlayıcı anahtarın dışında üreteceğin bir gizli bilgi veya kaydolacağın bir şey yoktur.

Buradaki hiçbir şey kısıtlı bir sürüm değildir. Yerel öncelikli takip, BYOK yapay zeka tabak tarama, PWA kurulumu, JSON dışa/içe aktarma, arayüzün tamamı: barındırılan kurulumla birebir aynıdır, çünkü aynı imajdır. Barındırılan dağıtımın tek fazlası, isteğe bağlı eşitleme servisini senin için işletiyor olmamızdır; o da zaten kendin çalıştırman için açık kaynaklıdır.

Neler çalıştırabilirsin

  • Yalnızca uygulama. Bir konteyner ekler. Veritabanı veya gizli anahtar yönetimi gerektirmeyen hızlı bir kurulum kazanırsın. Tarayıcıyı temizlersen günlüğünü kaybetme riski vardır, cihazlar arasında eşitleme olmaz ve taramalar bir bulut yapay zeka anahtarı gerektirir.
  • Uygulama ve çekirdek sunucu. openplate-core ve Postgres ekler. Cihazlar arasında şifreli eşitleme ve isteğe bağlı paylaşımlı bir yapay zeka faturası kazanırsın. Veritabanını, gizli anahtarı ve kurtarma kodunu yedeklemezsen veri kaybı riski vardır.
  • Uygulama ve kendi sunucundaki çıkarım. openplate-inference ekler. Bulut hesabı olmadan ve fotoğraflar ağından çıkmadan yerel tabak taramaları kazanırsın. Donanım zorlanması riski vardır ve her tarayıcının çıkarım konteynerine doğrudan erişebilmesi gerekir.
  • Her şey. Eşitleme ve çıkarım birlikte, toplam dört konteyner. Çoklu cihaz eşitlemesiyle birlikte tam veri gizliliği kazanırsın. En yüksek operasyonel bakım ve kaynak yükü riskini alırsın.

Her şekil, docker/topologies/ altındaki bir compose dosyasıdır; topologies.md nasıl seçim yapacağını açıklar.

Başlamadan önce

Docker kur. Yeni kurulmuş bir sunucuda bu bulunmaz. docs.docker.com/engine/install adresinden dağıtımın için Docker rehberini izle. Ubuntu 24.04 üzerinde dağıtım paketleri de iş görür:

bash
sudo apt-get update
sudo apt install docker.io docker-compose-v2
sudo usermod -aG docker "$USER"   # then log out and back in, to use docker without sudo

Podman da çalışır. Farklar için podman.md bölümünü oku.

Kalıcı bir dizin seç. Aşağıdaki her rehber mkdir -p ~/openplate && cd ~/openplate ile başlar. Compose dosyası ve .env dosyası orada bulunur. Yükseltmeler, yedekler ve günlük kayıtları dahil sonraki her komutu oradan çalıştır. /tmp dizinini kullanma. Yeniden başlatma orayı boşaltabilir ve gizli anahtarlarını barındıran .env dosyan kaybolur.

Bunu ailen için çalıştırıyorsan, iki şeyi erkenden yap. - .env dosyasını ve veritabanını yedekle. .env dosyasını, özellikle de SERVER_SECRET satırını güvenli bir yere kopyala. Bu satır olmadan, geri yüklenen bir veritabanı hiçbir hesabı açamaz. Ardından veritabanını belirli bir plana göre yedekle. Komutlar Yedekler dosyasındadır. - Diğer cihazların yalnızca HTTPS portuna erişmesine izin ver. Birçok sunucu güvenlik duvarı olmadan başlar, bu yüzden bir konteynerin yayımladığı her port ağınıza açık olur. Konteyner portlarını, HTTPS bölümünde gösterildiği gibi 127.0.0.1 üzerinde tut; böylece onlara yalnızca ters proxy'n erişir. ufw gibi bir güvenlik duvarı bunları senin yerine kapatmaz, çünkü Docker portlarını onun arkasından dolaşarak yayımlar. ufw yine de sunucudaki diğer her şeyi kapatır. Önce SSH'ye, ardından HTTPS'ye izin ver: ``bash sudo ufw allow OpenSSH sudo ufw allow 443/tcp sudo ufw allow 8443/tcp # the core server's HTTPS port, in the recipes below sudo ufw enable ` With a domain name, Caddy also needs port 80 for its certificate: sudo ufw allow 80/tcp`.

Uygulamanın tek başına kullanımı

Konteyner aracı
mkdir -p ~/openplate && cd ~/openplate
curl -O https://raw.githubusercontent.com/LowCarbCheck/openplate/main/docker/compose.yml
docker compose -f compose.yml up -d
Doğrudan sunucunun kendisinde http://localhost:3000 olarak veya HTTPS üzerinden aç. Başka bir cihazdan bağlanıldığında http://<the server's address>:3000 günlüğü gösterir. Uygulamayı yükleme, çevrimdışı kullanım ve tek tıkla OpenRouter bağlantısı orada çalışmaz. HTTPS bölümüne bak.

Podman bu dosyaları podman compose ile çalıştırır. Ubuntu üzerinde bu alt komut, sağlayıcı olarak podman-compose paketinin kurulu olmasına ihtiyaç duyar: podman.md bölümüne bak.

Tek bir konteyner elde edersin, veritabanı yoktur, .env adımı yoktur ve üretilecek bir gizli anahtar bulunmaz. Uygulamaya http://localhost:3000 üzerinden erişilebilir.

Port tüm arayüzünde yayımlanır. up -d tamamlandığı anda uygulamaya bu makinenin yerel ağ adresinden erişilebilir. Paylaşılan bir ağda, ports: satırını '127.0.0.1:3000:3000' olarak değiştir ve bunun yerine bir ters proxy üzerinden eriş.

TRUST_PROXY, uygulamanın önünde kaç ters proxy bulunduğunu belirler. Compose dosyası varsayılan olarak 1 değerini kullanır. Caddy veya nginx gibi tek bir proxy arkasında doğru olan budur. Bu olmadan, uygulamanın CSRF denetimi yanlış adresi görür ve form gönderimleri başarısız olur. Önünde bir proxy yoksa bu değeri 0 yap:

bash
echo "TRUST_PROXY=0" >> .env
docker compose -f compose.yml up -d

Proxy yokken sayfalar her iki değerde de çalışır. Ancak 1, bir ziyaretçinin X-Forwarded-For başlığında adresini sahte göstermesine ve besin aramalarındaki adres başına düşen sınırı aşmasına izin verir.

İmajı kendin derle

Yayımlanan imajı çekmek yerine kaynaktan derlemek için docker/compose.yml içindeki image: satırını yoruma al, build: satırındaki yorumu kaldır ve derleme bağlamı bu dosyaya göre göreli olduğundan bu komutu depo kök dizininden çalıştır:

Konteyner aracı
docker compose --project-directory . -f docker/compose.yml build
docker compose --project-directory . -f docker/compose.yml up -d

Hiç konteyner olmadan çalıştırmak için Docker olmadan bölümüne bak.

Diğer tüm kurulumlar (eşitleme, kendi sunucunda çıkarım veya her ikisi) docker/topologies/ altında ayrı birer dosyadır. Birini seçmek için topologies.md bölümüne bak.

Uygulama ve kendi çekirdek sunucun

docker/topologies/compose.core.yml, uygulama, çekirdek sunucu ve eşitleme gereksinim duyduğu Postgres veritabanı için referans dağıtımdır. Uygulama yine de kendi başına hiçbir veritabanına bağlanmaz. (Kendi sunucunda barındırılan çıkarım da istiyorsan, aşağıdaki Uygulama, eşitleme ve kendi sunucunda çıkarım bölümüne bak. Bu kurulum, model çalışma zamanına ek olarak aynı eşitleme yapılandırmasını kullanır.)

bash
mkdir -p ~/openplate && cd ~/openplate
curl -O https://raw.githubusercontent.com/LowCarbCheck/openplate/main/docker/topologies/compose.core.yml

# The core server needs exactly one secret. Generate it and keep it with your backups.
echo "SERVER_SECRET=$(openssl rand -hex 32)" >> .env

# Your key to the admin API. You need it to create the first account.
echo "ADMIN_TOKEN=$(openssl rand -hex 32)" >> .env

# The URLs a BROWSER will use to reach each service. Skip these two for a test
# on this machine, or through the ssh tunnel in the HTTPS section.
echo "PUBLIC_APP_URL=https://openplate.example.com" >> .env
echo "PUBLIC_SYNC_URL=https://sync.example.com" >> .env

# 1 behind one reverse proxy, 0 with none.
echo "TRUST_PROXY=1" >> .env

docker compose -f compose.core.yml up -d
bash
mkdir -p ~/openplate && cd ~/openplate
curl -O https://raw.githubusercontent.com/LowCarbCheck/openplate/main/docker/topologies/compose.core.yml

echo "SERVER_SECRET=$(openssl rand -hex 32)" >> .env
echo "ADMIN_TOKEN=$(openssl rand -hex 32)" >> .env

echo "PUBLIC_APP_URL=https://openplate.example.com" >> .env
echo "PUBLIC_SYNC_URL=https://sync.example.com" >> .env
echo "TRUST_PROXY=1" >> .env

podman compose -f compose.core.yml up -d
Hesaplar güvenli bir sayfaya ihtiyaç duyar. Düz http://<the server's address> üzerinde giriş yapmak, kayıt olmak ve bir davet bağlantısını açmak başarısız olur: tarayıcı, bunların kullandığı kriptografiyi kısıtlar. Her iki adresi de HTTPS üzerinden sun ya da localhost üzerinden test et. HTTPS bölümüne bak.

Bu son satırı başkalarının erişebileceği bir makinede çalıştırmadan önce openplate-core'un README dosyası dosyasını oku. Her iki servis de portlarını tüm ağ arayüzlerinde yayınlar. Hesap servisi başladığı anda dışarıya açılır ve bir hesap servisi işletmek, uygulamayı çalıştırmaktan daha büyük bir sorumluluktur.

Dosya, yanlış ayarlandığında sorun çıkaran iki ayar (SERVER_SECRET ve TRUST_PROXY) dahil olmak üzere satır satır açıklanmıştır. TRUST_PROXY, aynı proxy'nin arkasında veya hiçbir proxy olmadan durdukları için her iki servis için de geçerlidir. Dosya, servislerin .env dosyasından okuduğu her değişkeni konteynerlerine aktarır. environment-variables.md hepsini listeler. Eşitlemenin ne olduğu ve istemcinin ona nasıl ulaştığı için sync.md bölümüne bak.

İlk hesabı oluştur

Kimse kendi kendine kaydolamaz. Bir hesap, tek bir e-posta adresine gönderilen bir davet açılarak oluşturulur. Kendin için ilk daveti sunucuda ADMIN_TOKEN kullanarak üretirsin. Bunu kendi adresinle ~/openplate içinde çalıştır. Port 3001, compose.core.yml ve compose.full.yml çekirdek sunucuyu yayımladığı yerdir. Çekirdek sunucunun apps/core içindeki kendi compose dosyası ise port 3000'i kullanır:

bash
ADMIN_TOKEN=$(grep '^ADMIN_TOKEN=' .env | cut -d= -f2)
curl -s -X POST http://127.0.0.1:3001/v1/admin/invites \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H 'Content-Type: application/json' \
  -d '{"email":"you@example.com","displayName":"You","role":"admin"}'

Yanıt tek satırlık bir JSON çıktısıdır. Önemli olan kısım şöyle görünür:

json
"emailed":false,"link":"https://openplate.example.com/join#server=https%3A%2F%2Fsync.example.com&invite=si_..."
  • E-posta yapılandırılmadı (öntanımlı): "emailed": false. Kimseye bir şey yazılmadı. link değerini kopyala ve kendin aç.
  • E-posta yapılandırıldı (bkz. E-posta): "emailed": true. Aynı bağlantı ilgili adrese mektup olarak da yola çıktı.

Bağlantıyı güvenli bir sayfada tarayıcıda aç, bir parola belirle ve hesap oluşsun. Bir telefon veya ikinci bir cihaz, ancak sen HTTPS kurulumunu yaptıktan sonra oturum açabilir, çünkü ssh tüneli ve localhost yalnızca tek bir bilgisayara hizmet verir. Bağlantı bir kez çalışır ve yedi gün sonra geçerliliğini yitirir. "role":"admin", bu ilk hesabı yönetici yapar. Bundan sonra, insanları doğrudan uygulamanın içinden, /admin kısmından davet edersin. E-posta bulunmayan bir kurulumda her yeni bağlantıyı ekranda gösterir. Sıradan bir üye için role parametresini dahil etme. E-posta, her iki yolu da açıklar: her bağlantıyı elden iletmek veya çekirdek sunucunun bunu e-postayla göndermesine izin vermek.

Çekirdek sunucunun herkesin tarama masrafını karşıladığı yönetilen bir kurulumda, hesaba günde 200 yapay zeka isteği tanımlamak için gövdeye "dailyAiLimit":200 ekle. Varsayılan değer 0'dır. Yönetilen bir kurulum için .env içinde dört satır daha gerekir. Bir model olmadan taramalar başlamaz, çünkü uygulama faturana yansıyacak bir modeli kendi kendine seçmez:

bash
echo "INSTANCE_MODE=managed" >> .env
echo "UPSTREAM_BASE_URL=https://openrouter.ai/api/v1" >> .env
echo "UPSTREAM_API_KEY=sk-or-..." >> .env
echo "AI_ADVERTISED_MODEL=vendor/model-name" >> .env

vendor/model-name yerine sağlayıcının model adını, sağlayıcının yazdığı şekilde birebir yaz. AI_ADVERTISED_MODEL yerine AI_TIERS_FILE=bundled değerini de ayarlayabilirsin, bu durumda çekirdek sunucu modeli kendi aşama dosyasından (ai-tiers.json) alır. Bkz. configuration.md.

Birisi parolasını unuttuğunda

E-posta yapılandırılmışsa, uygulama içindeki Parolamı unuttum bir sıfırlama bağlantısı gönderir ve sıfırlamadan sonra günlük geri gelir. E-posta yapılandırılmamışsa uygulama hiçbir şey gönderemez ve parola sıfırlama sayfası kullanıcıya yöneticiye danışmasını söyler. Bağlantıyı sen oluşturursun:

  • Uygulama içinde: Yönetim, Kişiler altında, ilgili kişiyi aç ve Sıfırlama bağlantısı gönder seçeneğini seç. E-posta yapılandırılmamışsa sayfa bağlantıyı doğrudan gösterir. Bunu bir parolayı paylaşacağın şekilde paylaş.
  • Sunucu üzerinde: hesabın id değerini bul, sonra onun için bir bağlantı iste. Port, topoloji compose dosyalarında olduğu gibi yine 3001'dir.
bash
ADMIN_TOKEN=$(grep '^ADMIN_TOKEN=' .env | cut -d= -f2)
curl -s http://127.0.0.1:3001/v1/admin/accounts -H "Authorization: Bearer $ADMIN_TOKEN"
curl -s -X POST http://127.0.0.1:3001/v1/admin/accounts/1/reset-mail \
  -H "Authorization: Bearer $ADMIN_TOKEN"

İkinci çağrı {"emailed":false,"link":"https://openplate.example.com/reset#server=...&token=sr_..."} yanıtını verir. Bir sıfırlama bağlantısı tek bir kez çalışır ve bir saat sonra geçerliliğini yitirir.

E-posta

Çekirdek sunucu davet ve parola sıfırlama e-postaları gönderebilir. Bunu yapmak zorunda değildir. Bir aile kurulumu hiçbir e-posta ayarı olmadan da çalışır ve en basit yol budur.

E-posta yok

Tüm e-posta ayarlarını boş bırak. Çekirdek sunucu hiçbir e-posta göndermez. Bunun yerine her bağlantıyı sana gösterir ve sen de bunu bir parola paylaşır gibi iletirsin.

  • Bir davet: /admin adresindeki Yönetim bölümünü aç ve Birini davet et seçeneğini seç. Adresi gir ve Daveti gönder seçeneğini seç. Sayfada bu adres için Davet şunun için hazır: yazar ve bağlantı gösterilir. Bağlantıyı kopyala seçeneğini seç ve bunu örneğin özel bir mesajla ilgili kişiye gönder. Bağlantı kimin elindeyse hesabı o açabilir.
  • Unutulmuş bir parola: Kişiler altında ilgili kişiyi aç ve Sıfırlama bağlantısı gönder seçeneğini seç. Sayfada bağlantı gösterilir. Aynı şekilde ilet. Bir saat içinde ve bir defaya mahsus çalışır.
  • Kaybolan bir davet: Davetler altında adresin yanındaki Tekrar gönder seçeneğini seç. Bu işlem yeni bir bağlantı oluşturur ve eskisini geçersiz kılar. Sayfa kopyalaman için yeni bağlantıyı gösterir. Açık davetlerine geri dönmek için Listeye dön seçeneğini seç.

Bağlantı tarayıcından farklı bir adres kullanıyorsa, altında bir uyarı görünür. PUBLIC_APP_URL ve PUBLIC_SYNC_URL değerlerini aileni kullandığı adreslere ayarla, ardından bağlantıyı yeniden üret. Sayfa ayrıca, bağlantı sayfayı açıyor fakat uygulamayı localhost üzerindeki bir çekirdek sunucuya veya diğer cihazların erişemeyeceği düz bir http:// adresine yönlendiriyorsa da seni uyarır. PUBLIC_SYNC_URL değerini aileni kullandığı https:// adresine ayarla, ardından bağlantıyı tekrar üret.

OPEN_SIGNUP=true, yabancıların hesap talep etmesine izin verir. Çekirdek sunucu, e-posta yapılandırılmadığında bu ayarla başlamayı reddeder. Bir aile kurulumu bunu kapalı tutar ve sen ayarlayana kadar da kapalı kalır. Turnstile ile kayıt olma, bu ayarı ve onun güvenlik doğrulamasını (captcha) açıklar.

SMTP

Herhangi bir standart e-posta hesabı mektupları SMTP üzerinden gönderebilir. Bu satırları .env dosyasına ekle:

  • SMTP_HOST: şema ve bağlantı noktası içermeyen sunucu adı.
  • SMTP_PORT: boş bıraktığında 587.
  • SMTP_USER ve SMTP_PASSWORD: oturum açma bilgileri. İkisini de ayarla ya da oturum açma gerektirmeyen bir sunucu için ikisini de boş bırak.
  • SMTP_FROM: yalın bir adres veya Name <address> olarak gönderen adresi.
  • MAIL_OPERATOR_EMAIL: kendi adresin. İptal veya geri çekme işlemlerinin senin kopyanı alır. Her iki aktarım yöntemi de bunu gerektirir.

Şifreleme moduna port karar verir. Port 465 en başından itibaren TLS kullanır. Diğer tüm portlar STARTTLS ile yükseltme yapmak zorundadır ve servis, bu özelliğe sahip olmayan bir sunucuya posta göndermez. Düz metne yalnızca Mailpit gibi yerel bir yakalayıcı için SMTP_HOST, localhost gibi bir geri döngü adresi olduğunda izin verilir (bkz. Mailpit ile test et). Servis sertifikaları her zaman kontrol eder.

Bir Gmail hesabı uygulama şifresi gerektirir. Google bunu yalnızca 2 Adımlı Doğrulama açık olan hesaplar için oluşturur. Google'ın SMTP ayarları smtp.gmail.com ve 587 numaralı bağlantı noktasını belirt:

bash
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=family.openplate@gmail.com
SMTP_PASSWORD="the app password"
SMTP_FROM="openplate <family.openplate@gmail.com>"
MAIL_OPERATOR_EMAIL=you@example.org

Amazon SES, AWS erişim anahtarından farklı olan SES için oluşturulmuş SMTP kimlik bilgileri ve doğrulanmış bir gönderici adresi gerektirir. Ana bilgisayar AWS bölgeni belirtir. Ayrıntılar için uç nokta listesi bölümüne bak. Hesabın SES korumalı alanı içinde kaldığı sürece SES yalnızca doğrulanmış alıcı adreslerine teslimat yapar.

bash
SMTP_HOST=email-smtp.eu-central-1.amazonaws.com
SMTP_PORT=587
SMTP_USER=<SES SMTP user name>
SMTP_PASSWORD=<SES SMTP password>
SMTP_FROM="openplate <noreply@example.org>"
MAIL_OPERATOR_EMAIL=you@example.org

.env üzerinde yapılan herhangi bir düzenlemeden sonra çekirdek sunucuyu docker compose -f <your file> up -d ile yeniden oluştur.

Bir HTTP e-posta API'si

HTTP API'si sunan bir e-posta servisi de çalışır. MAIL_API_URL, MAIL_API_KEY ve MAIL_API_FROM, her üçünü de ayarla, ayrıca MAIL_OPERATOR_EMAIL ekle. Çekirdek sunucu, her e-postayı Resend API'sinin beklediği biçimi kullanarak, bir Bearer belirteci olarak MAIL_API_KEY ile birlikte MAIL_API_URL adresine JSON POST isteği şeklinde gönderir. Resend, uyumlu servislerden biridir. Resend üzerinde MAIL_API_URL, https://api.resend.com/emails değerindedir.

Yalnızca tek bir aktarım yöntemi yapılandır. Hem SMTP hem de e-posta API'sini ayarlarsan, çekirdek sunucu başlamayı reddeder.

E-posta için genel adresler gerekir

Her e-posta bir bağlantı taşır ve bu bağlantı okuyucunun telefonunda açılmalıdır. SMTP veya bir e-posta API'si yapılandırdığında, PUBLIC_APP_URL ve PUBLIC_SYNC_URL değerlerini ailenin kullandığı https:// adreslerine ayarla. İki ayardan biri düz http:// veya localhost gibi bir geri döngü (loopback) adresi kullanıyorsa, çekirdek sunucu başlamayı reddeder. Günlüğü, şöyle başlayan bir mesajda düzeltilmesi gereken her değeri adlandırır:

Mail is configured. Its messages would carry links that recipients cannot open.

Günlük mesajı bu değerleri CLIENT_BASE_URL ve SERVER_PUBLIC_URL olarak anar. Bunlar çekirdek sunucunun okuduğu dahili adlardır ve compose dosyaları bunları PUBLIC_APP_URL ve PUBLIC_SYNC_URL üzerinden eşler. Mesajı docker compose -f <your file> logs core ile görüntüle.

E-postanın çalıştığını kontrol et

/admin içinden kendine ait ikinci bir adrese davet gönder. Sayfa bu adrese Davet şuraya gönderildi: göstermeli ve e-posta gelen kutuna ulaşmalıdır. Sayfa Davet şunun için hazır: gösterir ve bir bağlantı yazdırırsa teslimat başarısız olmuştur. Bağlantı geçerli kalır. Sebebini görmek için çekirdek sunucu günlüğünde bir Mail send failed satırı ara. Testi bitirdiğinde, Davetler altında test daveti için Geri çek seçeneğini belirle.

Mailpit ile test et

Mailpit, her e-postayı yakalar ve bir web sayfasında gösterir, böylece bir e-posta hesabı olmadan e-postaları test edebilirsin. Bunu çekirdek konteynerinin ağını paylaşan bir yan araç (sidecar) olarak çalıştır. Çekirdek sunucu daha sonra ona düz metne izin verilen localhost olarak erişir. Bu dosyayı compose dosyanın yanına compose.mailpit.yml olarak kaydet:

yaml
# compose.mailpit.yml: a mail catcher for testing, next to your compose file
services:
  core:
    ports:
      - '127.0.0.1:8025:8025' # Mailpit's web page, on this machine only
  mailpit:
    image: docker.io/axllent/mailpit:latest
    restart: unless-stopped
    network_mode: 'service:core'

Bu satırları .env dosyasına ekle. Mailpit, postaları 1025 portundan kabul eder:

bash
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_FROM="openplate <test@example.org>"
MAIL_OPERATOR_EMAIL=you@example.org

İki dosyayı birlikte başlat, ardından bir davet gönder ve bunu sunucuda http://localhost:8025 adresinde oku:

bash
docker compose -f compose.core.yml -f compose.mailpit.yml up -d

E-posta için genel adresler gerekir içindeki kural hâlâ geçerlidir. Önce PUBLIC_APP_URL ve PUBLIC_SYNC_URL değerlerini https:// adreslerine ayarla, aksi takdirde çekirdek sunucu başlamaz.

SMTP_HOST=mailpit gibi servis adıyla erişilen ayrı bir Mailpit konteyneri çalışmaz. Çekirdek sunucu düz metni yalnızca bu makineye gönderir. Bir servis adı başka bir ana bilgisayar sayılır. Servis STARTTLS ister, Mailpit bunu sunmaz ve her e-posta günlükte Mail send failed hatasıyla başarısız olur. Paylaşılan ağ, Mailpit'i aynı makineye yerleştirir.

Testi bitirdiğinde bu dört satırı .env dosyasından kaldır. Ardından docker compose -f compose.core.yml up -d --remove-orphans ile Mailpit'i kaldır.

Özel sertifika yetkilisine sahip bir geçiş sunucusu

Çekirdek sunucu her e-posta sunucusunun sertifikasını kontrol eder. Bir şirket ağı içindeki bir aktarıcı, özel bir sertifika yetkilisi tarafından imzalanmış bir sertifika kullanabilir. Node.js varsayılan olarak bu yetkiliye güvenmez. Çekirdek sunucuya bu yetkilinin sertifikasını bir PEM dosyası olarak ver. Dosyayı konteynere bağla ve NODE_EXTRA_CA_CERTS değerini onun dosya yoluna ayarla. Örneğin, compose dosyanın yanındaki bir compose.ca.yml içinde:

yaml
# compose.ca.yml: trust a private certificate authority for the mail relay
services:
  core:
    volumes:
      - ./relay-ca.pem:/etc/openplate/relay-ca.pem:ro
bash
echo "NODE_EXTRA_CA_CERTS=/etc/openplate/relay-ca.pem" >> .env
docker compose -f compose.core.yml -f compose.ca.yml up -d

Node.js dosyayı başlangıçta bir kez okur. Sertifika, Node.js'nin zaten güvendiği sertifikalara eklenir, böylece genel posta sunucuları çalışmaya devam eder.

Uygulama ve kendi sunucunda barındırılan çıkarım

docker/topologies/compose.inference.yml, uygulamayı openplate-inference ile yan yana çalıştırır. Tabak fotoğrafları kendi donanımında okunur ve her ziyaretçiye tek dokunuşla "bu openplate kendi yapay zekasını sunar" imkanı verilir. Önce topologies.md donanım bölümünü oku. Küçük lite modeli, bir CPU üzerinde yaklaşık 1,6 GB RAM ve tabak başına birkaç saniye ile bir dakika arasında bir süre ister.

bash
mkdir -p ~/openplate && cd ~/openplate
curl -O https://raw.githubusercontent.com/LowCarbCheck/openplate/main/docker/topologies/compose.inference.yml

# One key, generated here on the server. The inference service accepts it and
# the app hands it to every browser.
echo "INFERENCE_API_KEY=opk_$(openssl rand -hex 24)" >> .env

# The two URLs a BROWSER will use. Replace 192.168.1.20 with this machine's
# address, or with the names your reverse proxy serves.
echo "PUBLIC_APP_URL=http://192.168.1.20:3000" >> .env
echo "PUBLIC_INFERENCE_URL=http://192.168.1.20:8300/v1" >> .env

# 0 with no reverse proxy, 1 behind one.
echo "TRUST_PROXY=0" >> .env

docker compose -f compose.inference.yml up -d
docker compose -f compose.inference.yml logs -f inference
Düz HTTP taramalar için çalışır, HTTPS ise baştan sona HTTPS gerektirir. Düz http://<the server's address> üzerinden bir tabak fotoğrafı çıkarım konteynerine ulaşır, ancak uygulamanın yüklenmesi çalışmaz. Uygulama https:// üzerinde çalıştığında, çıkarım adresi de https:// olmak zorundadır. Aksi takdirde tarayıcı, güvenli sayfadan gelen çağrıyı engeller. HTTPS bölümüne bak.

PUBLIC_INFERENCE_URL, bir tarayıcının tarafından açılabilecek bir adres olmalıdır, çünkü fotoğraf doğrudan telefondan çıkarım konteynerine gider. Konteynerlerin birbirleri için kullandığı isim olan http://inference:8300/v1, orada çalışmaz. Sondaki /v1 kısmını koru.

İlk başlatma, adlandırılmış bir alana yaklaşık 2 GiB (1,96 GiB) ağırlık indirir; bu işlem testlerimizde altı ila yedi dakika sürdü ve ardından modeli yükler. Günlük her adımı gösterir. Uygulama hemen ayağa kalkar; tek dokunuşla yapay zeka ise bu çağrı 200 yanıtı verdiğinde çalışır:

bash
curl -s http://127.0.0.1:8300/readyz

Anahtar her tarayıcının yüklediği sayfada yer alır, bu yüzden uygulamayı açabilen herkes onu okuyabilir. Bu durum bir ev ağında veya tailnet üzerinde sorun oluşturmaz, ancak internete açık bir kurulumda yanlıştır. Kuralın tamamı configuration.md içinde yer alır. Çıkarım kapsayıcısı iki tanesi hariç tüm CPU çekirdeklerini kullanır; bunu değiştirmek için .env dosyasında LLAMA_THREADS değerini belirle.

Uygulama, eşitleme ve kendi sunucunda çıkarım

docker/topologies/compose.full.yml dört konteyner çalıştırır: uygulama, çekirdek sunucu, Postgres ve kendi sunucunda barındırılan çıkarım. Önce Uygulama ve kendi çekirdek sunucun ve Uygulama ve kendi sunucunda barındırılan çıkarım bölümlerini oku. Bu bölüm yalnızca her parça birlikte çalıştığında neyin değiştiğini ele alır.

bash
mkdir -p ~/openplate && cd ~/openplate
curl -O https://raw.githubusercontent.com/LowCarbCheck/openplate/main/docker/topologies/compose.full.yml

# The core server needs exactly one secret. Generate it and keep it with your backups.
echo "SERVER_SECRET=$(openssl rand -hex 32)" >> .env

# Your key to the admin API. You need it to create the first account.
echo "ADMIN_TOKEN=$(openssl rand -hex 32)" >> .env

# One key for the inference service, which the app hands to every browser.
echo "INFERENCE_API_KEY=opk_$(openssl rand -hex 24)" >> .env

# The URLs a BROWSER will use to reach each service. PUBLIC_APP_URL and
# PUBLIC_SYNC_URL default to localhost, so skip both for a test on this
# machine. PUBLIC_INFERENCE_URL has no such default: set it even for a
# local test, for example to http://localhost:8300/v1.
echo "PUBLIC_APP_URL=https://openplate.example.com" >> .env
echo "PUBLIC_SYNC_URL=https://sync.example.com" >> .env
echo "PUBLIC_INFERENCE_URL=https://ai.example.com/v1" >> .env

# 1 behind one reverse proxy, 0 with none.
echo "TRUST_PROXY=1" >> .env

docker compose -f compose.full.yml up -d

İlk hesabı yukarıda bölümündekiyle aynı şekilde oluştur. İlk başlatma aynı zamanda yaklaşık 2 GiB tutarındaki çıkarım ağırlıklarını da indirir. Model yükleme günlüğü ve hazırlık denetimi Uygulama ve kendi sunucunda barındırılan çıkarım içindekiyle aynı şekilde çalışır. Bir deneme yerine gerçek cihazlar için üç adresi de HTTPS arkasına al. Bkz. HTTPS.

Docker olmadan

Uygulama tek bir Node.js programıdır. Doğrudan yerel bir kopyadan çalışır. Oturumu kapatma ve yeniden başlatmalarda systemd ile ayakta tutarak Ubuntu 24.04 üzerinde nasıl çalıştırılacağı aşağıda açıklanmıştır.

Node.js 24 veya daha yenisi. Ubuntu 24.04, çok eski olan nodejs sürüm 18'i sağlar. 24 sürümünü NodeSource üzerinden kur:

bash
curl -fsSL https://deb.nodesource.com/setup_24.x -o nodesource_setup.sh
sudo -E bash nodesource_setup.sh
sudo apt install -y nodejs git
node --version      # v24.x

nvm da çalışır, ancak Node'u ev dizinine yerleştirir. Bu durumda aşağıdaki systemd birimi bu dosya yolunu kullanmalıdır (command -v node bunu ekrana basar).

pnpm, deponun istediği sürüm. corepack, Node 24 ile birlikte gelir. Uygulamanın package.json dosyasındaki packageManager alanında belirlenen pnpm sürümünün birebir aynısını indirir, ancak yalnızca apps/app içindeyken. Bu dizinin dışındayken pnpm, corepack neyi seçerse onu varsayılan kabul eder. Her pnpm komutunu apps/app içinde çalıştır. İlk çalıştırmada, indirme onayını onayla.

bash
sudo corepack enable
git clone https://github.com/LowCarbCheck/openplate.git ~/openplate-src
cd ~/openplate-src/apps/app
pnpm install --frozen-lockfile
pnpm build

Ayarlar. Sunucu, çalıştığı dizinden .env dosyasını okur. Üretim ortamında APP_URL olmadan başlamayı reddeder:

bash
cat > .env <<'EOF'
NODE_ENV=production
PORT=3000
APP_URL=http://localhost:3000
TRUST_PROXY=0
EOF

APP_URL değişkenini kişilerin açtığı adrese ayarla, önünde bir ters proxy olduğunda da TRUST_PROXY=1 değerini belirle. uygulama için geçerli diğer her değişken aynı dosyaya girer. HOST=127.0.0.1, sunucunun yalnızca bu makineyi dinlemesini sağlar; aynı cihazdaki bir proxy'nin arkasında istediğin şey de budur.

Uygulamanın önyüklemede başlaması ve sen oturumu kapattıktan sonra da çalışmaya devam etmesi için Bir systemd birimi. Aşağıdaki $USER ve $HOME, sen yapıştırdıkça doldurulur:

bash
sudo tee /etc/systemd/system/openplate.service > /dev/null <<EOF
[Unit]
Description=openplate
After=network-online.target
Wants=network-online.target

[Service]
User=$USER
WorkingDirectory=$HOME/openplate-src/apps/app
Environment=NODE_ENV=production
ExecStart=/usr/bin/node --import tsx ./server.ts
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now openplate
curl -s http://127.0.0.1:3000/healthcheck

sudo journalctl -u openplate -f günlüğü gösterir. Yükseltmek için depoyu tekrar çekip derle, ardından yeniden başlat:

bash
cd ~/openplate-src/apps/app
git pull
pnpm install --frozen-lockfile
pnpm build
sudo systemctl restart openplate

HTTPS bölümü burada aynen geçerlidir: ters proxy'yi 3000 portuna yönlendir.

İlk çalıştırma

  1. Uygulamayı aç ve kısa başlangıç adımlarını izle. Kayıt yok, giriş yok: Bir cihazda uygulamayı kim açarsa o cihazın kullanıcısı odur.
  2. Ayarlar → Yapay Zeka bölümüne git ve kendi API anahtarınla bir yapay zeka sağlayıcısı bağla (OpenRouter, Mistral, kendi OpenAI uyumlu uç noktan veya Anthropic). Tek tıkla OpenRouter akışı ve bunun yerine örnek tarafından sağlanan bir uç nokta sunmak hakkında bilgi için configuration.md bölümüne bak.
  3. Erkenden bir yedek al: Ayarlar → Veri ve yedekleme → Her şeyi indir (JSON). Günlüğün bu tarayıcının depolama alanında tutulur, bu yüzden site verilerini temizlediğinde veya yeni bir cihaza geçtiğinde elinde kalacak tek kopya yedektir.
  4. Bu kurulumda birden fazla kişi tarama yapıyorsa, lowcarbcheck.org/developers adresinden ücretsiz bir gıda veritabanı anahtarı al, bunu .env dosyasına FOOD_DB_API_KEY=... olarak ekle ve docker compose -f <your file> up -d komutunu tekrar çalıştır. Bir anahtar olmadan kurulumdaki herkes küçük ve anonim tek bir kotayı paylaşır. Bkz. configuration.md. Bir anahtarla ayrıca FOOD_DB_BACKFILL=true değerini de belirleyebilirsin; bu, insanların bir yapay zeka yanıtından kaydettiği yiyecekleri LowCarbCheck'e öneri olarak aktarır. Bkz. configuration.md.

HTTPS

Tarayıcılar çeşitli özellikleri bir güvenli bağlam ile sınırlandırır. Güvenli bağlam, https:// üzerinden veya yerel makinedeki localhost adresinden sunulan bir sayfadır. openplate birçok işlev için güvenli bağlam gerektirir:

  • Hesaplar, oturum açma ve eşitleme. Oturum açma, kaydolma ve bir davet veya sıfırlama bağlantısını açma işlemleri anahtarları Web Crypto API (crypto.subtle) ile türetir. Tarayıcılar bu API'yi düz bir http:// sayfasında devre dışı bırakır. http://192.168.1.20:3000 üzerinde bu ekranlar çalışmaz. Paylaşım ve araştırma konsolu da aynı API'yi kullandıkları için başarısız olur.
  • OpenRouter ile tek tıkla oturum açmayı sağlayan OpenRouter ile bağlan da aynı nedenden ötürü çalışmaz. Bir anahtarı elle yapıştırmak her yerde çalışır.
  • Uygulamayı yükleme ve çevrimdışı kullanım (service worker).

Başka bir cihazdan düz HTTP üzerinden günlük, elle kayıt tutma, yedeklemeler ve tabak fotoğrafları çalışmaya devam eder. Fotoğraf düğmesi güvenli bir sayfaya ihtiyaç duymayan bir dosya seçici aracılığıyla işi telefonun kendi kamerasına devreder. Hızlı başlangıç sunucunun kendisinde değişiklik yapmadan çalışır, çünkü localhost güvenli sayılır.

Cihazlarının güvenli bir adrese ihtiyacı vardır. Dört şekilde bir adres ayarlayabilirsin: hızlı bir test için bir ssh tüneli, bir alan adına sahip Caddy, alan adı olmayan bir ev ağında Caddy veya Tailscale.

Tek bir bilgisayardan hızlı bir test: ssh tüneli

Bu bir kurulum değil, tek bir bilgisayar için bir testtir. Tünel yalnızca onu çalıştıran bilgisayara hizmet verir ve yalnızca komut çalıştığı sürece geçerlidir. Bir telefon veya ikinci bir cihaz bu tünel üzerinden giriş yapamaz. Bunlar için aşağıdaki Caddy ile HTTPS kur.

Bir sertifika yapılandırmadan önce hesapları ve eşitlemeyi test etmek için iki portu bilgisayarına yönlendir. PUBLIC_APP_URL ve PUBLIC_SYNC_URL değerlerini boş bırak, böylece ikisi de localhost olan varsayılanlarını korusun. Burada e-postayı da ayarlanmamış olarak bırak. E-posta ayarlandığında, çekirdek sunucu bağlantı adresleri localhost belirttiği sürece başlamayı reddeder. E-posta olmadığında başlar ve her bağlantıyı kendin kopyalarsın. Bu komutu sunucuda değil, kendi bilgisayarında çalıştır:

bash
ssh -N -L 3000:localhost:3000 -L 3001:localhost:3001 you@192.168.1.20

Komut çalışırken tarayıcında http://localhost:3000 adresini aç. Bu güvenli bir sayfa sayılır, bu sayede giriş yapmak çalışır. Sunucudan gelen bir davet bağlantısı (http://localhost:3000/join#...) da burada açılır. Çıkarım konteyneri için -L 8300:localhost:8300 ekle.

Bir alan adı: Caddy

Caddy, Let's Encrypt sertifikasını otomatik olarak alır ve yeniler. Sunucuna yönlendirilmiş bir alan adı gerektirir. Ayrıca sertifika doğrulaması için 80 ve 443 numaralı bağlantı noktalarının internetten erişilebilir olmasını gerektirir.

# Caddyfile
openplate.example.com {
    reverse_proxy localhost:3000
}

Ardından .env içinde APP_URL=https://openplate.example.com ayarla. Üretim varsayılanı olan TRUST_PROXY=1 değerini ayarla. docker compose -f compose.yml up -d ile app servisini yeniden oluştur. Düz bir docker compose restart komutu .env dosyasını okumaz okumaz. Yalnızca mevcut konteyneri yeniden başlatır, bu yüzden yeni değerler asla yüklenmez.

Eşitleme için çekirdek sunucuya kendi alan adını ver. APP_URL yerine her iki genel URL'yi de ayarla:

# Caddyfile
openplate.example.com {
    reverse_proxy localhost:3000
}
sync.example.com {
    reverse_proxy localhost:3001
}
bash
PUBLIC_APP_URL=https://openplate.example.com
PUBLIC_SYNC_URL=https://sync.example.com
TRUST_PROXY=1

ports: satırını '127.0.0.1:3000:3000' olarak değiştir ve eşitleme için '127.0.0.1:3001:3000' kullan. Değişikliği docker compose -f <your file> up -d ile uygula. Bir ters ters vekil konteyner bağlantı noktalarını yayından kaldırmaz. Eğer '3000:3000' olarak bırakırsan, uygulama yerel ağında HTTPS adresinin yanında 3000 numaralı bağlantı noktasında düz HTTP sunmaya devam eder.

Podman servisi podman compose -f compose.yml up -d ile aynı şekilde yeniden oluşturur. Ters vekili atlamadan önce rootless ile ilgili bir ayrıntıya dikkat et: rootless bir Podman konteyneri, ekstra yapılandırma olmadan 1024'ün altındaki bir ana makine bağlantı noktasına bağlanamaz. Doğrudan 80 veya 443 numaralı bağlantı noktasına yayınlamak önce sudo sysctl net.ipv4.ip_unprivileged_port_start=80 gerektirir. Bkz. podman.md.

Alan adı yok, yalnızca ev ağı: yerel sertifikalı Caddy

Alan adı olmadan da Caddy ev ağında HTTPS sunabilir. Kendi sertifika yetkilisini oluşturur ve bunu sunucunun adresi için bir sertifika imzalamakta kullanır. openplate uygulamasını açan her telefon ve bilgisayar bu yetkiliye bir kez güvenmelidir. Bundan sonra ailenin telefonları güvenli bir sayfaya ulaşır. Oturum açma, eşitleme ve uygulamayı yükleme işlemleri https:// üzerinden çalışır.

Sunucuya sabit bir adres ver. Yönlendiricinde sunucunun geçerli adresini, örneğin 192.168.1.20, hiç değişmeyecek şekilde rezerve et. Sertifika ve her iki genel adres bu adı kullanır.

Caddy'yi kur ve adrese yönlendir. Ubuntu'da sudo apt install caddy, Caddy'yi bir servis olarak kurar. Kendi sunucunun adresini kullanarak /etc/caddy/Caddyfile dosyasını bununla değiştir. tls internal, Caddy'ye sertifikayı kendisinin imzalamasını söyler:

# /etc/caddy/Caddyfile
https://192.168.1.20 {
    tls internal
    reverse_proxy localhost:3000
}
https://192.168.1.20:8443 {
    tls internal
    reverse_proxy localhost:3001
}
bash
sudo systemctl reload caddy

Aynı adresleri .env içinde ayarla, ardından docker compose -f <your file> up -d ile konteynerleri yeniden oluştur:

bash
PUBLIC_APP_URL=https://192.168.1.20
PUBLIC_SYNC_URL=https://192.168.1.20:8443
TRUST_PROXY=1

Yalnızca uygulamanın kendisi için bunun yerine APP_URL=https://192.168.1.20 ayarla. İkinci bloğu Caddyfile dışında bırak. Yukarıdaki tarifte olduğu gibi, konteynerlere yalnızca Caddy'nin ulaşabilmesi için ports: satırlarını '127.0.0.1:3000:3000' ve '127.0.0.1:3001:3000' olarak değiştir.

Caddy'nin kök sertifikasını sunucudan dışarı kopyala. Ubuntu'daki Caddy bunu /var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt altında tutar. Sertifika herkese açıktır. Özel anahtarı aynı klasördedir ve sunucudan asla ayrılmamalıdır, bu yüzden yalnızca root.crt dosyasını kopyala:

bash
sudo cp /var/lib/caddy/.local/share/caddy/pki/authorities/local/root.crt ~/openplate-root.crt
sudo chown "$USER" ~/openplate-root.crt

Bilgisayarında bunu scp you@192.168.1.20:openplate-root.crt . ile çek. Ardından, örneğin kendine e-posta eki olarak göndererek ya da AirDrop ile her telefona ilet.

Her cihazda bir kez güven. Ailenin telefonlarının https:// üzerinden çalışmasını sağlayan adım budur.

  • iPhone ve iPad: dosyayı aç ve indirmeye izin ver. Ayarlar içinde, üst tarafa yakın Profil İndirildi seçeneğine dokun veya Genel > VPN ve Aygıt Yönetimi altından bulup yükle. Ardından Ayarlar > Genel > Hakkında > Sertifika Güven Ayarları altından bunun için tam güveni aç. Bu son adım olmadan tarayıcı sayfayı yine de reddeder.
  • Android: dosyayı telefona kaydet. Ayarlar > Güvenlik > Şifreleme ve kimlik bilgileri > Sertifika yükle > CA sertifikası bölümünü aç, uyarıyı kabul et ve dosyayı seç. Daha yeni telefonlarda bu yol Güvenlik ve gizlilik > Diğer güvenlik ayarları ile başlar ve isimler telefon üreticileri arasında biraz farklılık gösterir. Telefondan ekran kilidi yoksa, Android bir tane ayarlamanı ister.
  • Bir bilgisayar: sistemin sertifikalarına ekle. Bazı tarayıcılar kendi listelerini tutar ve orada da bulunmasına ihtiyaç duyar.

Bir telefonda https://192.168.1.20 adresini aç. Sayfa herhangi bir uyarı olmadan yüklenmeli ve giriş yapma çalışmalıdır. Adres yalnızca ev ağında çalışır. Caddy'nin veri klasörünü yedeklerinle birlikte sakla. Yeni bir Caddy kurulumu yeni bir yetkili makam oluşturur ve her cihazın yeni olana güvenmesi gerekir.

Başka herhangi bir ters proxy

nginx, Traefik veya başka bir proxy Caddy'nin yerini alabilir. Bunların hiçbirini test etmedik, bu yüzden bu bir tarif değil, bir kontrol listesidir. Proxy tüm bunları yapmalıdır:

  • İki adet https:// adresi. Uygulama ve çekirdek sunucunun her biri kendisininkini alır.
  • .env içindeki aynı adresler. PUBLIC_APP_URL ve PUBLIC_SYNC_URL değerlerini tam olarak bu adreslere ayarla. Uygulamanın tek başına kullanımı için bu APP_URL değeridir.
  • TRUST_PROXY=1 veya zincirdeki proxy sayısı.
  • Host ve X-Forwarded-Proto uygulamaya ulaşır. Tarayıcının Host başlığını değiştirmeden ilet veya X-Forwarded-Host değerini buna ayarla. X-Forwarded-Proto değerini https olarak ayarla. Uygulamanın CSRF denetimi sayfanın kendi adresini bunlardan oluşturur ve tarayıcının Origin değeriyle karşılaştırır. Bunlar yanlışsa form gönderimleri başarısız olur.
  • X-Forwarded-For her iki servise de ulaşır. Adres başına sınırları bunu okur.
  • Konteyner bağlantı noktaları 127.0.0.1 üzerinde kalır. '127.0.0.1:3000:3000' ve '127.0.0.1:3001:3000' değerlerini koru, böylece proxy'yi aşarak hiçbir şey bunlara ulaşamaz.

Alan adı yok: Tailscale Serve

Tailscale, tailnet ağındaki her makineye ts.net altında bir HTTPS adresi verir. Alan adına, açık portlara ve manuel sertifika yönetimine ihtiyacın kalmaz. Tailscale Serve, bu adresi bu makinedeki bir portun önüne koyar. Eşitleme özellikli openplate iki adrese ihtiyaç duyar. Aynı makine adı altında iki porta hizmet verirsin: 443 üzerinde uygulama ve 8443 üzerinde çekirdek sunucu.

Başlamadan önce:

  • Tailscale yönetici konsolundaki DNS sayfasında tailnet ağın için MagicDNS ve HTTPS sertifikalarını aç. Adımlar Tailscale'in HTTPS kılavuzu sayfasında yer alır. Makine adı herkese açık bir sertifika günlüğünde görünür, bu yüzden gizli bir şey içermeyen bir ad seç.
  • openplate'i açan her cihazda Her aile üyesi Tailscale çalıştırır. Her kişi tailnet ağında yer almalı veya bu makineyi kendileriyle paylaşılmış olmalıdır.
  • Konteyner bağlantı noktalarını 127.0.0.1 üzerinde tut: Uygulama için '127.0.0.1:3000:3000' ve eşitleme için '127.0.0.1:3001:3000'. Tailscale Serve bunlara bu makinede erişir. Başka hiçbir şeyin erişmesine gerek yoktur.

Ardından her iki bağlantı noktasını sun. --bg bunların arka planda çalışmasını sağlar ve Tailscale yeniden başlatmanın ardından bunları yeniden sunar:

bash
tailscale serve --bg --https=443 3000
tailscale serve --bg --https=8443 3001
tailscale serve status

Sertifikayı Tailscale düzenler ve yeniler. Kendi makine ve tailnet adlarını kullanarak her iki adresi .env içinde ayarla:

bash
PUBLIC_APP_URL=https://<machine-name>.<tailnet>.ts.net
PUBLIC_SYNC_URL=https://<machine-name>.<tailnet>.ts.net:8443
TRUST_PROXY=1

Tailscale Serve bir ters proxy'dir, bu yüzden TRUST_PROXY, 1 olarak kalır. Yığını docker compose -f <your file> up -d ile yeniden oluştur. Uygulamayı tek başına çalıştırırsan yalnızca 3000 numaralı bağlantı noktasını sun ve APP_URL değerini ilk adrese ayarla.

Bu yolu uçtan uca çalıştırmadık. Yukarıdaki bayrakları tailscale serve başvurusu belgeler ve Tailscale belgeleri, tailscale serve konusunu açıklar. Yukarıdaki Caddy tarifi, doğruladığımız tariftir.

Kendi sunucunda barındırılan bir Tailscale kontrol sunucusu olan Headscale, HTTPS sertifikası vermez. Bir Headscale tailnet ağı, bunun yerine bir alan adı içeren Caddy tarifine ihtiyaç duyar.

Yedekler

Uygulama sunucusunda yedeklenecek hiçbir şey yoktur. Veritabanı barındırmaz ve durum kaydetmez: silinen bir uygulama konteyneri hiçbir şey kaybetmez.

Asıl önemli yedek cihaz başına alınan JSON dışa aktarımıdır: Ayarlar → Veri ve yedekleme → Her şeyi indir (JSON). Bu dosya, temizlenmiş bir tarayıcıdan veya bozulan bir telefondan geriye kalan kopyadır. Bir cihaz hiç dışa aktarmadığın ya da bir süredir dışa aktarmadığın veriler barındırdığında, uygulama bir hatırlatma başlığı gösterir.

Dışa aktarma dosyasını da günlüğün kendisi kadar gizli tut. Her girdiyi açık metin olarak tutar; ayrıca bu cihazın paylaşım kimliğine ait özel anahtarı ve araştırma takma adının türetildiği kökü de içerir. Dosyayı elinde bulunduran kişi, bu kişiyle paylaşılmış olan bir günlüğü açabilir ve araştırma katkılarını o kişiye geri bağlayabilir. İki şey dosyanın dışında kalır: yapay zeka sağlayıcısı anahtarı ve cihazdan asla ayrılmayan tabak fotoğrafları.

Çekirdek sunucuyu da çalıştırıyorsan, onun Postgres veritabanı, veritabanı olmadan hiçbir işe yaramayan ve tersi de geçerli olan SERVER_SECRET ile birlikte planlı bir yedeklemeyi (dump) hak eder:

Konteyner aracı
docker compose -f compose.core.yml exec postgres \
  pg_dump -U openplate openplate_sync > sync-backup.sql

Yükseltme

Konteyner aracı
docker compose -f compose.yml pull
docker compose -f compose.yml up -d

Dağıtımı yaparken kullandığın -f dosyasının aynısını kullan. docker/topologies/ içinden bir topoloji ayağa kaldırdıysan onun yerine o dosyayı belirt, örneğin docker compose -f compose.core.yml pull. compose.core.yml yanındaki yalın bir docker compose pull, no configuration file provided: not found hatasıyla başarısız olur.

Compose dosyaları en yeni sürüm olan latest etiketini kullanır, dolayısıyla pull seni o sürüme geçirir. Ne zaman yükselteceğini seçmek için image: satırına bir sürümü sabitle, örneğin ghcr.io/lowcarbcheck/openplate:0.54.0. Bir sonraki sürümü istediğinde numarayı değiştir. Çekirdek sunucu ve çıkarım servisinin kendi sürüm numaraları vardır, bu yüzden her imajı kendine sabitle. main etiketi main dalındaki her değişikliği takip eder. Ailenin kullandığı bir sunucu için değil, test amaçlıdır.

Taşınacak hiçbir şey yok: uygulama konteyneri durum tutmaz, bu yüzden yeni imaj sadece eskisinin yerini alır. Yığının tamamını çalıştırıyorsan, çekirdek sunucu başlangıçta kendi veritabanı geçişlerini uygular.

0.1.x öncesi bir imajdan yükseltme (tek seferlik)

Eski imajlar kendi hesap sistemini ve kendi Postgres veritabanını çalıştırıyordu. İkisi de kaldırıldı. Yükseltme işlemi users tablosunu ve ona bağlı her şeyi siler: hesaplar, oturumlar, doğrulama ve sıfırlama belirteçleri. Kaydettiğin hiçbir şey bundan etkilenmez: takip verileri zaten cihaza taşınmıştı. Bu tek yönlü bir değişikliktir, bu yüzden:

  1. Önce yedek al. Hesap satırlarının kurtarılabilir olmasını istiyorsan uygulamanın eski veritabanından bir pg_dump al ve her cihazdaki her kullanıcının Profil → Verilerin üzerinden bir JSON dışa aktarımı almasını sağla. Günlüklerini tutan kopya o dışa aktarımdır.
  2. Yükselt. Önce image: satırını en yeni sürüm olan ghcr.io/lowcarbcheck/openplate:latest değerine güncelle: 0.1.x öncesi imajlar ghcr.io/sprqvntrs/openplate altında yayımlanmıştı ve bu değişiklik olmadan çekmek yalnızca eski olanı tekrar getirir. Geçiş işlemi ardından konteyner başladığında çalışır. Sonrasında giriş sayfası kalmaz: halihazırda verisi olan her cihaz bunu korur ve sadece kim olduğunu sormayı bırakır.
  3. .env dosyanı temizle. session-secret, encryption-key, signup-gate ve seeded-superadmin değişkenleri kaldırıldı; DB_HOST, DB_PORT, DB_USER, DB_PASSWORD, DB_NAME ve havuz ayarlama değişkenleri de öyle. Hiçbir şey bunları okumaz. Tanımlı bırakılmaları zararsızdır ama gereksiz yüktür.
  4. Sonuçtan memnun kalınca Eski birimi sil. Eski sürümler herhangi bir Compose proje adı sabitlememişti, bu nedenle önek çalıştırdığın dizinden geliyordu (önce gerçek adı doğrula): docker volume ls | grep pg-data, ardından docker compose down && docker volume rm <that name>.

aynı tarayıcı profilinde iki hesapla oturum açılmışsa, cihaz deposunun her zaman cihaz kapsamlı olduğunu unutma: verileri zaten tek bir depoyu paylaşıyordu ve öyle kalır. İki kişinin günlüğünü tek bir cihazda ayrı tutmanın yolu yine ayrı tarayıcı profilleridir.

Bu sayfayı GitHub üzerinde düzenle