├── .gitignore ├── rootfs ├── etc │ ├── s6-overlay │ │ └── s6-rc.d │ │ │ ├── init-setup │ │ │ ├── type │ │ │ ├── up │ │ │ └── run │ │ │ ├── svc-novnc │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ │ └── init-setup │ │ │ └── run │ │ │ ├── svc-openbox │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ │ └── init-setup │ │ │ └── run │ │ │ ├── user │ │ │ └── contents.d │ │ │ │ ├── init-setup │ │ │ │ ├── svc-novnc │ │ │ │ ├── svc-openbox │ │ │ │ ├── svc-soulseek │ │ │ │ └── svc-tigervnc │ │ │ ├── svc-soulseek │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ │ └── init-setup │ │ │ └── run │ │ │ └── svc-tigervnc │ │ │ ├── type │ │ │ ├── dependencies.d │ │ │ └── init-setup │ │ │ └── run │ └── xdg │ │ └── openbox │ │ └── rc.xml └── usr │ └── share │ └── novnc │ └── index.html ├── docs ├── synology_docker_config_ports_screenshot.png └── synology_docker_config_volumes_screenshot.png ├── docker-compose.yml ├── soulseek.conf ├── LICENSE ├── ui.patch ├── .github └── workflows │ └── build.yml ├── Dockerfile └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-setup/type: -------------------------------------------------------------------------------- 1 | oneshot 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-novnc/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-openbox/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/init-setup: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-novnc: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-openbox: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-soulseek: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/svc-tigervnc: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-soulseek/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-tigervnc/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-novnc/dependencies.d/init-setup: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-openbox/dependencies.d/init-setup: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-soulseek/dependencies.d/init-setup: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-tigervnc/dependencies.d/init-setup: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/init-setup/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/init-setup/run 2 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-openbox/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | 3 | # Start Openbox 4 | exec s6-setuidgid $(id -nu $PUID) openbox 5 | -------------------------------------------------------------------------------- /docs/synology_docker_config_ports_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realies/soulseek-docker/HEAD/docs/synology_docker_config_ports_screenshot.png -------------------------------------------------------------------------------- /docs/synology_docker_config_volumes_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/realies/soulseek-docker/HEAD/docs/synology_docker_config_volumes_screenshot.png -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-soulseek/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | 3 | export HOME=/data 4 | # Default umask settings 5 | umask ${UMASK} 6 | 7 | # Start Soulseek 8 | exec s6-setuidgid $(id -nu $PUID) /app/SoulseekQt 9 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-novnc/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | 3 | # Start noVNC proxy 4 | exec s6-setuidgid $(id -nu $PUID) /usr/share/novnc/utils/novnc_proxy --vnc localhost:${VNC_PORT} --listen ${NOVNC_PORT} --web /usr/share/novnc 5 | -------------------------------------------------------------------------------- /rootfs/etc/xdg/openbox/rc.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 1 6 | 0 7 | 8 | 9 | 10 | 11 | yes 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | services: 3 | soulseek: 4 | platform: linux/amd64 5 | build: . 6 | environment: 7 | - PGID=1000 8 | - PUID=1000 9 | ports: 10 | - 6080:6080 11 | volumes: 12 | - appdata:/data/.SoulseekQt 13 | - downloads:/data/Soulseek Downloads 14 | - shared:/data/Soulseek Shared Folder 15 | - logs:/data/Soulseek Chat Logs 16 | volumes: 17 | appdata: 18 | downloads: 19 | shared: 20 | logs: 21 | -------------------------------------------------------------------------------- /rootfs/usr/share/novnc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | soulseek-docker 5 | 6 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /rootfs/etc/s6-overlay/s6-rc.d/svc-tigervnc/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | 3 | # Check if the VNCPWD_FILE variable is set and file exists 4 | if [ -n "$VNCPWD_FILE" ] && [ -f "$VNCPWD_FILE" ]; then 5 | VNCPWD=$(cat $VNCPWD_FILE) 6 | fi 7 | 8 | # Define default VNC password handling 9 | if [ -z "${VNCPWD}" ]; then 10 | noauth="-SecurityTypes None" 11 | else 12 | echo "${VNCPWD}" | vncpasswd -f > /tmp/passwd 13 | fi 14 | 15 | # Start Tigervnc with configurable port 16 | exec s6-setuidgid $(id -nu $PUID) Xtigervnc -desktop soulseek -auth /tmp/.Xauthority -rfbport ${VNC_PORT} -nopn -rfbauth /tmp/passwd -quiet -AlwaysShared $noauth :1 17 | -------------------------------------------------------------------------------- /soulseek.conf: -------------------------------------------------------------------------------- 1 | # reverse proxy config for linuxserver's letsencrypt nginx container 2 | 3 | upstream soulseek { 4 | server soulseek-docker:6080; 5 | } 6 | 7 | server { 8 | server_name _; 9 | listen 80; 10 | return 301 https://$host$request_uri; 11 | } 12 | 13 | server { 14 | server_name _; 15 | listen 443 ssl; 16 | 17 | access_log /config/log/nginx/soulseek_access.log; 18 | error_log /config/log/nginx/soulseek_error.log; 19 | 20 | include /config/nginx/ssl.conf; 21 | 22 | client_max_body_size 0; 23 | 24 | location / { 25 | include /config/nginx/proxy.conf; 26 | proxy_pass http://soulseek/; 27 | } 28 | 29 | location /websockify { 30 | include /config/nginx/proxy.conf; 31 | proxy_set_header Upgrade $http_upgrade; 32 | proxy_set_header Connection "upgrade"; 33 | proxy_pass http://soulseek/; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 realies 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /ui.patch: -------------------------------------------------------------------------------- 1 | @@ -77,7 +77,23 @@ 2 | 3 |
4 | 5 | -

no
VNC

6 | + 7 | + 8 | + 10 | + 11 | + 12 | + 13 | + 14 | + 16 | + 17 | + 18 | + 19 | + 20 | + 22 | + 23 | 24 | 25 | /etc/machine-id && \ 9 | locale-gen en_US.UTF-8 && \ 10 | curl -fL# https://github.com/just-containers/s6-overlay/releases/latest/download/s6-overlay-noarch.tar.xz -o /tmp/s6-overlay-noarch.tar.xz && \ 11 | tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz && \ 12 | rm -rf /tmp/s6-overlay-noarch.tar.xz && \ 13 | curl -fL# https://github.com/just-containers/s6-overlay/releases/latest/download/s6-overlay-x86_64.tar.xz -o /tmp/s6-overlay-x86_64.tar.xz && \ 14 | tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz && \ 15 | rm -rf /tmp/s6-overlay-x86_64.tar.xz && \ 16 | mkdir /usr/share/novnc && \ 17 | curl -fL# https://github.com/novnc/noVNC/archive/master.tar.gz -o /tmp/novnc.tar.gz && \ 18 | tar -xf /tmp/novnc.tar.gz --strip-components=1 -C /usr/share/novnc && \ 19 | mkdir /usr/share/novnc/utils/websockify && \ 20 | curl -fL# https://github.com/novnc/websockify/archive/master.tar.gz -o /tmp/websockify.tar.gz && \ 21 | tar -xf /tmp/websockify.tar.gz --strip-components=1 -C /usr/share/novnc/utils/websockify && \ 22 | curl -fL# https://site-assets.fontawesome.com/releases/v6.0.0/svgs/solid/cloud-arrow-down.svg -o /usr/share/novnc/app/images/downloads.svg && \ 23 | curl -fL# https://site-assets.fontawesome.com/releases/v6.0.0/svgs/solid/folder-music.svg -o /usr/share/novnc/app/images/shared.svg && \ 24 | curl -fL# https://site-assets.fontawesome.com/releases/v6.0.0/svgs/solid/comments.svg -o /usr/share/novnc/app/images/logs.svg && \ 25 | bash -c 'sed -i "s/ Login. 26 | - Wait for a Soulseek settings file to appear in `/data/.SoulseekQt/1`, this is saved every 60 minutes by default but can be forced to be more freuquent from Options -> General. 27 | - Map both ports from your router to the machine hosting the Docker image, and from the outside of the Docker image to the server within it. See the [Soulseek FAQ](https://www.slsknet.org/news/faq-page#t10n606) for more details. 28 | 29 | 3. Launch the Docker container and map the required volumes (see [How to Launch](#how-to-launch) section below). 30 | 31 | 4. Access the Soulseek UI by opening a web browser and navigating to `http://docker-host-ip:6080` or `https://reverse-proxy`, depending on your configuration. 32 | 33 | ## Configuration 34 | 35 | The container supports the following configuration options: 36 | 37 | | Parameter | Description | 38 | | --------------- | ----------------------------------------------------------------------------- | 39 | | `PGID` | Group ID for the container user (optional, requires `PUID`, default: 1000) | 40 | | `PUID` | User ID for the container user (optional, requires `PGID`, default: 1000) | 41 | | `VNC_PORT` | Port for VNC server (optional, default: 5900) | 42 | | `NOVNC_PORT` | Port for noVNC web access (optional, default: 6080) | 43 | | `MODIFY_VOLUMES`| Modify ownership and permissions of mounted volumes (optional, default: true) | 44 | | `UMASK` | File permission mask for newly created files (optional, default: 022) | 45 | | `VNCPWD` | Password for the VNC connection (optional) | 46 | | `VNCPWD_FILE` | Password file for the VNC connection (optional, takes priority over `VNCPWD`) | 47 | | `TZ` | Timezone for the container (optional, e.g., Europe/Paris, America/Vancouver) | 48 | 49 | ## How to Launch 50 | 51 | ### Using Docker Compose 52 | 53 | ```yaml 54 | version: "3" 55 | services: 56 | soulseek: 57 | image: realies/soulseek 58 | container_name: soulseek 59 | restart: unless-stopped 60 | volumes: 61 | - /persistent/appdata:/data/.SoulseekQt 62 | - /persistent/downloads:/data/Soulseek Downloads 63 | - /persistent/logs:/data/Soulseek Chat Logs 64 | - /persistent/shared:/data/Soulseek Shared Folder 65 | environment: 66 | - PGID=1000 67 | - PUID=1000 68 | ports: 69 | - 6080:6080 70 | - 61122:61122 # example listening port, check Options -> Login 71 | - 61123:61123 # example obfuscated port, check Options -> Login 72 | ``` 73 | 74 | ### Using Docker CLI 75 | 76 | ```bash 77 | docker run -d --name soulseek --restart=unless-stopped \ 78 | -v "/persistent/appdata":"/data/.SoulseekQt" \ 79 | -v "/persistent/downloads":"/data/Soulseek Downloads" \ 80 | -v "/persistent/logs":"/data/Soulseek Chat Logs" \ 81 | -v "/persistent/shared":"/data/Soulseek Shared Folder" \ 82 | -e PGID=1000 \ 83 | -e PUID=1000 \ 84 | -p 6080:6080 \ 85 | -p 61122:61122 \ # example listening port, check Options -> Login 86 | -p 61123:61123 \ # example obfuscated port, check Options -> Login 87 | realies/soulseek 88 | ``` 89 | 90 | ### Using Docker on Synology DSM 91 | 92 | Port Configuration 93 | 94 | ![Synology Docker Port Configuration](docs/synology_docker_config_ports_screenshot.png) 95 | 96 | - Port 6080 is used by noVNC for accessing Soulseek from your local network. Only TCP type is needed. 97 | - Ports 61122 and 61123 are examples; open Soulseek to determine the exact ports to forward. Only TCP type is needed. 98 | - Configure these ports to forward from your router to the machine hosting the Docker image. See the Soulseek Port Forwarding Guide for more details. 99 | 100 | Volume Configuration 101 | 102 | ![Synology Docker Volume Configuration](docs/synology_docker_config_volumes_screenshot.png) 103 | 104 | - Mount the required directories for Soulseek data persistence. 105 | - The example mounts an extra directory `/music/FLAC` for sharing; mount the directory you want to share. 106 | --------------------------------------------------------------------------------