# Εγκατάσταση του Caddy reverse proxy σε LXC container στο Proxmox.

Παρακάτω θα σου δείξω **αναλυτικά βήμα προς βήμα** πώς να εγκαταστήσεις το **Caddy reverse proxy** σε **LXC container** στο **Proxmox**, καθώς και πώς να προσθέτεις domains με παραδείγματα.

### 🚀 Λήψη και εκτέλεση σε μία γραμμή

```bash
apt update && apt install -y curl && clear && curl -s https://docs.greenhome.stream/attachments/39 | bash
```

OR

```bash
apt update && apt install -y wget && clear && wget -q https://docs.greenhome.stream/attachments/39 && bash caddy-install.sh && rm -f caddy-install.sh
```

---

### ✅ ΠΡΟΫΠΟΘΕΣΕΙΣ

1. Έχεις ένα **Proxmox server** σε λειτουργία.
2. Έχεις (ή θα δημιουργήσεις) ένα **LXC container** με **Debian 11 ή 12** (ή Ubuntu).
3. Έχεις **κατοχυρωμένο domain name** και δυνατότητα να προσθέτεις/αλλάζεις **A records**.
4. Έχεις **εξωτερική IP** ή κάνεις port forwarding σε router.
5. Ο LXC container έχει **δικαιώματα internet** και δυνατότητα να κάνει **bind σε ports 80/443**.

---

#### 🔧 ΜΕΡΟΣ 1: Δημιουργία LXC Container για Caddy

##### Βήμα 1: Δημιουργία LXC Container από GUI

- Άνοιξε το Proxmox GUI.
- Πήγαινε **Create CT**.
- Συμπλήρωσε:
    
    
    - **Hostname**: `caddy`
    - **Template**: `Debian 12` (ή 11)
    - **Disk Size**: π.χ. 4GB
    - **CPU/RAM**: 1 core / 512MB RAM
    - **Network**: NAT ή bridged, ανάλογα τη ρύθμιση σου.
- **Enable nesting** (σημαντικό!):
    
    
    - Μετά τη δημιουργία, πήγαινε στο `Options > Features > Nesting` και ενεργοποίησέ το.

---

#### 🧰 ΜΕΡΟΣ 2: Εγκατάσταση του Caddy

Μπαίνουμε στο container:

```bash
pct enter <CTID>  # π.χ. pct enter 103
```

Ενημερώνουμε το σύστημα:

```bash
apt update && apt upgrade -y
```

##### Βήμα 2: Εγκατάσταση του Caddy (από το επίσημο repo)

```bash
apt install -y debian-keyring debian-archive-keyring curl
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-archive-keyring.gpg

curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | \
tee /etc/apt/sources.list.d/caddy-stable.list

apt update
apt install caddy -y
```

Επιβεβαίωση εγκατάστασης:

```bash
caddy version
```

---

#### 🚀 ΜΕΡΟΣ 3: Παραμετροποίηση Reverse Proxy

Η κύρια ρύθμιση του Caddy γίνεται μέσω του `Caddyfile`.

Ο Caddyfile βρίσκεται συνήθως εδώ:

```bash
/etc/caddy/Caddyfile
```

---

#### 🔄 ΠΑΡΑΔΕΙΓΜΑ Reverse Proxy για ένα domain

Έστω ότι έχεις το domain:

```text
example.com → δείχνει στην IP του Proxmox server σου
```

Και έχεις ένα web service π.χ. ένα container/VM με IP `192.168.100.50` που ακούει στο port `8080`.

##### Βήμα 1: Αλλαγή Caddyfile

Άνοιξε το αρχείο:

```bash
nano /etc/caddy/Caddyfile
```

Προσθέτεις:

```json
example.com {
    reverse_proxy 192.168.100.50:8080
}
```

Ο Caddy θα:

- Ακούει στο `example.com` (στο port 80/443).
- Θα πάρει αυτόματα SSL certificate μέσω Let's Encrypt.
- Θα κάνει reverse proxy στο 192.168.100.50:8080.

---

##### Βήμα 2: Επανεκκίνηση Caddy

```bash
systemctl restart caddy
```

Έλεγξε αν τρέχει σωστά:

```bash
systemctl status caddy
```

---

#### 🌐 ΡΥΘΜΙΣΕΙΣ DNS

Για να δουλέψει το παραπάνω:

- Πήγαινε στον DNS provider σου (Cloudflare, Namecheap, GoDaddy, κ.λπ.).
- Πρόσθεσε **A Record**:
    
    
    - Name: `@`
    - Type: `A`
    - Value: `η δημόσια IP του Proxmox server`

Αν έχεις το Caddy πίσω από router, σιγουρέψου ότι έχεις κάνει **port forwarding** για:

- TCP 80 → στον LXC container (ή στο Proxmox αν bridged)
- TCP 443 → το ίδιο

---

### ➕ ΠΩΣ ΠΡΟΣΘΕΤΩ ΝΕΟ DOMAIN (ή subdomain)

Απλά προσθέτεις νέο block στο `Caddyfile`.

### Παράδειγμα:

```json
example.com {
    reverse_proxy 192.168.100.50:8080
}

blog.example.com {
    reverse_proxy 192.168.100.51:8080
}

nextcloud.mydomain.com {
    reverse_proxy 192.168.100.52:443
    tls your@email.com
    header {
        Strict-Transport-Security "max-age=31536000;"
    }
}
```

Και πάλι κάνεις:

```bash
systemctl reload caddy
```

ή

```bash
caddy reload --config /etc/caddy/Caddyfile
```

---

#### 🛠 ΧΡΗΣΙΜΕΣ ΕΝΤΟΛΕΣ

<table id="bkmrk-%CE%95%CE%BD%CF%84%CE%BF%CE%BB%CE%AE-%CE%A0%CE%B5%CF%81%CE%B9%CE%B3%CF%81%CE%B1%CF%86%CE%AE-cad"><thead><tr><th>Εντολή</th><th>Περιγραφή</th></tr></thead><tbody><tr><td>`caddy reload`</td><td>Φορτώνει νέο Caddyfile χωρίς restart</td></tr><tr><td>`caddy validate --config /etc/caddy/Caddyfile`</td><td>Ελέγχει για λάθη</td></tr><tr><td>`journalctl -u caddy -f`</td><td>Logs σε πραγματικό χρόνο</td></tr><tr><td>`caddy list-modules`</td><td>Λίστα ενεργών modules</td></tr></tbody></table>

---

#### ⚠️ ΣΥΧΝΑ ΠΡΟΒΛΗΜΑΤΑ

<table id="bkmrk-%CE%A0%CF%81%CF%8C%CE%B2%CE%BB%CE%B7%CE%BC%CE%B1-%CE%9B%CF%8D%CF%83%CE%B7-%22caddy"><thead><tr><th>Πρόβλημα</th><th>Λύση</th></tr></thead><tbody><tr><td>"Caddy failed to obtain certificate"</td><td>DNS record δεν δείχνει σωστά ή port 80/443 μπλοκάρονται</td></tr><tr><td>"permission denied on port 80/443"</td><td>Ο LXC container δεν έχει capabilities (λύση παρακάτω)</td></tr></tbody></table>

---

#### 🔓 LXC: Δικαιώματα για ports 80/443

Αν έχεις πρόβλημα με το binding σε port 80/443, κάνε edit το LXC config:

```bash
nano /etc/pve/lxc/103.conf
```

Πρόσθεσε:

```text
lxc.cap.drop:
lxc.apparmor.profile: unconfined
lxc.cgroup2.devices.allow: a
```

---

#### 📦 Extra: Dynamic reverse proxy (wildcard domains)

Αν θέλεις να έχεις wildcard υποστήριξη (π.χ. `*.example.com`), μπορείς:

```json
*.example.com {
    reverse_proxy 192.168.100.100:8080
}
```

Για wildcard SSL από Let’s Encrypt, χρειάζεται DNS plugin (π.χ. Cloudflare API).

---

### ✅ ΤΕΛΙΚΗ ΕΠΙΣΚΟΠΗΣΗ

<table id="bkmrk-%CE%A3%CF%84%CE%BF%CE%B9%CF%87%CE%B5%CE%AF%CE%BF-%CE%A0%CE%B5%CF%81%CE%B9%CE%B3%CF%81%CE%B1%CF%86%CE%AE-c"><thead><tr><th>Στοιχείο</th><th>Περιγραφή</th></tr></thead><tbody><tr><td>Caddy εγκατάσταση</td><td>`apt install caddy` από επίσημο repo</td></tr><tr><td>Reverse Proxy</td><td>Μέσα από `/etc/caddy/Caddyfile`</td></tr><tr><td>SSL</td><td>Αυτόματα από Let's Encrypt</td></tr><tr><td>Domains</td><td>Προσθήκη A records και blocks στο Caddyfile</td></tr><tr><td>Port Binding</td><td>Ίσως χρειαστεί `unconfined` LXC profile</td></tr></tbody></table>

---

<span style="color: rgb(224, 62, 45);">**Ins0mniA**</span>