diff --git a/apps/slskd/config.json b/apps/slskd/config.json new file mode 100644 index 00000000..6bc842b7 --- /dev/null +++ b/apps/slskd/config.json @@ -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" + } + ] +} diff --git a/apps/slskd/data/slskd.yml.template b/apps/slskd/data/slskd.yml.template new file mode 100644 index 00000000..25fe48be --- /dev/null +++ b/apps/slskd/data/slskd.yml.template @@ -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: +# secret: +# 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: +# 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: +# - +# cidrs: +# - +# 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: +# 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 diff --git a/apps/slskd/docker-compose.yml b/apps/slskd/docker-compose.yml new file mode 100644 index 00000000..5de11dbd --- /dev/null +++ b/apps/slskd/docker-compose.yml @@ -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 diff --git a/apps/slskd/metadata/description.md b/apps/slskd/metadata/description.md new file mode 100644 index 00000000..3d8773a6 --- /dev/null +++ b/apps/slskd/metadata/description.md @@ -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! \ No newline at end of file diff --git a/apps/slskd/metadata/logo.jpg b/apps/slskd/metadata/logo.jpg new file mode 100644 index 00000000..aa6d51f7 Binary files /dev/null and b/apps/slskd/metadata/logo.jpg differ