MEF · Kurulum dokümanları

Web + Android · Ubuntu · Supabase

MEF Web ve Android — Ayrıntılı kurulum kılavuzu

Sürüm 1.11.0 · 22 Ekim 2026 · Ubuntu, Supabase ve bağımsız Voxexo lisansı

Bu kılavuz kaynak kod paketini kendi alan adı, Ubuntu sunucusu ve Supabase projesiyle çalıştırmak isteyen işletici içindir. Komutlar Bash içindir. PowerShell penceresine aynen yapıştırılmaz; Ubuntu SSH oturumunda çalıştırılır. Windows bilgisayarda geliştirme ve Android derlemesi ayrı bölümdedir.

1. Domain girmek gerekiyor mu?

Evet. Kurulumu yapan işletici kendi alan adını ayarlara bir kez yazar. Uygulamayı kullanan kişiler alan adı, sunucu IP adresi veya lisans anahtarı girmez. Android, derlenirken içine konulan HTTPS API adresine otomatik bağlanır.

AdresİşlevKim ayarlar?
https://app.example.comWeb sitesi ve bu örnekte APIKurulumu yapan kişi
https://app.example.com/adminUygulama yönetimiAynı domain altında otomatik yol
wss://rtc.example.comSes, video ve canlı yayın bağlantısıMedya sunucusunu kuran kişi
https://PROJECT_REF.supabase.coAuth, veritabanı ve StorageAlıcının Supabase projesi
https://license.voxexo.comSatıcının lisans servisiVoxexo; müşteri bunu kendi domainiyle değiştirmez

example.com ve PROJECT_REF örnek değerlerdir. Bunları kendi bilgilerinle değiştir. Alan adı bir klasör değildir; DNS kaydıyla sunucuya yönlenir, web sunucusunda tanımlanır ve TLS sertifikası alır.

Bu kılavuz web ve API için aynı alan adını kullanır. API ayrı api.example.com adresinde kurulursa EXPO_PUBLIC_API_URL ve LICENSE_INSTALLATION_ORIGIN o API origin'ini gösterir; CORS_ORIGINS web sitesinin origin'ini içerir. Auth Site URL ise kullanıcıya gösterilen web sitesidir. Aynı uygulamanın Web ve Android istemcileri ortak API/veritabanı kullanır.

2. Yapılandırma dosyaları: hangi değer nereye yazılır?

203.0.113.10 dokümantasyon için ayrılmış örnek IP adresidir; çalışır bir sunucu değildir. DNS A kayıtlarında gerçek sunucu IP adresini kullan. app.example.com, rtc.example.com ve PROJECT_REF örneklerini kendi değerlerinle değiştir. Uygulama kullanıcıları bu ayarları girmez.

Dosya / panelDüzenlenecek alanÖrnek / açıklama
frontend/.envEXPO_PUBLIC_API_URLhttps://app.example.com — /v1 ekleme
frontend/.envEXPO_PUBLIC_SUPABASE_URLhttps://PROJECT_REF.supabase.co
frontend/.envEXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEYAynı projenin public publishable/anon anahtarı
/etc/mef/api.envSUPABASE_URL, SUPABASE_ANON_KEYAynı projenin URL ve public anahtarı
/etc/mef/api.envSUPABASE_SERVICE_ROLE_KEYSadece sunucuda kalacak service_role anahtarı
/etc/mef/api.envCORS_ORIGINS, LICENSE_INSTALLATION_ORIGINhttps://app.example.com — sonuna / ekleme
/etc/mef/api.envLICENSE_ISSUERhttps://license.voxexo.com — satıcı değişiklik bildirmedikçe koru
/etc/mef/api.envLICENSE_PUBLIC_KEY_FILE/opt/mef/server/license-public.pem
frontend/app.jsonexpo.name, slug, schemeMy App, my-app, myapp
frontend/app.jsonexpo.android.package, versionCodecom.example.myapp, 1 — her mağaza güncellemesinde artır
frontend/tools/finalize-web.mjstitle, description, URLKendi marka ve HTTPS domainin
/etc/nginx/sites-available/mefserver_name, root, proxy_passapp.example.com, /var/www/mef, http://127.0.0.1:3001
Supabase Auth → URL ConfigurationSite URL, Redirect URLshttps://app.example.com/ ve myapp://
Supabase Auth → Email → SMTPhost, port, user, password, senderKendi posta hizmetinin bilgileri
/etc/mef/api.envLIVEKIT_URL, LIVEKIT_HTTP_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRETwss://rtc.example.com ve özel medya anahtarların

.env.example şablondur. Gerçek frontend değerleri .env dosyasına, gerçek API değerleri özel /etc/mef/api.env dosyasına yazılır. Anahtarları bu dokümana veya kaynak ZIP'ine kaydetme. Lisans sağlayıcısının adresi, kendi web sitenin alan adından farklıdır.

3. Arayüz dilleri

Web ve Android ortak 22 dil kataloğu kullanır: Türkçe, İngilizce, Almanca, Fransızca, Arapça, Çince, Rusça, İspanyolca, Korece, Japonca, Portekizce, Lehçe, İtalyanca, Felemenkçe, Ukraynaca, Hintçe, Endonezce, Vietnamca, Tayca, Farsça, Bengalce ve Urduca. İlk açılışta cihazın desteklenen dili seçilir; desteklenmeyen cihaz dillerinde İngilizce kullanılır. Dil menüsünden yapılan tercih cihazda saklanır. Arapça, Farsça ve Urduca sağdan sola gösterilir.

Metinler frontend/src/i18n/locales/<dil>.json dosyalarındadır. Anahtarlar kaynak Türkçe metindir; değerler çeviridir. {p0} gibi yer tutucuları koru. Arayüz çevirisi kullanıcı mesajlarını, isimlerini ve yayın başlıklarını değiştirmez. Mesaj çevirisi için ayrıca çeviri hizmeti gerekir. Native izin metinleri frontend/locales/ altında bulunur; bu dosyalardaki değişiklik Android'in yeniden derlenmesini gerektirir.

4. Hangi dosyayı kullanacağım?

Dosyaİçerik / kullanım
MEF-Web-Source.zipWeb arayüzü, API, migration'lar, örnek ayarlar ve kılavuz
MEF-Android-Addon.zipAynı sürümdeki Web kaynaklarının üzerine eklenen native dosyalar ve ayarlar
MEF-Web-Android-Source.zipWeb ve Android kaynakları bir arada; birlikte alan müşteri bunu kullanır
APKAndroid cihazda test/kurulum çıktısı; kaynak kod değildir
AABGoogle Play için yayın çıktısı; düzenlenebilir proje değildir

ZIP'i açınca ana dizinde frontend/, server/, supabase/, deployment/ ve documentation/ bulunur. Android eklentisi tek başına tam ürün değildir. Birleşik pakette eklentiyi yeniden açman gerekmez.

node_modules, Android SDK, Gradle önbelleği, model ağırlıkları, gerçek kullanıcı verileri ve özel şifreler ZIP'e konmaz. Bu nedenle kaynak ZIP'i APK'den çok küçüktür. Kurulumda npm ci bağımlılıkları internetten indirir; kurulumdan sonra diskte kullanılan alan kaynak ZIP boyutundan büyük olur.

5. Başlamadan önce hazır olacak bilgiler

Supabase hesap giriş şifresi, Supabase database şifresi, uygulama kullanıcısının şifresi ve VOX lisans anahtarı farklı bilgilerdir. Birini diğer alanın yerine yazma.

6. DNS ve HTTPS

DNS yönetiminde örnek olarak aşağıdaki kayıtları oluştur:

TürAdDeğer
Aapp203.0.113.10
Artc203.0.113.10

IPv6 kullanmıyorsan boşa veya yanlış sunucuya giden AAAA kaydı bırakma. app.example.com için mevcut sertifikası olan sunucuda o sertifikayı kullan. Yeni sunucuda sertifika adımı aşağıdadır.

Cloudflare kullanılıyorsa medya origin'i ve WebRTC portları normal web proxy'si üzerinden taşınmaz. Bu kılavuzun rtc örneği doğrudan erişilebilir DNS kaydı içindir. Web sitesi proxylense bile https://app.example.com/v1/license/challenge/… yolu lisans servisi tarafından okunabilmeli; bu API yoluna tarayıcı CAPTCHA'sı veya JavaScript challenge uygulanmamalı.

DNS kontrolü:

bash
getent ahosts app.example.com
getent ahosts rtc.example.com

Telefon uygulaması localhost adresindeki API'ye bağlanamaz; telefondaki localhost telefonun kendisidir. Üretimde https://app.example.com kullanılmalı. IP + HTTP adresi mevcut lisans etkinleştirmesi için uygun değildir.

7. Yeni Ubuntu sunucusunu hazırlama

Bu bölüm boş sunucu içindir. Plesk veya başka bir hosting paneli varsa panelin domain, document root, sertifika ve reverse proxy ayarlarını kullan; aynı portlara ikinci web sunucusu kurma.

bash
sudo apt update
sudo apt install -y ca-certificates curl unzip xz-utils python3 openssl nginx certbot python3-certbot-nginx

Node.js 24 zaten kuruluysa yalnızca node --version, npm --version ve command -v node ile doğrula. Ubuntu'nun varsayılan nodejs paketi istediğimiz major sürüm olmayabilir. Yeni x86_64 sunucu için resmi binary örneği; ARM sunucuda mimariyi linux-arm64 yap:

bash
NODE_VERSION=v24.22.1
NODE_ARCH=linux-x64
mkdir -p "$HOME/mef-node-download"
cd "$HOME/mef-node-download"
curl -fSLO "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$NODE_ARCH.tar.xz"
curl -fSLO "https://nodejs.org/dist/$NODE_VERSION/SHASUMS256.txt"
sha256sum --check --ignore-missing SHASUMS256.txt

Checksum başarılıysa:

bash
sudo tar -xJf "node-$NODE_VERSION-$NODE_ARCH.tar.xz" -C /opt
sudo ln -s "/opt/node-$NODE_VERSION-$NODE_ARCH" /opt/mef-node
sudo ln -s /opt/mef-node/bin/node /usr/local/bin/node
sudo ln -s /opt/mef-node/bin/npm /usr/local/bin/npm
sudo ln -s /opt/mef-node/bin/npx /usr/local/bin/npx
node --version
npm --version

Sürüm bu kılavuz hazırlanırken resmi indirme sayfasından kontrol edildi. Sonraki kurulumlarda desteklenen 24.x güvenlik sürümünü kontrol et. ln mevcut bir dosya yüzünden hata verirse zorla üzerine yazma; mevcut Node kurulumunu incele. Systemd için Node yolu /opt/mef-node/bin/node olacak. Mevcut Plesk sunucusunda bu yol farklıdır.

Uygulama kullanıcısı ve özel lisans dizini:

bash
sudo useradd --system --create-home --home-dir /var/lib/mef --shell /usr/sbin/nologin mef
sudo install -d -o mef -g mef -m 755 /opt/mef
sudo install -d -o root -g root -m 700 /etc/mef
sudo install -d -o mef -g mef -m 700 /var/lib/mef-license

Kullanıcı zaten varsa yeniden oluşturmaya çalışma. Kaynak ZIP'i SFTP/SCP ile sunucuya gönder, /opt/mef içine aç ve yalnızca bu uygulamanın kaynak klasörlerini mef kullanıcısına ver. ZIP'in içine fazladan bir üst klasör açılmadığını doğrula:

bash
ls /opt/mef/frontend/package.json /opt/mef/server/package.json
sudo chown -R mef:mef /opt/mef/frontend /opt/mef/server

8. Yeni Supabase projesi ve migration'lar

Supabase hesabında yeni proje oluştur. Proje ref'i panel URL'sindeki proje kimliğidir. API Settings/Connect bölümlerinden kendi proje URL'sini ve anahtarlarını al. Aşağıdaki işlemler kurulum klasörünün kökünde yapılır; server/ içinde yapılmaz.

bash
cd /opt/mef
npx supabase --version
npx supabase --help
npx supabase init --help
npx supabase link --help
npx supabase db push --help

supabase/config.toml yoksa npx supabase init çalıştır. CLI sürümünü kurulum kaydına yaz. Ardından:

bash
npx supabase login
npx supabase link --project-ref PROJECT_REF
npx supabase db push --dry-run
npx supabase db push
npx supabase migration list

Giriş ve database parolası sorulduğunda CLI'nin etkileşimli akışını kullan; bunları komut satırındaki parametrelere veya herkese açık dosyalara yazma. Migration'lar dosya adı sırasıyla uygulanır. Bu pakette 35 SQL migration dosyası bulunur. Tek bir ilk SQL dosyasını çalıştırmak yeterli değildir.

Var olan proje için önce migration geçmişini karşılaştır. already exists veya geçmiş uyuşmazlığı varsa veritabanını silerek çözmeye çalışma. Kurulum rehberi adına üretimde db reset çalıştırma. Salt okunur ön kontrol için SQL Editor:

sql
select to_regclass('public.profiles') as profiles,
       to_regclass('public.messages') as messages,
       to_regclass('mef_private.operator_emails') as operators;

select id, public from storage.buckets order by id;

select tablename from pg_publication_tables
where pubname = 'supabase_realtime' and schemaname = 'public'
order by tablename;

Storage bucket'ları ve erişim politikaları migration'ların parçasıdır. İzin hatasını çözmek için private bucket'ları public yapma, RLS'yi kapatma veya service_role anahtarını telefona koyma. Güncel Supabase güvenlik danışmanını da kontrol et; mevcut ayrıcalıklı RPC'lerin yetki denetimlerini koru.

9. Auth, yönetici hesabı ve SMTP

Supabase Authentication → URL Configuration:

AyarAynı domain örneği
Site URLhttps://app.example.com/
Redirect URLhttps://app.example.com/
Android redirectmef://

Buradaki mef:// bir domain değildir; uygulamanın deep-link scheme'idir. Marka değiştirilirse Android bölümündeki scheme adımlarını birlikte uygula.

Authentication → Email/SMTP bölümünde kendi SMTP host, port, kullanıcı ve parolanı tanımla. Gönderen adresi o servis tarafından kullanılabilir olmalı. Sağlayıcının verdiği SPF/DKIM kayıtlarını DNS'e ekle; gerekliyse DMARC yapılandır. Varsayılan Supabase e-posta servisini herkese açık ticari gönderim için yeterli kabul etme. SMTP örneğin info@example.com olabilir; müşteriler Voxexo'nun posta hesabını kullanmaz.

İlk gerçek yönetici hesabını uygulamadan kaydet ve e-postasını doğrula. Lisans olmadığı için uygulama akışı ilerlemiyorsa Supabase Auth kullanıcı yönetiminden işleticiye ait hesabı oluşturup doğrula; auth.users tablosuna elle kullanıcı satırı ekleme.

SQL Editor'da gerçek doğrulanmış işletici e-postasını yetkilendir:

sql
insert into mef_private.operator_emails(email)
values (lower('owner@example.com'))
on conflict do nothing;

select id, email, email_confirmed_at
from auth.users
where lower(email) = lower('owner@example.com');

Kaynak paketindeki owner@example.com gerçek kullanıcı değildir ve gerçek kişiye yetki sağlamaz. Adresin doğrulanmış olması gerekir. Kullanıcının kendisinin değiştirebildiği profil/metaveri alanlarına admin=true yazarak yönetici yetkisi verilmez.

10. API'nin özel ayarları

bash
sudo install -o root -g root -m 600 /opt/mef/server/.env.example /etc/mef/api.env
sudo nano /etc/mef/api.env

Aynı dosyadaki örnek boş değerleri aşağıdaki mantıkla doldur. Gerçek değerleri burada verilen örnek yazılarla karıştırma:

dotenv
SUPABASE_URL=https://PROJECT_REF.supabase.co
SUPABASE_ANON_KEY=YOUR_PROJECT_PUBLIC_KEY
SUPABASE_SERVICE_ROLE_KEY=YOUR_SERVER_ONLY_SERVICE_ROLE_KEY
HOST=127.0.0.1
PORT=3001
NODE_ENV=production
CORS_ORIGINS=https://app.example.com
PRIVATE_CHARACTER_TEST_MODE=false
CASHOUT_ENCRYPTION_KEY=YOUR_NEW_64_CHARACTER_HEX_KEY
LICENSE_ISSUER=https://license.voxexo.com
LICENSE_INSTALLATION_ORIGIN=https://app.example.com
LICENSE_PUBLIC_KEY_FILE=/opt/mef/server/license-public.pem
LICENSE_STATE_FILE=/var/lib/mef-license/installation.json
LICENSE_REQUIRED=true

CORS_ORIGINS ve LICENSE_INSTALLATION_ORIGIN sonuna / ekleme. SUPABASE_ANON_KEY, API'de kullanılan public proje anahtarının değişken adıdır; service_role ile aynı değer değildir. Frontend ve server public key'leri aynı projeye ait olmalıdır.

Cashout şifreleme anahtarı için openssl rand -hex 32 ile yeni bir değer üretip özel dosyaya yaz. Banka bilgileri kullanılmaya başladıktan sonra bu anahtarı rastgele değiştirme; yedekle. Anahtar kaybı eski şifreli banka bilgilerinin okunamamasına yol açabilir.

Paketin açık doğrulama PEM dosyası müşteri sunucusunda okunabilir kalmalıdır:

bash
sudo chmod 644 /opt/mef/server/license-public.pem
sudo -u mef test -r /opt/mef/server/license-public.pem
sudo -u mef test -w /var/lib/mef-license

PEM dosyasını root:root 700 bir klasörün altına koyarsan dosya 644 olsa bile servis okuyamaz. Özel issuer imza anahtarını bu dosyanın yerine koyma.

11. API'yi derleme ve servis olarak çalıştırma

bash
cd /opt/mef/server
sudo -u mef /opt/mef-node/bin/npm ci
sudo -u mef /opt/mef-node/bin/npm run typecheck
sudo -u mef /opt/mef-node/bin/npm run build

/etc/systemd/system/mef-api.service oluştur:

ini
[Unit]
Description=MEF application API
Wants=network-online.target
After=network-online.target

[Service]
User=mef
Group=mef
WorkingDirectory=/opt/mef/server
EnvironmentFile=/etc/mef/api.env
Environment=NODE_ENV=production
ExecStart=/opt/mef-node/bin/node dist/index.js
Restart=on-failure
RestartSec=5
UMask=0077
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/mef-license

[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable --now mef-api
sudo systemctl status mef-api --no-pager
curl -fsS http://127.0.0.1:3001/health

Health yanıtı 200/ok olmalı. Bu yalnızca API'nin yapılandırılıp açıldığını gösterir; tüm veritabanı, e-posta veya kamera akışlarının kabul testi değildir. API portu yalnızca loopback'te dinler; 3001 portunu internete açmak gerekmez.

12. Web arayüzünü derleme

Frontend örnek ayarlarını kendi projenle doldur:

bash
cd /opt/mef/frontend
sudo -u mef cp .env.example .env
sudo -u mef nano .env
dotenv
EXPO_PUBLIC_SUPABASE_URL=https://PROJECT_REF.supabase.co
EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=YOUR_PROJECT_PUBLIC_KEY
EXPO_PUBLIC_API_URL=https://app.example.com

EXPO_PUBLIC_API_URL sonuna /v1 yazma; kod endpoint'lere /v1 ekler. EXPO_PUBLIC_ değişkenleri derlenen uygulamada okunabilir; bu alana özel anahtar konmaz. .env değişince yalnızca Nginx'i yeniden başlatmak yetmez; web tekrar derlenmelidir.

Markanı app.json, arayüzdeki marka metinleri, logolar ve tools/finalize-web.mjs içindeki başlık/açıklama/og:url alanlarında düzenle. Lisans sağlayıcısının license.voxexo.com adresini marka değişikliği diye değiştirme.

bash
sudo -u mef /opt/mef-node/bin/npm ci
sudo -u mef /opt/mef-node/bin/npm run typecheck
sudo -u mef /opt/mef-node/bin/npm run lint
sudo -u mef /opt/mef-node/bin/npm run export:web
sudo install -d -m 755 /var/www/mef
sudo cp -a dist/. /var/www/mef/
sudo find /var/www/mef -type d -exec chmod 755 {} +
sudo find /var/www/mef -type f -exec chmod 644 {} +

Web document root yalnızca frontend/dist içeriğini sunmalıdır. Kaynak klasörünün tamamını, server/ klasörünü veya .env dosyalarını web köküne kopyalama. Test ve hata ayıklama araçlarını müşteri sitesine yayımlama.

13. Nginx, sertifika ve /admin

Boş Ubuntu sunucusunda /etc/nginx/sites-available/mef dosyasına önce HTTP yapılandırmasını yaz. Domain ve root değerlerini kendi kurulumuna göre düzenle:

nginx
server {
    listen 80;
    server_name app.example.com;
    root /var/www/mef;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
    location = /admin {
        try_files /index.html =404;
        add_header Cache-Control "no-store" always;
    }
    location = /admin/ {
        return 308 /admin;
    }
    location ~ ^/(v1(?:/|$)|health$) {
        proxy_pass http://127.0.0.1:3001;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        client_max_body_size 32k;
        proxy_read_timeout 120s;
        add_header Cache-Control "no-store" always;
    }
    location ~ ^/(?:\.env|\.git|node_modules|server|src)(?:/|$) {
        return 404;
    }
}
bash
sudo ln -s /etc/nginx/sites-available/mef /etc/nginx/sites-enabled/mef
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d app.example.com
sudo certbot renew --dry-run
curl -I https://app.example.com/admin
curl -fsS https://app.example.com/health

Sertifika aracı HTTPS ve HTTP→HTTPS yönlendirmesini kurduktan sonra kontrol et. Plesk'te bunun yerine domainin kendi SSL ve ek Nginx direktifleri kullanılır. Mevcut Plesk document root'u bu örnekteki /var/www/mef değildir.

Firewall varsa önce doğru SSH portunun izinli olduğunu doğrula; web için 80/TCP ve 443/TCP açılır. 3001, çeviri servisi ve özel lisans dosyaları dışarı açılmaz. Sunucu sağlayıcısının ek firewall kuralları da geçerlidir.

14. Lisansı etkinleştirme ve ilk yönetici kilidi

Normal yol: yönetici hesabıyla webden giriş yap → /admin → Kurulum lisansı → VOX anahtarını yapıştır → etkinleştir. Müşteri, satıcının license.voxexo.com/ paneline girmez.

Mevcut 1.11.0 sürümünde ilk yöneticinin profili tamamlanmamışsa arayüz önce profil oluşturmayı gösterebilir. Henüz etkinleştirilmemiş lisans da profil tamamlama isteğini engelleyebilir. Bu durumda lisansı kapatmak veya veritabanında sahte profil tamamlandı bilgisi yazmak yerine aşağıdaki ilk kurulum yardımcısını kullan.

Bu kılavuz ZIP'indeki documentation/activate-owner.py ve documentation/activate-owner.mjs dosyalarını kaynakların documentation/ klasörüne birlikte koy. Ubuntu sunucusunda:

bash
sudo python3 /opt/mef/documentation/activate-owner.py /opt/mef/server /etc/mef/api.env

Gerçek doğrulanmış yönetici e-postanı, uygulama kullanıcısının şifresini ve VOX anahtarını gir. Parola ve lisans anahtarı terminalde gösterilmez veya bir dosyaya kaydedilmez. Yardımcı Supabase'e normal kullanıcı olarak giriş yapar, canonical admin_access kontrolünü yapar ve çalışan yerel API'ye etkinleştirme isteği gönderir. Yönetici olmayan hesaba ek yetki vermez, kullanıcı yaratmaz ve lisans zorunluluğunu kapatmaz.

Başarılı çıktı active: true, kurulum domain'i ve ürün haklarıdır. Sonra webde profilini normal şekilde tamamla, /admin sayfasına gir ve lisans durumunu kontrol et. Yardımcı yalnızca yeni kurulumdaki ilk yönetici etkinleştirmesi gerektiğinde kullanılır.

Etkinleştirme sırasında issuer şu yolu dışarıdan HTTPS ile doğrular: /v1/license/challenge/<tek-kullanımlık-nonce>. Rastgele bir nonce ile elle GET yapmak 404 verebilir; bu beklenir. Gerçek nonce etkinleştirme işlemi sırasında oluşturulur.

Anahtar bir production kurulumuna ve alan adına bağlanır. Aynı kurulumdaki Android için ayrı domain gerekmez; Android hakkı aynı anahtara eklenir. Alan adı değişirse satıcı kurulum bağlantısını sıfırlar ve yeni adreste yeniden etkinleştirme yapılır.

Hak belgesi yaklaşık günlük yenilenir; kısa kesintiler için en fazla 7 gün geçerli imzalı önbellek vardır. Bu 7 günlük kullanım aboneliği değildir. Bağlantısız kurulumda iptal anında uygulanmaz; yenilemede kontrol edilir. Sunucunun saatini doğru tut.

15. Ses/video ve canlı yayın için LiveKit

Web/API'nin açılması medya sunucusunun kurulduğu anlamına gelmez. Sesli/görüntülü görüşmeler ve canlı yayınlar için LiveKit ayrıca çalışmalıdır. Resmi dağıtım kılavuzuyla kendi Ubuntu sunucunda kur; kullanılan LiveKit server sürümünü kurulum kaydına yaz. Anahtarları yalnızca API ve LiveKit sunucusunda tut.

Bu rehber ayrı rtc.example.com domain'ini önerir. Geçerli TLS sertifikası olan reverse proxy, LiveKit'in loopback'teki 7880 portuna WebSocket bağlantısını taşır. İlgili HTTPS server bloğunda örnek:

nginx
location / {
    proxy_pass http://127.0.0.1:7880;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    proxy_buffering off;
}

API'nin özel env dosyasında:

dotenv
LIVEKIT_URL=wss://rtc.example.com
LIVEKIT_API_KEY=YOUR_LIVEKIT_KEY
LIVEKIT_API_SECRET=YOUR_LIVEKIT_SECRET
LIVEKIT_HTTP_URL=http://127.0.0.1:7880

LiveKit yapılandırmasında aynı anahtarlarla imzalı webhook tanımla:

yaml
webhook:
  api_key: YOUR_LIVEKIT_KEY
  urls:
    - https://app.example.com/v1/livekit/webhook

Bu webhook çağrı süreleri ve yayın katılımının güvenilir sunucu olaylarıyla işlenmesini sağlar. İmza kontrolünü kaldırma. rtc.udp_port: 7882 ile UDP mux kullanılan örnekte 7882/UDP ve ICE/TCP için 7881/TCP dışarıdan erişilebilir olmalıdır. UDP port aralığı yöntemi seçildiyse o yöntemin aralığı açılır; iki yöntemin kurallarını karıştırma. TURN/UDP kullanılırsa 3478/UDP ve yapılandırılmış relay aralığı da açılır. TURN/TLS ayrı domain/sertifika ve port tasarımı gerektirir. Yalnızca 443'ü açmak her ağda medyanın çalışmasını sağlamaz.

Medya sunucusunun public IP/NAT ayarını gerçek sunucuna göre yap; eski kurulum IP'sini kopyalama. Büyük yayınların CPU, ağ ve trafik gereksinimini gerçek eşzamanlı kullanıcılarla ölç. Fotoğraf üretimi/GPU, temel Web+Android kurulumu için gerekli değildir.

bash
sudo systemctl restart mef-api
curl -fsS https://app.example.com/v1/capabilities

Capabilities, yapılandırma durumunu gösterir; gerçek iki cihazlı görüşme testinin yerine geçmez. Wi-Fi ve mobil veri arasında ses/video, mikrofon/kamera izni reddi, yeniden bağlanma, çağrı süresi, yayın sohbeti ve izleyici sayısını dene.

16. Mesaj çevirisi

Çeviri özelliği ayrıca loopback üzerinde LibreTranslate uyumlu /translate servisi gerektirir. Tüm dillere ait modellerin otomatik kurulduğunu varsayma; hizmetin yüklü dil çiftlerini doğrula. Bu API yalnızca yerel HTTP çeviri origin'ini kabul eder.

dotenv
TRANSLATION_URL=http://127.0.0.1:5000

Kullanıcının ana dili profilde seçili olmalı. Dil modelleri yüklendikten sonra API'yi yeniden başlat ve bir mesajı gerçek kullanıcı hesabından çevir. Kullanıcının göremediği başka sohbetteki mesajı çevirme isteği yetki hatası vermelidir. Çeviri hizmetini kimlik doğrulamasız olarak internete açma.

17. Android eklentisini uygulama

Web+Android birleşik ZIP kullanıldıysa native dosyalar zaten vardır. Yalnız Web kurulduysa aynı 1.11.0 sürümündeki Android overlay'i kaynakların kök dizinine aç; frontend/ klasörü mevcut frontend/ üzerine birleşir. Kurulumu yedekle ve sana ait .env dosyasını koru. Overlay app.json ve paket dosyalarını değiştirdiği için kendi markalamanı tekrar kontrol et.

Android için ikinci Supabase projesi, ikinci kullanıcı havuzu veya ikinci admin paneli oluşturma. Android istemcisi aynı HTTPS API URL'sini kullanır; kullanıcı Web ve Android'de aynı hesabına giriş yapar.

frontend/app.json içinde en az şu alanları kendi markana göre düzenle:

json
{
  "expo": {
    "name": "My App",
    "slug": "my-app",
    "scheme": "myapp",
    "android": {
      "package": "com.yourcompany.myapp",
      "versionCode": 1
    }
  }
}

Bu JSON tam dosyanın yerine geçmez; diğer Expo eklentilerini ve mevcut ayarları koru. Android paket adı DNS adresi değildir. Örneğin com.yourcompany.myapp telefon/Play uygulama kimliğidir, https://app.example.com ise sunucu adresidir.

Scheme mef yerine myapp yapılırsa Supabase Redirect URLs listesine myapp:// ekle. src/useApp.ts scheme değerini Expo yapılandırmasından okur; bu dosyadaki kaynak kodu değiştirmen gerekmez. Değişiklikten sonra Android uygulamasını yeniden derle.

Native WebRTC ve diğer native eklentiler bulunduğundan tüm işlevlerin Expo Go'da çalışmasını bekleme. APK veya native development build ile test et. Android hakkı olmayan Web lisansı, resmi Android istemcisinin API kullanımını ve Android kaynak indirmesini açmaz.

18. Android APK ve AAB üretme

Bu adımı geliştirici bilgisayarında yapmak daha uygundur. Aynı source ve lockfile ile başla:

bash
cd frontend
npm ci
npm run typecheck
npx eas-cli --help
npx eas-cli login
npx eas-cli build:configure

EAS proje kimliği oluşturulursa app.json/app.config.ts içindeki kendi projene ait ek ayarları koru. EAS kullanımı ayrı bir Expo hizmetidir; o hesabın kota/ücret koşulları geçerlidir. Android Studio/SDK ile yerel derleme alternatifi de vardır.

Örnek eas.json:

json
{
  "build": {
    "preview": {
      "distribution": "internal",
      "environment": "preview",
      "android": { "buildType": "apk" }
    },
    "production": {
      "environment": "production",
      "android": { "buildType": "app-bundle" }
    }
  }
}

EAS preview ve production ortamlarının ikisinde de kendi üç EXPO_PUBLIC_… değerini tanımla. Yerel .env dosyasının Git ignore veya EAS ignore nedeniyle uzak derlemeye gitmesini varsayma. EAS environment değişkenleri bu yüzden açıkça ayarlanmalıdır. Bu üç alanın public olması normaldir; server secret'larını EAS frontend değişkenlerine ekleme.

bash
npx eas-cli env:create --help
npx eas-cli build --platform android --profile preview
npx eas-cli build --platform android --profile production

Preview çıktısı APK, production çıktısı AAB olur. İmza anahtarını kendi hesabında yönet; satıcının Android Debug/test sertifikasıyla Play yayını yapma. Play'de devam güncellemeleri aynı uygulama kimliği ve uygun imza zinciriyle yapılır. Yeni mağaza sürümlerinde versionCode artırılır.

Yerel derleme tercihinde SDK 58'in güncel Android araç gereksinimlerini uygula. Kaynak projede native klasörler npx expo prebuild --platform android ile üretilebilir; üretilen Gradle/SDK/JDK gereksinimlerini esas al. Mağaza release imzası ayarlanmadan assembleRelease adının güvenli yayın imzası sağladığını varsayma.

Domain/API origin'i değişirse frontend .env veya EAS ortamı güncellenip yeni Web/Android derlemesi yapılır. Aynı alan adı korunarak yalnız sunucu IP'si değiştiriliyorsa genelde DNS güncellemesi yeterlidir; API, TLS, özel lisans durumu ve diğer yapılandırmalar da doğru taşınmalıdır. Bu sürümde son kullanıcının sunucu adresini değiştirdiği bir giriş ekranı yoktur.

19. Güncelleme ve yedek

Yeni sürümü önce yedekle, staging'de dene; sonra API ve Web'i birlikte güncelle. Lockfile ile npm ci, API için npm run build, web için npm run export:web kullan. .env değişikliği frontend paketine kendiliğinden yansımaz.

Yedeklenecek öğeNeden?
Supabase veritabanıHesap/profil/sohbet/cüzdan ve işletim kayıtları
Storage dosyalarıVeritabanı yedeği tek başına fotoğraf byte'larını garanti etmez
/etc/mef/api.envÖzel sunucu ayarları ve sabit şifreleme anahtarı
/var/lib/mef-license/installation.jsonMevcut kurulumun özel aktivasyon durumu
Android yayın/upload anahtarıAynı uygulamayı güncelleme yeteneği
Değiştirilmiş marka kaynaklarıMüşterinin özelleştirmeleri

Yedekler web kökünde tutulmaz. Ayrı güvenli konuma da kopyala ve geri dönüş testi yap. Tamamlanmış müşteri kurulumunun lisans durum dosyasını satış ZIP'ine koyma. Aynı uygulama taşınırken durumu güvenli taşı; aynı durumu kopyalayıp iki production kurulumunu paralel çalıştırma.

Lisans sağlayıcısının özel imza anahtarı ve satıcı veritabanı müşteri kaynak paketine dahil değildir. Uygulamanın açık doğrulama anahtarı pakette bulunur.

20. Sık hatalar

BelirtiÖnce kontrol edilecekler
/admin 404SPA fallback, Nginx exact /admin yolu ve gerçek document root
502 Bad GatewayAPI servisi açık mı, doğru loopback portu ve Node yolu var mı?
API 401Gerçek oturum var mı, frontend ve API aynı Supabase projesinde mi?
API 503 installation_license_requiredHTTPS origin doğru mu, lisans etkin mi, imzalı önbellek geçerli mi?
İlk yönetici profil adımında kaldı13. bölümdeki doğrulanmış yönetici aktivasyon yardımcısı
owner_not_authorizedAuth email_confirmed_at ve mef_private.operator_emails kaydı
activation_http_409Domain doğrulama veya tek kurulum sınırı; API challenge erişimini ve satıcıdaki eski bağlamayı kontrol et
EACCES: license-public.pemDosya kadar üst klasörlerin geçiş/okuma izni de doğru olmalı
android_not_licensedLisansa Android hakkı ekle, web admininden hakları yenile
CORS hatasıCORS_ORIGINS içindeki tam origin; protokol ve www farkı dahil
Girişte veriler gelmiyorMigration listesi, RLS, account_access ve doğru public key
E-posta gelmiyorSMTP yetkisi, gönderici, SPF/DKIM, Supabase Auth logları ve sınırlar
Fotoğraf yüklenmiyorBucket/policy, oturum, dosya türü/boyutu ve doğru proje
Ses/video bağlanıyor ama görüntü yokPublic IP/NAT, UDP/TCP medya portları, TURN ve izinler
Yayın izleyici/süre bilgisi yanlışLiveKit webhook imzası/URL'si ve API yönetim erişimi
Çeviri çalışmıyorAna dil, loopback çeviri servisi ve yüklü dil modelleri
Domain değişti ama Android eski sunucuya gidiyorEXPO_PUBLIC_API_URL derlemede gömülür; yeni binary oluştur
Android doğrulama linki açılmıyorapp.json scheme, useApp.ts içindeki tüm scheme değerleri ve Supabase Redirect URLs

Log inceleme:

bash
sudo journalctl -u mef-api -n 80 --no-pager
sudo nginx -t
sudo systemctl status nginx mef-api --no-pager

Destek için log paylaşırken Authorization/Cookie, parolalar, secret key'ler, VOX tam anahtarı, banka ve kullanıcı verilerini çıkar. Hata düzeltmek için tüm env dosyasını herkese açık bir sohbete yapıştırma.

21. Teslim öncesi kabul kontrolü

Bu kılavuz ve kaynaklar, her yeni müşterinin boş Ubuntu/Supabase projesindeki kurulumunun kabul edildiği anlamına gelmez. Mevcut sürümün otomatik testleri/derlemeleri yapılmıştır; yeni müşteri ortamının gerçek cihaz ve ağ kabulü ayrıca yapılmalıdır. Ödeme, SMS veya Firebase push sağlayıcısının yalnızca bir alan doldurularak kurulmuş sayıldığı varsayılmaz.

22. Resmi kaynaklar

Sürüm yükseltmeden önce kullandığın hizmetlerin güncel resmi dokümanlarını ve paket sürüm notlarını kontrol et.