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 versionkomutu 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
localhostadresinde 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.
-
Ayar şablonunu kopyalayın:
cd deploy cp .env.example .env -
Veritabanı parolası için rastgele bir değer üretin:
openssl rand -hex 32 -
.envdosyasını açın ve çıkan değeriPOSTGRES_PASSWORDsatı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
-
Anten’i başlatın (ilk seferde derleme birkaç dakika sürer):
docker compose up -d --build -
Durumu kontrol edin. İki konteyner de
Upolmalı,antendbir süre sonrahealthygörünmelidir:docker compose ps -
Tarayıcıda
http://localhost:8080adresini 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.
-
Alan adınızın DNS kaydını sunucunun adresine yönlendirin ve kaydın yayılmasını bekleyin.
-
.envdosyası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.ymlANTEN_COOKIE_SECURE,ANTEN_BINDveRTC_HOSTSayarlarına dokunmayın; HTTPS eki bunları kendisi ayarlar ve istemcilere ses için alan adınızı bildirir. -
Güvenlik duvarında gerekli portları açın.
ufwkullanıyorsanız:sudo ufw allow 22/tcp sudo ufw allow 80/tcp sudo ufw allow 443 sudo ufw allow 50000 sudo ufw enableSunucu 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.
-
Anten’i başlatın:
sudo docker compose up -d --build -
https://anten.example.orgadresini 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
- Anten’e bir takma adla bağlanın.
- 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;
0sı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
.antendosyası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ÜKLEyazı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
- 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.
- Eski sunucuda bir yedek alın.
- 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.
- 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 downkonteynerleri kaldırır ama verileri bırakır.docker compose down -vise 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.