Homelab - dont rely on services where YOU are the product @ Cédric Walter | Friday, Dec 22, 2023 | 12 minutes read | 2477 Words | Update at Saturday, Nov 23, 2024

A homelab, short for home laboratory, refers to a setup where individuals or hobbyists create a small-scale computing or networking environment in their homes for various purposes. The goal is typically to gain hands-on experience, test and learn about different technologies, and build skills related to IT, networking, server administration, and more. Homelabs can vary widely in complexity and purpose, depending on the interests and goals of the individual setting them up!

While running a homelab can be a rewarding and educational experience, there are potential risks and challenges associated with it. Here are some considerations:

Security Risks

  • Exposed Services: If not properly configured, exposed services in your homelab can become potential entry points for attackers. It’s crucial to secure and properly configure your services, especially if your homelab is connected to the internet.
  • Data Loss: In the event of hardware failure, accidental deletion, or other issues, there is a risk of data loss. Regular backups are essential to mitigate this risk. Attention RAID is NOT a backup (use unlimited backblaze instead)

Resource Utilization

  • Power Consumption: Running multiple servers and networking equipment can increase your power consumption, leading to higher electricity bills. Consider the energy efficiency of your homelab components.
  • Resource Constraints: Depending on your hardware, you might encounter resource constraints. It’s essential to balance the number of virtual machines and services with the capabilities of your hardware.

Learning Curve

  • Complexity: Managing a homelab can be complex, especially if you are experimenting with advanced configurations or technologies. Be prepared to invest time in learning and troubleshooting.
  • Maintenance: Regular maintenance is required to keep your homelab up and running. Updates, security patches, and software upgrades need to be managed.

Internet Service Provider (ISP) Limitations

  • Bandwidth: Some ISPs may have limitations on upload and download speeds, which can affect the performance of services hosted in your homelab, especially if you plan to make them accessible from the internet.
  • Legal and Ethical Considerations: Compliance: Be aware of legal and regulatory requirements. Running certain services may be subject to laws and regulations. Ensure compliance with terms of service and licenses for software you use.
  • Responsible Use: Understand and respect the terms of use for the services you run. Unauthorized use or abuse of resources could lead to legal consequences.

Financial Investment

  • Costs: While setting up a basic homelab can be done relatively inexpensively, more advanced configurations or equipment can incur costs. Consider your budget and financial commitments.

Noise and Physical Space

  • Noise: Homelab equipment can generate noise, especially if you have servers or networking gear. Consider the physical location of your homelab to minimize disruption.
  • Space: Dedicated space may be needed for your homelab equipment. Ensure proper ventilation to prevent overheating.
  • I personally only use SSD for their speed, and they are noiseless!

Isolation from Production Systems

  • Isolation: Keep your homelab isolated from critical production systems to prevent any accidental impact on live services.

Notes

You need to be confortable with terminal and docker, if notm, I recommend you to use a all in one server like:

  • CasaOS generic with a lot of apps
  • umbrelOS : a lot of apps, but more focus on crypto Apps can be installed using an app store and you wont have anything to tinker with! (but you lose on flexibility)

I use Bash, but you could also put everything in a docker compose, or use portainer.

Jellyfin is good enough for my needs, I do not install Kavita, AudiobookShelf, Calibre-web anymore.

openspeedtest

version: '3.3'
services:
    speedtest:
        restart: unless-stopped
        container_name: openspeedtest
        ports:
            - '21000:3000'
            - '21001:3001'
        image: openspeedtest/latest

Run first in a terminal

We set some variables first, then you can proceed and install any software


# uncomment for MacOS
# export DOCKER_CONF=/Users/yourusername/Docker

# uncomment for raspberry pi
# export DOCKER_CONF=/home/pi/docker

# uncomment for ubuntu
export DOCKER_CONF=/root/docker

TIMEZONE="Europe/Zurich"
RESTART_POLICY=unless-stopped

# https://docs.linuxserver.io/general/understanding-puid-and-pgid/
MY_PUID=1000
MY_PGID=1000

Jellyfin

The king of media center

INSTALL_JELLYFIN=true
JELLYFIN_MEDIA=/media/pi

if $INSTALL_JELLYFIN; then
    mkdir -p $DOCKER_CONF/jellyfin/config
    mkdir -p $DOCKER_CONF/jellyfin/cache

    docker run -d  \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -v $DOCKER_CONF/jellyfin/config:/config  \
    -v $DOCKER_CONF/jellyfin/cache:/cache  \
    -v $JELLYFIN_MEDIA:/media  \
    --net=host \
    --restart $RESTART_POLICY \
    jellyfin/jellyfin:latest
else
   echo "INSTALL_JELLYFIN is false."
fi

AdguardHome

read also https://github.com/AdguardTeam/AdguardHome/wiki/Encryption

INSTALL_ADGUARDHOME=true
ADGUARDHOME_PORT=3000

if $INSTALL_ADGUARDHOME; then
    mkdir -p $DOCKER_CONF/adguardhome/config
    mkdir -p $DOCKER_CONF/adguardhome/workdir
    docker pull adguard/adguardhome
    docker kill adguardhome
    docker rm adguardhome

    docker run -d --name adguardhome\
    -e TZ=$TIMEZONE \
    --restart $RESTART_POLICY \
    --network host  \
    -v $DOCKER_CONF/adguardhome/workdir:/opt/adguardhome/work\
    -v $DOCKER_CONF/adguardhome/config:/opt/adguardhome/conf\
    -p 53:53/tcp -p 53:53/udp\
    -p 67:67/udp -p 68:68/udp\
    -p 9080:80/tcp -p 9443:443/tcp -p 9443:443/udp -p $ADGUARDHOME_PORT:3000/tcp\
    -p 853:853/tcp
    -p 784:784/udp -p 853:853/udp -p 8853:8853/udp\
    -p 5443:5443/tcp -p 5443:5443/udp\
    -d adguard/adguardhome

    echo "Access Adguardhome $HOSTNAME:$ADGUARDHOME_PORT"
else
   echo "INSTALL_ADGUARDHOME is false."
fi
INSTALL_SABNZBD=true
SABNZBD_PORT=8080
SABNZBD_DOWNLOADS=/sabnzbd
READARR_INCOMPLETE_DOWNLOADS=/sabnzbd

if $INSTALL_SABNZBD; then
    mkdir -p $DOCKER_CONF/sabnzbd/config
    mkdir -p $SABNZBD_DOWNLOADS
    mkdir -p $READARR_INCOMPLETE_DOWNLOADS
    docker kill sabnzbd
    docker rm sabnzbd
    docker run -d \
    --name=sabnzbd \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $SABNZBD_PORT:8080 \
    -v $DOCKER_CONF/sabnzbd/config:/config \
    -v $SABNZBD_DOWNLOADS:/downloads `#optional` \
    -v $READARR_INCOMPLETE_DOWNLOADS:/incomplete-downloads `#optional` \
    --restart $RESTART_POLICY \
    lscr.io/linuxserver/sabnzbd:latest

    echo "Access Readarr $HOSTNAME:$SABNZBD_PORT/sabnzbd/"
else
   echo "INSTALL_SABNZBD is false."
fi

Readarr

https://readarr.com Readarr is a ebook collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new books from your favorite authors and will interface with clients and indexers to grab, sort, and rename them.

INSTALL_READARR=true
READARR_PORT=8787
READARR_BOOKS=/readarr
READARR_DOWNLOADS=/readarr

if $INSTALL_READARR; then
    mkdir -p $READARR_DOWNLOADS
    mkdir -p $READARR_BOOKS
    mkdir -p $DOCKER_CONF/readarr/data
    docker kill readarr
    docker rm readarr
    docker run -d \
    --name=readarr \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $READARR_PORT:8787 \
    -v $DOCKER_CONF/readarr/data:/config \
    -v $READARR_BOOKS:/books `#optional` \
    -v $READARR_DOWNLOADS:/downloads `#optional` \
    --restart $RESTART_POLICY \
    lscr.io/linuxserver/readarr:nightly

    echo "Access Readarr $HOSTNAME:$READARR_PORT"
else
   echo "INSTALL_READARR is false."
fi

MovieMatch

https://github.com/LukeChannings/moviematch MovieMatch connects to your Plex server and gets a list of movies (from any libraries marked as a movie library). As many people as you want connect to your MovieMatch server and get a list of shuffled movies. Swipe right to 👍, swipe left to 👎. If two (or more) people swipe right on the same movie, it’ll show up in everyone’s matches. The movies that the most people swiped right on will show up first.

INSTALL_MOVIEMATCH=true
MOVIEMATCH_PORT=8000

if $INSTALL_MOVIEMATCH; then
    docker kill moviematch
    docker rm moviematch
    docker run -d -it --name=moviematch \
    -e PLEX_URL=$PLEX_URL \
    -e PLEX_TOKEN=$PLEX_TOKEN \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $MOVIEMATCH_PORT:8000 --pull always \
    --restart $RESTART_POLICY \
    lukechannings/moviematch:latest

    echo "Access MovieMatch $HOSTNAME:$MOVIEMATCH_PORT"
else
   echo "INSTALL_MOVIEMATCH is false."
fi

Kavita

Kavita is a full-fledged, fast, cross-platform, & open-source manga, comic, and book server. Built from the ground up with a focus on manga

INSTALL_KAVITA=true
KAVITA_PORT=5471
KAVITA_COMICS=/comics

if $INSTALL_KAVITA; then
    mkdir -p $DOCKER_CONF/kavita
    docker kill kavita
    docker rm kavita

    docker run -d --name=kavita \
    -p $KAVITA_PORT:5000 \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -v $DOCKER_CONF/kavita:/kavita/config \
    -v $KAVITA_COMICS:/manga \
    --restart $RESTART_POLICY \
    kizaing/kavita

    echo "TODO Add library by adding folder mapped /manga"
    echo "Access Kavita $HOSTNAME:$KAVITA_PORT"
else
   echo "INSTALL_KAVITA is false."
fi

Overseerr

Overseerr is a request management and media discovery tool built to work with your existing Plex ecosystem. The best way to discover media. Overseerr helps you find media you want to watch. With inline recommendations and suggestions, you will find yourself deeper and deeper in a rabbit hole of content you never knew you just had to have. https://overseerr.dev/

INSTALL_OVERSEER=true
OVERSEER_PORT=5055

if $INSTALL_OVERSEER; then
    mkdir -p $DOCKER_CONF/overseerr/config
    docker kill overseers
    docker rm  overseerr
    docker run -d \
    --name overseerr \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -e LOG_LEVEL=debug \
    -p $OVERSEER_PORT:5055 \
    -v $DOCKER_CONF/config:/app/config \
    --restart $RESTART_POLICY \
    sctx/overseerr

    echo "Access Overseerr $HOSTNAME:$OVERSEER_PORT"
else
   echo "INSTALL_OVERSEER is false."
fi

Apple timemachine

https://hub.docker.com/r/mbentley/timemachine

INSTALL_TIMEMACHINE=true
TIMEMACHINE_VOLUME=/timemachine
TIMEMACHINE_PASSWORD=xxxxxxxx

if $INSTALL_TIMEMACHINE; then
    docker run -d --restart=always \
    --name timemachine \
    --net=host \
    -e ADVERTISED_HOSTNAME="" \
    -e CUSTOM_SMB_CONF="false" \
    -e CUSTOM_USER="false" \
    -e DEBUG_LEVEL="1" \
    -e MIMIC_MODEL="TimeCapsule8,119" \
    -e EXTERNAL_CONF="" \
    -e HIDE_SHARES="no" \
    -e TM_USERNAME="timemachine" \
    -e TM_GROUPNAME="timemachine" \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e PASSWORD="$TIMEMACHINE_PASSWORD" \
    -e SET_PERMISSIONS="false" \
    -e SHARE_NAME="TimeMachine" \
    -e SMB_INHERIT_PERMISSIONS="no" \
    -e SMB_NFS_ACES="no" \
    -e SMB_METADATA="stream" \
    -e SMB_PORT="445" \
    -e SMB_VFS_OBJECTS="acl_xattr fruit streams_xattr" \
    -e VOLUME_SIZE_LIMIT="0" \
    -e WORKGROUP="WORKGROUP" \
    -e TZ=$TIMEZONE \
    -v $TIMEMACHINE_VOLUME:/opt/timemachine \
    -v timemachine-var-lib-samba:/var/lib/samba \
    -v timemachine-var-cache-samba:/var/cache/samba \
    -v timemachine-run-samba:/run/samba \
    mbentley/timemachine:smb
else
   echo "INSTALL_TIMEMACHINE is false."
fi

Prowlarr

The Ultimate Indexer Manager https://prowlarr.com

INSTALL_PROWLARR=true
PROWLARR_PORT=9696

if $INSTALL_PROWLARR; then
    mkdir -p $DOCKER_CONF/prowlarr
    docker run -d \
    --name=prowlarr \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $PROWLARR_PORT:9696 \
    -v $DOCKER_CONF/prowlarr:/config \
    --restart $RESTART_POLICY \
    lscr.io/linuxserver/prowlarr:latest

    echo "Access prowlarr $HOSTNAME:$PROWLARR_PORT"
else
   echo "INSTALL_PROWLARR is false."
fi

RdtClient

RdtClient emulates the qBittorrent web protocol and allow applications to use those APIs. This way you can use Sonarr and Radarr to download directly from torrent without being tracked. https://github.com/rogerfar/rdt-client

INSTALL_RTDCLIENT=true
RTDCLIENT_PORT=6500
RTDCLIENT_DOWNLOAD_FOLDER=/Downloads

if $INSTALL_RTDCLIENT; then
    mkdir -p $DOCKER_CONF/rdtclient/db
    mkdir -p $RTDCLIENT_DOWNLOAD_FOLDER
    docker kill rdtclient
    docker rm rdtclient
    docker run --pull=always -d \
            --volume $RTDCLIENT_DOWNLOAD_FOLDER:/data/downloads \
            --volume $DOCKER_CONF/rdtclient/db/:/data/db \
            --log-driver json-file \
            --log-opt max-size=10m \
            -e PUID=$MY_PUID -e PGID=$MY_PGID \
            -e TZ=$TIMEZONE \
            -p $RTDCLIENT_PORT:6500 \
            --name rdtclient \
            --restart $RESTART_POLICY \
            rogerfar/rdtclient:latest

    echo "http://$HOSTNAME:$RTDCLIENT_PORT/setup"
    echo "Configure rdtclient to use your premium real debrid account"
    echo "Create login and password"
    echo "Connect to real debrid, api key at https://real-debrid.com/apitoken"
    echo "Access RdtClient $HOSTNAME:$RTDCLIENT_PORT"
else
   echo "INSTALL_RTDCLIENT is false."
fi

Portainer

Containers are the way the world builds modern software applications, and Portainer is the way the world manages containers. With an intuitive UI, backed by …

INSTALL_PORTAINER=true
PORTAINER_PORT=9100
PORTAINER_AGENT=9001

if $INSTALL_PORTAINER; then
    mkdir -p $DOCKER_CONF/portainer
    docker kill portainer
    docker rm portainer
    docker run -d --name=portainer \
    -p 8100:8000 \
    -p $PORTAINER_PORT:9000 \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $DOCKER_CONF/portainer:/data \
    --restart=always \
    portainer/portainer

    docker run -d \
    -p $PORTAINER_AGENT:9001 \
    --name portainer_agent \
    --restart=always \
    -e TZ=$TIMEZONE \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v /var/lib/docker/volumes:/var/lib/docker/volumes \
    portainer/agent:2.16.2

    echo "Access portainer $HOSTNAME:$PORTAINER_PORT"
else
   echo "INSTALL_PORTAINER is false."
fi

Radarr

Radarr is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent. The project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.

INSTALL_RADARR=true
SONARR_RADARR=7878
RADARR_DOWNLOADS=/radarr

if $INSTALL_SONARR; then
    mkdir -p $DOCKER_CONF/sonarr
    docker kill sonarr && docker rm sonarr
    docker run -d \
    --name=sonarr \
    -e TZ=$TIMEZONE \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -p $SONARR_PORT:8989 \
    -v $DOCKER_CONF/sonarr:/config \
    --restart $RESTART_POLICY \
    lscr.io/linuxserver/sonarr:latest

    echo "Access Sonarr $HOSTNAME:$PORTAINER_PORT"
    echo "TODO Copy API key  for Overseer"
    echo "TODO Create Root folders for Overseer"
    echo "TODO Connect Sonarr to overseer"
    echo "See Connect Sonarr/Radarr to rdtclient"
else
   echo "INSTALL_SONARR is false."
fi

Sonarr

is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them.It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. https://github.com/linuxserver/docker-sonarr/pkgs/container/sonarr

INSTALL_SONARR=true
SONARR_PORT=8989

if $INSTALL_RADARR; then
    mkdir -p $DOCKER_CONF/radarr
    docker kill radarr && docker rm radarr
    docker run -d --name=radarr \
    -p $RADARR_PORT:7878 \
    -e TZ=$TIMEZONE \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -v $DOCKER_CONF/radarr:/config \
    -v $RADARR_DOWNLOADS:/shares \
    --restart $RESTART_POLICY \
    ghcr.io/linuxserver/radarr

    echo "Access Radarr $HOSTNAME:$RADARR_PORT"
    echo "TODO Connect Radarr to overseer"
    # See Connect Sonarr/Radarr to rdtclient
    # https://rarbg.to/rssdd.php?category=2;23;24;25;26
else
   echo "INSTALL_RADARR is false."
fi

Lidarr

https://lidarr.audio

INSTALL_LIDARR=true
LIDARR_PORT=8686
LIDARR_MONITORED_FOLDER=/music
LIDARR_DOWNLOADS_FOLDER=/Downloads

if $INSTALL_LIDARR; then
    mkdir -p $DOCKER_CONF/lidarr
    docker kill lidarr && docker rm lidarr
    docker run -d \
    --name=lidarr \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $LIDARR_PORT:8686 \
    -v $DOCKER_CONF/lidarr/config:/config \
    -v $LIDARR_MONITORED_FOLDER:/music `#optional` \
    -v $LIDARR_DOWNLOADS_FOLDER:/downloads `#optional` \
    --restart $RESTART_POLICY \
    lscr.io/linuxserver/lidarr:latest

    echo "Access Lidarr $HOSTNAME:$LIDARR_PORT"
    echo "TODO Connect Lidarr to overseer"
    # See Connect Sonarr/Radarr to rdtclient
    # https://rarbg.to/rssdd.php?category=2;23;24;25;26
else
   echo "INSTALL_LIDARR is false."
fi

Tautulli

https://hub.docker.com/r/tautulli/tautulli https://tautulli.com/#download

INSTALL_TAUTULLI=true
TAUTULLI_PORT=8181

if $INSTALL_TAUTULLI; then
    mkdir -p $DOCKER_CONF/tautulli
    docker run -d \
    --name=tautulli \
    --restart $RESTART_POLICY \
    -v $DOCKER_CONF/tautulli:/config \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -p $TAUTULLI_PORT:8181 \
    ghcr.io/tautulli/tautulli
    echo "Access tautulli $HOSTNAME:$TAUTULLI_PORT"
else
   echo "INSTALL_TAUTULLI is false."
fi

JDownloader

JDownloader is a download manager, written in Java, which allows automatic download of groups of files from one-click hosting sites.

INSTALL_JDOWN=true
JDOWN_PORT=5800
JDOWN_DOWNLOAD_FOLDER=/Downloads

if $INSTALL_JDOWN; then
    mkdir -p $DOCKER_CONF/config
    mkdir -p $JDOWN_DOWNLOAD_FOLDER
    docker kill jdownloader2
    docker rm jdownloader2
    docker run -d --name=jdownloader2 \
    -p 3129:3129 \
    -p $JDOWN_PORT:5800 \
    -p 5900:5900 \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -v $DOCKER_CONF/jdownloader2/config:/config \
    -v $JDOWN_DOWNLOAD_FOLDER:/output \
    --restart $RESTART_POLICY \
    jlesage/jdownloader-2

    echo "Access Jdownloader $HOSTNAME:$JDOWN_PORT"
else
   echo "INSTALL_JDOWN is false."
fi

Homarr

Homarr simplify the management of your server with Homarr - a sleek, modern dashboard that puts all of your apps and services at your fingertips.

INSTALL_HOMARR=true
HOMARR_PWD=xxxxxxx
HOMARR_PORT=4000

if $INSTALL_HOMARR; then
    mkdir -p $DOCKER_CONF/homarr
    mkdir -p $DOCKER_CONF/homarr/icons

    docker kill homarr && docker rm homarr
    docker run -d --name=homarr \
        -p $HOMARR_PORT:7575 \
        -v $DOCKER_CONF/homarr:/app/data/configs \
        -v $DOCKER_CONF/homarr/icons:/app/public/icons \
        -e PASSWORD=$HOMARR_PWD \
        -e PUID=$MY_PUID -e PGID=$MY_PGID \
        -e TZ=$TIMEZONE \
        --restart $RESTART_POLICY \
    ghcr.io/ajnart/homarr

    echo "Access homarr $HOSTNAME:$HOMARR_PORT"
else
   echo "INSTALL_HOMARR is false."
fi

Photoprism

INSTALL_PHOTOPRISM=true
PHOTOPRISM_PWD=xxxxxxxxx
PHOTOPRISM_STORAGE=/Pictures
PHOTOPRISM_PORT=2342

if $INSTALL_PHOTOPRISM; then
    mkdir -p $DOCKER_CONF/photoprism
    docker kill photoprism
    docker rm photoprism

    docker run -d --name=photoprism \
    -p $PHOTOPRISM_PORT:2342 \
    -e TZ=$TIMEZONE \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e PHOTOPRISM_UPLOAD_NSFW=true \
    -e PHOTOPRISM_ADMIN_PASSWORD=$PHOTOPRISM_PWD \
    -e PHOTOPRISM_ORIGINALS_LIMIT=-1 \
    -v $DOCKER_CONF/photoprism:/photoprism/storage \
    -v $PHOTOPRISM_STORAGE:/photoprism/originals \
    --restart $RESTART_POLICY \
    photoprism/photoprism
else
   echo "INSTALL_PHOTOPRISM is false."
fi

Audiobookshelf

Audiobookshelf is a free and open source audiobook and podcast manager.

INSTALL_AUDIOBOOKSHELF=true
AUDIOBOOKSHELF_PORT=13378
AUDIOBOOKSHELF_MEDIA=/audiobookshelf/

if $INSTALL_AUDIOBOOKSHELF; then
    docker pull ghcr.io/advplyr/audiobookshelf
    mkdir -p $DOCKER_CONF/audiobookshelf/config

    mkdir -p $AUDIOBOOKSHELF_MEDIA/metadata
    mkdir -p $AUDIOBOOKSHELF_MEDIA/audiobooks
    mkdir -p $AUDIOBOOKSHELF_MEDIA/podcasts

    docker kill audiobookshelf
    docker remove audiobookshelf

    docker run -d \
    -p $AUDIOBOOKSHELF_PORT:80 \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -e TZ=$TIMEZONE \
    -v $DOCKER_CONF/audiobookshelf/config:/config \
    -v $AUDIOBOOKSHELF_MEDIA/metadata:/metadata \
    -v $AUDIOBOOKSHELF_MEDIA/audiobooks:/audiobooks \
    -v $AUDIOBOOKSHELF_MEDIA/podcasts:/podcasts \
    --name audiobookshelf \
    --restart $RESTART_POLICY \
    --rm ghcr.io/advplyr/audiobookshelf

    echo " ${GREEN}INFO${NC} Access audiobookshelf $HOSTNAME:$AUDIOBOOKSHELF_PORT"
else
   echo "INSTALL_AUDIOBOOKSHELF is false."
fi

Calibreweb

Calibre-Web is a web app providing a clean interface for browsing, reading and downloading eBooks using a valid Calibre database.

# Default login initial is admin/admin123
INSTALL_CALIBRE_WEB=true
CALIBRE_WEB_PORT=8083
CALIBRE_WEB_FOLDER=/calibreweb

if $INSTALL_CALIBRE_WEB; then
    mkdir -p $DOCKER_CONF/calibreweb
    mkdir -p $CALIBRE_WEB_FOLDER
    docker kill calibre-web
    docker remove calibre-web

    docker run -d --name=calibre-web \
    -p $CALIBRE_WEB_PORT:8083 \
    -e TZ=$TIMEZONE \
    -e DOCKER_MODS=linuxserver/mods:universal-calibre \
    -e OAUTHLIB_RELAX_TOKEN_SCOPE=1 \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -v $DOCKER_CONF/calibreweb:/config \
    -v $CALIBRE_WEB_FOLDER:/books \
    --restart $RESTART_POLICY \
    ghcr.io/linuxserver/calibre-web

    echo "${GREEN}INFO${NC} Access calibre-web $HOSTNAME:$CALIBRE_WEB_PORT Login initial is admin pwd: admin123"
    echo "${GREEN}INFO${NC} use tireader with http://$HOSTNAME:$CALIBRE_WEB_PORT/opds?auth=username:password"
else
   echo "INSTALL_CALIBRE_WEB is false."
fi

Jellyfin

    mkdir -p $DOCKER_CONF/jellyfin/config
    mkdir -p $DOCKER_CONF/jellyfin/cache

    docker run -d  \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    -v $DOCKER_CONF/jellyfin/config:/config  \
    -v $DOCKER_CONF/jellyfin/cache:/cache  \
    -v $JELLYFIN_MEDIA:/media  \
    --net=host \
    --restart $RESTART_POLICY \
    jellyfin/jellyfin:latest

Watchtower

** Attention it update images and can breal sometimes services, run daily

With watchtower you can update the running version of your containerized app simply by pushing a new image to the Docker Hub or your own image registry.

docker run --detach \
    --name watchtower \
    -e TZ=$TIMEZONE \
    -e PUID=$MY_PUID -e PGID=$MY_PGID \
    --restart $RESTART_POLICY \
    --volume /var/run/docker.sock:/var/run/docker.sock \
    containrrr/watchtower

Support me

Buy me a coffee

Related content

Dynamic IP at home, no problem with ddclient and Cloudflare

Dynamic IP at home, no problem with ddclient and Cloudflare

Thursday, Feb 29, 2024

ddclient is an open-source Perl-based client used to update dynamic DNS entries for various DDNS service providers. It supports a wide range of protocols, including DynDNS, No-IP, DuckDNS, Cloudflare, and many others, making it a flexible choice for users with diverse needs.
3 minutes read
Building a Plex Media Server on Raspberry Pi 4: Your Ultimate DIY Guide

Building a Plex Media Server on Raspberry Pi 4: Your Ultimate DIY Guide

Monday, Aug 28, 2023

In the era of digital media consumption, having a centralized hub to manage and stream your media content has become increasingly important. Enter the Plex Media Server—an incredibly versatile platform that allows you to organize, access, and enjoy your movies, TV shows, music, and photos from any device, anywhere. And what ’s even better? You can set up your very own Plex Media Server using a Raspberry Pi 4, a budget-friendly and energy-efficient solution that ’s perfect for DIY enthusiasts. In this guide, we ’ll walk you through the steps to create your very own Plex server on a Raspberry Pi 4.
3 minutes read

© 1997 - 2024 Cédric Walter blog

Powered by Open Sources technologies

avatar

Cédric WalterA true selfless act always sparks another

6s A1 Acedeck Achat Acide-Hyaluronique Acma Adaptability Advocate-for-Change Ai Airplane Algorand Alice-Hlidkova-Author Alpine Alps Alternative Altruism-vs-Commercialization Antique-Scooters Antiseptic-Rinse Apache Apple Apps-De-Messagerie Arcade Arcade-Gaming Armattan Art Artemis Artemis-Viper Artistic-Expression Atlassian Authenticity-in-Writing Authenticity-Matters Avis Bag Bambulab Bash Bean Bennu Bernardet Bestwishes Betaflight Betruger Beware Bien-Vivre Bien-Être Bien-Être-Physique Bike Bio Bioethics Bitcoin Blessures-Sportives Blockchain Blockchain-Consensus-Encyclopedia Blockchain-Systems Blog Book-Review Books Bots Bought Box Brand-Authenticity Brand-Integrity Brand-Protection Breaking-Barriers Business-Management Business-Milestones Business-Strategy Business-Success Business-Transformation Businessbooks Byzantine-Fault-Tolerance Calculator Calibre Calibre-Web Camera Case-Studies Cc2500 Cgm-Next Challenges Changement-De-Vie Channel-Setup Cheaper Cherry-Blossoms Chiffrement Chirurgie-Orthopédique Choosing-Fbl-Gyro Ci/Cd Classic-Games Classic-Scooters Classic-Vespa Climb Climbing Codefest Collectible-Scooters Collectibles Collection Collector Color Communication Competition Confidentialité Consensus-Algorithms Consensus-Mechanisms Console Consommation-Responsable Consumer-Awareness Containerization Contest Control-Surfaces Controller Copy Corticostéroïdes Counterfeit-Awareness Counterfeit-Culture Counterfeit-Market Counterfeit-vs-Authentic Covid19 Creating Croissance-Personnelle Cryptocurrency Cultural-Experience Cultural-Richness Curve-Adjustments Customer-Discovery Cve-Issues Dance-Dreams Death Decentralization Decentralized Dental-Hygiene Dependency Design Development Devfest Devops Distributed-Ledger-Technology Diverse-Perspectives Diy-Dental Diy-Health Dji Docker Docker-Compose Docker-Hosting Docker-Networking Docker-Registry Docker-Security Dont-Buy Dotnet Download Downloading Dreams-and-Reality Drone Ducati Dynamic-Ip Désencombrement Développement-Personnel Développement-Spirituel Ecology Edgetx Elrs Elta Emotional-Challenges Emotional-Hurdles Empowering-Narrative Endpoints Engelberg Ensitm Entrepreneurial-Lessons Entrepreneurial-Mindset Entrepreneurs Entrepreneurship Entrepreneurship-Books Essaim Essentially Ethereum Ethical-Dilemmas Evoque Execution Exercices-De-Renforcement Exercise-Form Expérience-Utilisateur Facebook Failure-Analysis Failure-Stigma Failure-to-Success Fake Fake-Apparel Fake-Brands Fake-Goods Family Family-Building Family-Dynamics Fashion-Ethics Fashion-Fraud Fbl-Controllers Fbl-System-Compatibility Fbl-System-Features Fbl-System-Reviews Federated Fertility-Struggles Finance Finance-Books Finances-Personnelles Financial-Modeling Financiallanning Firearm Firmware-Customization Firmware-Issues Fissure-Horizontale Fitness-Routine Fitness-Tips Flexibilité Flight-Controller Flybarless-Advantages Flybarless-Systems Fonctionnalités-Avancées Foss Fpv Frame France Freestyle Fresh-Breath Friendship-Goals Front Gallery Game-Music Gameplay-Mechanics Gamer-Community Games Gaming-Culture Gaming-Enthusiast Gaming-History Gaming-Legacy Gaming-Nostalgia Generative-Ai Genou Gestion-De-Ladouleur Gestion-Du-Temps Git Global-Impact Google Green-Tea Green-Tea-Mouthwash Growth-Hacking-Books Growth-Mindset Guide Hackathon Hackday Hackfest Health-and-Wellness Helicopter Helicopter-Community Helicopter-Gyro Helicopter-Tuning Herbal-Mouthwash Hewlettpackard Historical-Scooters Hobbies Hobby Hobbyist-Blog Holidays Holistic-Oralcare Hollidays Home-Remedy Home-Workouts Homelab Homemade-Oralcare Honda Honesty Honey Hornet How-To HowTo Https Hugo Human-Connection Hygiene-Routine Icecream Iconic-Scooters Iflight Iflightnazgulevoque Im Imessage Immich Indoor Industrial-Shit Industry Injections-Intra-Articulaires Injury-Prevention Innovation Innovation-Books Innovation-Journey Instagram Intégration-Apple Ios Japan-Travel Japanese-Cuisine Jar Java Jdk11 Jellyfin Joint-Health Junit Jupiter Kitchen Knee-Rehabilitation Knee-Stability Knockoff-Alert Kyoto Lacoste Lacoste-Counterfeit Lambretta Landmarks Leadership Leadership-Books Lean-Startup Learning-From-Failure Leg-Day Leg-Workouts Legal-Complexities Legit-Fashion Let's-Encrypt Libération Life-Transformations Link Linux Llm Local-Traditions M2evo Macos Magical-Adventure Magician-Lord Main Maison Make Manurhin Manurhin-Sm75 Mapping Marathon Market-Research Marketing-Books Maven Me Medical Medical-Advancements Messagerie Messenger Metakernel Miami-Entertainment Mid-Century-Scooters Migration Mindset-Shifts Minimalisme Minimum-Viable-Product Minty-Fresh Mixer-Settings Mk3 Mk4 Mobilité Model-Setup Modern-Family Modern-Motherhood Moon Moral-Encounters Motherhood-Dilemmas Moto Motorcycle Mount Mountain Mountains Mouth-Rinse Mouthwash-Ingredients Mouthwash-Recipe Mulhouse Muscle-Activation Music Mvs Mycollection Ménisque NASA Natural-Mouthwash Nature Nazgul Neo-Geo-Aes Neogeo Network New-Bookrelease Nginx-Proxy North-Face North-Face-Replica Nostalgic-Scooters Nv14 Objectifs Offroad Old-School-Scooters Omphobby Open-Source Open-Source-Rc Opensource Opentx Openvpn Oral-Care Oral-Health Organizer Osaka Oss Overcoming-Challenges P1p P1s Parental-Rights Parenthood-Reflections Parts Passion Patella-Health Persistence Personal-Relationships Photos Physical-Therapy Physiothérapie Pivot-Strategy Pixel-Art Planet Plasma-Riche-en-Plaquettes Platform Plex Pluto Ppl Pretty-Girl-Complex Privacy Private-Pilot-License Product-Market-Fit Productivity-Books Proof-of-Stake Proof-of-Work Protect-Your-Style Protection-Des-Données Prusa Prusa-Research Public-Image Quadcopter Quadriceps-Strength Quiz Radio-Control Radio-Programming Radiomaster Rare-Scooters Raspberrypi Raspbian Rates-Configuration Rc Rc-Community Rc-Configuration Rc-Firmware Rc-Helicopter Rc-Helicopter-Electronics Rc-Helicopter-Enthusiasts Rc-Helicopter-Setup Rc-Helicopter-Technology Rc-Helicopter-Tips Rc-Helicopters Rc-Modeling Rc-Simulator Realdebrid Realflight Receiver Reflex-Xtr Refreshing-Breath Rehabilitation-Exercises Relations-Personnelles Relationship-Complexities Released Remote Remote-Control-Flying Reproductive-Ethics Resilience-in-Business Resilient-Women Restored-Scooters Retro-Gaming Retro-Gaming-Community Retro-Gaming-Console Retro-Scooters Reverse-Proxy Rhythms-of-Life Risk-Management Robotic Router Rx Réadaptation Rééducation Sab Sab-Raw-420 Sab-Raw-580 Sab-Raw-700 Sales-Books Sans-Publicité Santé-Articulaire Santé-Mentale Scooter-Enthusiast Scooter-Memorabilia Scooters Security-Nightmare Self-Leveling-Helicopter Server-Configuration Servo-Config Signal Simplification Skateboarding Skydiving Snk Snk-Corporation Snk-Neo-Geo Soap Social-Issues Solex Space Spams Sport Ssl-Termination Ssl/Tls Startup-Books Startup-Failure Static-Code-Generator Steam Strategic-Networking Streaming Strength-Training Success-Stories Sun Support Surrogacy-Agency Surrogacy-Journey Surrogacy-Narratives Swiftui Swiss Switzerland Sécurité Team Team-Building Team-Dynamics Technologie Teeth-Cleaning Telegram Temples-and-Shrines Tendermint Terrot Thérapie-Physique Tokyo Torvol Traefik Traitement-Des-Fissures Transmitter Transmitter-Firmware Travel Travel-Tips Trouver-Du-Sens Tunnel Turning-Setbacks-Into-Success Tutorial Tx Unconventional-Strategies Vacation Velosolex Vespa Viaferrata Video Video-Game-Review Vie-Numérique Vintage Vintage-Scooters Vintage-Two-Wheelers Vintage-Vespa Vintagegaming Vmo-Exercises Warez Web-Security Whatsapp Wind Winner Winterthur Women-Supporting-Women Wordpress Workout-Progression X1c Zurich Zyxel Zyxel-Avoid Zyxel-Not-Serious-With-Security Zyxel-Outdated Zyxel-Router-Not-Good Écosystème-Apple Équilibre
Me

Cédric Walter is a French-Swiss entrepreneur, investor, and software engineer based in Zurich, Switzerland. He spent his career developing software applications for Swiss insurance companies to handle billions of dollars in premiums. He cofounded Innoveo AG and as the software architect developed the no-code platform designed to reduce the manual coding that powers many software apps. As an active participant in the European hacking community, he works on many open source projects including blockchain. Cédric is a winner of SBHack19/21 and HackZurich 2021. His expertise include designing back end, event-based, and blockchain systems. Cédric is also the founded Disruptr GmbH, a software development company that offers full spectrum of services for businesses of all sizes. JAVA full-stack developer since 2000, in Blockchain since 2017, Certified Scrum Master 2012, Corda Certified Developer in 2019, Ethereum smart contract expert in the SWISS Blockchain Security working group Hackathons

  • HackZurich 2022 – Level Up in top 25 finalist among 134 submissions
  • SBHACK21 – SwiFi winner of best Solution on Algorand, overall Winner 3rd Prize, CV Labs Fast Track Ticket
  • HackZurich 2020 Europe’s Biggest Hackathon winner in category Migros
  • SBHACK19 – LendIt winner of Swiss biggest Blockchain Hackathon Member of the Bitcoin Association Switzerland and Cryptovalley association Switzerland, Github https://github.com/cedricwalter 99.9% most of my career code is unfortunately NOT on github 😵 PGP: DF52 ADDA C81A 08A6

PGP: DF52 ADDA C81A 08A6

Copyright information

All editorial content and graphics on our sites are protected by U.S. copyright, international treaties, and other applicable copyright laws and may not be copied without the express permission of Cedric Walter, which reserves all rights. Reuse of any of Cedric Walter editorial content and graphics for any purpose without The author ’s permission is strictly prohibited.

DO NOT copy or adapt the HTML or other code that this site creates to generate pages. It also is covered by copyright.

Reproduction without explicit permission is prohibited. All Rights Reserved. All photos remain copyright © their rightful owners. No copyright infringement is intended.

Disclaimer: The editor(s) reserve the right to edit any comments that are found to be abusive, offensive, contain profanity, serves as spam, is largely self-promotional, or displaying attempts to harbour irrelevant text links for any purpose.

Others

If you like my work or find it helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and maintain more projects in the future. 🦾

It is better to attach some information or leave a message so that I can record the donation 📝 , thank you very much 🙏.

Reproduction without explicit permission is prohibited. All Rights Reserved. All photos remain copyright © their rightful owners. No copyright infringement is intended.