Files
homelab/docs/services.md
Arpad Krejczinger c842b4a398 Streamline AI docs, add skills, enforce symlink-everything policy
- Add .claude/skills/: homelab-context (auto-loads key facts each session),
  homelab-status (/homelab-status command), deploy-config (symlink setup guide)
- Remove AGENTS.md and ai/sessions/: superseded by plan mode + skill system
- Remove 4 obsolete session commands (session-start/list/switch, reload-instructions)
- Rewrite CLAUDE.md: remove duplicate content, enforce symlink policy, clarify sudo pattern
- Trim docs/services.md from 946 to ~230 lines: remove planning-era content,
  keep install steps and current status for migration reference
- Strip stale "sudo cp" deploy header from ssh-honeypot.service (now symlinked to repo)
- Update TODO.md: mark NAS migration and symlink tasks done, add jellyfin upgrade warning
2026-03-01 23:45:18 +01:00

6.3 KiB

Services & Applications

Reference for all self-hosted services. Useful for troubleshooting and migrating to a new machine.

Nginx Reverse Proxy

Status: Active | Config: config/nginx/homelab.conf/etc/nginx/sites-available/homelab (symlinked)

Features

  • Path-based routing (/gitea/, /files/, /media/, /netdata/, /portainer/)
  • SSL termination with Let's Encrypt (auto-renewal via certbot timer)
  • WebDAV support for Copyparty
  • HTTP → HTTPS redirect
  • Security headers

Management

sudo nginx -t                        # Test config
sudo systemctl reload nginx          # Reload (or restart for major changes)
sudo journalctl -u nginx -f          # Logs

New Machine Setup

sudo pacman -S nginx certbot certbot-nginx
sudo mkdir -p /etc/nginx/sites-available /etc/nginx/sites-enabled
sudo ln -s /home/hoborg/homelab/config/nginx/homelab.conf /etc/nginx/sites-available/homelab
sudo ln -s /etc/nginx/sites-available/homelab /etc/nginx/sites-enabled/homelab
sudo certbot --nginx -d ak-homelab.duckdns.org
sudo systemctl enable --now certbot-renew.timer

Gitea (Git Server)

Status: Running | Docker: /opt/docker/gitea/ | Data: /mnt/nas/docker-data/gitea/data

Management

cd /opt/docker/gitea
docker compose logs -f gitea
docker compose restart
docker compose pull && docker compose up -d   # Update

New Machine Setup

sudo mkdir -p /opt/docker/gitea
sudo ln -s /home/hoborg/homelab/config/docker/gitea/docker-compose.yml /opt/docker/gitea/docker-compose.yml
cd /opt/docker/gitea && docker compose up -d

Copyparty (File Server / WebDAV)

Status: Running | Type: systemd | Config: config/systemd/copyparty.service (symlinked)

Volumes

/shared     → /home/hoborg/shared       (guest: rw, hoborg: rwmd)
/documents  → /home/hoborg/Documents    (hoborg: rwmd)
/music      → /home/hoborg/Music        (guest: rw, hoborg: rwmd)
/videos     → /home/hoborg/Videos       (guest: rw, hoborg: rwmd)
/pictures   → /home/hoborg/Pictures     (guest: rw, hoborg: rwmd)
/private    → /home/hoborg/private      (hoborg only: rwmd)

Management

sudo systemctl status copyparty
sudo systemctl restart copyparty
journalctl -fu copyparty

WebDAV Clients

  • X-plore (Android): Server ak-homelab.duckdns.org, Path /files/shared/, Port 443, HTTPS
  • rclone: rclone config create homelab-webdav webdav url=https://ak-homelab.duckdns.org/files/ vendor=other user=hoborg

New Machine Setup

sudo pacman -S copyparty
sudo ln -s /home/hoborg/homelab/config/systemd/copyparty.service /etc/systemd/system/copyparty.service
sudo systemctl daemon-reload && sudo systemctl enable --now copyparty

Jellyfin (Media Server)

Status: Running | Docker: /opt/docker/jellyfin/

Media Library Paths (inside container)

/media/music    → /home/hoborg/Music
/media/videos   → /home/hoborg/Videos
/media/pictures → /home/hoborg/Pictures
/media/shared   → /home/hoborg/shared
/media/private  → /home/hoborg/private

Management

cd /opt/docker/jellyfin
docker compose logs -f jellyfin
docker compose restart
docker compose pull && docker compose up -d   # Update

⚠️ Upgrade Warning

v10.11+ performs a major EF Core DB migration (library.dbjellyfin.db). Known to hang at "Saving BaseItem entries". Always back up the Jellyfin data volume before upgrading.

New Machine Setup

sudo mkdir -p /opt/docker/jellyfin
sudo ln -s /home/hoborg/homelab/config/docker/jellyfin/docker-compose.yml /opt/docker/jellyfin/docker-compose.yml
cd /opt/docker/jellyfin && docker compose up -d
# Visit http://localhost:8096 for setup wizard

Nextcloud (Cloud Storage)

Status: Running | Docker: /opt/docker/nextcloud/ | Data: /mnt/nas/docker-data/nextcloud/

Management

cd /opt/docker/nextcloud
docker compose logs -f
docker compose restart

New Machine Setup

sudo mkdir -p /opt/docker/nextcloud
sudo ln -s /home/hoborg/homelab/config/docker/nextcloud/docker-compose.yml /opt/docker/nextcloud/docker-compose.yml
cd /opt/docker/nextcloud && docker compose up -d

Portainer (Docker Management)

Status: Running | Docker: /opt/docker/portainer/

Management

cd /opt/docker/portainer && docker compose restart

Netdata (System Monitoring)

Status: Running | Docker: /opt/docker/netdata/


qBittorrent

Status: Running | Docker: /opt/docker/qbittorrent/


SSL Certificates

Status: Auto-renewal active

# Manual renewal test
sudo certbot renew --dry-run

# Check timer
sudo systemctl status certbot-renew.timer
journalctl -u certbot-renew.service
  • Cert: /etc/letsencrypt/live/ak-homelab.duckdns.org/fullchain.pem
  • Key: /etc/letsencrypt/live/ak-homelab.duckdns.org/privkey.pem
  • Renewal: Every 90 days via systemd timer

Landing Page

Config: config/www/index.html/var/www/homelab/index.html (symlinked)

Edit the file in the repo — changes are live immediately (no restart needed).


Troubleshooting

See docs/troubleshooting/ for specific issues. Common checks:

# All containers running?
docker ps

# Nginx config valid?
sudo nginx -t

# NAS mounted?
mountpoint /mnt/nas

# Service logs
journalctl -fu <service>
docker compose -f /opt/docker/<service>/docker-compose.yml logs -f