The following subsections from General section should be performed in this order:
- SSH configuration
- Ubuntu - Synchronize time with chrony
- Update system timezone
- Correct DNS resolution
- Generate Gmail App Password
- Configure Postfix Server to send email through Gmail
- Mail notifications for SSH dial-in
Add the following mounting points to /etc/fstab/
192.168.0.114:/mnt/tank1/data /home/sitram/data nfs rw 0 0
192.168.0.114:/mnt/tank2/media /home/sitram/media nfs rw 0 0
I used for a while the Docker Engine from Ubuntu apt repository, until a container stopped working because it needed the latest version which was not yet available. I decided to switch from Ubuntu's apt version of docker to the official one from here and it has been working great so far.
I launch all containers from a single docker-compose file called docker-compose.yml
which I store in /home/sitram/data
. Together with the yaml file, I store a .env
file which contains the stack name:
echo COMPOSE_PROJECT_NAME=serenity >> /home/sitram/data/.env
The configuration of each container is stored in /home/sitram/docker
in a folder named after each container. I have a job running on the host server, which periodically creates a backup of this VM to a Raid 1 so I should be protected in case of some failures.
[TODO] move the containers docker configuration to my tank1 in order to reduce the wear on the SSD.
Identify what docker related packages are installed on your system
dpkg -l | grep -i docker
Remove any docker related packages installed from Ubuntu repository. This will not remove images, containers, volumes, or user created configuration files on your host.
sudo apt-get purge -y docker-engine docker docker.io docker-ce docker-ce-cli docker-compose-plugin
sudo apt-get autoremove -y --purge docker-engine docker docker.io docker-ce docker-compose-plugin
If you wish to delete all images, containers, and volumes run the following commands:
sudo rm -rf /var/lib/docker /etc/docker
sudo rm /etc/apparmor.d/docker
sudo groupdel docker
sudo rm -rf /var/run/docker.sock
Update the apt
package index and install packages to allow apt to use a repository over HTTPS:
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Add Docker’s official GPG key:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
Use the following command to set up the repository:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Update the apt package index:
sudo apt-get update
Install the latest version of Docker Engine
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Verify that the Docker Engine installation is successful by running the hello-world image
sudo docker run hello-world
I keep my containers updated using Watchtower. It runs every night and sends notifications over telegram.
The container has:
- a volume mapped to
/var/run/docker.sock
used to access Docker via Unix sockets
Below is the docker-compose I used to launch the container.
#Watchtower every night with telegram notification - https://containrrr.dev/watchtower/
#Chron Expression format - https://pkg.go.dev/github.com/robfig/[email protected]#hdr-CRON_Expression_Format
watchtower:
image: containrrr/watchtower:latest
container_name: watchtower_schedule_telegram
volumes:
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
command:
--cleanup
--include-stopped
--notifications shoutrrr
--notification-url "xxxxxxx"
--schedule "0 0 0 * * *"
I use Heimdall as a web portal for managing al the services running on my HomeLab.
The container has:
- a volume mapped to
/home/sitram/docker/heimdall
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#Heimdall - Web portal for managing home lab services - https://hub.docker.com/r/linuxserver/heimdall
heimdall:
image: ghcr.io/linuxserver/heimdall
container_name: heimdall
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
volumes:
- /home/sitram/docker/heimdall:/config
ports:
- 81:80
- 441:443
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:81 || exit 1
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
I use Portainer as a web interface for managing my docker containers. It helps me tocheck container logs, login to a shell inside the container and perform other various debugging activities.
The container has:
- a volume mapped to
/home/sitram/docker/portainer
used to store the configuration of the application - a volume mapped to
/var/run/docker.sock
used to access Docker via Unix sockets
Below is the docker-compose I used to launch the container.
#Portainer - a web interface for managing docker containers
portainer:
image: portainer/portainer-ce:alpine
container_name: portainer
command: -H unix:///var/run/docker.sock
restart: always
ports:
- 9000:9000
- 8000:8000
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:9000 || exit 1
interval: 30s
timeout: 10s
retries: 5
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/sitram/docker/portainer:/data
I use Calibre as a book management application. My book library is stored in the mounted volume.
The container has:
- a volume mapped to
/home/sitram/docker/calibre
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#Calibre - Books management application - https://hub.docker.com/r/linuxserver/calibre
calibre:
image: ghcr.io/linuxserver/calibre:latest
container_name: calibre
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- UMASK_SET=022 #optional
volumes:
- /home/sitram/docker/calibre:/config
ports:
- 8080:8080
- 8081:8081
- 9090:9090
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:8080 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
I use Calibre-web as a web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre datavase.
The container has:
- a volume mapped to
/home/sitram/docker/calibre-web
used to store the configuration of the application - a volume mapped to
/home/sitram/docker/calibre/Calibre Library
where the Calibre database is located.
Below is the docker-compose I used to launch the container.
#Calibre-web - web app providing a clean interface for browsing, reading and downloading eBooks using an existing Calibre database. - https://hub.docker.com/r/linuxserver/calibre-web
calibre-web:
image: ghcr.io/linuxserver/calibre-web
container_name: calibre-web
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- DOCKER_MODS=linuxserver/calibre-web:calibre
volumes:
- /home/sitram/docker/calibre-web:/config
- "/home/sitram/docker/calibre/Calibre Library:/books"
ports:
- 8086:8083
healthcheck:
test: curl -f http://192.168.0.101:8086 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
I use qBitTorrent as my main torrent client accessible to the entire LAN network. I use an older version(14.3.9) because the latest immage is causing some issues which I couldn't figure how to solve.
The container has:
- a volume mapped to
/home/sitram/docker/qbittorrent
used to store the configuration of the application - a volume mapped to
/home/sitram/media/torrents
where all downloaded torrents are storred to preserve the life of the host SSD - a volume mapped to
/home/sitram/media/torrents/torrents
where I can add any.torrent
file and it will be automatically started by the client.
Below is the docker-compose I used to launch the container.
#qBitTorrent - Torrent client - https://hub.docker.com/r/linuxserver/qbittorrent/
# 2022.07.08 - Latest docker image caused torrents to go into error and wouldn't download.
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:14.3.9
#image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- WEBUI_PORT=9093
volumes:
- /home/sitram/docker/qbittorrent:/config
- /home/sitram/media/torrents:/downloads
- /home/sitram/media/torrents/torrents:/watch
ports:
- 51413:51413
- 51413:51413/udp
- 9093:9093
healthcheck:
test: curl -f http://192.168.0.101:9093 || exit 1
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
I use Jackett as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software.
The container has:
- a volume mapped to
/home/sitram/docker/jackett
used to store the configuration of the application - a volume mapped to
/home/sitram/media/torrents
where all downloaded torrents are storred to preserve the life of the host SSD
Below is the docker-compose I used to launch the container.
# Jackett - works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. - https://ghcr.io/linuxserver/jackett
jackett:
image: ghcr.io/linuxserver/jackett
container_name: jackett
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- AUTO_UPDATE=true #optional
volumes:
- /home/sitram/docker/jackett:/config
- /home/sitram/media/torrents:/downloads
ports:
- 9117:9117
healthcheck:
test: curl -f http://192.168.0.101:9117 || exit 1
interval: 30s
timeout: 10s
retries: 5
restart: unless-stopped
I use Sonarr as a web application to mnitor multiple sources for favourite tv shows.
The container has:
- a volume mapped to
/home/sitram/docker/sonarr
used to store the configuration of the application - a volume mapped to
/home/sitram/media/tvseries
used to store all TV shows - a volume mapped to
/home/sitram/media/torrents
where all downloaded torrents are storred to preserve the life of the host SSD
Below is the docker-compose I used to launch the container.
#Sonarr - Monitor multiple sources for favourite tv shows - https://ghcr.io/linuxserver/sonarr
sonarr:
image: ghcr.io/linuxserver/sonarr
container_name: sonarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- UMASK_SET=022 #optional
volumes:
- /home/sitram/docker/sonarr:/config
- /home/sitram/media/tvseries:/tv
- /home/sitram/media/torrents:/downloads
ports:
- 8989:8989
healthcheck:
test: curl -f http://192.168.0.101:8989 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- jackett
- qbittorrent
restart: unless-stopped
I use Radarr as a web application to mnitor multiple sources for favourite movies.
The container has:
- a volume mapped to
/home/sitram/docker/radarr
used to store the configuration of the application - a volume mapped to
/home/sitram/media/movies
used to store all the movies - a volume mapped to
/home/sitram/media/torrents
where all downloaded torrents are storred to preserve the life of the host SSD
Below is the docker-compose I used to launch the container.
#Radarr - A fork of Sonarr to work with movies https://ghcr.io/linuxserver/radarr
radarr:
image: ghcr.io/linuxserver/radarr:nightly-alpine
container_name: radarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- UMASK_SET=022 #optional
volumes:
- /home/sitram/docker/radarr:/config
- /home/sitram/media/movies:/movies
- /home/sitram/media/torrents:/downloads
ports:
- 7878:7878
healthcheck:
test: curl -f http://192.168.0.101:7878 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- jackett
- qbittorrent
restart: unless-stopped
I use Bazarr as a web application companion to Sonarr and Radarr. It can manage and download subtitles based on your requirements.
The container has:
- a volume mapped to
/home/sitram/docker/bazarr
used to store the configuration of the application - a volume mapped to
/home/sitram/media/movies
used to store all the movies - a volume mapped to
/home/sitram/media/tvseries
used to store all TV shows
Below is the docker-compose I used to launch the container.
#Bazarr is a companion application to Sonarr and Radarr. It can manage and download subtitles based on your requirements. - https://hub.docker.com/r/linuxserver/bazarr
bazarr:
image: ghcr.io/linuxserver/bazarr
container_name: bazarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
volumes:
- /home/sitram/docker/bazarr:/config
- /home/sitram/media/movies:/movies
- /home/sitram/media/tvseries:/tv
ports:
- 6767:6767
healthcheck:
test: curl -f http://192.168.0.101:6767 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- radarr
- sonarr
restart: unless-stopped
I use Lidarr as a web application to manage my music collection.
The container has:
- a volume mapped to
/home/sitram/docker/lidarr
used to store the configuration of the application - a volume mapped to
/home/sitram/media/music
used to store all the music - a volume mapped to
/home/sitram/media/torrents
where all downloaded torrents are storred to preserve the life of the host SSD
Below is the docker-compose I used to launch the container.
#Lidarr is a music collection manager for Usenet and BitTorrent users. - https://hub.docker.com/r/linuxserver/lidarr
lidarr:
image: ghcr.io/linuxserver/lidarr
container_name: lidarr
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
volumes:
- /home/sitram/docker/lidarr:/config
- /home/sitram/media/music:/music
- /home/sitram/media/torrents:/downloads
ports:
- 8686:8686
healthcheck:
test: curl -f http://192.168.0.101:8686 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- jackett
- qbittorrent
restart: unless-stopped
I use Overseerr as a free and open source web application for managing requests for my media library. It integrates with your existing services, such as Sonarr, Radarr, and Plex.
The container has:
- a volume mapped to
/home/sitram/docker/overseerr
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#Overseerr is a free and open source software application for managing requests for your media library.
# It integrates with your existing services, such as Sonarr, Radarr, and Plex!
# https://hub.docker.com/r/sctx/overseerr
overseerr:
image: sctx/overseerr:latest
container_name: overseerr
environment:
- LOG_LEVEL=debug
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
ports:
- 5055:5055
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:5055 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
volumes:
- /home/sitram/docker/overseerr:/app/config
restart: unless-stopped
I use GoDaddy DNS Updater as a free and open source application that uses curl, and a simple shell script to monitor a sub-domain or domain and update GoDaddy DNS records.
The container has:
- a volume mapped to
/home/sitram/docker/godaddy_dns_updater
used to store the logs of the application
Below is the docker-compose I used to launch the container.
#GoDaddy DNS Updater - A simple docker image that uses curl, and a simple shell script to monitor a sub-domain or domain and update GoDaddy DNS records - https://github.com/parker-hemphill/godaddy-dns-updater
godaddy_dns_updater:
image: parkerhemphill/godaddy-dns-updater
container_name: godaddy_dns_updater
environment:
- DOMAIN=sitram.eu
- API_KEY=xxx #to be filled with GoDaddy developer API key
- API_SECRET=xxx #to be filled with GoDaddy developer API key secret
- DNS_CHECK=600
- TIME_ZONE=Europe/Bucharest
volumes:
- /home/sitram/docker/godaddy_dns_updater:/tmp
restart: unless-stopped
I use SWAG - Secure Web Application Gateway as a free and open source application that sets a Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes.
The container has:
- a volume mapped to
/home/sitram/docker/swag
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#SWAG - Secure Web Application Gateway sets up an Nginx webserver and reverse proxy with php support and a built-in certbot client that automates free SSL server certificate generation and renewal processes. - https://ghcr.io/linuxserver/swag
swag:
image: ghcr.io/linuxserver/swag
container_name: swag
cap_add:
- NET_ADMIN
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- URL=xxxxx #to be filled with the subdomain
- SUBDOMAINS=wildcard
- VALIDATION=dns
- DNSPLUGIN=godaddy
- [email protected] # to be filled with real email
- ONLY_SUBDOMAINS=false
- STAGING=false
- DOCKER_MODS=linuxserver/mods:swag-auto-reload|linuxserver/mods:universal-wait-for-internet
volumes:
- /home/sitram/docker/swag:/config
ports:
- 443:443
- 80:80
healthcheck:
test: wget --no-verbose --tries=1 --spider --no-check-certificate https://sitram.eu || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- duckdns
restart: unless-stopped
I use Plex to organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices.
The container has:
- a volume mapped to
/home/sitram/docker/plex/
used to store the configuration of the application - a volume mapped to
/dev/shm
used for transcoding videos. I use this approach to reduce the wear on the host SSD. - a volume mapped to
/home/sitram/media/tvseries
used to store all TV shows - a volume mapped to
/home/sitram/media/movies
used to store all the movies - a volume mapped to
/home/sitram/media/music
used to store all the music - a volume mapped to
/home/sitram/data/photos
used to store family photos - a volume mapped to
/home/sitram/media/trainings
used to store various video training materials
Below is the docker-compose I used to launch the container.
Plex - Organizes video, music and photos from personal media libraries and streams them to smart TVs, streaming boxes and mobile devices. - https://hub.docker.com/r/plexinc/pms-docker/
plex:
image: plexinc/pms-docker:latest
container_name: plex
network_mode: host
environment:
- TZ=Europe/Bucharest
- PUID=1000
- PGID=1000
- HOSTNAME=Serenity
volumes:
- /home/sitram/docker/plex/:/config
#- /home/sitram/docker/plex/tmp:/transcode
- /dev/shm:/transcode
- /home/sitram/media/tvseries:/tvseries
- /home/sitram/media/movies:/movies
- /home/sitram/media/music:/music
- /home/sitram/data/photos:/photos
- /home/sitram/media/trainings:/trainings
# ports:
# - "32400:32400/tcp"
# - "3005:3005/tcp"
# - "8324:8324/tcp"
# - "32469:32469/tcp"
# - "1900:1900/udp"
# - "32410:32410/udp"
# - "32412:32412/udp"
# - "32413:32413/udp"
# - "32414:32414/udp"
depends_on:
- swag
restart: unless-stopped
I use PostgressSQL database as a database server for Guacamole container
The container has:
- a volume mapped to
/home/sitram/docker/postgres
used to store the configuration of the application and databases
Below is the docker-compose I used to launch the container.
#PostgressSQL database - https://github.com/docker-library/docs/blob/master/postgres/README.md
db_postgress:
container_name: db_postgress
image: postgres:13
user: 1000:1000
environment:
- POSTGRES_USER=xxx
- POSTGRES_PASSWORD=xxx
ports:
- 5432:5432
healthcheck:
test: pg_isready -h 192.168.0.101 -p 5432 -U sitram || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
volumes:
- /home/sitram/docker/postgres:/var/lib/postgresql/data:rw
restart: unless-stopped
I use MySQL as a open-source relational database management system to store databases for
The container has:
- a volume mapped to
/home/sitram/docker/mysql/data
used to store the databases - a volume mapped to
/home/sitram/docker/mysql/conf
used to store custom configurations - a volume mapped to
/home/sitram/docker/mysql/logs
used to access MySQL logs - a volume mapped to
/home/sitram/docker/mysql/run
used to access the pid and sock files.
Below is the docker-compose I used to launch the container.
#MySQL database - https://hub.docker.com/_/mysql?tab=description
mysql:
container_name: mysql
image: mysql
user: 1000:1000
command:
--default-authentication-plugin=mysql_native_password
cap_add:
- SYS_NICE
environment:
- MYSQL_ROOT_PASSWORD=xxx
- MYSQL_DATABASE=xxx
- MYSQL_USER=xxx
- MYSQL_PASSWORD=xxx
ports:
- 3306:3306
healthcheck:
test: mysqladmin ping -h 192.168.0.101 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
volumes:
- /home/sitram/docker/mysql/data:/var/lib/mysql
- /home/sitram/docker/mysql/conf:/etc/mysql/conf.d
- /home/sitram/docker/mysql/logs:/var/log/mysql
- /home/sitram/docker/mysql/run:/var/run/mysqld
restart: unless-stopped
I use Adminer (formerly phpMinAdmin) as a full-featured database management tool written in PHP to connect to MySQL container
Below is the docker-compose I used to launch the container.
#Adminer - (formerly phpMinAdmin) is a full-featured database management tool written in PHP - https://hub.docker.com/_/adminer
adminer:
container_name: adminer
image: adminer
environment:
- ADMINER_DESIGN=nette
- ADMINER_DEFAULT_SERVER=192.168.0.101
ports:
- 8082:8080
restart: unless-stopped
I use PGAdmin as a web interface to administer PostgressSQL databasees
The container has:
- a volume mapped to
/home/sitram/docker/pgadmin
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#PGAdmin - Web interface used to administer PostgressSQL - https://www.pgadmin.org/docs/pgadmin4/latest/container_deployment.html#environment-variables
pg_admin:
image: dpage/pgadmin4
container_name: pg_admin
ports:
- 82:80
environment:
- [email protected]
- PGADMIN_DEFAULT_PASSWORD=xxx
- PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=True
- PGADMIN_CONFIG_LOGIN_BANNER="Authorised users only!"
- PGADMIN_CONFIG_CONSOLE_LOG_LEVEL=10
volumes:
- /home/sitram/docker/pgadmin:/var/lib/pgadmin
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:82 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
I use Guacamole as a web application for accesing internal services over SSH, RDP or other protocols. It consists of two containers, a daemon and the web interface.
Below is the docker-compose I used to launch the the Guacamole Daemon container.
The container has:
#Guacamole Daemon - http://guacamole.apache.org/doc/gug/guacamole-docker.html
guacd:
container_name: guacd
image: guacamole/guacd
environment:
- TZ=Europe/Bucharest
- GUACD_LOG_LEVEL=debug
ports:
- 4822:4822
networks:
- guacamole
restart: unless-stopped
Below is the docker-compose I used to launch the Guacamole web application container.
- a volume mapped to
/home/sitram/docker/swag
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#Guacamole - web application for accesing internal services over SSH, RDP or other protocols - http://guacamole.apache.org/doc/gug/guacamole-docker.html
# 2022.7-08 - Latest docker image would not boot. I temporarily switched to version 1.4.0
guacamole:
container_name: guacamole
image: guacamole/guacamole:1.4.0
links:
- guacd
environment:
- TZ=Europe/Bucharest
- GUACD_HOSTNAME=192.168.0.101
- GUACD_PORT=4822
- POSTGRES_HOSTNAME=192.168.0.101
- POSTGRES_PORT=5432
- POSTGRES_DATABASE=guacamole_db
- POSTGRES_USER=xxx
- POSTGRES_PASSWORD=xxx
- GUACAMOLE_HOME=/custom-config
volumes:
- /home/sitram/docker/guacamole:/custom-config
networks:
- guacamole
ports:
- 8083:8080
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:8083/guacamole/ || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- swag
- guacd
- db_postgress
restart: unless-stopped
I use Redis as an open-source, networked, in-memory, key-value data store with optional durability. It is written in ANSI C
The container has:
- a volume mapped to
/home/sitram/docker/redis
used to store the database a volume mapped to/home/sitram/docker/redis/config
used to store custom configuration
Below is the docker-compose I used to launch the container.
#Redis is an open-source, networked, in-memory, key-value data store with optional durability. It is written in ANSI C.- https://hub.docker.com/_/redis
redis:
container_name: redis
image: redis
user: 1000:1000
environment:
- TZ=Europe/Bucharest
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- 6379:6379
healthcheck:
test: redis-cli -h 192.168.0.101 -p 6379 ping | grep PONG
interval: 30s
timeout: 10s
retries: 5
volumes:
- /home/sitram/docker/redis:/data
- /home/sitram/docker/redis/config:/usr/local/etc/redis
restart: unless-stopped
I use LibreSpeed as a very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. No Flash, No Java, No Websocket, No Bullshit.
The container has:
- a volume mapped to
/home/sitram/docker/librespeed
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#LibreSpeed - very lightweight Speedtest implemented in Javascript, using XMLHttpRequest and Web Workers. No Flash, No Java, No Websocket, No Bullshit. - https://hub.docker.com/r/linuxserver/librespeed
librespeed:
image: ghcr.io/linuxserver/librespeed:latest
container_name: librespeed
environment:
- PUID=1000
- PGID=1000
- TZ=Europe/Bucharest
- PASSWORD=xxx
- CUSTOM_RESULTS=true
- DB_TYPE=mysql
- DB_NAME=librespeed
- DB_HOSTNAME=192.168.0.101
- DB_USERNAME=xxx
- DB_PASSWORD=xxx
- DB_PORT=3306
volumes:
- /home/sitram/docker/librespeed:/config
ports:
- 85:80
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:85 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
depends_on:
- mysql
restart: unless-stopped
I use Authelia as an open source authentication and authorization server protecting modern web applications by collaborating with reverse proxies.
The container has:
- a volume mapped to
/home/sitram/docker/authelia
used to store the configuration of the application
Below is the docker-compose I used to launch the container.
#Authelia - an open source authentication and authorization server protecting modern web applications by collaborating with reverse proxies - https://www.authelia.com/docs/
authelia:
image: authelia/authelia:latest
container_name: authelia
user: 1000:1000
environment:
- TZ=Europe/Bucharest
volumes:
- /home/sitram/docker/authelia:/config
ports:
- 9092:9092
depends_on:
- redis
restart: unless-stopped
I use Portfolio Performance as an open source tool to calculate the overall performance of an investment portfolio. I built the image based on the instructions from here.
The container has:
- a volume mapped to
/home/sitram/docker/portfolio-performance/workspace
used to store the application workspace.
Below is the docker-compose I used to launch the container.
#Portfolio Performance - An open source tool to calculate the overall performance of an investment portfolio.
#Self build image based on instructions from https://forum.portfolio-performance.info/t/portfolio-performance-in-docker/10062
PortfolioPerformance:
image: portfolio:latest
container_name: PortfolioPerformance
environment:
- TZ=Europe/Bucharest
- USER_ID=1000
- GROUP_ID=1000
- KEEP_APP_RUNNING=1
- DISPLAY_WIDTH=1920
- DISPLAY_HEIGHT=910
labels:
- "com.centurylinklabs.watchtower.enable=false"
volumes:
- /home/sitram/docker/portfolio-performance/workspace:/opt/portfolio/workspace
ports:
- 5800:5800
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:5800 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
I use Audiobookshelf as an self hosted audiobook and podcast server with mobile applications for Android and iOS which allows to listen to audiobooks remotely from the server.
The container has:
- a volume mapped to
/home/sitram/media/audiobooks
used to store all the audiobooks - a volume mapped to
/home/sitram/media/podcasts
used to store all the podcasts - a volume mapped to
/home/sitram/docker/audiobookshelf/config
used to store the configuration of the application - a volume mapped to
/home/sitram/docker/audiobookshelf/metadata
used to store cache, streams, covers, downloads, backups and logs
Below is the docker-compose I used to launch the container.
#Audiobookshelf - is an self hosted audiobook and podcast server - https://www.audiobookshelf.org/
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:latest
container_name: audiobookshelf
environment:
- TZ=Europe/Bucharest
- AUDIOBOOKSHELF_UID=1000
- AUDIOBOOKSHELF_GID=1000
volumes:
- /home/sitram/media/audiobooks:/audiobooks
- /home/sitram/media/podcasts:/podcasts
- /home/sitram/docker/audiobookshelf/config:/config
- /home/sitram/docker/audiobookshelf/metadata:/metadata
ports:
- 13378:80
healthcheck:
test: wget --no-verbose --tries=1 --spider http://192.168.0.101:13378 || exit 1
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
restart: unless-stopped
I use Stirling-PDF as a selfhosted web based PDF manipulation tool
The container has:
- a volume mapped to
/home/sitram/docker/stirling-pdf/trainingData:
used to store extra OCR languages - a volume mapped to
/home/sitram/media/podcasts
used to store all the podcasts - a volume mapped to
/home/sitram/docker/stirling-pdf/configs
used to store the configuration of the application - a volume mapped to
/home/sitram/docker/stirling-pdf/customFiles
used to store custom static files uch as the app logo by placing files in the/customFiles/static/
directory. An example of customising app logo is placing a/customFiles/static/favicon.svg
to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF
Below is the docker-compose I used to launch the container.
#Stirling-PDF - locally hosted web based PDF manipulation tool - https://github.com/Frooodle/Stirling-PDF
stirling-pdf:
image: frooodle/s-pdf:latest
container_name: stirling-pdf
env_file:
- .env
ports:
- 8084:8080
healthcheck:
test: curl -f http://192.168.0.101:8086 || exit 1
interval: 30s
timeout: 10s
retries: 5
volumes:
- /home/sitram/docker/stirling-pdf/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
- /home/sitram/docker/stirling-pdf/configs:/configs
- /home/sitram/docker/stirling-pdf/customFiles:/customFiles/
environment:
- DOCKER_ENABLE_SECURITY=false
- PUID=1000
- PGID=1000
- UMASK=022
restart: unless-stopped