[APP] Add SLSKD (#3010)

* Add SLSKD

* Add Traefik labels

* Make sure user edits are recorded in config

* Add default shared directory

* Add information on credentials

* Specify CPU architectures in config.json

* Remove superfluous file

* fix: run the app as root

* fix: remove unnecessary config options

---------

Co-authored-by: Pieter D'herde <hello@pieterdherde.com>
Co-authored-by: Stavros <steveiliop56@gmail.com>
This commit is contained in:
PieterDherde 2024-04-08 14:40:56 +02:00 committed by GitHub
parent 08c08107d6
commit 6721faf773
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 364 additions and 0 deletions

54
apps/slskd/config.json Normal file
View File

@ -0,0 +1,54 @@
{
"name": "SLSKD",
"available": true,
"port": 5030,
"exposable": true,
"id": "slskd",
"description": "A modern client-server application for the Soulseek file-sharing network.",
"tipi_version": 1,
"version": "0.20.1",
"categories": ["utilities"],
"short_desc": "P2P downloads",
"author": "jpdillingham",
"source": "https://github.com/slskd/slskd",
"supported_architectures": ["amd64", "arm64"],
"form_fields": [{
"type": "text",
"label": "WebUI username",
"max": 50,
"min": 3,
"required": true,
"env_variable": "SLSKD_WEB_USER"
},
{
"type": "password",
"label": "WebUI password",
"max": 50,
"min": 3,
"required": true,
"env_variable": "SLSKD_WEB_PASSWORD"
},
{
"type": "text",
"label": "Soulseek username",
"max": 50,
"min": 3,
"required": true,
"env_variable": "SLSKD_USER"
},
{
"type": "password",
"label": "Soulseek password",
"max": 50,
"min": 3,
"required": true,
"env_variable": "SLSKD_PASSWORD"
},
{
"type": "boolean",
"label": "Allow remote configuration",
"required": true,
"env_variable": "SLSKD_REMOTE_CONFIGURATION"
}
]
}

View File

@ -0,0 +1,226 @@
#debug: false
remote_configuration: {{SLSKD_REMOTE_CONFIGURATION}}
# remote_file_management: false
# instance_name: default
# flags:
# no_logo: false
# no_start: false
# no_config_watch: false
# no_connect: false
# no_share_scan: false
# force_share_scan: false
# no_version_check: true
# log_sql: false
# experimental: false
# volatile: false
# case_sensitive_reg_ex: false
# relay:
# enabled: false
# mode: controller # controller (default), agent, or debug (for local development)
# # controller config is required when running in 'agent' mode
# # this specifies the relay controller that will be controlling this agent
# controller:
# address: https://some.site.com:5000
# ignore_certificate_errors: false
# api_key: <a 16-255 character string corresponding to one of the controller's 'readwrite' or 'administrator' API keys>
# secret: <a 16-255 character shared secret matching the controller's config for this agent>
# downloads: false
# # agent config is optional when running in 'controller' mode
# # this specifies all of the agents capable of connecting
# agents:
# my_agent:
# instance_name: my_agent # make sure the top-level instance_name of the agent matches!
# secret: <a 16-255 character string unique to this agent>
# cidr: 0.0.0.0/0,::/0
directories:
incomplete: /incomplete
downloads: /downloads
shares:
directories:
filters:
- \.ini$
- Thumbs.db$
- \.DS_Store$
cache:
storage_mode: memory
workers: 16
# retention: ~ # retain indefinitely (do not automatically re-scan)
# rooms:
# - ~
# global:
# upload:
# slots: 20
# speed_limit: 1000 # in kibibytes
# limits:
# queued:
# files: 500
# megabytes: 5000
# daily:
# files: 1000
# megabytes: 10000
# failures: 200
# weekly:
# files: 5000
# megabytes: 50000
# failures: 1000
# download:
# slots: 500
# speed_limit: 1000
# groups:
# default:
# upload:
# priority: 500
# strategy: roundrobin
# slots: 10
# limits:
# queued:
# files: 150
# megabytes: 1500
# daily: ~ # no daily limits (weekly still apply)
# weekly:
# files: 1500
# megabytes: 15000
# failures: 150
# leechers:
# thresholds:
# files: 1
# directories: 1
# upload:
# priority: 999
# strategy: roundrobin
# slots: 1
# speed_limit: 100
# limits:
# queued:
# files: 15
# megabytes: 150
# daily:
# files: 30
# megabytes: 300
# failures: 10
# weekly:
# files: 150
# megabytes: 1500
# failures: 30
# blacklisted:
# members:
# - <username to blacklist>
# cidrs:
# - <CIDR to blacklist, e.g. 255.255.255.255/32>
# user_defined:
# my_buddies:
# upload:
# priority: 250
# strategy: firstinfirstout
# slots: 10
# limits:
# queued:
# files: 1000 # override global default
# members:
# - alice
# - bob
# filters:
# search:
# request:
# - ^.{1,2}$
web:
port: 5030
https:
disabled: false
# port: 5031
# force: false
# certificate:
# pfx: ~
# password: ~
url_base: /
content_path: wwwroot
# logging: false
authentication:
disabled: false
username: {{SLSKD_WEB_USER}}
password: {{SLSKD_WEB_PASSWORD}}
# jwt:
# key: ~
# ttl: 604800000
# api_keys:
# my_api_key:
# key: <some example string between 16 and 255 characters>
# role: readonly # readonly, readwrite, administrator
# cidr: 0.0.0.0/0,::/0
# retention:
# transfers:
# upload:
# succeeded: 1440 # 1 day
# errored: 30
# cancelled: 5
# download:
# succeeded: 1440 # 1 day
# errored: 20160 # 2 weeks
# cancelled: 5
# files:
# complete: 20160 # 2 weeks
# incomplete: 43200 # 30 days
# logs: 259200 # 180 days
# logger:
# disk: true
# loki: ~
# metrics:
# enabled: false
# url: /metrics
# authentication:
# disabled: false
# username: slskd
# password: slskd
# feature:
# swagger: false
soulseek:
address: vps.slsknet.org
port: 2271
username: {{SLSKD_USER}}
password: {{SLSKD_PASSWORD}}
# description: |
# A slskd user. https://github.com/slskd/slskd
listen_ip_address: 0.0.0.0
listen_port: 50300
# diagnostic_level: Info
# distributed_network:
# disabled: false
# disable_children: false
# child_limit: 25
# logging: false
connection:
timeout:
connect: 10000
inactivity: 15000
buffer:
read: 16384
write: 16384
transfer: 262144
write_queue: 250
# proxy:
# enabled: false
# address: ~
# port: ~
# username: ~
# password: ~
# integration:
# ftp:
# enabled: false
# address: ~
# port: ~
# username: ~
# password: ~
# remote_path: /
# encryption_mode: auto
# ignore_certificate_errors: false
# overwrite_existing: true
# connection_timeout: 5000
# retry_attempts: 3
# pushbullet:
# enabled: false
# access_token: ~
# notification_prefix: "From slskd:"
# notify_on_private_message: true
# notify_on_room_mention: true
# retry_attempts: 3
# cooldown_time: 900000

View File

@ -0,0 +1,48 @@
version: "3.9"
services:
slskd:
image: slskd/slskd:0.20.1
container_name: slskd
volumes:
- "${APP_DATA_DIR}:/app"
- "${ROOT_FOLDER_HOST}/media/downloads/complete:/downloads"
- "${ROOT_FOLDER_HOST}/media/downloads/incomplete:/incomplete"
- "${ROOT_FOLDER_HOST}/media/:/shared"
environment:
- SLSKD_WEB_USER=${SLSKD_WEB_USER}
- SLSKD_WEB_PASSWORD=${SLSKD_WEB_PASSWORD}
- SLSKD_USER=${SLSKD_USER}
- SLSKD_PASSWORD=${SLSKD_PASSWORD}
- SLSKD_REMOTE_CONFIGURATION=${SLSKD_REMOTE_CONFIGURATION}
- SLSKD_CONFIG=/app/data/slskd.yml
- SLSKD_SHARED_DIR=/shared
restart: unless-stopped
networks:
- tipi_main_network
ports:
- ${APP_PORT}:5030
labels:
# Main
traefik.enable: true
traefik.http.middlewares.slskd-web-redirect.redirectscheme.scheme: https
traefik.http.services.slskd.loadbalancer.server.port: 5030
# Web
traefik.http.routers.slskd-insecure.rule: Host(`${APP_DOMAIN}`)
traefik.http.routers.slskd-insecure.entrypoints: web
traefik.http.routers.slskd-insecure.service: slskd
traefik.http.routers.slskd-insecure.middlewares: slskd-web-redirect
# Websecure
traefik.http.routers.slskd.rule: Host(`${APP_DOMAIN}`)
traefik.http.routers.slskd.entrypoints: websecure
traefik.http.routers.slskd.service: slskd
traefik.http.routers.slskd.tls.certresolver: myresolver
# Local domain
traefik.http.routers.slskd-local-insecure.rule: Host(`slskd.${LOCAL_DOMAIN}`)
traefik.http.routers.slskd-local-insecure.entrypoints: web
traefik.http.routers.slskd-local-insecure.service: slskd
traefik.http.routers.slskd-local-insecure.middlewares: slskd-web-redirect
# Local domain secure
traefik.http.routers.slskd-local.rule: Host(`slskd.${LOCAL_DOMAIN}`)
traefik.http.routers.slskd-local.entrypoints: websecure
traefik.http.routers.slskd-local.service: slskd
traefik.http.routers.slskd-local.tls: true

View File

@ -0,0 +1,36 @@
A modern client-server application for the [Soulseek](https://www.slsknet.org/news/) file-sharing network.
## Features
### Credentials
Upon installing the app will ask for a username and password for both the web interface and the Soulseek network. If another Soulseek user already exists with that name, the app will still install correctly but won't login. A new username can be configured in the settings.
### Secure access
slskd runs as a daemon or Docker container in your network (or in the cloud!) and is accessible from a web browser. It's designed to be exposed to the internet, and everything is secured with a token that [you can control](https://github.com/slskd/slskd/blob/master/docs/config.md#authentication).
![image](https://user-images.githubusercontent.com/17145758/193290217-0e6d87f5-a547-4451-8d90-d554a902716c.png)
### Search
Search for things just like you're used to with the official Soulseek client. slskd makes it easy to enter multiple searches quickly.
![image](https://user-images.githubusercontent.com/17145758/193286989-30bd524d-81b6-4721-bd72-e4438c2b7b69.png)
### Results
Sort and filter search results using the same filters you use today. Dismiss results you're not interested in, and download the ones you want in a couple of clicks.
![image](https://user-images.githubusercontent.com/17145758/193288396-dc3cc83d-6d93-414a-93f6-cea0696ac245.png)
### Downloads
Monitor the speed and status of downloads, grouped by user and folder. Click the progress bar to fetch your place in queue, and use the selection tools to cancel, retry, or clear completed downloads. Use the controls at the top to quickly manage downloads by status.
![image](https://user-images.githubusercontent.com/17145758/193289840-3aee153f-3656-4f15-b086-8b1ca25d38bb.png)
### Pretty much everything else
slskd can do almost everything the official Soulseek client can; browse user shares, join chat rooms, privately chat with other users.
New features are added all the time!

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB