Selfhost Stack
I have been interested in selfhosting for a long time, and recently bought a GMKtec G3 Plus for my homelab which has helped me scratch that itch
Setup
I use Proxmox VE for my main host. Which I access through a wireguard tunnel using Tailscale . Since I already own some domains I use cloudflare to access my tailscale setup for cleaner domains, like bitwarden.domain.tld
Stack
- Caddy (Alpine Linux): Reverse Proxy
- Vaultwarden (Alpine Linux): Password Manager
- Immich: Media backup and hosting
- Alpine IT Tools : Collection of handy dev tools
- silverbullet : Markdown based note taking app
- degoog : Search Engine
- Navidrome: Selfhosted Music
- Jellyfin: Media Streaming software
- kanban (I made this): Kanban Board
- iSponsorBlockTV: SponsorBlock for Smart TV
I have been really happy with most things, especially silverbullet and degoog. Most things just work, use community scripts and 💥 everything works. But there have been some services which were a headache to work with.
Reviews
1. silverbullet
Silverbullet has been the best addition to my workflow. I have never been a note-taker but silverbullet has helped me get started. Its pretty versatile and programmable, although I have only keep it vanilla since it works for my workflow
2. Alpine IT Tools
Pretty handy toolset, some are not necessarily dev tools. Overall, love it
3. degoog
Its pretty fast and configurable. This feels like the only selfhosted search engine worth installing. This is one of the only search engine with shimmer animation for loading and not just freezes until search has been done. I have tried SearXNG and omni
4. Jellyfin
I loved using jellyfin, it gives a sense of ownership, but… I do not consume that much media 😅, I mostly watch anime. Movies and shows are a rarity, maybe an annual occurance.
5. Caddy
Hate it, its probably the most tidious task of my selfhosting journey. It is the only service for which I had to setup scripts, cron jobs and what not. Following script is used for updating IP based on container ID:
# update_caddy.sh
#!/bin/bash
# Configuration
MAP_FILE="/root/caddy_map.txt"
CADDY_CT_ID="100"
ENV_FILE_PATH="/etc/conf.d/caddy"
while IFS=':' read -r ct_id last_octet var_prefix; do
# Get current IPv4 for the CT
current_ip=$(lxc-info -n "$ct_id" -iH | grep 192)
if [ -n "$current_ip" ]; then
echo "Updating $var_prefix to $current_ip..."
# Updates the IP address while preserving the protocol (http/https)
# It looks for lines starting with 'export VAR_PREFIX_IP='
/usr/sbin/pct exec $CADDY_CT_ID -- sed -i "s|^\(export ${var_prefix}_IP=https\{0,1\}://\)[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}|\1$current_ip|g" $ENV_FILE_PATH
else
echo "Could not find IP for CT $ct_id"
fi
done < "$MAP_FILE"
/usr/sbin/pct reboot $CADDY_CT_ID
This is what the caddy_map looks like:
# caddy_map.txt
101:13:IMMICH
102:24:BULLET
103:14:VAULT
104:29:TOOLS
105:21:KANBAN
106:30:SEARCH
111:24:JELLY
This is my first ever writing experience. It feels like my structuring has been all over the place and there was no continuation. But I had to start somewhere, writing has been on my TODO for a long time and I just kept avoiding it.