Anten
English

İşletme kılavuzu

Kurulum

Anten'i Docker Compose ile kendi sunucunuzda kurun: ilk açılış, otomatik HTTPS, ilk yönetici, erişim ayarları, yedekleme ve güncelleme adım adım.

Bu kılavuz, Anten’i kendi sunucunuzda kurmak ve işletmek içindir: ilk kurulum, internete açma, ilk yönetici, erişim ayarları, yedekleme, güncelleme ve durdurma. Anten, Docker Compose ile çalışan iki konteynerden oluşur: antend (sunucu programı; web istemcisi, ses sunucusu ve API tek programdadır) ve PostgreSQL veritabanı.

Gereksinimler

  • Docker Engine ve Docker Compose v2. Bir Linux sunucuda Docker Engine’i, kendi bilgisayarınızda denemek için Docker Desktop’ı kullanabilirsiniz. Kurulumu Docker’ın kendi talimatlarına göre yapın; docker compose version komutu bir sürüm yazıyorsa hazırsınız.
  • En az 2 GB bellek. İlk açılışta Anten kaynak dosyalarından derlenir; derleme birkaç dakika sürer.
  • İnternete açık bir kurulum için ayrıca:
    • herkese açık bir IP adresi olan bir sunucu,
    • bir alan adı (örneğin anten.example.org); DNS’te A kaydı (varsa AAAA kaydı da) sunucunun adresini göstermelidir,
    • açık portlar: 80/TCP ve 443/TCP+UDP (web), 50000/UDP ve TCP (ses ve görüntü).

Tarayıcılar mikrofonu yalnızca HTTPS üzerinden ya da localhost adresinde verir. Başkalarının konuşabilmesi için internete açık bir kurulumda HTTPS zorunludur; bunu aşağıdaki HTTPS eki sizin yerinize ayarlar.

Dosyalar ve ayar dosyası

Anten’in dosyalarını edindikten sonra bu kılavuzdaki komutların tamamı deploy klasöründe çalışır. Bu klasörde docker-compose.yml (temel kurulum), docker-compose.server.yml (otomatik HTTPS eki), docker-compose.nginx.yml (mevcut bir reverse proxy için ek) ve .env.example (ayar şablonu) bulunur.

  1. Ayar şablonunu kopyalayın:

    cd deploy
    cp .env.example .env
    
  2. Veritabanı parolası için rastgele bir değer üretin:

    openssl rand -hex 32
    
  3. .env dosyasını açın ve çıkan değeri POSTGRES_PASSWORD satırına yazın. Parola veritabanı adresinin içine girdiği için onaltılık (hex) bir değer kullanın.

.env dosyası parolalar ve anahtarlar içerir: başkalarıyla paylaşmayın ve bir depoya koymayın.

Önemli ayarlar

Ayar Varsayılan Anlamı
POSTGRES_PASSWORD (zorunlu) Veritabanı parolası; boşsa Anten başlamaz
ANTEN_SERVER_NAME Anten Sunucusu İlk açılışta oluşturulan sunucunun adı; sonra sunucu ayarlarından değiştirilebilir
ANTEN_LANGUAGE tr tr ya da en: ilk açılışta oluşturulan grupların ve odaların adları ile sunucunun kendi duyurularının dili
ANTEN_DOMAIN Yalnızca internete açık kurulumda: sunucunun alan adı
COMPOSE_FILE Hangi eklerin kullanılacağı; böylece her komuta -f eklemeniz gerekmez
ANTEN_BIND 127.0.0.1 antend’in dinlediği adres; yerel kurulumda yalnızca bu bilgisayar
ANTEN_HTTP_PORT 8080 Yerel kurulumda web arayüzünün portu
ANTEN_COOKIE_SECURE false Oturum çerezinin yalnızca HTTPS’te gönderilmesi; HTTPS eki bunu kendisi açar
RTC_HOSTS İstemcilerin ses portuna ulaştığı adres; internete açık kurulumda boş bırakın (alan adı kullanılır)
RTC_BIND Ses portunun yayınlandığı adres; genellikle boş kalır
ANTEN_TRUSTED_PROXIES Anten’in önünde aynı makinede bir reverse proxy varsa private
ANTEN_GIF_PROVIDER, ANTEN_GIF_KEY İsteğe bağlı GIF araması: tenor ya da giphy ve o servisin API anahtarı; anahtar yoksa kapalıdır

GIF araması açıksa aramalar ve GIF’ler sunucu üzerinden geçer: servis kullanıcıların değil, sunucunun adresini görür. Bu ayar dışında Anten hiçbir dış adrese bağlanmaz.

Kendi bilgisayarınızda denemek

  1. Anten’i başlatın (ilk seferde derleme birkaç dakika sürer):

    docker compose up -d --build
    
  2. Durumu kontrol edin. İki konteyner de Up olmalı, antend bir süre sonra healthy görünmelidir:

    docker compose ps
    
  3. Tarayıcıda http://localhost:8080 adresini açın ve bir takma adla bağlanın. Ardından yönetici olma adımlarıyla yönetici olun.

Aynı bilgisayarda ikinci bir kişi gibi denemek için ikinci bir sekmede http://127.0.0.1:8080 adresini açın; tarayıcı onu ayrı bir site sayar. Sesi denerken kulaklık kullanın, aksi hâlde kendi sesinizi gecikmeli duyarsınız.

Aynı ağdaki diğer bilgisayarlar

.env dosyasında ANTEN_BIND=0.0.0.0 yapın, RTC_HOSTS satırının başındaki # işaretini kaldırıp bu bilgisayarın ağ adresini yazın (örneğin RTC_HOSTS=192.168.1.20) ve docker compose up -d komutunu çalıştırın. Diğer bilgisayarlar http://192.168.1.20:8080 gibi bir adresi açar. Tarayıcılar mikrofonu HTTP üzerinden yalnızca localhost için verdiğinden bu bilgisayarlar yalnızca dinleyebilir; konuşmak için HTTPS’li bir kurulum gerekir.

Sunucuyu internete açmak

docker-compose.server.yml eki, Anten’in önüne Caddy’yi koyar. Caddy, alan adınız için Let’s Encrypt sertifikasını kendisi alır ve yeniler; ses portu herkese açık olarak yayınlanır.

  1. Alan adınızın DNS kaydını sunucunun adresine yönlendirin ve kaydın yayılmasını bekleyin.

  2. .env dosyasında şu satırları düzenleyin (başlarındaki # işaretini kaldırarak):

    ANTEN_DOMAIN=anten.example.org
    COMPOSE_FILE=docker-compose.yml:docker-compose.server.yml
    

    ANTEN_COOKIE_SECURE, ANTEN_BIND ve RTC_HOSTS ayarlarına dokunmayın; HTTPS eki bunları kendisi ayarlar ve istemcilere ses için alan adınızı bildirir.

  3. Güvenlik duvarında gerekli portları açın. ufw kullanıyorsanız:

    sudo ufw allow 22/tcp
    sudo ufw allow 80/tcp
    sudo ufw allow 443
    sudo ufw allow 50000
    sudo ufw enable
    

    Sunucu sağlayıcınızın panelinde ayrıca bir güvenlik duvarı varsa aynı portları orada da açın. SSH’yi yalnızca kendi adresinize açmanız ya da anahtarla girişi zorunlu kılmanız önerilir.

  4. Anten’i başlatın:

    sudo docker compose up -d --build
    
  5. https://anten.example.org adresini açın, bir takma adla bağlanın ve yönetici olma adımlarına geçin.

Sertifika ilk açılışta birkaç saniye içinde alınır. Alınamıyorsa nedeni Caddy’nin kayıtlarında görünür; çoğu zaman DNS kaydı henüz yayılmamıştır ya da 80/443 portları kapalıdır:

sudo docker compose logs caddy

Sunucuda zaten bir reverse proxy varsa

80 ve 443 portlarını başka siteler için nginx gibi bir web sunucusu kullanıyorsa Caddy’yi kurmayın; docker-compose.server.yml yerine docker-compose.nginx.yml ekini kullanın. antend bu durumda yalnızca sunucunun içinden ulaşılan 127.0.0.1:8088 adresini dinler, ses portu (50000) herkese açık kalır. .env:

ANTEN_DOMAIN=anten.example.org
COMPOSE_FILE=docker-compose.yml:docker-compose.nginx.yml

Web sunucusunda alan adı için bir site oluşturun, sertifikayı onunla alın ve istekleri 127.0.0.1:8088 adresine yönlendirin. Gateway bir WebSocket bağlantısıdır; Upgrade/Connection başlıkları ve uzun zaman aşımları gerekir. nginx için örnek:

location / {
	proxy_pass http://127.0.0.1:8088;
	proxy_http_version 1.1;
	proxy_set_header Upgrade $http_upgrade;
	proxy_set_header Connection "upgrade";
	proxy_set_header Host $host;
	proxy_set_header X-Forwarded-For $remote_addr;
	proxy_set_header X-Forwarded-Proto $scheme;
	proxy_read_timeout 1h;
	proxy_send_timeout 1h;
	client_max_body_size 510m;
}

Bu ek, antend’in kişilerin gerçek adresini proxy’nin X-Forwarded-For başlığından okumasını kendisi ayarlar. Başka bir düzende Anten’in önüne kendi proxy’nizi koyuyorsanız .env dosyasına ANTEN_TRUSTED_PROXIES=private yazın; aksi hâlde herkes proxy’nin adresinden gelmiş görünür, adres yasakları ve adres başına sınırlar çalışmaz.

client_max_body_size değeri, sunucu ayarlarındaki en büyük dosya boyutundan ve yedek dosyalarınızdan biraz büyük olmalıdır; nginx’in varsayılan sınırı 1 MB’tır. Caddy böyle bir sınır koymaz.

Yönetici olmak

İlk açılışta, henüz hiçbir yönetici yokken antend kayıtlarına çerçeveli bir yetki anahtarı yazar:

docker compose logs antend
  1. Anten’e bir takma adla bağlanın.
  2. Sunucu menüsünden Yetki anahtarı kullan’ı seçin ve anahtarı girin. Artık yöneticisiniz.

Anahtar tek kullanımlıktır. Kaybettiyseniz ya da ikinci bir yönetici gerekiyorsa yenisini üretin:

docker compose exec antend /antend privilege-key

Daha sonra yöneticiler, sunucu ayarlarındaki Yetki anahtarları bölümünden herhangi bir sunucu grubu için anahtar oluşturabilir. Anahtarları yalnızca güvendiğiniz kişilere iletin.

Erişim ayarları

Kimlerin bağlanabileceğini Sunucu ayarları → Erişim bölümünden belirlersiniz. Değişiklikler hemen uygulanır.

  • Yeni kullanıcılar bağlanabilir: Kapalıyken yalnızca daha önce bağlanmış kimlikler ve hesaplar giriş yapabilir.
  • Hesapla giriş: Kimlik anahtarına ek olarak kullanıcı adı ve parolayla hesap oluşturmaya izin verir; varsayılan olarak kapalıdır. Parola sunucuya gönderilmez (bu düzenden önceki hesaplar bir kez gönderip yeni düzene geçer).
  • Sunucu parolası: Açıkken bağlanan herkesin parolayı girmesi gerekir.
  • Aynı adresten bağlantı sınırı: Bir internet adresinden aynı anda en fazla 5 kişi ve saatte en fazla 3 yeni kimlik (varsayılan). Kalabalık bir ev, yurt ya da iş yeri için artırabilirsiniz; 0 sınırsızdır. Yöneticiler sayılmaz; IPv6 adresleri /64 olarak sayılır.

Bunlara ek olarak bir hesap aynı anda en fazla 10 bağlantı açabilir; giriş denemeleri, mesajlar ve sesli odadaki sinyaller hız sınırlıdır. Kimlik ve adres yasakları da bu bölümün yanında, Yasaklar altında yönetilir.

Büyük hacimli saldırı trafiği hiçbir uygulamanın içinden durdurulamaz; sunucuya ulaşmadan durdurulmalıdır. Sağlayıcınızın saldırı korumasını kullanın ve güvenlik duvarında yalnızca gereken portları açık bırakın. Web tarafını bir CDN arkasına alabilirsiniz, ancak ses portu (50000) doğrudan sunucuya gelir.

Yedekleme ve geri yükleme

Uygulamanın içinden (önerilen)

Sunucu ayarları → Yedekleme bölümü yalnızca yöneticilere görünür.

  • Yedek al: Sunucunun tamamı (odalar, gruplar ve yetkiler, üyeler, yasaklar, mesajlar, gönderilen dosyalar, profil resimleri) tek bir .anten dosyasına yazılır. Dosya, belirlediğiniz en az 10 karakterlik bir parolayla şifrelenir (age, scrypt). Parolayı unutursanız yedek açılmaz. Oturumlar yedeğe girmez. Kullanıcılar bu sırada sunucuyu kullanmaya devam edebilir.
  • Yedekten geri yükle: Dosyayı seçin, parolasını ve onay için GERİ YÜKLE yazın. Sunucudaki her şey yedektekiyle değişir; yedekten sonra yazılanlar silinir. İşlem tek bir veritabanı işlemidir: yanlış parola ya da bozuk bir dosya hiçbir şeyi değiştirmez. Bittiğinde herkesin bağlantısı kesilir ve sayfalar yeniden yüklenir.

Bir yedek yalnızca aynı Anten sürümüne (aynı veritabanı şemasına) geri yüklenebilir. Bir proxy arkasındaysanız proxy’nin istek boyutu sınırı yedek dosyasından büyük olmalıdır.

Komut satırından

Kalıcı veriler iki yerdedir: PostgreSQL (kullanıcılar, odalar, mesajlar) ve uploads birimi (gönderilen dosyalar, profil resimleri). İkisini aynı anda yedekleyin; birbirlerine bağlıdırlar.

Veritabanını yedeklemek:

docker compose exec postgres pg_dump -U anten -d anten -Fc -f /tmp/anten.dump
docker compose cp postgres:/tmp/anten.dump ./anten.dump
docker compose exec postgres rm /tmp/anten.dump

Dosyaları yedeklemek (bulunduğunuz klasöre anten-dosyalar.tgz yazar):

docker run --rm -v anten_uploads:/data -v "$PWD:/yedek" postgres:18.6-alpine tar czf /yedek/anten-dosyalar.tgz -C /data .

Dosyaları geri yüklemek (ardından docker compose up -d):

docker run --rm -v anten_uploads:/data -v "$PWD:/yedek" postgres:18.6-alpine tar xzf /yedek/anten-dosyalar.tgz -C /data

Veritabanını boş bir kuruluma, antend hiç açılmadan önce geri yüklemek:

docker compose up -d postgres
docker compose cp ./anten.dump postgres:/tmp/anten.dump
docker compose exec postgres pg_restore -U anten -d anten --no-owner /tmp/anten.dump
docker compose exec postgres rm /tmp/anten.dump
docker compose up -d

Veritabanı yedeğini güvenli bir yerde saklayın: içinde kullanıcılar, odalar ve sunucuda okunabilir saklanan mesajlar vardır. Kimlik anahtarlarının gizli yarısı yedekte yoktur; yalnızca kullanıcıların cihazlarındadır.

Sunucuyu taşımak

  1. Taşımadan önce kullanıcılardan kimliklerini yedeklemelerini isteyin (kendi adlarına tıklayıp Kimliği yedekle). Kimlik anahtarı adrese bağlıdır; yeni adreste tarayıcı onu tanımaz.
  2. Eski sunucuda bir yedek alın.
  3. Yeni kurulumu aynı Anten sürümüyle açın, ilk yetki anahtarıyla yönetici olun ve yedeği geri yükleyin. Yedekteki yöneticiler geri gelir.
  4. Kullanıcılar yeni adreste bağlanma ekranındaki Yedekten kimlik yükle ile kendi dosyalarını seçer ve eski kimlikleri, gruplarıyla bağlanır.

Güncelleme

Yeni sürümün dosyalarını edindikten sonra güncellemeden önce bir yedek alın ve şunu çalıştırın:

docker compose up -d --build

Komut yeni sürümü derler ve yalnızca değişen konteyneri yeniden başlatır. Veritabanı güncellemeleri açılışta kendiliğinden uygulanır; bağlı kullanıcılar birkaç saniye içinde kendiliğinden yeniden bağlanır.

Masaüstü uygulaması güncellemelerini bağlı olduğu sunucudan alır; sunucuda bunun için ek bir kurulum gerekmez. Yöneticiler yeni bir sürümü Sunucu ayarları → Masaüstü güncellemesi bölümünden, kurulum dosyasını ve latest.json dosyasını birlikte seçerek yükler. Uygulama yalnızca yayıncının anahtarıyla imzalanmış ve kendi sürümünden yeni bir güncellemeyi kurar; sunucu ele geçirilse bile sahte bir sürüm kurdurulamaz.

Durdurma ve kayıtlar

docker compose stop              # durdurur; her şey yerinde kalır
docker compose up -d             # yeniden başlatır
docker compose ps                # durum
docker compose logs -f antend    # canlı kayıtlar (çıkmak için Ctrl+C)

Konteynerler restart: unless-stopped ile çalışır: elle durdurmadığınız sürece Docker başladığında Anten de başlar.

Dikkat: docker compose down konteynerleri kaldırır ama verileri bırakır. docker compose down -v ise veritabanını ve gönderilen dosyaları siler. Yedeğiniz olmadan kullanmayın.

Sorun giderme

Ses “Bağlanıyor…” durumunda kalıyor

Önce güvenlik duvarını kontrol edin: 50000 portu kapalıysa yazışma çalışır ama kimse sesli bağlanamaz. Sağlayıcının panelindeki güvenlik duvarını da unutmayın.

antend, açılışta istemcilere sese hangi adresin bildirildiğini kaydeder (rtc_hosts):

sudo docker compose logs antend | grep rtc

Orada sunucunun herkese açık adresi görünmelidir. Görünmüyorsa (örneğin alan adı başka bir yere çözülüyorsa) .env dosyasında RTC_HOSTS satırını açıp sunucunun herkese açık IP adresini yazın ve sudo docker compose up -d komutunu çalıştırın.

UDP’nin engellendiği ağlarda tarayıcı aynı porttan TCP ile bağlanır; gecikme biraz artar ama ses çalışır. Bazı tarayıcıların gizlilik ayarları WebRTC’yi kısıtlar; ses yine bağlanmıyorsa tarayıcının WebRTC ayarını varsayılana döndürün.

Büyük dosyalar gönderilemiyor

Anten’in önündeki bir proxy’nin istek boyutu sınırı, dosyaları antend’e ulaşmadan keser. Sınırı sunucu ayarlarındaki en büyük dosya boyutundan biraz büyük yapın (nginx’te client_max_body_size). Alan adınız bir CDN üzerinden geçiyorsa CDN’in de bir sınırı olabilir. İstemci bu durumu ayrıca bildirir.