Truenas Setup
Prerequisites
Background
I have a Proxmox setup on an old Xeon server with TrueNAS Scale running as VM. But with my new WTR PRO, I wanted to explore using docker
for my containers instead of LXCs (Linux Containers). I am keeping the Proxmox running as backup and planned on terraforming
the Proxmox installation in the future.
I installed TrueNAS ElectricEel-24.10.1 on this bad boy and will document the docker
containers I’m going to deploy.
WARNING:
Do not enable apt
if you don’t know what you’re doing. It can destroy the appliance.
$ sudo mount -o remount,rw 'boot-pool/ROOT/24.10.1/usr'
$ sudo chmod +x /usr/bin/apt*
$ sudo chmod +x /usr/bin/dpkg
$ wget -qO- https://raw.githubusercontent.com/eza-community/eza/main/deb.asc | sudo gpg --dearmor -o /etc/apt/keyrings/gierens.gpg
$ echo "deb [signed-by=/etc/apt/keyrings/gierens.gpg] http://deb.gierens.de stable main" | sudo tee /etc/apt/sources.list.d/gierens.list
$ sudo chmod 644 /etc/apt/keyrings/gierens.gpg /etc/apt/sources.list.d/gierens.list
$ sudo apt update
$ sudo apt install eza vim ncdu
$ curl -s https://ohmyposh.dev/install.sh | bash -s
Update ~/.profile
eval "$(oh-my-posh init bash)"
# aliases
alias la='eza -la --icons=always'
alias ls='eza -a --icons=always'
alias ll='eza -l --icons=always'
alias lt='eza -a --tree --level=1 --icons=always'
Portainer
I installed Portainer Community Edition from the community Train. It’s available by default and I only need to click Discover Apps to reveal itself. It’s a box-standard setup where you need to fill up the UI for Portainer, Network, Storage and Resources Configuration. It’s running on 2 CPUs with 4096 MB of RAM. The rest of the containers are stack
deployment within portainer
.
Authelia
I have configuration.yml
, users_database.yml
and notification.txt
on the mounted volume so its persistent.
services:
authelia:
image: authelia/authelia
container_name: authelia
restart: always
volumes:
- /mnt/fast/authelia/config:/config
ports:
- 9091:9091
environment:
- TZ=Europe/London
Filebrowser
services:
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- PUID=568
- PGID=568
- TZ=Europe/London
ports:
- 8084:80
volumes:
- /mnt/fast:/srv/fast:rw
- /mnt/tank0:/srv/tank0:rw
- /mnt/fast/filebrowser/config/settings.json:/config/settings.json
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks: {}
Gitea
services:
server:
image: docker.io/gitea/gitea
container_name: gitea
environment:
- USER_UID=568
- USER_GID=568
restart: always
volumes:
- /mnt/fast/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 3000:3000
- 222:22
I have to use a custom config
file since it’s running on a non-standard SSH port.
❯ cat ~/.ssh/config
Host 192.168.x.x
Port 222
User git
Heimdall
services:
heimdall:
image: lscr.io/linuxserver/heimdall:latest
container_name: heimdall
environment:
- PUID=999
- PGID=999
- TZ=Europe/Lond
volumes:
- /mnt/fast/heimdall/config:/config
ports:
- 7980:80
- 7943:443
restart: unless-stopped
HomeAssistant
services:
homeassistant:
container_name: homeassistant
image: lscr.io/linuxserver/homeassistant:latest
network_mode: host
environment:
- PUID=999
- PGID=999
- TZ=Europe/London
ports:
- 8123:8123
volumes:
- /mnt/fast/homeassistant/config:/config
- /etc/localtime:/etc/localtime:ro
- /run/dbus:/run/dbus:ro
restart: always
Immich
This is the most challenging container to setup. In my Proxmox, I have a bare-metal installation of this since I don’t have success mounting volumes inside the LXC container.
services:
immich-server:
container_name: immich-server
image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
volumes:
- ${UPLOAD_LOCATION}:/usr/src/app/upload
- /etc/localtime:/etc/localtime:ro
env_file:
- stack.env
ports:
- '2283:2283'
depends_on:
- redis
- database
restart: always
user: 3002:568
healthcheck:
disable: false
immich-machine-learning:
container_name: immich-machine-learning
image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release}
volumes:
- model-cache:/cache
env_file:
- stack.env
restart: always
user: 568:568
healthcheck:
disable: false
redis:
container_name: immich-redis
image: docker.io/redis:6.2-alpine@sha256:eaba718fecd1196d88533de7ba49bf903ad33664a92debb24660a922ecd9cac8
healthcheck:
test: redis-cli ping || exit 1
restart: always
database:
container_name: immich-postgres
image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0
environment:
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_DB: ${DB_DATABASE_NAME}
POSTGRES_INITDB_ARGS: '--data-checksums'
volumes:
- ${DB_DATA_LOCATION}:/var/lib/postgresql/data
healthcheck:
test: >-
pg_isready --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" || exit 1;
Chksum="$$(psql --dbname="$${POSTGRES_DB}" --username="$${POSTGRES_USER}" --tuples-only --no-align
--command='SELECT COALESCE(SUM(checksum_failures), 0) FROM pg_stat_database')";
echo "checksum failure count is $$Chksum";
[ "$$Chksum" = '0' ] || exit 1
interval: 5m
start_interval: 30s
start_period: 5m
command: >-
postgres
-c shared_preload_libraries=vectors.so
-c 'search_path="$$user", public, vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on
restart: always
volumes:
model-cache:
I have the following on my stack.env
deployed using Portainer’s web editor.
# You can find documentation for all the supported env variables at https://immich.app/docs/install/environment-variables
# The location where your uploaded files are stored
UPLOAD_LOCATION=/mnt/tank0/immich
# The location where your database files are stored
DB_DATA_LOCATION=/mnt/fast/postgres14
TZ=Europe/London
IMMICH_VERSION=v1.120.1
DB_USERNAME=postgres
DB_DATABASE_NAME=immich
DB_PASSWORD=YOUR_STRONG_PASSWORD
Navidrome
services:
navidrome:
image: deluan/navidrome:latest
user: 568:568
ports:
- 4533:4533
restart: unless-stopped
environment:
ND_SCANSCHEDULE: 1h
ND_LOGLEVEL: info
ND_SESSIONTIMEOUT: 24h
ND_BASEURL: ""
volumes:
- /mnt/fast/navidrome/data:/data
- /mnt/tank0/data/media/music:/music:ro
Nextcloud
services:
nextcloud:
image: lscr.io/linuxserver/nextcloud:latest
container_name: nextcloud
environment:
- PUID=568
- PGID=568
- TZ=Europe/London
volumes:
- /mnt/fast/nextcloud/config:/config
- /mnt/fast/nextcloud/data:/data
ports:
- 4443:443
restart: unless-stopped
Nginx Proxy Manager
services:
proxy:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy
network_mode: bridge
restart: always
environment:
- PUID=568
- PGID=568
- TZ=Europe/London
ports:
- 8081:81
- 8443:443
volumes:
- /mnt/fast/nginx/data:/data
- /mnt/fast/nginx/letsencrypt:/etc/letsencrypt
ddns:
image: favonia/cloudflare-ddns:latest
container_name: cloudflare-ddns
restart: always
read_only: true
cap_drop: [all]
security_opt: [no-new-privileges:true]
environment:
- CLOUDFLARE_API_TOKEN=GET_THIS_FROM_YOUR_CLOUDFLARE_ACCOUNT
- DOMAINS=lekat.uk,auth.lekat.uk
- PROXIED=true
- IP6_PROVIDER=none
Pihole
networks:
dns_net:
driver: bridge
ipam:
config:
- subnet: 172.16.8.0/24
services:
pihole:
container_name: pihole
hostname: pihole
image: pihole/pihole:latest
networks:
dns_net:
ipv4_address: 172.16.8.7
ports:
- 53:53/tcp
- 53:53/udp
- 81:80/tcp
environment:
TZ: Europe/London
WEBPASSWORD: STRONG_PASSWORD
PIHOLE_DNS_: 172.16.8.8#5053
volumes:
- /mnt/fast/pihole:/etc/pihole
- /mnt/fast/pihole/dnsmasq.d:/etc/dnsmasq.d
restart: unless-stopped
unbound:
container_name: unbound
image: mvance/unbound:latest
networks:
dns_net:
ipv4_address: 172.16.8.8
volumes:
- /mnt/fast/pihole/unbound:/opt/unbound/etc/unbound
ports:
- 5053:53/tcp
- 5053:53/udp
healthcheck:
test: ["NONE"]
restart: unless-stopped
I edited the unbound.conf
to remove the zone configurations.
###########################################################################
# FORWARD ZONE
###########################################################################
#include: /opt/unbound/etc/unbound/forward-records.conf
###########################################################################
# LOCAL ZONE
###########################################################################
# Include file for local-data and local-data-ptr
#include: /opt/unbound/etc/unbound/a-records.conf
#include: /opt/unbound/etc/unbound/srv-records.conf
###########################################################################
# WILDCARD INCLUDE
###########################################################################
#include: "/opt/unbound/etc/unbound/*.conf"
PostgreSQL
services:
db:
container_name: postgresql
image: postgres:17.2-bullseye
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=STRONG_PASSWORD
ports:
- 5432:5432
restart: always
volumes:
- /mnt/fast/postgres17:/var/lib/postgresql/data
command: >-
bash -c "apt-get update &&
apt-get install -y postgresql-17-pgvector &&
docker-entrypoint.sh postgres
-c shared_preload_libraries=vector
-c 'search_path=\"$$user\",public,vectors'
-c logging_collector=on
-c max_wal_size=2GB
-c shared_buffers=512MB
-c wal_compression=on"
Trilium
services:
trilium:
container_name: trilium
image: triliumnext/notes:v0.90.4
restart: always
environment:
- TRILIUM_DATA_DIR=/home/node/trilium-data
- USER_GID=1000
ports:
- 8082:8080
volumes:
- /mnt/fast/trilium/notes:/home/node/trilium-data