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