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 | İşlev | Kim ayarlar? |
|---|---|---|
| https://app.example.com | Web sitesi ve bu örnekte API | Kurulumu yapan kişi |
| https://app.example.com/admin | Uygulama yönetimi | Aynı domain altında otomatik yol |
| wss://rtc.example.com | Ses, video ve canlı yayın bağlantısı | Medya sunucusunu kuran kişi |
| https://PROJECT_REF.supabase.co | Auth, veritabanı ve Storage | Alıcının Supabase projesi |
| https://license.voxexo.com | Satıcının lisans servisi | Voxexo; 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 / panel | Düzenlenecek alan | Örnek / açıklama |
|---|---|---|
| frontend/.env | EXPO_PUBLIC_API_URL | https://app.example.com — /v1 ekleme |
| frontend/.env | EXPO_PUBLIC_SUPABASE_URL | https://PROJECT_REF.supabase.co |
| frontend/.env | EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY | Aynı projenin public publishable/anon anahtarı |
| /etc/mef/api.env | SUPABASE_URL, SUPABASE_ANON_KEY | Aynı projenin URL ve public anahtarı |
| /etc/mef/api.env | SUPABASE_SERVICE_ROLE_KEY | Sadece sunucuda kalacak service_role anahtarı |
| /etc/mef/api.env | CORS_ORIGINS, LICENSE_INSTALLATION_ORIGIN | https://app.example.com — sonuna / ekleme |
| /etc/mef/api.env | LICENSE_ISSUER | https://license.voxexo.com — satıcı değişiklik bildirmedikçe koru |
| /etc/mef/api.env | LICENSE_PUBLIC_KEY_FILE | /opt/mef/server/license-public.pem |
| frontend/app.json | expo.name, slug, scheme | My App, my-app, myapp |
| frontend/app.json | expo.android.package, versionCode | com.example.myapp, 1 — her mağaza güncellemesinde artır |
| frontend/tools/finalize-web.mjs | title, description, URL | Kendi marka ve HTTPS domainin |
| /etc/nginx/sites-available/mef | server_name, root, proxy_pass | app.example.com, /var/www/mef, http://127.0.0.1:3001 |
| Supabase Auth → URL Configuration | Site URL, Redirect URLs | https://app.example.com/ ve myapp:// |
| Supabase Auth → Email → SMTP | host, port, user, password, sender | Kendi posta hizmetinin bilgileri |
| /etc/mef/api.env | LIVEKIT_URL, LIVEKIT_HTTP_URL, LIVEKIT_API_KEY, LIVEKIT_API_SECRET | wss://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.zip | Web arayüzü, API, migration'lar, örnek ayarlar ve kılavuz |
| MEF-Android-Addon.zip | Aynı sürümdeki Web kaynaklarının üzerine eklenen native dosyalar ve ayarlar |
| MEF-Web-Android-Source.zip | Web ve Android kaynakları bir arada; birlikte alan müşteri bunu kullanır |
| APK | Android cihazda test/kurulum çıktısı; kaynak kod değildir |
| AAB | Google 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
- Alan adı yönetimi ve Ubuntu sunucusuna SSH erişimi.
- Node.js 24 LTS, npm ve Ubuntu üzerinde yönetim yetkisi.
- Alıcının kendi Supabase projesi, proje URL'si, frontend için public key ve yalnızca API için service_role anahtarı.
- Uygulama yöneticisi olacak gerçek e-posta hesabı ve doğrulanmış uygulama kullanıcısı.
- Satın alınan ürün haklarını içeren
VOX-…lisans anahtarı. - Herkese e-posta göndermek için SMTP hesabı ve gerekli posta DNS kayıtları.
- Ses/video/canlı yayın kullanılacaksa LiveKit ve dışarıdan erişilebilir medya portları.
- Android için kendi uygulama paket adı, yayın imzası ve gerekiyorsa Google Play/Expo hesabı.
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ür | Ad | Değer |
|---|---|---|
| A | app | 203.0.113.10 |
| A | rtc | 203.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ü:
getent ahosts app.example.com
getent ahosts rtc.example.comTelefon 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.
sudo apt update
sudo apt install -y ca-certificates curl unzip xz-utils python3 openssl nginx certbot python3-certbot-nginxNode.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:
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.txtChecksum başarılıysa:
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 --versionSü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:
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-licenseKullanı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:
ls /opt/mef/frontend/package.json /opt/mef/server/package.json
sudo chown -R mef:mef /opt/mef/frontend /opt/mef/server8. 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.
cd /opt/mef
npx supabase --version
npx supabase --help
npx supabase init --help
npx supabase link --help
npx supabase db push --helpsupabase/config.toml yoksa npx supabase init çalıştır. CLI sürümünü kurulum kaydına yaz. Ardından:
npx supabase login
npx supabase link --project-ref PROJECT_REF
npx supabase db push --dry-run
npx supabase db push
npx supabase migration listGiriş 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:
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:
| Ayar | Aynı domain örneği |
|---|---|
| Site URL | https://app.example.com/ |
| Redirect URL | https://app.example.com/ |
| Android redirect | mef:// |
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:
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ı
sudo install -o root -g root -m 600 /opt/mef/server/.env.example /etc/mef/api.env
sudo nano /etc/mef/api.envAynı dosyadaki örnek boş değerleri aşağıdaki mantıkla doldur. Gerçek değerleri burada verilen örnek yazılarla karıştırma:
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=trueCORS_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:
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-licensePEM 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
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:
[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.targetsudo systemctl daemon-reload
sudo systemctl enable --now mef-api
sudo systemctl status mef-api --no-pager
curl -fsS http://127.0.0.1:3001/healthHealth 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:
cd /opt/mef/frontend
sudo -u mef cp .env.example .env
sudo -u mef nano .envEXPO_PUBLIC_SUPABASE_URL=https://PROJECT_REF.supabase.co
EXPO_PUBLIC_SUPABASE_PUBLISHABLE_KEY=YOUR_PROJECT_PUBLIC_KEY
EXPO_PUBLIC_API_URL=https://app.example.comEXPO_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.
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:
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;
}
}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/healthSertifika 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:
sudo python3 /opt/mef/documentation/activate-owner.py /opt/mef/server /etc/mef/api.envGerç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:
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:
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:7880LiveKit yapılandırmasında aynı anahtarlarla imzalı webhook tanımla:
webhook:
api_key: YOUR_LIVEKIT_KEY
urls:
- https://app.example.com/v1/livekit/webhookBu 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.
sudo systemctl restart mef-api
curl -fsS https://app.example.com/v1/capabilitiesCapabilities, 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.
TRANSLATION_URL=http://127.0.0.1:5000Kullanı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:
{
"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:
cd frontend
npm ci
npm run typecheck
npx eas-cli --help
npx eas-cli login
npx eas-cli build:configureEAS 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:
{
"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.
npx eas-cli env:create --help
npx eas-cli build --platform android --profile preview
npx eas-cli build --platform android --profile productionPreview çı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 öğe | Neden? |
|---|---|
| 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.json | Mevcut 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 404 | SPA fallback, Nginx exact /admin yolu ve gerçek document root |
| 502 Bad Gateway | API servisi açık mı, doğru loopback portu ve Node yolu var mı? |
| API 401 | Gerçek oturum var mı, frontend ve API aynı Supabase projesinde mi? |
| API 503 installation_license_required | HTTPS 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_authorized | Auth email_confirmed_at ve mef_private.operator_emails kaydı |
| activation_http_409 | Domain doğrulama veya tek kurulum sınırı; API challenge erişimini ve satıcıdaki eski bağlamayı kontrol et |
| EACCES: license-public.pem | Dosya kadar üst klasörlerin geçiş/okuma izni de doğru olmalı |
| android_not_licensed | Lisansa Android hakkı ekle, web admininden hakları yenile |
| CORS hatası | CORS_ORIGINS içindeki tam origin; protokol ve www farkı dahil |
| Girişte veriler gelmiyor | Migration listesi, RLS, account_access ve doğru public key |
| E-posta gelmiyor | SMTP yetkisi, gönderici, SPF/DKIM, Supabase Auth logları ve sınırlar |
| Fotoğraf yüklenmiyor | Bucket/policy, oturum, dosya türü/boyutu ve doğru proje |
| Ses/video bağlanıyor ama görüntü yok | Public 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ıyor | Ana dil, loopback çeviri servisi ve yüklü dil modelleri |
| Domain değişti ama Android eski sunucuya gidiyor | EXPO_PUBLIC_API_URL derlemede gömülür; yeni binary oluştur |
| Android doğrulama linki açılmıyor | app.json scheme, useApp.ts içindeki tüm scheme değerleri ve Supabase Redirect URLs |
Log inceleme:
sudo journalctl -u mef-api -n 80 --no-pager
sudo nginx -t
sudo systemctl status nginx mef-api --no-pagerDestek 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ü
- Web ana sayfası, /admin ve HTTPS çalışıyor; private dosyalar dışarıdan indirilemiyor.
- Sahibi doğrulanmış yönetici lisansı etkinleştirebiliyor; normal kullanıcı satıcı veya admin yetkisi alamıyor.
- E-posta kayıt/doğrulama, şifre sıfırlama, çıkış ve hesap silme doğrulandı.
- Doğum tarihi, ana dil, ülke/dil seçimi ve fotoğraf sırası kaydediliyor.
- İki gerçek hesap arasında beğeni, reddetme, eşleşme, mesaj ve anlık bildirim test edildi.
- İki farklı ağdaki cihazda ses/video ve çağrı bitiş/süre kaydı doğrulandı.
- Canlı yayın, katılım bildirimi, izleyici listesi, yayın sohbeti ve ruby hareketleri test edildi.
- Tek gösterimlik/süreli medya kuralları ve başka kullanıcının özel dosyasına erişimin reddi doğrulandı.
- Mağaza için APK/AAB kendi marka/paket kimliği ve imzasıyla üretildi.
- SMTP, kullanım/gizlilik metinleri, işletici ve destek adresi müşteriye göre dolduruldu.
- Yedek geri yükleme ve başarısız güncellemeden geri dönüş denendi.
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
- Node.js resmi indirmeler
- Supabase migration akışı
- Supabase CLI db push ve dry-run
- Supabase Auth Redirect URLs
- Supabase özel SMTP
- Expo SDK 58
- Expo public environment değişkenleri
- EAS build yapılandırması
- Android APK/AAB derleme ayrımı
- LiveKit production deployment
- LiveKit port ve firewall
Sürüm yükseltmeden önce kullandığın hizmetlerin güncel resmi dokümanlarını ve paket sürüm notlarını kontrol et.