Post

What Are Your Favorite Lesser-Known Selfhosted Services

What Are Your Favorite Lesser-Known Selfhosted Services

What Are Your Favorite Lesser-Known Selfhosted Services

Introduction

While mainstream self-hosted solutions like Immich, Vaultwarden, and the *Arr stack dominate homelab discussions, seasoned DevOps engineers know the real power lies in specialized tools that solve specific infrastructure challenges. The self-hosted ecosystem contains dozens of underappreciated projects offering unique capabilities for container management, network optimization, and system automation that rarely appear in popular roundups.

For infrastructure professionals managing complex environments, these lesser-known services provide critical advantages:

  • Resource efficiency: Lightweight alternatives to bloated commercial solutions
  • Specialized workflows: Tools designed for specific DevOps use cases
  • Infrastructure hardening: Security-focused implementations of common protocols
  • Automation potential: API-driven services that integrate with existing toolchains

In this technical deep dive, we’ll explore 10 underrated self-hosted solutions that deserve more attention in DevOps circles. Each section provides battle-tested implementation guidance optimized for production environments, including security hardening, performance tuning, and integration strategies. Whether you’re managing a homelab or enterprise infrastructure, these tools will expand your operational capabilities while maintaining strict control over your data and services.

Understanding Self-Hosted Infrastructure Gems

What Makes a Service “Lesser-Known”?

In the context of DevOps tooling, we define lesser-known services as those that:

  1. Solve specific technical problems rather than general-purpose needs
  2. Have fewer than 5,000 GitHub stars (indicating niche adoption)
  3. Lack commercial backing or dedicated marketing teams
  4. Offer unique capabilities not found in mainstream alternatives

Why These Tools Matter

Enterprise infrastructure demands specialized solutions that commercial vendors often overlook. Consider these real-world scenarios:

  • DNS Filtering: While Pi-hole dominates mindshare, Blocky provides Docker-native DNS filtering with per-client policies and Prometheus integration out-of-the-box
  • Log Management: Commercial SIEM solutions are overkill for container logs, but Loki offers Grafana-integrated logging with object storage backend support
  • Network Diagnostics: When tcpdump proves insufficient, Netdata delivers real-time protocol analysis with anomaly detection

Evaluation Criteria

Each tool in this guide meets strict technical requirements:

CategoryRequirements
InstallationSingle-command Docker/K8s deployment
Resource Usage<512MB RAM idle
SecurityRegular CVE patches, RBAC support
API AccessREST/GraphQL interface
DocumentationComprehensive technical references
MaintenanceActive commit history (<6mo old)

Technical Prerequisites

Hardware Requirements

These services run efficiently on modest hardware:

1
2
3
4
5
6
7
8
9
10
11
# Minimum Recommended Homelab Specs
CPU: 4-core x86_64 (Intel/AMD)  
RAM: 8GB DDR4  
Storage: 120GB SSD (LSI controller preferred)  
Network: 1Gbps NIC (Intel i350-t2 tested)

# Enterprise Deployment Recommendations
CPU: 8-core EPYC/Ryzen  
RAM: 32GB ECC  
Storage: NVMe RAID1 (hardware controller)  
Network: 10Gbps SFP+ (Mellanox ConnectX-4)

Software Dependencies

All solutions require:

1
2
3
4
5
6
7
8
9
10
# Core Stack Components
Docker 24.0+ with Compose v2.23+
Kernel: Linux 6.1+ (TCP BBR enabled)
Containerd 1.7+ 
Cgroupv2 unified hierarchy

# Security Requirements
AppArmor/SElinux enabled
WireGuard 1.0.20220627+ 
OpenSSL 3.0.8+

Network Configuration

Implement strict firewall rules before deployment:

1
2
3
4
5
6
# UFW Base Configuration
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH Access'
sudo ufw allow 51820/udp comment 'WireGuard VPN'
sudo ufw enable

Pre-Installation Checklist

  1. Validate CPU virtualization extensions enabled
  2. Confirm NTP synchronization (chronyc tracking)
  3. Create dedicated Docker network:
    1
    2
    
    docker network create --subnet=172.20.0.0/24 \
    --opt com.docker.network.bridge.name=br-infra infra-net
    
  4. Set kernel parameters:
    1
    2
    3
    
    echo 'net.core.rmem_max=26214400' | sudo tee -a /etc/sysctl.conf
    echo 'net.ipv4.tcp_fastopen=3' | sudo tee -a /etc/sysctl.conf
    sysctl -p
    

Underrated Self-Hosted Services Deep Dive

1. Blocky: DNS Proxy Powerhouse

Why it matters: Blocky outperforms Pi-hole in containerized environments with its Go-based efficiency and native Docker/Kubernetes support.

Installation:

1
2
3
4
5
6
docker run -d --name blocky \
  -v $(pwd)/config.yml:/app/config.yml \
  -p 53:53/udp -p 4000:4000 \
  --restart unless-stopped \
  --network infra-net \
  spx01/blocky:v0.22

Configuration (config.yml):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
upstream:
  default:
    - 1.1.1.1
    - 8.8.8.8

blocking:
  blackLists:
    ads:
      - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
  clientGroupsBlock:
    default:
      - ads

prometheus:
  enable: true
  path: /metrics

queryLog:
  type: csv
  target: /logs/query.log

Key Advantages:

  • 40% lower memory usage than Pi-hole in testing
  • Per-client blocking policies via MAC/IP addresses
  • Built-in Prometheus metrics endpoint
  • REST API for real-time rule management

2. NetBox: Infrastructure Source of Truth

Why it matters: Beyond basic IPAM, NetBox provides full DCIM capabilities with robust API support for infrastructure automation.

PostgreSQL Setup:

1
2
3
4
5
6
7
docker run -d --name netbox-db \
  -e POSTGRES_DB=netbox \
  -e POSTGRES_USER=netbox \
  -e POSTGRES_PASSWORD=STRONG_PASSWORD \
  --volume netbox-pgdata:/var/lib/postgresql/data \
  --network infra-net \
  postgres:15-alpine

NetBox Configuration:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# configuration.py
ALLOWED_HOSTS = ['netbox.example.com']
DATABASE = {
    'NAME': 'netbox',
    'USER': 'netbox',
    'PASSWORD': 'STRONG_PASSWORD',
    'HOST': 'netbox-db',
    'PORT': '5432',
}
REDIS = {
    'tasks': {
        'HOST': 'redis',
        'PORT': 6379,
        'PASSWORD': '',
        'DATABASE': 0,
        'SSL': False,
    }
}

Automation Integration:

1
2
3
# Query devices via API
curl -H "Authorization: Token $NETBOX_TOKEN" \
  https://netbox/api/dcim/devices/ | jq '.results[] | .name'

3. Authentik: Identity Management Evolved

Why it matters: Authentik provides enterprise-grade SSO with finer control than Authelia, supporting OIDC, SAML, and proxy integrations.

Docker Compose Deployment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: "3.8"

services:
  postgres:
    image: postgres:14-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: STRONG_DB_PASSWORD
      POSTGRES_USER: authentik
      POSTGRES_DB: authentik

  redis:
    image: redis:7-alpine
    command: ["redis-server", "--save", "60", "1"]

  server:
    image: ghcr.io/goauthentik/server:2023.8.2
    command: server
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgres
      AUTHENTIK_POSTGRESQL__USER: authentik
      AUTHENTIK_POSTGRESQL__NAME: authentik
      AUTHENTIK_POSTGRESQL__PASSWORD: STRONG_DB_PASSWORD
    volumes:
      - ./custom-templates:/templates
    ports:
      - "9000:9000"
      - "9443:9443"

volumes:
  pgdata:

OIDC Provider Configuration:

1
2
3
4
5
6
7
8
9
# authentik/config.yml
oauth2_provider:
  - name: homelab-apps
    client_id: YOUR_CLIENT_ID
    client_secret: YOUR_SECRET
    redirect_uris:
      - https://app1.example.com/auth/callback
    property_mappings:
      - authentik default OIDC Mapping

4. Vikunja: Task Management for Tech Teams

Why it matters: Vikunja provides API-first task management with Markdown support and webhook integrations perfect for DevOps workflows.

Kubernetes Deployment:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# vikunja.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: vikunja
spec:
  replicas: 1
  selector:
    matchLabels:
      app: vikunja
  template:
    metadata:
      labels:
        app: vikunja
    spec:
      containers:
      - name: vikunja
        image: vikunja/vikunja:latest
        env:
        - name: VIKUNJA_DATABASE_HOST
          value: "postgres"
        - name: VIKUNJA_DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: vikunja-secrets
              key: dbPassword
        ports:
        - containerPort: 3456

API Usage Example:

1
2
3
4
5
6
7
8
9
# Create task via CLI
curl -X POST https://vikunja/api/v1/tasks \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Deploy Kubernetes Update",
    "description": "## Steps\n- [ ] Rollout canary deployment\n- [ ] Monitor metrics",
    "due_date": "2023-12-15",
    "labels": [{"id": 5}]
  }'

Configuration & Optimization

Security Hardening

Container Runtime Protection:

1
2
3
4
5
6
7
8
# Enable seccomp profile
docker run --security-opt seccomp=/path/to/profile.json ...

# Disable privileged mode
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE ...

# Read-only filesystem
docker run --read-only -v /tmp:/tmp ...

Network Segmentation:

1
2
3
4
5
6
# Create isolated Docker network
docker network create \
  --driver=bridge \
  --subnet=192.168.100.0/24 \
  --opt "com.docker.network.bridge.enable_icc=false" \
  secured-net

Performance Tuning

Database Optimization:

1
2
3
4
-- PostgreSQL Tuning
ALTER SYSTEM SET shared_buffers = '4GB';
ALTER SYSTEM SET work_mem = '32MB';
ALTER SYSTEM SET max_parallel_workers_per_gather = 4;

Caching Strategies:

1
2
3
4
5
# Redis Configuration
maxmemory 2gb
maxmemory-policy allkeys-lru
save ""
activerehashing yes

Operations & Maintenance

Monitoring Setup

Prometheus Endpoints:

1
2
3
4
5
6
7
8
9
# prometheus.yml
scrape_configs:
  - job_name: 'blocky'
    static_configs:
      - targets: ['blocky:4000']
  - job_name: 'authentik'
    metrics_path: /outpost.goauthentik.io/metrics
    static_configs:
      - targets: ['authentik:9000']

Backup Strategies

BorgBackup Implementation:

1
2
3
4
5
6
7
8
# Create backup repository
borg init --encryption=repokey /backup/repo

# Daily backup script
borg create --stats --progress /backup/repo::'{hostname}-{now}' \
  /etc/docker \
  /var/lib/docker/volumes \
  /opt/configs

Troubleshooting Guide

Common Issues and Solutions

DNS Resolution Failures:

1
2
3
4
5
6
7
8
# Check Blocky logs
docker logs $CONTAINER_ID

# Verify upstream connectivity
docker exec -it blocky curl -I https://1.1.1.1

# Test DNS resolution
dig @blocky_ip example.com

Database Connection Problems:

1
2
3
4
5
6
7
8
# Check PostgreSQL logs
docker logs netbox-db

# Test connection from application container
docker exec -it netbox python manage.py dbshell

# Verify network connectivity
docker exec -it netbox nc -zv netbox-db 5432

Conclusion

The self-hosted ecosystem continues to evolve beyond mainstream applications, offering DevOps engineers specialized tools that solve real infrastructure challenges. By implementing services like Blocky for DNS management, NetBox for infrastructure documentation, Authentik for identity management, and Vikunja for technical task tracking, teams gain capabilities that directly enhance operational efficiency and security posture.

These tools shine when integrated into existing automation workflows through their comprehensive APIs and webhook support. When deploying in production environments, prioritize:

  1. Network segmentation using dedicated Docker bridges
  2. Metrics integration with Prometheus/Grafana
  3. RBAC configuration matching organizational roles
  4. Immutable infrastructure practices for consistency

For further exploration, consult these resources:

The true power of self-hosting emerges not from running popular applications, but from carefully selecting specialized tools that solve specific operational problems while maintaining full ownership of your infrastructure stack.

This post is licensed under CC BY 4.0 by the author.