# 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)
[](https://github.com/alexlnos/dsm-mini/actions/workflows/ci.yml)
[](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.
> Ç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)