Add README.me
This commit is contained in:
105
README.me
Normal file
105
README.me
Normal file
@@ -0,0 +1,105 @@
|
||||
# Self-Hosted Git Service – Public Architecture
|
||||
|
||||
## Overview
|
||||
|
||||
A self-hosted Gitea instance running on a home server, made publicly accessible via a cheap VPS (1 vCPU, 1 GB RAM, 10 GB SSD) acting as a secure entry point.
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Internet
|
||||
│
|
||||
▼
|
||||
┌─────────────────────┐
|
||||
│ VPS (Debian) │
|
||||
│ Public IPv4 │
|
||||
│ │
|
||||
│ WireGuard Tunnel │
|
||||
│ iptables NAT │
|
||||
│ (Port 80/443 →) │
|
||||
└─────────┬───────────┘
|
||||
│
|
||||
WireGuard Tunnel
|
||||
(encrypted, UDP)
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────────┐
|
||||
│ Home Network │
|
||||
│ │
|
||||
│ ┌─────────────────────────┐ │
|
||||
│ │ LXC: Reverse Proxy │ │
|
||||
│ │ │ │
|
||||
│ │ Caddy │ │
|
||||
│ │ - Auto TLS (Let's Enc.) │ │
|
||||
│ │ - Reverse Proxy → Gitea │ │
|
||||
│ └────────────┬────────────┘ │
|
||||
│ │ │
|
||||
│ LAN Bridge │
|
||||
│ │ │
|
||||
│ ┌────────────▼────────────┐ │
|
||||
│ │ LXC: Gitea │ │
|
||||
│ │ │ │
|
||||
│ │ Git Hosting (HTTPS) │ │
|
||||
│ │ Web UI + API │ │
|
||||
│ └─────────────────────────┘ │
|
||||
│ │
|
||||
│ Proxmox VE Host │
|
||||
└───────────────────────────────┘
|
||||
```
|
||||
|
||||
## Traffic Flow
|
||||
|
||||
1. User visits `https://git.example.com`
|
||||
2. DNS resolves to VPS public IP
|
||||
3. VPS forwards port 80/443 through WireGuard tunnel via iptables NAT
|
||||
4. Caddy (in LXC) terminates TLS with auto-provisioned Let's Encrypt certificate
|
||||
5. Caddy reverse-proxies request to Gitea (LXC) over LAN
|
||||
6. Gitea serves the response back through the same path
|
||||
|
||||
## Components
|
||||
|
||||
| Component | Role | Environment |
|
||||
|-----------|------|-------------|
|
||||
| VPS (1€/month) | Public entry point, WireGuard endpoint, port forwarding | Debian, cloud-hosted |
|
||||
| WireGuard | Encrypted site-to-site tunnel between VPS and home network | Both sides |
|
||||
| Caddy | Reverse proxy with automatic HTTPS (Let's Encrypt) | LXC on Proxmox |
|
||||
| Gitea | Self-hosted Git service (web UI, API, HTTPS clone) | LXC on Proxmox |
|
||||
| Proxmox VE | Hypervisor managing all local containers | Bare-metal, home server |
|
||||
|
||||
## Design Decisions
|
||||
|
||||
**WireGuard over Tailscale/Headscale**
|
||||
Only two endpoints with a fixed public IP on the VPS side – a simple point-to-point WireGuard tunnel is sufficient. No need for mesh networking, NAT traversal, or a coordination server. Tailscale/Headscale can be added later if the setup grows.
|
||||
|
||||
**Caddy over NGINX**
|
||||
Caddy provides automatic TLS certificate provisioning and renewal with zero configuration. The entire reverse proxy config is 6 lines.
|
||||
|
||||
**Reverse Proxy in separate LXC**
|
||||
Keeps the proxy isolated from both the hypervisor and the application. Adding new services only requires editing the Caddyfile – no changes to the VPS or tunnel needed.
|
||||
|
||||
**TLS termination at home, not on VPS**
|
||||
The VPS only forwards encrypted traffic. TLS is terminated by Caddy in the home network, keeping certificate management local and the VPS stateless.
|
||||
|
||||
## Extensibility
|
||||
|
||||
Adding a new public service requires three steps:
|
||||
|
||||
1. Deploy the service on Proxmox (VM or LXC)
|
||||
2. Add a DNS A-record pointing to the VPS
|
||||
3. Add a `reverse_proxy` block to the Caddyfile:
|
||||
```
|
||||
newservice.example.com {
|
||||
reverse_proxy <local-ip>:<port>
|
||||
}
|
||||
```
|
||||
|
||||
No changes to the VPS, tunnel, or firewall needed.
|
||||
|
||||
## Security
|
||||
|
||||
- VPS has no application logic – it only forwards traffic
|
||||
- WireGuard provides authenticated, encrypted communication between sites
|
||||
- TLS certificates are automatically managed by Caddy (Let's Encrypt)
|
||||
- Gitea is not directly exposed to the internet
|
||||
- SSH hardened: key-only authentication, no root login
|
||||
- VPS firewall managed at provider level (only SSH, HTTP, HTTPS, WireGuard open)
|
||||
Reference in New Issue
Block a user