configs/server-dockers/docker-compose.yml
server-dockers/docker-compose.ymlRaw
1#version: '3.8'
2
3#
4# More info: https://arnaucube.com/media-setup/
5#
6#
7# Usage
8# -----
9# - All commands from inside the same directory where this file is placed.
10# - Replace the `/mnt/usb` to your custom location, usually an external hard
11# drive.
12#
13# Before running: mount the external hard drive!!
14# > sudo mount /dev/sda /mnt/usb
15#
16# Run:
17# > sudo docker compose up -d
18#
19# Stop:
20# > sudo docker compose stop
21#
22# Remove containers (since the volumes are mapped to local directories, they
23# will persist):
24# > sudo docker compose down
25#
26#
27# NOTE: the configurations is in the SSD disk, while the movies, shows, music are in the HHD
28#
29# Port of each service:
30# - jellyfin: 8096
31# - # emby: 8097
32# - wallabag: 8098
33# - slskd: 8099
34# - metube: 8100
35# - sonarr: 8101
36# - prowlarr: 8102
37# - bazarr: 8103
38# - radarr: 8104
39# - qui: 8105
40# - jellystat: 8106
41# - lingarr: 8107
42# - libretranslate: 8108
43# - lidarr: 8109
44# - swiparr: 8110
45# - qbittorrent: 8080
46# - homepage: 8000
47# - grafana: 3000
48
49services:
50 jellyfin:
51 image: jellyfin/jellyfin
52 container_name: jellyfin
53 ports:
54 - "8096:8096"
55 volumes:
56 - /home/beelink/configurations/jellyfin:/config
57 - /mnt/usb:/media
58 restart: unless-stopped
59 environment:
60 - JELLYFIN_PublishedServerUrl=https://jellyfin.myserver.com
61 devices:
62 - /dev/dri/renderD128:/dev/dri/renderD128 # hardware accelerated transcoding
63 group_add:
64 - "993" # obtained from `getent group render | cut -d: -f3`
65 networks:
66 - cloudflared_net
67
68 wallabag:
69 image: wallabag/wallabag
70 container_name: wallabag
71 ports:
72 - "8098:80"
73 volumes:
74 - /home/beelink/configurations/wallabag/data:/var/www/wallabag/data
75 - /home/beelink/configurations/wallabag/images:/var/www/wallabag/web/assets/images
76 environment:
77 - SYMFONY__ENV__DOMAIN_NAME=http://192.168.1.155:8098
78 restart: unless-stopped
79
80 slskd:
81 image: slskd/slskd
82 container_name: slskd
83 ports:
84 - "8099:5030"
85 - "50300:50300"
86 volumes:
87 - /home/beelink/configurations/slskd:/app
88 - /mnt/usb/audio/slskd-downloads:/downloads # isolate it in a subdir, since slskd removes arbitrary files on that dir
89 environment:
90 - SLSKD_REMOTE_CONFIGURATION=true
91 restart: unless-stopped
92
93 metube:
94 image: ghcr.io/alexta69/metube
95 container_name: metube
96 ports:
97 - "8100:8081"
98 volumes:
99 - /mnt/usb/audio/from-youtube:/downloads
100 restart: unless-stopped
101
102 sonarr:
103 image: lscr.io/linuxserver/sonarr:latest
104 container_name: sonarr
105 environment:
106 - PUID=1000
107 - PGID=1000
108 - TZ=Europe/Amsterdam
109 volumes:
110 - /home/beelink/configurations/sonarr:/config
111 - /mnt/usb/torrent-downloads:/downloads
112 - /mnt/usb/shows:/data/shows
113 ports:
114 - 8101:8989
115 restart: unless-stopped
116
117 radarr:
118 image: lscr.io/linuxserver/radarr:latest
119 container_name: radarr
120 environment:
121 - PUID=1000
122 - PGID=1000
123 - TZ=Europe/Amsterdam
124 volumes:
125 - /home/beelink/configurations/radarr:/config
126 - /mnt/usb/torrent-downloads:/downloads
127 - /mnt/usb/movies:/movies
128 ports:
129 - 8104:7878
130 restart: unless-stopped
131
132 lidarr:
133 image: lscr.io/linuxserver/lidarr:latest
134 container_name: lidarr
135 environment:
136 - PUID=1000
137 - PGID=1000
138 - TZ=Europe/Amsterdam
139 volumes:
140 - /home/beelink/configurations/lidarr/config:/config
141 - /mnt/usb/audio:/music
142 - /mnt/usb/torrent-downloads:/downloads
143 ports:
144 - 8109:8686
145 restart: unless-stopped
146
147 bazarr:
148 image: lscr.io/linuxserver/bazarr:latest
149 container_name: bazarr
150 environment:
151 - PUID=1000
152 - PGID=1000
153 - TZ=Europe/Amsterdam
154 volumes:
155 - /home/beelink/configurations/bazarr:/config
156 - /mnt/usb/shows:/data/shows
157 - /mnt/usb/movies:/movies
158 ports:
159 - 8103:6767
160 restart: unless-stopped
161
162 lingarr:
163 image: ghcr.io/lingarr-translate/lingarr:latest # or lingarr/lingarr:latest
164 container_name: lingarr
165 restart: unless-stopped
166 environment:
167 - ASPNETCORE_URLS=http://+:9876
168 - DB_CONNECTION=mysql
169 - DB_HOST=lingarr-db
170 - DB_PORT=3306
171 - DB_DATABASE=lingarr
172 - DB_USERNAME=lingarr
173 - DB_PASSWORD=YOUR_DB_PASSW_HERE
174 ports:
175 - "8107:9876"
176 volumes:
177 - /mnt/usb/movies:/movies
178 - /mnt/usb/shows:/tv
179 - /home/beelink/configurations/lingarr:/app/config
180 # networks:
181 # - lingarr
182 depends_on:
183 lingarr-db:
184 condition: service_healthy
185
186 lingarr-db:
187 image: mariadb:latest
188 container_name: lingarr-db
189 restart: unless-stopped
190 environment:
191 - MYSQL_DATABASE=lingarr
192 - MYSQL_USER=lingarr
193 - MYSQL_PASSWORD=YOUR_DB_PASSW_HERE
194 - MYSQL_ROOT_PASSWORD=YOUR_DB_PASSW_HERE
195 volumes:
196 - /home/beelink/configurations/lingarr:/var/lib/mysql
197 # networks:
198 # - lingarr
199 healthcheck:
200 test: "mariadb $$MYSQL_DATABASE -u$$MYSQL_USER -p$$MYSQL_PASSWORD -e 'SELECT 1;'"
201 interval: 10s
202 timeout: 5s
203 retries: 5
204
205 LibreTranslate:
206 container_name: LibreTranslate
207 image: libretranslate/libretranslate:latest
208 restart: unless-stopped
209 environment:
210 - LT_LOAD_ONLY=en,es,ca
211 - LT_WORKERS=2
212 user: "1000:1000"
213 ports:
214 - 8108:5000
215 volumes:
216 # NOTE: on first run, needs:
217 # rm -rf ./libretranslate
218 # mkdir ./libretranslate/.config
219 # sudo chown -R 1000:1000 ./libretranslate/.config
220 # sudo chmod -R 755 ./libretranslate/.config
221 #
222 - /home/beelink/configurations/libretranslate:/home/libretranslate/.local
223 - /home/beelink/configurations/libretranslate/.config:/home/libretranslate/.config
224 healthcheck:
225 test: ["CMD-SHELL", "./venv/bin/python scripts/healthcheck.py"]
226
227 prowlarr:
228 container_name: prowlarr
229 image: ghcr.io/hotio/prowlarr
230 ports:
231 - "8102:9696"
232 environment:
233 - PUID=1000
234 - PGID=1000
235 - UMASK=002
236 - TZ=Europe/Amsterdam
237 volumes:
238 - /home/beelink/configurations/prowlarr:/config
239 restart: unless-stopped
240
241 qbittorrent-nox:
242 image: qbittorrentofficial/qbittorrent-nox:latest
243 container_name: qbittorrent-nox
244 ports:
245 - "8080:8080"
246 - "6881:6881/tcp" # Torrent listening port
247 - "6881:6881/udp"
248 volumes:
249 - /home/beelink/configurations/qbittorrent:/config
250 - /mnt/usb/torrent-downloads:/downloads
251 environment:
252 - QBT_LEGAL_NOTICE=confirm
253 - WEBUI_PORT=8080
254 restart: unless-stopped
255
256 qui:
257 image: ghcr.io/autobrr/qui:latest
258 container_name: qui
259 restart: unless-stopped
260 ports:
261 - "8105:7476"
262 volumes:
263 - ./qui:/config
264
265 jellystat-db:
266 image: 'postgres:15.2'
267 shm_size: 1gb
268 container_name: jellystat-db
269 restart: unless-stopped
270 environment:
271 POSTGRES_USER: postgres
272 POSTGRES_PASSWORD: YOUR_DB_PASSW_HERE
273 volumes:
274 - '/home/beelink/configurations/postgres:/var/lib/postgresql/data'
275 jellystat:
276 image: 'cyfershepard/jellystat:latest'
277 container_name: jellystat
278 restart: unless-stopped
279 environment:
280 POSTGRES_USER: postgres
281 POSTGRES_PASSWORD: YOUR_DB_PASSW_HERE
282 POSTGRES_IP: jellystat-db
283 POSTGRES_PORT: 5432
284 JWT_SECRET: YOUR_JWT_SECRET_HERE
285 TZ: Europe/Madrid
286 MINIMUM_SECONDS_TO_INCLUDE_PLAYBACK: 300
287 volumes:
288 - '/home/beelink/configurations/jellystat-backup-data:/app/backend/backup-data'
289 ports:
290 - '8106:3000'
291 depends_on:
292 - jellystat-db
293
294 swiparr:
295 image: ghcr.io/m3sserstudi0s/swiparr:latest
296 container_name: swiparr
297 restart: unless-stopped
298 environment:
299 - PROVIDER=jellyfin
300 - JELLYFIN_URL=http://192.168.1.155:8096
301 - JELLYFIN_PUBLIC_URL=https://jellyfin.myserver.com
302 volumes:
303 - /home/beelink/configurations/swiparr:/app/data
304 ports:
305 - 8110:4321
306
307 homepage:
308 image: ghcr.io/gethomepage/homepage:latest
309 container_name: homepage
310 environment:
311 HOMEPAGE_ALLOWED_HOSTS: 192.168.1.155:8000 # required, may need port. See gethomepage.dev/installation/#homepage_allowed_hosts
312 sysctls:
313 - net.ipv6.conf.all.disable_ipv6=1
314 ports:
315 - 8000:3000
316 volumes:
317 - /home/beelink/configurations/homepage:/app/config
318 - /mnt/usb:/mnt/usb:ro
319 restart: unless-stopped
320
321 # metrics related:
322 prometheus:
323 image: prom/prometheus:latest
324 container_name: prometheus
325 ports:
326 - "9090:9090"
327 volumes:
328 - ./prometheus.yml:/etc/prometheus/prometheus.yml
329 - prometheus_data:/prometheus
330 networks:
331 - monitoring
332 restart: unless-stopped
333
334 node-exporter:
335 image: prom/node-exporter:latest
336 container_name: node-exporter
337 ports:
338 - "9100:9100"
339 volumes:
340 - /:/host:ro
341 networks:
342 - monitoring
343 restart: unless-stopped
344
345 grafana:
346 image: grafana/grafana:latest
347 container_name: grafana
348 ports:
349 - "3000:3000"
350 environment:
351 - GF_SECURITY_ADMIN_PASSWORD=YOURPASSWORDHERE
352 volumes:
353 - grafana_data:/var/lib/grafana
354 networks:
355 - monitoring
356 depends_on:
357 - prometheus
358 restart: unless-stopped
359
360 cloudflared:
361 image: cloudflare/cloudflared:latest
362 container_name: cloudflared
363 restart: unless-stopped
364 command: tunnel run
365 volumes:
366 - /home/beelink/server-dockers/cloudflared:/etc/cloudflared
367 - /home/beelink/server-dockers/cloudflared/config:/home/nonroot/.cloudflared
368 networks:
369 - cloudflared_net
370 extra_hosts:
371 - "host.docker.internal:host-gateway"
372
373networks:
374 cloudflared_net:
375 driver: bridge
376 monitoring:
377 driver: bridge
378 # lingarr:
379 # external: true
380
381volumes:
382 prometheus_data:
383 driver: local
384 grafana_data:
385 driver: local