Update README.md

This commit is contained in:
Manohar Gupta 2026-05-29 13:25:41 +00:00
parent 723e724e0a
commit 5eb134ffa8

View file

@ -1,39 +1,32 @@
# Manohar's Infrastructure # Manohar's Infrastructure
Self-hosted stack on Hetzner CX32 (Helsinki), deployed via Dokploy + Traefik. Self-hosted stack on Hetzner CX32 (Helsinki), deployed via Dokploy + Traefik.
## Services ## Services
App URL Purpose | App | URL | Purpose |
Forgejo <https://git.manohargupta.com> Self-hosted Git |---|---|---|
| Forgejo | https://git.manohargupta.com | Self-hosted Git |
n8n <https://automate.manohargupta.com> Workflow automation | n8n | https://automate.manohargupta.com | Workflow automation |
| Apprise | https://notify.manohargupta.com | Notification API (Tailscale only) |
Apprise <https://notify.manohargupta.com> Notification API (Tailscale only) | Miniflux | https://feeds.manohargupta.com | RSS reader |
| ChangeDetection | https://watch.manohargupta.com | Webpage change monitor |
Miniflux <https://feeds.manohargupta.com> RSS reader | Paperless-ngx | https://docs.manohargupta.com | Document OCR + search |
| Tiger Agent | https://agent.manohargupta.com | AI orchestration |
ChangeDetection <https://watch.manohargupta.com> Webpage change monitor | Dokploy | https://dokploy.manohargupta.com | Docker orchestration |
| Uptime Kuma | https://status.manohargupta.com | Monitoring |
Paperless-ngx <https://docs.manohargupta.com> Document OCR + search | Umami | https://analytics.manohargupta.com | Web analytics |
Tiger Agent <https://agent.manohargupta.com> AI orchestration
Dokploy <https://dokploy.manohargupta.com> Docker orchestration
Uptime Kuma <https://status.manohargupta.com> Monitoring
Umami <https://analytics.manohargupta.com>Web analytics
## Stack ## Stack
- **Server**: Hetzner CX32, Ubuntu 24.04, Helsinki (hel1) - **Server**: Hetzner CX32, Ubuntu 24.04, Helsinki (hel1)
- **Orchestration**: Dokploy (Docker Swarm) - **Orchestration**: Dokploy (Docker Swarm)
- **Reverse proxy**: Traefik with Let's Encrypt TLS - **Reverse proxy**: Traefik with Let's Encrypt TLS
- **Access**: Tailscale SSH only (`ssh root@manohar-ubuntu`) - **Access**: Tailscale SSH only `ssh root@manohar-ubuntu`
- **DNS**: Namecheap → [manohargupta.com](http://manohargupta.com) - **DNS**: Namecheap → [manohargupta.com](http://manohargupta.com)
## Deployment notes ## Deployment Notes
- All compose files are in `deployments/` - All compose files are in `deployments/`
- Every compose declares `dokploy-network` as `external: true` - Every compose declares `dokploy-network` as `external: true`
@ -41,9 +34,9 @@ Umami <https://analytics.manohargupta.com>Web analytics
- Secrets set in Dokploy Env tab, never hardcoded (except bcrypt hashes in labels which Dokploy cannot substitute) - Secrets set in Dokploy Env tab, never hardcoded (except bcrypt hashes in labels which Dokploy cannot substitute)
- Apprise and ChangeDetection restricted to Tailscale CGNAT range (100.64.0.0/10) - Apprise and ChangeDetection restricted to Tailscale CGNAT range (100.64.0.0/10)
## Key learnings ## Key Learnings
- Forgejo Docker image uses /data as root, not /var/lib/gitea - Forgejo Docker image uses /data as root, not /var/lib/gitea
- n8n WEBHOOK_URL must match public domain exactly or webhook URLs are wrong - n8n WEBHOOK_URL must match public domain exactly or webhook URLs are wrong
- htpasswd hashes in Traefik labels need $$ escaping (Compose interpolates single $) - htpasswd hashes in Traefik labels need $$ escaping (Compose interpolates single $)
- Dokploy env var substitution works in environment: blocks but NOT in labels: - Dokploy env var substitution works in environment: blocks but NOT in labels: