Compare commits
26
Commits
6af1bfb43e
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e726709f61 | ||
|
|
fbb2527b52 | ||
|
|
c0e6aa94b5 | ||
|
|
f5c4625e9b | ||
|
|
2b84aa90e1 | ||
|
|
97ec948b3c | ||
|
|
9fcdce389d | ||
|
|
548baedfaf | ||
|
|
b2ab702f00 | ||
|
|
fa800942d2 | ||
|
|
6b6d042423 | ||
|
|
864d71bff1 | ||
|
|
82be64d1e7 | ||
|
|
3384c01970 | ||
|
|
6a3eeee60a | ||
|
|
b18325fbef | ||
|
|
3492f7b8e4 | ||
|
|
2b52534c05 | ||
|
|
8441e35d01 | ||
|
|
2fc81f2853 | ||
|
|
95b92dc1e6 | ||
|
|
36a17fbe2d | ||
|
|
93934ee468 | ||
|
|
23684d5aa5 | ||
|
|
cd0b6b71e6 | ||
|
|
4e7a20b424 |
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "ConvertX",
|
||||
"id": "convertx",
|
||||
"available": true,
|
||||
"dynamic_config": true,
|
||||
"tipi_version": 1,
|
||||
"version": "latest",
|
||||
"short_desc": "1000'den fazla format arasinda dosya donusturucu (video, resim, ses, belge).",
|
||||
"author": "C4illin",
|
||||
"port": 3000,
|
||||
"categories": ["utilities", "media"],
|
||||
"description": "ConvertX, FFmpeg, ImageMagick, Pandoc ve Calibre motorlarini birlestiren self-hosted bir dosya donusturucudur. mp4<->avi, png<->jpg, webp, mkv, docx, epub gibi 1000'den fazla format arasinda tarayicidan donusturme yapabilirsin. Toplu (batch) donusturme ve coklu kullanici hesabi destekler.",
|
||||
"source": "https://github.com/C4illin/ConvertX",
|
||||
"website": "https://github.com/C4illin/ConvertX",
|
||||
"exposable": true,
|
||||
"force_expose": false,
|
||||
"https": true,
|
||||
"supported_architectures": ["arm64", "amd64"],
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "random",
|
||||
"label": "JWT Secret (otomatik)",
|
||||
"hint": "Oturum imzalama anahtari, kurulumda otomatik uretilir. Degistirmene gerek yok.",
|
||||
"required": true,
|
||||
"env_variable": "JWT_SECRET",
|
||||
"encoding": "hex",
|
||||
"min": 32
|
||||
},
|
||||
{
|
||||
"type": "boolean",
|
||||
"label": "Yeni hesap kaydina izin ver",
|
||||
"hint": "GUVENLIK UYARISI: Public internete actiysan bunu SADECE ilk hesabini olusturana kadar acik tut, sonra tekrar kapat. Acik kalirsa herkes hesap acip sunucunun islem gucunu kullanabilir.",
|
||||
"required": false,
|
||||
"default": false,
|
||||
"env_variable": "ACCOUNT_REGISTRATION"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
convertx:
|
||||
image: ghcr.io/c4illin/convertx
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
# JWT oturum imzalama anahtari - config.json'daki "random" alaniyla
|
||||
# kurulumda otomatik uretilir.
|
||||
- JWT_SECRET=${JWT_SECRET}
|
||||
# Public'e acacagin icin bunlar guvenlik amacli sabit tutuluyor:
|
||||
# - Kimliksiz (login'siz) hic kimse dosya donusturemesin
|
||||
# - HTTPS uzerinden geldigimiz icin HTTP_ALLOWED'a gerek yok
|
||||
- ALLOW_UNAUTHENTICATED=false
|
||||
- HTTP_ALLOWED=false
|
||||
# Ilk kurulumda bir kez true yapip kendi hesabini olustur, sonra
|
||||
# tekrar false'a cekmen onerilir (asagida config.json'da form alani var).
|
||||
- ACCOUNT_REGISTRATION=${ACCOUNT_REGISTRATION:-false}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data:/app/data
|
||||
x-runtipi:
|
||||
is_main: true
|
||||
internal_port: 3000
|
||||
|
||||
x-runtipi:
|
||||
schema_version: 2
|
||||
@@ -0,0 +1,25 @@
|
||||
# ConvertX
|
||||
|
||||
ConvertX, FFmpeg, ImageMagick, Pandoc ve Calibre motorlarini bir araya
|
||||
getiren self-hosted bir dosya donusturucudur. 1000'den fazla format
|
||||
arasinda donusum yapabilirsin: mp4 <-> avi <-> mkv, png <-> jpg <-> webp,
|
||||
docx <-> pdf, epub ve daha fazlasi.
|
||||
|
||||
## Public internete acarken ONEMLI guvenlik notlari
|
||||
|
||||
Bu uygulama sunucunun CPU'sunu kullanarak dosya donusturuyor. Internete
|
||||
acik ve korumasiz birakilirsa herkes hesap acip sunucunun kaynaklarini
|
||||
tuketebilir. Bu yuzden:
|
||||
|
||||
1. Kurulum tamamlandiktan sonra **"Yeni hesap kaydina izin ver"** ayarini
|
||||
GECICI olarak ac, kendi hesabini olustur, sonra tekrar KAPAT.
|
||||
2. `ALLOW_UNAUTHENTICATED` degeri kasitli olarak `false` sabitlenmis
|
||||
durumda - boylece giris yapmayan kimse dosya donusturemiyor.
|
||||
3. Hesabini olusturduktan sonra kayit kapaliyken bile sen giris yapmaya
|
||||
devam edebilirsin, sadece yeni hesap acilamaz.
|
||||
|
||||
## Kullanim
|
||||
|
||||
Kurulumdan sonra siteye giris yap, "Create account" ile ilk hesabini
|
||||
olustur (sadece kayit acikken gorunur), sonra dosyalarini surukle-birak
|
||||
ile yukleyip cikti formatini secerek donustur.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 23 KiB |
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "Gitea Runner",
|
||||
"id": "gitea-runner",
|
||||
"available": true,
|
||||
"short_desc": "Kendi Gitea sunucunuz icin Docker tabanli Actions runner",
|
||||
"author": "self-hosted",
|
||||
"port": 7443,
|
||||
"categories": ["development", "utilities"],
|
||||
"description": "Gitea Actions is akislarini calistiran, docker.sock uzerinden istenen herhangi bir imaji (ubuntu, archlinux, fedora, flutter build image'i vb.) aninda cekebilen self-hosted Docker executor runner. Tek 'docker' etiketiyle kayit olur; hangi image'in kullanilacagini workflow dosyasindaki 'container: image:' alani belirler.",
|
||||
"tipi_version": 1,
|
||||
"version": "0.2.11",
|
||||
"source": "https://gitea.com/gitea/act_runner",
|
||||
"website": "https://docs.gitea.com/usage/actions/act-runner",
|
||||
"exposable": false,
|
||||
"no_gui": true,
|
||||
"dynamic_config": true,
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Gitea Sunucu Adresi",
|
||||
"hint": "Gitea instance'inizin tam adresi (https:// dahil)",
|
||||
"placeholder": "https://gitea.senin-adresin.com",
|
||||
"required": true,
|
||||
"env_variable": "GITEA_INSTANCE_URL"
|
||||
},
|
||||
{
|
||||
"type": "password",
|
||||
"label": "Runner Registration Token",
|
||||
"hint": "Gitea > Settings > Actions > Runners > Create new runner sayfasindan alinan tek seferlik token",
|
||||
"required": true,
|
||||
"env_variable": "GITEA_RUNNER_REGISTRATION_TOKEN"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Runner Adi",
|
||||
"default": "runtipi-docker-runner",
|
||||
"required": false,
|
||||
"env_variable": "GITEA_RUNNER_NAME"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
log:
|
||||
level: info
|
||||
|
||||
runner:
|
||||
file: .runner
|
||||
capacity: 3
|
||||
timeout: 3h
|
||||
insecure: false
|
||||
fetch_timeout: 5s
|
||||
fetch_interval: 2s
|
||||
labels: []
|
||||
|
||||
cache:
|
||||
enabled: true
|
||||
dir: ""
|
||||
host: ""
|
||||
port: 0
|
||||
external_server: ""
|
||||
|
||||
container:
|
||||
network: ""
|
||||
privileged: false
|
||||
options: ""
|
||||
workdir_parent: ""
|
||||
valid_volumes: []
|
||||
docker_host: ""
|
||||
force_pull: true
|
||||
|
||||
host:
|
||||
workdir_parent: ""
|
||||
@@ -0,0 +1,25 @@
|
||||
services:
|
||||
gitea-runner:
|
||||
image: gitea/act_runner:latest
|
||||
environment:
|
||||
- GITEA_INSTANCE_URL=${GITEA_INSTANCE_URL}
|
||||
- GITEA_RUNNER_REGISTRATION_TOKEN=${GITEA_RUNNER_REGISTRATION_TOKEN}
|
||||
- GITEA_RUNNER_NAME=${GITEA_RUNNER_NAME:-runtipi-docker-runner}
|
||||
# Tek etiket: workflow'lardaki her "container: image:" bu etiket
|
||||
# uzerinden calisir, ayrica image basina etiket tanimlamaya gerek yok.
|
||||
- GITEA_RUNNER_LABELS=docker
|
||||
- CONFIG_FILE=/config.yaml
|
||||
volumes:
|
||||
# Runner'in host'un docker daemon'ina erismesi icin sart.
|
||||
# NOT: bu, container'a host uzerinde fiilen root-esdegeri Docker
|
||||
# kontrolu verir - guvenlik acisindan bilerek kabul edilen bir risk.
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
# "data/config.yaml" bu app klasorunden ${APP_DATA_DIR}/data/'ya
|
||||
# Runtipi tarafindan kurulumda otomatik kopyalanir.
|
||||
- ${APP_DATA_DIR}/data/config.yaml:/config.yaml
|
||||
# Runner kimlik/is verisi (.runner dosyasi vb.) kalici olsun diye.
|
||||
- ${APP_DATA_DIR}/runner-state:/data
|
||||
restart: unless-stopped
|
||||
|
||||
x-runtipi:
|
||||
schema_version: 2
|
||||
@@ -0,0 +1,24 @@
|
||||
# Gitea Runner
|
||||
|
||||
Kendi Gitea sunucunuz icin Docker executor tipinde bir Actions runner'i,
|
||||
Runtipi uzerinden tek tikla kurar.
|
||||
|
||||
## Ozellikler
|
||||
- Tek `docker` etiketiyle calisir; workflow dosyalarindaki `container: image:`
|
||||
alani hangi image'in (ubuntu, archlinux, fedora, flutter, node, vs.)
|
||||
cekilecegini belirler — runner tarafinda ekstra etiket tanimlamaya gerek yok.
|
||||
- host'un Docker socket'ine baglanir, bu sayede istenen herhangi bir image
|
||||
aninda cekilip calistirilabilir.
|
||||
|
||||
## Kurulum sonrasi
|
||||
1. Gitea sunucunuzda Settings > Actions > Runners > "Create new runner"
|
||||
sayfasindan bir registration token alin.
|
||||
2. Bu app'i kurarken istenen alanlara sunucu adresini ve token'i girin.
|
||||
3. Kurulum bitince Gitea > Runners listesinde runner'in `docker` etiketiyle
|
||||
gorunmesi gerekir.
|
||||
|
||||
## Guvenlik notu
|
||||
Bu app, `/var/run/docker.sock`'u container icine mount eder. Bu, container'a
|
||||
host'un Docker daemon'i uzerinde tam kontrol (fiilen root-esdegeri yetki)
|
||||
verir. Sadece guvendiginiz workflow'lari calistiran bir Gitea instance'i icin
|
||||
kullanin.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,52 @@
|
||||
{
|
||||
"name": "Gluetun + qBittorrent (ProtonVPN)",
|
||||
"id": "gluetun-qbittorrent",
|
||||
"available": true,
|
||||
"short_desc": "ProtonVPN'e WireGuard ile baglanan Gluetun VPN gecidi + arkasinda calisan qBittorrent. Kill-switch + otomatik NAT-PMP port forwarding dahil.",
|
||||
"author": "y1lm0z",
|
||||
"port": 61235,
|
||||
"categories": ["network", "utilities"],
|
||||
"description": "Tek dosyada iki container: Gluetun, ProtonVPN'e WireGuard ile baglanip kill-switch (VPN kopunca internet de kesilir) sagliyor. qBittorrent ise kendi agini kullanmiyor, Gluetun'un ag namespace'ini 'network_mode: service:gluetun' ile paylasiyor - tum torrent trafigi zorunlu olarak VPN tunelinden geciyor. ProtonVPN'in NAT-PMP port forwarding'i sayesinde Gluetun periyodik olarak port ister ve degistiginde qBittorrent'in dinleme portunu otomatik gunceller (VPN_PORT_FORWARDING_UP_COMMAND) - elle hicbir sey yapman gerekmez, seed performansi icin kritik olan bu ozellik Mullvad'da yoktu. qBittorrent, Gluetun VPN'e baglanip saglikli olana kadar baslamiyor. WebUI'ye Gluetun'un actigi 61235 portundan erisiliyor.",
|
||||
"tipi_version": 1,
|
||||
"version": "1.0.2",
|
||||
"source": "https://github.com/qdm12/gluetun",
|
||||
"website": "https://github.com/qdm12/gluetun-wiki",
|
||||
"exposable": true,
|
||||
"force_expose": false,
|
||||
"https": false,
|
||||
"no_gui": false,
|
||||
"supported_architectures": ["arm64", "amd64"],
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "password",
|
||||
"label": "WireGuard Private Key",
|
||||
"hint": "ProtonVPN hesabi -> Downloads -> WireGuard configuration. P2P destekli (cift ok ikonlu) bir sunucu sec ve config olustururken 'NAT-PMP (Port Forwarding)' secenegini MUTLAKA ac, yoksa port forwarding calismaz. Indirdigin .conf dosyasindaki PrivateKey degeri.",
|
||||
"required": true,
|
||||
"env_variable": "WIREGUARD_PRIVATE_KEY"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "WireGuard Addresses",
|
||||
"hint": "Ayni .conf dosyasindaki Address alani, IPv4 kismi (orn. 10.2.0.2/32)",
|
||||
"placeholder": "10.2.0.2/32",
|
||||
"required": true,
|
||||
"env_variable": "WIREGUARD_ADDRESSES"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Sunucu Ulkeleri",
|
||||
"hint": "ONEMLI: bos birakma - bos birakirsan Gluetun P2P desteklemeyen bir sunucuya baglanabilir ve port forwarding hic calismaz. Virgulle ayrilmis ulke adlari, orn: Netherlands,Switzerland",
|
||||
"default": "Netherlands",
|
||||
"required": false,
|
||||
"env_variable": "SERVER_COUNTRIES"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Firewall Outbound Subnets",
|
||||
"hint": "Docker ve LAN aginin WebUI'ye erisebilmesi icin izinli subnetler.",
|
||||
"default": "172.16.0.0/12,192.168.0.0/16",
|
||||
"required": false,
|
||||
"env_variable": "FIREWALL_OUTBOUND_SUBNETS"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
services:
|
||||
gluetun:
|
||||
image: qmcgaw/gluetun:latest
|
||||
container_name: gluetun
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun:/dev/net/tun
|
||||
sysctls:
|
||||
# Debian 13 + yeni kernel'de gorulen "default route not found"
|
||||
# crash-loop hatasi icin: IPv6'yi bu container icin kapatiyoruz.
|
||||
- net.ipv6.conf.all.disable_ipv6=1
|
||||
environment:
|
||||
- VPN_SERVICE_PROVIDER=protonvpn
|
||||
- VPN_TYPE=wireguard
|
||||
- WIREGUARD_PRIVATE_KEY=${WIREGUARD_PRIVATE_KEY}
|
||||
- WIREGUARD_ADDRESSES=${WIREGUARD_ADDRESSES}
|
||||
- SERVER_COUNTRIES=${SERVER_COUNTRIES:-Netherlands}
|
||||
# Sadece P2P/port-forwarding destekleyen sunuculari sec - bu
|
||||
# olmadan Gluetun rastgele (P2P desteklemeyen) bir sunucuya
|
||||
# baglanip port forwarding'i sonsuza kadar "starting" durumunda
|
||||
# birakabiliyor.
|
||||
- PORT_FORWARD_ONLY=on
|
||||
- FIREWALL_OUTBOUND_SUBNETS=${FIREWALL_OUTBOUND_SUBNETS:-172.16.0.0/12,192.168.0.0/16}
|
||||
- TZ=${TZ}
|
||||
# ProtonVPN'in NAT-PMP port forwarding'i: Gluetun otomatik port
|
||||
# ister, degistiginde asagidaki komutla qBittorrent'in dinleme
|
||||
# portunu ANINDA gunceller - elle hicbir sey yapman gerekmiyor.
|
||||
- VPN_PORT_FORWARDING=on
|
||||
- VPN_PORT_FORWARDING_PROVIDER=protonvpn
|
||||
- VPN_PORT_FORWARDING_UP_COMMAND=/bin/sh -c 'wget -O- -nv --retry-connrefused --post-data "json={\"listen_port\":{{PORTS}}}" http://127.0.0.1:61235/api/v2/app/setPreferences'
|
||||
ports:
|
||||
# Sadece WebUI'yi host'a aciyoruz. Torrent peer portu artik ProtonVPN'in
|
||||
# NAT-PMP ile atadigi DINAMIK port - bu, VPN tunelinin (tun0) uzerinden
|
||||
# geliyor, Docker'in host network'unden degil, o yuzden burada ayrica
|
||||
# bir port yayinlamaya gerek yok (Gluetun kendi firewall'unda otomatik
|
||||
# izin veriyor).
|
||||
- 61235:61235
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/gluetun:/gluetun
|
||||
restart: unless-stopped
|
||||
x-runtipi:
|
||||
is_main: true
|
||||
internal_port: 61235
|
||||
|
||||
qbittorrent:
|
||||
image: lscr.io/linuxserver/qbittorrent:latest
|
||||
container_name: qbittorrent
|
||||
# Kendi agi yok, gluetun'un ag namespace'ini paylasiyor - tum
|
||||
# trafik VPN tunelinden geciyor (kill switch qbittorrent'i de kapsar).
|
||||
network_mode: "service:gluetun"
|
||||
depends_on:
|
||||
gluetun:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TZ}
|
||||
- WEBUI_PORT=61235
|
||||
# Baslangic degeri - Gluetun VPN_PORT_FORWARDING_UP_COMMAND ile
|
||||
# baglanir baglanmaz gercek atanan portla otomatik degistiriyor.
|
||||
- TORRENTING_PORT=61234
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data/config:/config
|
||||
- ${APP_DATA_DIR}/data/downloads:/downloads
|
||||
restart: unless-stopped
|
||||
|
||||
x-runtipi:
|
||||
schema_version: 2
|
||||
@@ -0,0 +1,41 @@
|
||||
# Gluetun + qBittorrent (ProtonVPN)
|
||||
|
||||
Tek uygulama, iki container: **Gluetun** (VPN geçidi) ve **qBittorrent** (torrent istemcisi). qBittorrent kendi ağını kullanmıyor, `network_mode: service:gluetun` ile Gluetun'un ağ namespace'ini paylaşıyor — bu yüzden tüm torrent trafiği zorunlu olarak ProtonVPN tüneli üzerinden geçiyor. VPN koparsa qBittorrent'in de interneti anında kesilir (kill switch).
|
||||
|
||||
**Fark yaratan özellik:** ProtonVPN, NAT-PMP ile gerçek port forwarding destekliyor (Mullvad 2023'te bunu kaldırmıştı). Gluetun bu portu otomatik ister ve her değiştiğinde qBittorrent'in dinleme portunu **kendisi günceller** — seed performansı için kritik olan bu adım tamamen otomatik.
|
||||
|
||||
## Kurulum
|
||||
|
||||
1. ProtonVPN hesabı → **Downloads → WireGuard configuration** sayfasına git.
|
||||
2. **P2P destekli bir sunucu seç** (çift ok ikonlu olanlar).
|
||||
3. Config oluştururken **"NAT-PMP (Port Forwarding)"** seçeneğini mutlaka aç — bunu atlarsan port forwarding hiç çalışmaz.
|
||||
4. İndirilen `.conf` dosyasından `PrivateKey` → **WireGuard Private Key**, `Address`'in IPv4 kısmı → **WireGuard Addresses** alanına.
|
||||
5. İstersen **Sunucu Ülkeleri** alanına bir ülke yaz (örn. `Netherlands`), boş bırakırsan rastgele P2P sunucu seçilir.
|
||||
6. Kur, başlat.
|
||||
|
||||
## Kurulumdan SONRA yapman gereken tek manuel adım
|
||||
|
||||
qBittorrent WebUI → **Options → Web UI → Authentication** → **"Bypass authentication for clients on localhost"** kutusunu işaretle, kaydet.
|
||||
|
||||
Bu şart, çünkü Gluetun port değiştiğinde qBittorrent'in API'sine `127.0.0.1` üzerinden (aynı ağ namespace'i içinden) istek atıyor — bu kutu işaretli değilse Gluetun'un isteği kimlik doğrulamada takılır, port senkronu sessizce başarısız olur.
|
||||
|
||||
## Erişim
|
||||
|
||||
```
|
||||
http://sunucu-ip:61235
|
||||
```
|
||||
|
||||
İlk girişte qBittorrent geçici bir şifre üretir, container loglarından (`docker logs qbittorrent`) görebilirsin.
|
||||
|
||||
## Portlar
|
||||
|
||||
- **61235** → WebUI (host ve container tarafında aynı numara, tek yayınlanan port)
|
||||
- Torrent peer portu artık **sabit değil** — ProtonVPN'in NAT-PMP ile dinamik atadığı port, VPN tüneli üzerinden geliyor (host'ta ayrıca port yayınlamaya gerek yok). Gluetun loglarında (`docker logs gluetun | grep -i port`) hangi portun atandığını görebilirsin.
|
||||
|
||||
## Sonarr / Radarr entegrasyonu
|
||||
|
||||
İndirme istemcisi olarak eklerken host adresi bu sunucu, port **61235**. `/downloads` klasörünü Sonarr/Radarr ile aynı host yoluyla paylaşırsan hardlink taşıma sorunsuz çalışır.
|
||||
|
||||
## İleride başka bir şeyi VPN'lemek istersen
|
||||
|
||||
Aynı `docker-compose.yml` dosyasına üçüncü bir servis ekleyip ona da `network_mode: "service:gluetun"` yazman yeterli — aynı dosyada oldukları için ekstra container ismi/proje eşleştirmesi gerekmiyor. O servisin ihtiyaç duyduğu portu **gluetun** servisinin `ports:` listesine eklemeyi unutma (ağı gerçekten sahiplenen o olduğu için port yayınlamayı da o yapmak zorunda).
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,58 @@
|
||||
{
|
||||
"name": "Lidarr YouTube Downloader",
|
||||
"id": "lidarr-youtube-downloader",
|
||||
"available": true,
|
||||
"short_desc": "Fills in missing Lidarr albums by downloading them from YouTube",
|
||||
"author": "Angrido",
|
||||
"port": 5000,
|
||||
"categories": ["media"],
|
||||
"description": "Lidarr YouTube Downloader is a free, self-hosted bridge between Lidarr and YouTube. It searches YouTube for albums that Lidarr is missing, scores the best audio match, downloads it at up to 320 kbps using yt-dlp, tags it with full ID3 metadata (MusicBrainz IDs, cover art, track numbers) and imports it back into your Lidarr library. It can also run as a native Lidarr download client (emulating a Newznab indexer + SABnzbd) so Lidarr handles search, grab and import automatically. Includes a scheduler, AcoustID fingerprint verification, and Telegram/Discord notifications.",
|
||||
"tipi_version": 1,
|
||||
"version": "1.8.6",
|
||||
"source": "https://github.com/Angrido/Lidarr-YouTube-Downloader",
|
||||
"website": "https://github.com/Angrido/Lidarr-YouTube-Downloader",
|
||||
"exposable": true,
|
||||
"force_expose": false,
|
||||
"no_gui": false,
|
||||
"supported_architectures": ["arm64", "amd64"],
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Lidarr URL",
|
||||
"hint": "Full URL to your Lidarr instance, including port",
|
||||
"placeholder": "http://192.168.1.10:8686",
|
||||
"required": true,
|
||||
"env_variable": "LIDARR_URL"
|
||||
},
|
||||
{
|
||||
"type": "password",
|
||||
"label": "Lidarr API Key",
|
||||
"hint": "Found in Lidarr under Settings -> General -> Security",
|
||||
"required": true,
|
||||
"env_variable": "LIDARR_API_KEY"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Download folder (host path)",
|
||||
"hint": "Host path where new tracks are temporarily saved before import, e.g. /mnt/data/Downloads",
|
||||
"placeholder": "/mnt/data/Downloads",
|
||||
"required": true,
|
||||
"env_variable": "DOWNLOAD_HOST_PATH"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Music library folder (host path)",
|
||||
"hint": "Host path of your Lidarr music library, must match the path Lidarr itself uses",
|
||||
"placeholder": "/mnt/data/Media/Music",
|
||||
"required": true,
|
||||
"env_variable": "MUSIC_HOST_PATH"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Umask",
|
||||
"default": "002",
|
||||
"required": false,
|
||||
"env_variable": "APP_UMASK"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
lidarr-youtube-downloader:
|
||||
image: angrido/lidarr-downloader:latest
|
||||
environment:
|
||||
- LIDARR_URL=${LIDARR_URL}
|
||||
- LIDARR_API_KEY=${LIDARR_API_KEY}
|
||||
- DOWNLOAD_PATH=/DATA/Downloads
|
||||
- LIDARR_PATH=/music
|
||||
- YT_COOKIES_FILE=/cookies/cookies.txt
|
||||
- PUID=${UID}
|
||||
- PGID=${GID}
|
||||
- UMASK=${APP_UMASK}
|
||||
- TZ=${TZ}
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/config:/config
|
||||
- ${APP_DATA_DIR}/cookies:/cookies
|
||||
- ${DOWNLOAD_HOST_PATH}:/DATA/Downloads
|
||||
- ${MUSIC_HOST_PATH}:/music
|
||||
x-runtipi:
|
||||
is_main: true
|
||||
internal_port: 5000
|
||||
|
||||
x-runtipi:
|
||||
schema_version: 2
|
||||
@@ -0,0 +1,21 @@
|
||||
# Lidarr YouTube Downloader
|
||||
|
||||
A free, open-source bridge between [Lidarr](https://lidarr.audio/) and YouTube that fills the gaps in your self-hosted music library. Powered by yt-dlp, MusicBrainz, iTunes and AcoustID, it searches YouTube for your missing albums, scores the best audio match, downloads it at up to 320 kbps, writes complete ID3 metadata with embedded artwork, and triggers a Lidarr import.
|
||||
|
||||
## Features
|
||||
- Smart YouTube matching (title similarity, duration, official-channel boost, forbidden-word filtering)
|
||||
- Optional AcoustID/chromaprint fingerprint verification before import
|
||||
- Full ID3 / MP4 tagging with MusicBrainz IDs and iTunes cover art
|
||||
- Can register inside Lidarr as a native download client (Newznab indexer + SABnzbd emulation) so Lidarr drives search/grab/import itself
|
||||
- Built-in scheduler for auto-discovery of new missing albums
|
||||
- Telegram & Discord notifications
|
||||
- Manual YouTube URL / playlist import with audio preview
|
||||
|
||||
## Setup notes
|
||||
1. After install, open the app and go to **Settings** to fine-tune audio format, concurrency, match threshold, scheduler and notifications.
|
||||
2. **Lidarr URL** and **Lidarr API key** are required (find the API key in Lidarr → Settings → General → Security).
|
||||
3. **Download folder** and **Music library folder** must be host paths reachable by both this app and your Lidarr container — ideally the exact same path Lidarr itself uses for its library, to avoid import path mismatches.
|
||||
4. If YouTube returns "Sign in to confirm you're not a bot", export a `cookies.txt` (Netscape format, throwaway Google account) and drop it into this app's data folder under `cookies/cookies.txt` — it's already mounted and referenced automatically.
|
||||
5. To use this app as a native Lidarr download client instead of just pushing files in, follow the "Use as a Lidarr download client" section in the [project README](https://github.com/Angrido/Lidarr-YouTube-Downloader#-use-as-a-lidarr-download-client).
|
||||
|
||||
**Disclaimer:** provided for personal, educational use to manage your own music library. You are responsible for complying with copyright law and YouTube's Terms of Service.
|
||||
@@ -0,0 +1,53 @@
|
||||
{
|
||||
"name": "Matrix Conduit",
|
||||
"id": "matrix-conduit",
|
||||
"available": true,
|
||||
"short_desc": "Hafif, hizli ve federasyon destekli Matrix homeserver.",
|
||||
"author": "matrix-conduit",
|
||||
"port": 8448,
|
||||
"categories": ["social", "network"],
|
||||
"description": "Conduit, Rust ile yazilmis, dusuk kaynak tuketen bir Matrix homeserver'dir. Element gibi Matrix istemcileriyle uyumludur ve federasyonu destekler.",
|
||||
"dynamic_config": true,
|
||||
"tipi_version": 1,
|
||||
"version": "0.10.12",
|
||||
"source": "https://gitlab.com/famedly/conduit",
|
||||
"website": "https://conduit.rs",
|
||||
"exposable": true,
|
||||
"force_expose": true,
|
||||
"https": true,
|
||||
"supported_architectures": ["arm64", "amd64"],
|
||||
"form_fields": [
|
||||
{
|
||||
"type": "boolean",
|
||||
"label": "Kayit acik olsun mu?",
|
||||
"hint": "Kapali birakip ilk admin hesabini kaydettikten sonra tekrar kapatman onerilir.",
|
||||
"required": false,
|
||||
"default": false,
|
||||
"env_variable": "ALLOW_REGISTRATION"
|
||||
},
|
||||
{
|
||||
"type": "boolean",
|
||||
"label": "Federasyona izin ver",
|
||||
"hint": "Diger Matrix sunucularindaki kullanicilarla konusabilmek icin acik olmali.",
|
||||
"required": false,
|
||||
"default": true,
|
||||
"env_variable": "ALLOW_FEDERATION"
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"label": "Guvenilir sunucular (JSON liste)",
|
||||
"hint": "Ornek: [\"matrix.org\"]",
|
||||
"placeholder": "[\"matrix.org\"]",
|
||||
"required": false,
|
||||
"default": "[\"matrix.org\"]",
|
||||
"env_variable": "TRUSTED_SERVERS"
|
||||
},
|
||||
{
|
||||
"type": "number",
|
||||
"label": "Maksimum istek boyutu (byte)",
|
||||
"required": false,
|
||||
"default": 20000000,
|
||||
"env_variable": "MAX_REQUEST_SIZE"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
server {
|
||||
listen 80 default_server;
|
||||
server_name _;
|
||||
|
||||
location /.well-known/matrix/server {
|
||||
default_type application/json;
|
||||
return 200 '{"m.server": "${APP_DOMAIN}:443"}';
|
||||
}
|
||||
|
||||
location /.well-known/matrix/client {
|
||||
default_type application/json;
|
||||
add_header Access-Control-Allow-Origin *;
|
||||
return 200 '{"m.homeserver": {"base_url": "https://${APP_DOMAIN}"}}';
|
||||
}
|
||||
|
||||
location / {
|
||||
return 404;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
services:
|
||||
matrix-conduit:
|
||||
image: matrixconduit/matrix-conduit:v0.10.12
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- CONDUIT_SERVER_NAME=${APP_DOMAIN}
|
||||
- CONDUIT_DATABASE_PATH=/var/lib/matrix-conduit/
|
||||
- CONDUIT_DATABASE_BACKEND=rocksdb
|
||||
- CONDUIT_ADDRESS=0.0.0.0
|
||||
- CONDUIT_PORT=6167
|
||||
- CONDUIT_LOG=${LOG:-warn,rocket=off,_=off,sled=off}
|
||||
- CONDUIT_MAX_REQUEST_SIZE=${MAX_REQUEST_SIZE:-20000000}
|
||||
- CONDUIT_ALLOW_REGISTRATION=${ALLOW_REGISTRATION:-false}
|
||||
- CONDUIT_ALLOW_FEDERATION=${ALLOW_FEDERATION:-true}
|
||||
- CONDUIT_TRUSTED_SERVERS=${TRUSTED_SERVERS:-["matrix.org"]}
|
||||
- CONDUIT_ALLOW_CHECK_FOR_UPDATES=false
|
||||
- CONDUIT_TURN_URIS=${TURN_URIS:-["turn:localhost?transport=udp", "turn:localhost?transport=tcp"]}
|
||||
- CONDUIT_TURN_SECRET=${TURN_SECRET:-turnsecret}
|
||||
# Bu satir olmadan Conduit diskte config dosyasi aramaya calisir.
|
||||
- CONDUIT_CONFIG=
|
||||
volumes:
|
||||
- ${APP_DATA_DIR}/data:/var/lib/matrix-conduit/
|
||||
x-runtipi:
|
||||
is_main: true
|
||||
internal_port: 6167
|
||||
|
||||
matrix-conduit-well-known:
|
||||
# build: yerine hazir nginx imaji kullaniyoruz; Runtipi app store'lar
|
||||
# kurulum sirasinda Dockerfile build etmeyi desteklemiyor.
|
||||
image: nginx:1.27-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- APP_DOMAIN=${APP_DOMAIN}
|
||||
volumes:
|
||||
# apps/matrix-conduit/data/nginx/default.conf.template dosyasi
|
||||
# kurulumda otomatik olarak ${APP_DATA_DIR}/data/nginx altina kopyalanir.
|
||||
- ${APP_DATA_DIR}/data/nginx:/etc/nginx/templates:ro
|
||||
labels:
|
||||
# Ana servis disindaki bu container icin Traefik label'larini
|
||||
# elle yaziyoruz cunku otomatik routing sadece is_main servise uygulanir.
|
||||
# Container iki agda birden oldugu icin (kendi proje agi + ana ag),
|
||||
# Traefik'e hangi agi kullanacagini acikca soylememiz gerekiyor.
|
||||
- "traefik.docker.network=runtipi_tipi_main_network"
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.services.{{RUNTIPI_APP_ID}}-wellknown.loadbalancer.server.port=80"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown-insecure.rule=Host(`${APP_DOMAIN}`) && PathPrefix(`/.well-known/matrix`)"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown-insecure.entrypoints=web"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown-insecure.service={{RUNTIPI_APP_ID}}-wellknown"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown-insecure.priority=100"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown.rule=Host(`${APP_DOMAIN}`) && PathPrefix(`/.well-known/matrix`)"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown.entrypoints=websecure"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown.tls.certresolver=myresolver"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown.service={{RUNTIPI_APP_ID}}-wellknown"
|
||||
- "traefik.http.routers.{{RUNTIPI_APP_ID}}-wellknown.priority=100"
|
||||
x-runtipi:
|
||||
# Traefik'in bu container'a ulasabilmesi icin ana ag'a katiyoruz.
|
||||
add_to_main_network: true
|
||||
|
||||
x-runtipi:
|
||||
schema_version: 2
|
||||
@@ -0,0 +1,16 @@
|
||||
# Matrix Conduit
|
||||
|
||||
Conduit, Rust ile yazılmış hafif ve hızlı bir Matrix homeserver'dır. Düşük
|
||||
kaynaklı sunucularda (Raspberry Pi dahil) rahatça çalışır ve diğer Matrix
|
||||
sunucularıyla federasyon kurabilir.
|
||||
|
||||
## Kurulum sonrası yapılması gerekenler
|
||||
|
||||
1. Uygulamayı kurarken **Expose via domain name (HTTPS)** seçeneğini
|
||||
kullanman gerekir; Conduit yerel `.tipi.local` alan adıyla düzgün
|
||||
federe olamaz, gerçek bir domain/subdomain gerekir.
|
||||
2. DNS'te domainin sunucunun IP adresine işaret ettiğinden emin ol.
|
||||
3. Kurulumdan sonra `ALLOW_REGISTRATION` seçeneğini geçici olarak açıp ilk
|
||||
admin hesabını oluştur, sonra tekrar kapat.
|
||||
4. Federasyon Test Aracı ile (`https://federationtester.matrix.org`)
|
||||
sunucunun doğru yapılandırıldığını kontrol edebilirsin.
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
Reference in New Issue
Block a user