# dsm-mini [English](README.md) · [Русский](README_RU.md) · [Español](README_ES.md) · [Português](README_PT.md) · [Deutsch](README_DE.md) · [Français](README_FR.md) · [Italiano](README_IT.md) · **Türkçe** · [Українська](README_UK.md) · [Polski](README_PL.md) [![Denetimler](https://github.com/alexlnos/dsm-mini/actions/workflows/ci.yml/badge.svg)](https://github.com/alexlnos/dsm-mini/actions/workflows/ci.yml) [![MIT lisansı](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) Ev tipi bir Synology NAS'ı yönetmek için Mini App'li bir Telegram botu: Download Station indirmeleri ve File Station dosyaları doğrudan mesajlaşmadan, VPN ve DSM web arayüzü olmadan. Sohbete bir magnet bağlantısı atın — bot düğmelerle nereye indireceğini sorar ve kuyruğa alır. Uygulamayı açın — ne indiğini, ne kadar kaldığını, disklerde ne olduğunu ve NAS'ın durumunu görürsünüz.

NAS genel görünümü İndirmeler Bir görev Dosyalar Depolama

> Çalışıyor: bot, Mini App ve bildirimler. DSM 7 ya da daha yenisi gerekir — > DSM 6'ya paket kurulmaz ve orada hiç denenmedi. DSM 7.2.2 üzerinde Download > Station 4.1.2 ve File Station 1.4.4 ile denendi. ## Neler yapabiliyor **İndirmeler** - Görev listesi: ilerleme, hız, kalan süre, kaynaklar ve eşler - Duraklatma, sürdürme, silme - Magnet bağlantısı, doğrudan bağlantı ve `.torrent` dosyasıyla ekleme - Hedef klasörü seçme, ayarlanabilir bir hızlı erişim listesiyle - Torrent içindeki dosyaları ve önceliklerini seçme - Bir görev bittiğinde ya da başarısız olduğunda sohbete mesaj **Dosyalar** - Klasörlere göz atma, önizleme, NAS'a yükleme - Yeniden adlandırma, kopyalama, taşıma, silme **NAS durumu** - İşlemci ve bellek yükü, çalışma süresi, ağ - Diskler, havuzlar ve birimler: sıcaklık, kullanılan alan, sağlık - Sanal makineler ve kapsayıcılar: başlatma ve durdurma - DSM olay günlüğü **Bildirimler ve ayarlar** - DSM'nin kendi bildirdikleri — güvenlik danışmanı, diskler, güncellemeler — sohbete ulaşır - Botun ne gönderebileceğinin seçimi: hiçbir şey, yalnızca indirmeler, her şey - DSM ana menüsünde kendi ekranı: paket kurulumdan sonra orada ayarlanır, sonra her ayar yine orada, yeniden başlatmadan değiştirilir **Dil** Uygulama ve bot, Telegram'da seçilen dili konuşur: İngilizce, Rusça, İspanyolca, Portekizce, Almanca, Fransızca, İtalyanca, Türkçe, Ukraynaca, Lehçe. Bilinmeyen bir dil İngilizce alır. --- ## Kurulum Yarım saat, ve çoğu servise değil sertifikaya gidiyor. DSM 7'li bir Synology NAS ve Download Station gerekiyor; başka hiçbir şeyi önceden kurmak gerekmez. > **Genel adres yalnızca Mini App için gerekir.** Telegram bir Mini App'i > yalnızca gerçek sertifikalı `https://` üzerinden açar: yerel bir `192.168.…` > ya da kendinden imzalı bir sertifika açılmaz. Adres olmadan bot tek başına > çalışır — bağlantılar, `.torrent` dosyaları, `/status` ve bildirimler — ve > NAS'ın dışarıdan erişilebilir olması gerekmez. Adres almanın üç yolu 4. > adımda; ikisi yönlendiricide bağlantı noktası açmadan. **1. Botu oluşturmak.** [@BotFather](https://t.me/BotFather) → `/newbot` → bir ad ve `bot` ile biten bir kullanıcı adı. Yanıt olarak bir belirteç gelir; saklayın, o botunuzun parolasıdır. **2. Kendi numaranızı öğrenmek.** [@userinfobot](https://t.me/userinfobot) → Start. `Id` satırıyla yanıt verir. **3. Servis için bir DSM kullanıcısı açmak.** Denetim Masası → Kullanıcı ve Grup → Oluştur. Yalnızca Download Station ve File Station erişimi, iki aşamalı doğrulama olmadan: tek kullanımlık kod bir yapılandırma dosyasından gelemez. Yönetici vermeyin: servis dosya silebiliyor. Hesabın yetip yetmediğini **DSM mini** penceresindeki **Hesabı denetle** düğmesi gösterir (6. adım): bu kullanıcıyla oturum açar ve DSM'nin ona neye izin verdiğini sıralar. **4. Mini App için bir adres almak** — ya da bu adımı atlayıp botu tek başına kullanın. Adres, Telegram'ı kullandığınız telefonda `https://` ile açılmalı. Üç yol var. Birincisi DSM üzerinden gider ve yönlendiricide bağlantı noktası yönlendirmesi ister; NAS'ta geçerli sertifikalı bir alan adı zaten varsa atlayın: - Denetim Masası → Harici Erişim → DDNS → Ekle, sağlayıcı `Synology`: `alex-nas.synology.me` gibi bir şey çıkar. - Yönlendiricide **80** ve **443** numaralı bağlantı noktalarını NAS'a yönlendirin. 80 olmadan sertifika verilmez, 443 olmadan uygulama açılmaz. - Denetim Masası → Güvenlik → Sertifika → Ekle → Let's Encrypt'ten, aynı ad için. Telefondan mobil veriyle deneyin: `https://alex-nas.synology.me:5001` DSM'yi uyarısız açmalı. İkincisi **Cloudflare Tunnel**, bağlantı noktası açmadan; DNS'i Cloudflare'de olan bir alan adı gerekir. Cloudflare panelinde bir tünel oluşturun, [SynoCommunity](https://synocommunity.com) paketlerinden **Cloudflare Tunnel**'ı tünelin belirteciyle kurun ve tünele genel bir ana makine adı verin — örneğin `mini.example.com` — hizmet olarak `http://localhost:58080`. Üçüncüsü **Tailscale**, yalnızca kendi cihazlarınız için. Tailscale'i NAS'a ve telefona kurun, tailnet'inizin DNS ayarlarında HTTPS sertifikalarını açın ve NAS'ta `sudo tailscale serve --bg 58080` çalıştırın: `https://nas.tail1234.ts.net` gibi bir adres verir. Uygulama, telefon Tailscale'e bağlı olduğu sürece açılır. **5. Paketi kurmak.** Paket Merkezi → Ayarlar → Paket Kaynakları → Ekle, ad `dsm-mini` ve mimarinize göre adres: - Intel ve AMD, modellerin çoğu: `https://alexlnos.github.io/dsm-mini/amd64.json` - ARM, giriş seviyesi modeller: `https://alexlnos.github.io/dsm-mini/arm64.json` Sonra Ayarlar → Genel → Güven Düzeyi → **Herhangi bir yayıncı**, ve **Topluluk** bölümünden **DSM mini — Telegram Mini App** kurun. Mimariden emin değil misiniz? `amd64` deneyin: uymayan bir paket zaten reddedilir. Kurulum hiçbir şey sormaz. Ya da `.spk` dosyasını [sürümlerden](https://github.com/alexlnos/dsm-mini/releases) elle kurun, Paket Merkezi → Elle Yükleme ile. **6. Ayarlamak.** DSM ana menüsünden **DSM mini**'yi açın ya da Paket Merkezi'nde **Aç**'a basın — Paket Merkezi kurulum bitince bunu kendisi de söyler. Yukarıdaki adımlarda toplanan değerleri doldurun — pencere her birini açıklar — ve **Mini App erişimi** bölümünde 4. adımdaki yolu ya da **Yalnızca bot, Mini App yok** seçeneğini seçin. **Kaydet**'e, ardından pencerenin üstündeki **Başlat**'a basın. Oradaki durum, DSM'nin ve botun ne zaman yanıt verdiğini, vermediyse neyin yanlış olduğunu gösterir. Birinci yol için ters proxy kuralını pencere kendisi oluşturur: adınızı **Bir adı servise yönlendir** alanına yazın. Elle yapmak için Denetim Masası → Oturum Açma Portalı → Gelişmiş → Ters Proxy → Oluştur. Kaynak: `HTTPS`, sizin adınız, bağlantı noktası `443`. Hedef: `HTTP`, `localhost`, bağlantı noktası `58080`. Tünel ya da Tailscale ile **Başka bir yol**'u seçip onların verdiği adresi girin. > Bu ad için **80** numaralı bağlantı noktasını proxy'lemeyin: DSM sertifikayı > oradan yeniliyor, araya girmek yenilemeyi üç ay sonra bozar. **7. Denemek.** Adres varsa, tarayıcıda `https://adresiniz/healthz` `{"status":"ok"}` yanıtını vermeli. Telegram imzası olmadan dışarıya hiçbir şey verilmez. **8. Uygulamayı açmak.** Botu kullanıcı adından bulun, Start'a basın — yazma alanının yanında bir **İndirmeler** düğmesi belirir. Ona herhangi bir magnet bağlantısı gönderin, klasörleri düğmelerle önerir. Adres yoksa düğme de olmaz: bağlantıları bota sohbetten gönderin. ## Bir şeyler ters gittiyse | Gördüğünüz | Sorun ne | Ne yapmalı | |---|---|---| | Bot `/start` komutuna susuyor | Bot kapalı ya da ayarlanmamış veya belirteç yanlış | DSM ana menüsünden **DSM mini**'yi açın: üstteki durum hangisi olduğunu söyler, **Başlat** da botu açar | | «Bu bota erişim kapalı» | Kimliğiniz listede değil | 2. adımdaki numarayı **DSM mini** penceresinde izin verilen kimliklere ekleyin | | Uygulama düğmesi yok | Genel adres boş (o zaman yalnızca bot çalışır) ya da `https://` değil | **DSM mini** penceresi, **Mini App erişimi** | | Düğme var, uygulama açılmıyor | Ters proxy ya da sertifika çalışmıyor | Tarayıcıda `https://adresiniz/healthz` açın | | «Uygulamayı bot üzerinden açın» | Uygulama tarayıcıda doğrudan bağlantıyla açıldı | Böyle olması gerekiyor: bottan açın | | «Erişim reddedildi: Telegram kimliğiniz…» | Servis sizi tanımadı | İzin verilen kimliklerde yalnızca rakamlar, virgülle ayrılmış | | Pencere, DSM'nin oturum açmayı reddettiğini söylüyor | Parola, 2FA ya da kullanıcının yetkileri | 3. adım: parola yazım hatasız, 2FA kapalı, uygulamalara izinli | | Pencere, Download Station'ın çalışmadığını söylüyor | Kurulu değil ya da kullanıcıya yasak | Paket Merkezi ve 3. adımdaki yetkiler | | Paket başlar başlamaz duruyor | Bağlantı noktasını başka bir şey tutuyor — günlük bunu söyler | `config.env` içindeki `LISTEN_ADDR` değerini SSH ile değiştirin (aşağıya bakın) | İlk bakılacak yer **DSM mini** penceresinin üstündeki durum satırıdır: DSM'nin ve Telegram'ın yanıt verip vermediğini, vermediyse nedenini söyler. Ayrıntılar paketin günlüğündedir, `/var/packages/dsm-mini/var/dsm-mini.log`; Paket Merkezi'nden de açılır. Günlük İngilizce tutulur; pencere, arayüz ve bot mesajları sizin dilinizde olur. ### Ayarları değiştirmek **DSM ana menüsünden DSM mini'yi açın** — bütün ayarlar orada. Parola ve belirteç yalnızca yazılır: boş bırakılan alan eskisini korur. Kaydetmek hemen geçerli olur: servis yeni ayarlarla kendini yeniden başlatır, paketi yeniden başlatmak gerekmez. Ayarlar NAS'ta tek bir dosyada durur: `/var/packages/dsm-mini/var/config.env`, izinler `600`. Dosya SSH ile de düzenlenebilir (Denetim Masası → Terminal ve SNMP → SSH'i açın); ardından paketi yeniden başlatın: ```bash sudo sed -i "s|^TELEGRAM_BOT_TOKEN=.*|TELEGRAM_BOT_TOKEN='yeni-belirteciniz'|" /var/packages/dsm-mini/var/config.env sudo synopkg restart dsm-mini ``` Bir güncelleme dosyaya dokunmaz; ayarların güncellemeyi atlatmasının nedeni budur. ## Güncelleme Paket kaynağı eklendiyse Paket Merkezi güncellemeyi kendi gösterir. Kaynak yoksa yeni `.spk` dosyasını [sürümlerden](https://github.com/alexlnos/dsm-mini/releases) indirip üzerine kurun. Ayarlar ve veritabanı iki durumda da kalır: paketin `var` dizininde duruyorlar, güncelleme oraya dokunmuyor. ## Veriler nerede duruyor Her şey `/var/packages/dsm-mini/var/` içinde: - `config.env` — DSM mini penceresindeki ayarlar, izinler `600`; - `dsm-mini.db` — bir SQLite veritabanı: sabitlenen klasörler, dil ve görevlerin son bilinen durumları; servis neyi bildirdiğini bunlardan anlıyor; - `dsm-mini.log` — günlük. Paketin güncellenmesi üçünü de korur. Paketin kaldırılması siler. ## Güvenlik Servis internete açık ve NAS'taki dosyaları silebiliyor, bu yüzden: - **Ayrı bir DSM kullanıcısı**, yönetici değil (3. adım). - Bu hesapta **iki aşamalı doğrulama olmadan**: tek kullanımlık bir kod bir yapılandırma dosyasından çalışamaz. - **İzin verilen kimlikler bir beyaz listedir.** Boş liste erişimi herkese kapatır, açmaz. - `/api/` altındaki her istek iki kez denetlenir: bot belirtecinden türetilen bir anahtarla `initData` imzası ve kimliğin listeye karşı denetimi. İmza yalnızca birinin botu açtığını kanıtlar — açmayı ise herkes yapabilir. - Dışarıya genel bir ifade gider, ayrıntılar günlüğe: imzada tam olarak neyin tutmadığını söyleyen bir mesaj, onu nasıl taklit edeceğinin ipucu olurdu. - Bot belirteci ve DSM parolası yalnızca NAS'ın kendisindeki `config.env` dosyasında, `600` izinleriyle durur ve hiçbir zaman günlüğe düşmez: bir reddedişte neden yazılır, değer değil. - Servis yalnızca `127.0.0.1` üzerinde dinler — yani NAS'ın kendisinden. Dışarıdan gelen her şey, genel adresi sunan şeyden — DSM ters proxy'si, bir tünel ya da Tailscale — geçer; TLS'i de o sonlandırır. Adres yoksa dışarıdan ona hiçbir şey ulaşmaz. ## Geliştirme ```bash cd web && npm install && npm run build # Mini App internal/web/dist içine düşer cd .. && go build ./cmd/dsm-mini # uygulaması gömülü tek bir ikili dosya go test ./... ``` Ön yüz ayrı, otomatik yenilemeyle: ```bash cd web && npm run dev # localhost:58080 üzerindeki arka uçla konuşur ``` Arka ucu yerelde çalıştırmak, paketin yaptığı gibi `STATE_DIR` içindeki `config.env` dosyasını okur; ortam değişkenleri dosyanın söylemediklerini tamamlar. Bunları bir dosyada tutmak elverişli: ```bash cp .env.example .env # doldurun set -a; . ./.env; set +a go run ./cmd/dsm-mini ``` Derlenmiş arayüz depoda duruyor (`internal/web/dist`) — onu `go:embed` alıyor. Ön yüzü değiştirdikten sonra yeniden derleyip sonucu işleyin, yoksa denetimler geçmez. Tümleştirme testleri gerçek bir NAS'a karşı çalışır ve öntanımlı olarak atlanır: ```bash DSM_URL=https://192.168.1.10:5001 DSM_USER=... DSM_PASSWORD=... \ DSM_INSECURE_TLS=true go test -tags=integration ./... ``` NAS'ın durumunu değiştiren testler ayrı izin ister: `DSM_TEST_MUTATIONS=1`, dosya işlemleri için ayrıca `DSM_TEST_FOLDER` — içinde geçici dosya oluşturulabilecek klasör. Oluşturdukları her şeyi kendileri siler. Yeni bir arayüz dili, her iki tarafta birer sözlük dosyası demek: `web/src/i18n/.ts` ve `internal/i18n/.go`. Bir metni atlamak mümkün değil: ön yüzde bunu tür, sunucuda bir test denetliyor. Projede kod, açıklamalar ve günlük İngilizce; öteki diller yalnızca sözlüklerde yaşıyor. Ayrıntılar [CLAUDE.md](CLAUDE.md) dosyasında. ## Synology API'sinin tuhaflıkları Synology Web API'si yer yer belgelerinde yazandan başka türlü davranıyor: aynı eylem üç ayrı biçimde yanıt veriyor, `limit = -1` File Station'ı deviriyor ve dosya yüklerken `_sid` her yerdekinden başka türlü verilmek zorunda. Gerçek bir NAS üzerinde öğrenilenlerin tamamı [docs/synology-api.md](docs/synology-api.md) dosyasında toplandı. ## Lisans [MIT](LICENSE)