MemoDokümantasyon
TR

Self-Hosting

Memo'nun backend'i headless bir Go REST API'sidir — masaüstünde çalışanla tamamen aynı, sadece bağlı bir Flutter penceresi olmadan. Bu, bir Raspberry Pi'de, eski bir laptop'ta, ev NAS'ında veya bir VPS'te başıboş çalışabileceği anlamına gelir; sen de gerçek masaüstü/mobil Memo uygulamandan (ya da bir tarayıcıdan) başka bir yerden ona bağlanırsın — tam olarak uzak bir backend gibi. Aşağıdakilerin hepsi v3.5.5 ile yeni.

Self-hosted bir Memo çalıştırmanın üç yolu var. Birini seç:

Yöntem Kimin için Neyi kurar
Sunucu-only kurulumcu SSH erişimi olan bir Raspberry Pi, ev sunucusu veya VPS Backend + CLI + engine binary'leri, memo ve systemd ile yönetilir
Docker / CasaOS CasaOS, Unraid, Synology veya herhangi bir Docker sunucusu Tek bir backend-only container, shell erişimi gerekmez
Tam masaüstü kurulumu, uzaktan işaret edilerek Zaten masaüstünde Memo çalıştırıyorsun ve başka bir cihazın ona ulaşmasını istiyorsun Sıradan masaüstü uygulaması, Ayarlar'da Remote Access açık

Üçü de tamamen aynı backend kodunu çalıştırıyor, yani auth, hafıza, provider'lar ve aşağıdaki her özellik hangisini seçtiğinden bağımsız olarak aynı davranıyor.

Sunucu-Only Kurulum

get-memo-server.sh, get-memo.sh'ın headless kardeşidir: aynı release arşivleri, aynı ~/.memo yapısı, aynı PATH wrapper'ı — ama bilinçli olarak Flutter masaüstü binary'sini, varlıklarını ve app-menu girdisini atlar. İşletim sistemini ve mimariyi (Linux x86_64, Linux arm64 veya macOS) tek bir komuttan otomatik algılar:

curl -fsSL https://download.bugradev.com/get-memo-server.sh | bash

Beta kanalı (her main push'unu takip eder — yeni self-hosted özellikleri tag'li bir release'e düşmeden denemenin şu an tek yolu):

curl -fsSL https://download.bugradev.com/get-memo-server-beta.sh | bash

Taze bir kurulum sırasında script, bir systemd --user servisi olarak kurulup kurulmayacağını sorar (tavsiye edilir — çökmelere dayanır, loginctl enable-linger ile kimse oturum açmadan reboot'lara da dayanır):

Run Memo as a background service (systemd --user)?
Bind to 0.0.0.0 so other devices can reach it? [Y/n]

Bind sorusuna evet demek backend'i --lan ile çalıştırır (0.0.0.0'a bağlanır, her istekte bir kimlik ister — aşağıdaki Auth Modları'na bakın); hayır demek onu sadece 127.0.0.1'de tutar, yalnızca kutunun kendisinden erişilebilir. Her iki durumda da çalışmaya başladığında kurulumcu tarayıcıyı tam olarak nereye yönlendireceğini söyler:

➜ Open http://<lan-ip>:8090 in your browser to get started

Aynı komutu daha sonra tekrar çalıştırmak (aynı URL) mevcut kurulumu tespit eder ve yerinde günceller — binary'ler ve engine tazelenir, config/hafıza/modeller/oturumlar/provider'lar/skill'ler korunur, ve systemd servisi (varsa) yeni binary ile otomatik yeniden başlar.

Güncelleme ve Kaldırma

# Güncelle (her iki kanal için de çalışır — kullandığın script'i yeniden çalıştır)
curl -fsSL https://download.bugradev.com/get-memo-server.sh | bash

# Sunucu-only bir kurulumu kaldır (systemd birimi, ~/.memo, CLI wrapper — önce yedek sunar)
curl -fsSL https://download.bugradev.com/uninstall-selfhosted.sh | bash

uninstall-selfhosted.sh, varsa memo.service systemd birimini durdurup kaldırır, elle başlatılmış --headless süreçleri öldürür, ~/.memo'yu, ~/.local/bin/memo wrapper'ını ve shell rc dosyalarına eklediği PATH satırlarını siler — önce memory/+sessions/'ı yedeklemeyi teklif eder. Onay istemini atlamak için -y/--yes ver (betikli kaldırmalar için).

Docker / CasaOS

Backend-only, multi-arch (amd64 + arm64) bir imaj her push'ta otomatik olarak GHCR'a yayınlanır:

docker pull ghcr.io/bugraakdemir/memo-backend:latest

Tag şeması Memo'nun geri kalan release pipeline'ıyla aynı: :latest ve :vX.Y.Z sadece gerçek bir tag'li release'de ilerler; :beta her main push'unu takip eder.

CasaOS: App Store → Install a customized app → aşağıdaki compose dosyasını yapıştır → istersen volume yolunu ayarla → Install.

Düz Docker Compose CasaOS olmadan da aynı şekilde çalışır:

name: memo
services:
  memo:
    image: ghcr.io/bugraakdemir/memo-backend:latest
    container_name: memo
    restart: unless-stopped
    ports:
      - "8090:8090"
    volumes:
      - /DATA/AppData/memo:/memo
    environment:
      - TZ=Europe/Istanbul
docker compose up -d

Container her zaman 0.0.0.0:8090'a bağlanır (loopback-only bir bağlanma Docker'ın kendi port eşlemesi üzerinden erişilemez olur) ve bunun sonucunda her istekte, diğer container'lardan veya localhost'tan gelenler dahil, bir X-Memo-Token gerektirir. Token ilk açılışta üretilir ve mount edilen volume'e kalıcı olarak yazılır; log'lardan oku:

docker logs memo | grep "X-Memo-Token required"

İmaj yalnızca CPU llama.cpp backend'ini içeriyor — yerel GGUF modeller çalışır, sadece CPU hızında. Küçük bir modelin ötesinde, tipik bir NAS/ev-sunucusu donanımında ilk açılıştan sonra Ayarlar'dan harici bir provider (OpenAI, Claude, Gemini, OpenRouter, ...) bağlamak gerçekçi seçim. Ses transkripsiyonu (Whisper) imajı küçük tutmak için bu imaja dahil edilmedi.

Kendi imajını derlemek (sadece bir fork veya push edilmemiş yerel bir değişiklik için gerekli):

docker build -t <kendi-registry'n>/memo-backend:latest .
docker push <kendi-registry'n>/memo-backend:latest

Auth Modları

Bir backend 127.0.0.1 dışında herhangi bir şeye bağlandığında (--lan, Docker, veya masaüstünde Remote Access), her istek bir kimlik ister — makinenin kendi loopback arayüzünden gelenler hariç, bu her modda her zaman güvenilir (masaüstü uygulamasının kendi yerel backend'iyle konuşması hiçbir zaman bu duvarla kapatılmak için tasarlanmadı). İstediğin zaman değiştirilebilen dört mod:

Mod Kim bağlanabilir Nasıl
none Porta ulaşabilen herkes Hiç kimlik yok — sadece tamamen güvenilir bir özel ağda mantıklı
token (varsayılan) Geçerli bir cihaz-bazlı token'a sahip herhangi bir cihaz X-Memo-Token header'ı veya Authorization: Bearer <token>
password Hesap şifresine sahip herkes Kullanıcı adı + şifre girişi, imzalı bir oturum verir
token_password İkisi de, herhangi biri çalışır
memo remote set-mode none
memo remote set-mode token
memo remote set-mode password --username sen --password ...
memo remote set-mode token_password --username sen --password ...

Şifreler argon2id ile hash'lenir, giriş denemeleri brute-force kilitlemesiyle sınırlıdır, ve oturumlar kısa ömürlü imzalı token'lardır (varsayılan 12 saat, "beni hatırla" ile 30 gün). Cihaz-bazlı token'lar diskte hash'lidir, sadece oluşturulduğunda bir kez gösterilir, ve başka hiçbir cihazın erişimine dokunmadan tek tek iptal edilebilir:

memo remote list-devices
memo remote add-device "telefonum"
memo remote revoke-device <id>
memo remote rotate-token <id>   # iptal et + aynı adla yeniden ekle, sızmış bir token için

--password, set-mode/login'de boş bırakılırsa terminalden gizli olarak interaktif sorulur — asla düz, ps ile görülebilir bir komut satırı argümanı olarak yazılmaz.

Çoklu Hesap

Self-hosted Memo, masaüstü veya web istemcisinde Ayarlar → Hesaplar'dan yönetilen (ekle, sil, şifre değiştir, çıkış yap) admin/kullanıcı rolleriyle çoklu hesabı destekler — tek, paylaşılan bir giriş değil. Her ekran aynı ilk-kurulum kapısından ve giriş kapısından geçer.

Web Arayüzü

Her self-hosted backend — sunucu-only kurulum veya Docker — kendi portunda (varsayılan http://<host>:8090) kendi web arayüzünü servis eder: gerçek bir Flutter web derlemesi, masaüstünde alacağın aynı uygulama, elle yazılmış ayrı bir istemci değil. İlk ziyaret seni kuruluma yönlendirir (ya da auth zaten yapılandırılmışsa bir token/giriş ekranına); ondan sonra provider bağlama ve model yönetimi için Ayarlar'la birlikte tam sohbet deneyimini alırsın.

Tam Flutter masaüstü uygulaması da self-hosted bir backend'e doğrudan işaret edebilir — Ayarlar → Remote Access → Backend Server URL — tam özellik seti için (hafıza, Orchestra, Takvim, WhatsApp ve daha hafif web derlemesinde olmayan her şey).

SSH Üzerinden Yönetim

Ayarlar'ın self-hosted bir kuruluma yapabildiği her şeyi memo CLI'si de yapabilir — tam söz dizimi için CLI Referansı'na bakın. Temel olanlar:

memo service status              # çalışıyor mu?
memo service restart             # yeniden başlat (her zaman --user, aşağıya bakın)
memo remote status                # auth modu, adresler, uyarılar
memo config get llama.port        # config.yaml'ı oku
memo config set llama.port 8081   # config.yaml'a yaz

Servis her zaman bir systemd --user birimidir (kurmak veya yönetmek için root/sudo gerekmez). systemctl'i elle kullanırsan sen de --user ekle — çıplak/sudo systemctl sistem-geneli birimleri hedefler ve Unit memo.service not found ile başarısız olur.

Bilinen Sınırlamalar

  • Henüz gömülü TLS yok. Backend düz HTTP servis ediyor. LAN'ından çıkan her şey için Tailscale, ngrok veya kendi reverse proxy'ni (nginx/Caddy, TLS sonlandırmasıyla) kullan — port 8090'ı doğrudan internete açma.
  • Tailscale/ngrok tünelleri sadece Ayarlar'dan. memo remote/memo service auth'u ve systemd birimini yönetir, ama bir tüneli başlatmak veya durdurmak henüz bir CLI alt komutu değil.
  • Henüz düşmanca güvenlik testi yok. Auth sistemi fonksiyonel olarak test edildi (bir Raspberry Pi üzerinde gerçek, loopback olmayan bir istemciye karşı canlı test dahil), ama gerçek bir kurulumun gerçek bir sızma testi henüz yapılmadı — beta-sertleştirilmiş olarak düşün, denetlenmiş değil.
  • CasaOS'ta özellikle arm64 Docker: imajın kendisi arm64 için derlenip push ediliyor, ama CasaOS'un app-store metadata'sı gerçek ARM donanımında canlı doğrulama beklerken henüz arm64'ü reklam etmiyor — bir Raspberry Pi'de docker pull yine de doğru arm64 imajını çözümlüyor.

Tam, güncel liste için bkz. Bilinen Sorunlar.