translations - Multi Server

This commit is contained in:
ChrispyBacon-dev 2026-03-21 14:21:12 +01:00
parent 99555896cd
commit 4f96eb9aad
9 changed files with 380 additions and 173 deletions

View file

@ -30,44 +30,65 @@ Meischt loufe Master u Redis zäme, während d Agente bi de Workloads platziert
## Voraussetzige
* DockFlare Master ab v3.0 mit konfiguriertem Redis (`REDIS_URL` gsetzt)
* E Cloudflare API-Token mit Tunnel- u Access-Rächt
* E Docker-Runtime uf jedem Host, wo du verwalte wotsch
* Optional es separates Netz oder VPN zwüsche Master u Agent, wänn dr Master nid öffentlich söll sy
* DockFlare Master ab v3.0 mit konfiguriertem Redis (`REDIS_URL` gsetzt). Optional chasch `REDIS_DB_INDEX` aaigäh, zum Daten vo angerne Containere ufem glyche Redis z trenne.
* E Cloudflare API-Token mit Tunnel- u Access-Rächt (glych wie bis anet).
* E Docker-Runtime uf jedem Host, wo du verwalte wotsch.
* Optional es separates Netz oder VPN zwüsche Master u Agent, wänn dr Master nid öffentlich söll sy.
---
## Typische Ablauf
1. I dr DockFlare UI e **Agenten-API-Schlüssu** generiere (`Agents → Generate Key`)
2. Dr **DockFlare-Agent-Container** uf em Zielhost usrolle u Master-URL plus API-Schlüssu übergäh
3. Dr Agent **registriert** sech bim Master u erscheint mit em Status *Pending*
4. I dr Master-UI dr Agent **freischalte** u ihm e Cloudflare-Tunnel zuewyse oder grad e nöie erstelle
5. Dr Master stellt Befähl i d Warteschlange; dr Agent holt si ab, setzt d Konfiguration um u meldet Status u Heartbeat zrügg
6. Wänn uf em Agent-Host Container starte oder stoppe, streamt dr Agent d Ereignis zrügg a dr Master, wo DNS, Access-Richtlinie u Tunnel-Ingress aktualisiert
1. I dr DockFlare UI e **Agenten-API-Schlüssu** generiere (`Agents → Generate Key`).
2. Dr **DockFlare-Agent-Container** uf em Zielhost usrolle u Master-URL plus API-Schlüssu übergäh.
3. Dr Agent **registriert** sech bim Master u erscheint mit em Status *Pending*.
4. I dr Master-UI dr Agent **freischalte** u ihm e Cloudflare-Tunnel zuewyse oder grad e nöie erstelle.
5. Dr Master stellt Befähl i d Warteschlange; dr Agent holt si ab, setzt d Konfiguration um u meldet Status u Heartbeat zrügg. DockFlare erkennt automatisch, weli Zone zu mene Hostname ghört nur wänn d Erkennig scheiteret, wird d Standard-Zone bruucht.
6. Wänn uf em Agent-Host Container starte oder stoppe, streamt dr Agent d Ereignis zrügg a dr Master, wo DNS, Access-Richtlinie u Tunnel-Ingress aktualisiert.
---
## DockFlare Agent deploye
> Dr Agent wird als `alplat/dockflare-agent` publiziert. Solang ds öffentleche Repository no nid online isch, chasch ihn us em `DockFlare-agent`-Source-Tree boue, wo i DockFlare 3.0 drbi isch.
Dr Agent isch uf Docker Hub als `alplat/dockflare-agent:latest` verfüegbar.
Es git zwei Wäg zum Deploye nimm dä, wo zu diner Umgebig passt:
### Option A — Einzeiler-Deploy-Skript (empfohle, opt-in)
Wänn du **Cloudflare Zero Trust** uf em Master konfiguriert hesch (`Agents → Setup Zero Trust`), chasch für jede Agenten-API-Schlüssu e fertig konfiguriertes Bash-Skript generiere la. Ds Skript:
- Prüeft, ob `docker compose` verfüegbar isch
- Erstellt s Docker-Netz `cloudflare-net`, wänn s no nid existiert
- Schribt e `docker-compose.yml` mit aune vier nötige Wärte iibaut (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Startet dr Agent-Stack sofort
So bruuchsch es: Gang uf `Agents → (Schlüssu-Zylu) → Deploy Agent → Quick Deploy`, kopier ds Skript u füeg es i mene SSH-Session uf em Zielserver ii. Kei `.env`-Datei nötig.
> Diese Option setzt voraus, dass d Cloudflare-Zero-Trust-Funktion uf em Master konfiguriert isch. Lueg im Abschnitt [Sicherheitsmodell](#sicherheitsmodell) für meh Details.
### Option B — Manuelle Compose-Konfiguration
Für Umgebige, wo di selber Konfigurationsdateie verwaltisch:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
Minimali `docker-compose.yml` uf em Agent-Host:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -117,9 +138,9 @@ networks:
```
* Führ `docker network create cloudflare-net` einisch uus, zum s gmeinsame Netz für Master u Agente bereitzstelle.
* Dr Socket-Proxy schränkt d Docker-API i uf genau die Fähigkeite, wo dr Agent würklech brucht.
* S Agent-Image louft als unprivilegierte Benutzer `dockflare` (UID/GID 65532). Lueg, dass gemounteti Verzeichnis wie `/app/data` für dä User schriibbar sy, oder bau s Image mit passende UID/GID neu.
* Füll e `.env`-Datei mit `DOCKFLARE_MASTER_URL` u `DOCKFLARE_API_KEY`; optional chasch `LOG_LEVEL` oder `DOCKER_HOST` genau glych überschrybe.
* Dr Socket-Proxy schränkt d Docker-API i uf genau die Fähigkeite, wo dr Agent würklech brucht; nur die, wo uf `1` gsetzt sy, sy zugänglich.
* S Agent-Image louft als unprivilegierte Benutzer `dockflare` (UID/GID 65532). Lueg, dass gemounteti Verzeichnis wie `/app/data` für dä User schriibbar sy.
* Füll e `.env`-Datei mit mindestens `DOCKFLARE_MASTER_URL` u `DOCKFLARE_API_KEY`; alli angerne Variable sy optionali Überschribige.
---
@ -127,16 +148,18 @@ networks:
* **Master API Key** schützt d administrativi API. I dr UI wird er ersch azeigt, wänn du uf *Show master API key* klicksch.
* **Agent API Keys** pro Agent eindeutig. E Widerruef sperrt wiiteri Registrierige u Befähl vo däm Host sofort.
* **Redis** wird für Queue u Cache bruucht; sicher Redis ab, vor allem wänn er usserhalb vo dim vertrouenswürdige Netz lauft.
* **Transport** Betriib dr Master hinder HTTPS, zum Bispil mit Cloudflare Access, damit dr Agent-Traffic verschlüsslet isch.
* **Least-Privilege Runtime** Dr Agent-Container louft als `dockflare`-User (UID/GID 65532) u bruucht e Socket-Proxy, damit dr Docker-Zuegriff uf ds Nötigste beschränkt blybt.
* **Cloudflare Zero Trust Service-Token** *(opt-in)* wänn konfiguriert, erstellt DockFlare e Cloudflare-Access-Aawändig, wo uf `/api/v2/agents/` bschränkt isch, mit mene `non_identity`-Policy. Agente schickle bim jede Aafrag d Häder `CF-Access-Client-Id` u `CF-Access-Client-Secret` mit, wo Cloudflare am Edge validiert, bevor dr Traffic em Master erreichet. Das git ne zwöite Authentifizierigslayer obendruf uf em Agent-API-Key. Dr Admin-Browserzuegriff funktioniert wyterhii über e `bypass`-Policy uf dr glyche App. Aktiviere übers `Agents → Setup Zero Trust`.
* **Redis** wird für Queue u Cache bruucht; sicher Redis ab mit Passwort u Netz-ACLs, vor allem wänn er usserhalb vo mene vertrouenswürdige LAN lauft.
* **Transport** Betriib dr Master hinder HTTPS, zum Bispil mit meme Cloudflare-Tunnel, damit dr Agent-Traffic verschlüsslet isch.
* **Least-Privilege Runtime** Dr Agent-Container louft als `dockflare`-User (UID/GID 65532) u bruucht e Socket-Proxy, damit dr Docker-Zuegriff uf Container-Iisicht u Lifecycle-Steuerig bschränkt blybt.
### Empfohlni Härtig
1. Agent-Keys i mene Vault oder Passwortmanager ufbewahre u regelmässig rotiere
2. Wenn möglich pro Agent e eigete Tunnel bruuche, zum d Privilegie sauber z trenne
3. I dr UI under `Agents` Heartbeat-Lücke beobachte; offline Hosts chöi diräkt entfernt wärde
4. Für d Master-UI lieber OAuth/OIDC oder e guet abgesicherte Passwort-Aamäldig statt riskanti Netzwerch-Abchürzige
1. Agent-Keys i mene Vault oder Passwortmanager ufbewahre u regelmässig rotiere.
2. **Cloudflare Zero Trust** uf em Master aktiviere für en zusätzliche Authentifizierigslayer am Cloudflare-Edge (`Agents → Setup Zero Trust`).
3. **Passwort-Login nid deaktiviere** bruuch lieber OAuth/OIDC-Provider für SSO-Bequemlichkeit ohni Sicherheitsrisiko. Wänn du s Passwort-Login trotzdem deaktiviersch, verstah, dass das e Sicherheitslücke uf Ebene vom Docker-Netz erstellt, wo beliebigi Container uf em glyche Netz d externe Authentifizierig umgah chöi. Lueg [Web UI ufruefe Passwort-Login deaktiviere](Accessing-the-Web-UI.md#disabling-password-login) für d vollständige Sicherheitskonsequänze.
4. Für jede Agent e eigete Tunnel bruuche, zum d Privilegie sauber z trenne.
5. I dr UI under `Agents` Heartbeat-Lücke beobachte; offline Hosts chöi diräkt entfernt wärde.
---
@ -153,8 +176,8 @@ networks:
## Nächschti Schritt
* Lueg dr aktualisiert Schnellstart im README aa, zum sicher z sy, dass Redis sauber iigrichtet isch
* Prüef ds Changelog uf Breaking Changes u Migrationshinwys
* Beobacht ds öffentliche DockFlare-Agent-Repository, sobald es veröffentlecht isch, damit du Releases nid verpassisch
* Lueg dr Schnellstart im Repository-README aa, zum sicher z sy, dass Redis sauber iigrichtet isch.
* Prüef ds Changelog uf Breaking Changes u Migrationshinwys.
* Überleg dr, Cloudflare Zero Trust z aktiviere für e härteti Agent-Authentifizierig (`Agents → Setup Zero Trust`).
Viu Spass bim Tunnelbaue.
Viu Spass bim Tunnelbaue! 🚇

View file

@ -41,7 +41,7 @@ Master und Redis laufen typischerweise zusammen, während Agenten neben Workload
1. **Agenten-API-Schlüssel generieren** in der DockFlare UI (`Agents → Generate Key`).
2. **DockFlare Agent-Container ausrollen** auf dem Remote-Host, wobei Master-URL und Schlüssel übergeben werden.
3. Der Agent **registriert** sich beim Master und erscheint mit dem Status *Ausstehend (Pending)*.
3. Der Agent **registriert** sich beim Master und erscheint mit dem Status *Pending*.
4. In der Master-UI **enrolen Sie den Agenten** (freischalten) weisen Sie ihm einen Cloudflare Tunnel zu oder erstellen Sie einen neuen Tunnel für diesen Host.
5. Der Master reiht Befehle ein; der Agent **ruft diese ab (polls)**, wendet die Konfiguration an und meldet Status/Heartbeat. DockFlare erkennt die Zielzone für jeden Hostnamen automatisch (und fällt nur auf die Standardzone zurück, wenn die Erkennung fehlschlägt).
6. Wenn Container auf dem Host des Agenten gestartet oder gestoppt werden, streamt der Agent Ereignisse an den Master zurück, der wiederum DNS, Zugriffsrichtlinien und Tunnel-Eingangsregeln aktualisiert.
@ -50,24 +50,45 @@ Master und Redis laufen typischerweise zusammen, während Agenten neben Workload
## Bereitstellung des DockFlare Agenten
> Der Agent wird als `alplat/dockflare-agent` veröffentlicht. Solange das öffentliche Repository noch nicht online ist, können Sie ihn aus dem `DockFlare-agent` Source-Tree erstellen, der in DockFlare 3.0 enthalten ist.
Der Agent wird als `alplat/dockflare-agent:latest` auf Docker Hub veröffentlicht.
Es gibt zwei Bereitstellungsmethoden wählen Sie die für Ihr Setup passende:
### Option A Einzeiler-Bereitstellungsskript (empfohlen, Opt-in)
Wenn Sie **Cloudflare Zero Trust** auf dem Master konfiguriert haben (`Agents → Setup Zero Trust`), kann DockFlare für jeden Agenten-API-Schlüssel ein vollständig vorkonfiguriertes Bash-Skript generieren. Das Skript:
- Prüft, ob `docker compose` verfügbar ist
- Erstellt das Docker-Netzwerk `cloudflare-net`, falls es noch nicht existiert
- Schreibt eine `docker-compose.yml` mit allen vier erforderlichen Werten (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Startet den Agenten-Stack sofort
Zur Verwendung: gehen Sie zu `Agents → (Schlüsselzeile) → Deploy Agent → Quick Deploy`, kopieren Sie das Skript und fügen Sie es in eine SSH-Sitzung auf dem Zielserver ein. Es ist keine `.env`-Datei erforderlich.
> Diese Option erfordert, dass das Cloudflare Zero Trust-Feature auf dem Master konfiguriert ist. Details finden Sie im Abschnitt [Sicherheitsmodell](#sicherheitsmodell).
### Option B Manuelle Compose-Konfiguration
Für Umgebungen, in denen Sie Ihre eigenen Konfigurationsdateien verwalten:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
Minimale `docker-compose.yml` auf dem Agenten-Host:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,8 +139,8 @@ networks:
- Führen Sie `docker network create cloudflare-net` einmal aus, um das gemeinsame Netzwerk für Master und Agenten bereitzustellen.
- Der Socket-Proxy begrenzt die Docker-API-Oberfläche, die der Agent erreichen kann; nur die auf `1` gesetzten Fähigkeiten sind erreichbar.
- Das Agenten-Image läuft als der unprivilegierte `dockflare`-Benutzer (UID/GID 65532). Stellen Sie sicher, dass gemountete Verzeichnisse wie `/app/data` von diesem Konto beschrieben werden können, oder erstellen Sie das Image so, dass es Ihren Host-Informationen entspricht.
- Füllen Sie eine `.env`-Datei mit `DOCKFLARE_MASTER_URL` und `DOCKFLARE_API_KEY` aus; optionale Overrides (zum Beispiel `LOG_LEVEL` oder `DOCKER_HOST`) können Sie auf die gleiche Weise setzen.
- Das Agenten-Image läuft als der unprivilegierte `dockflare`-Benutzer (UID/GID 65532). Stellen Sie sicher, dass gemountete Verzeichnisse wie `/app/data` von diesem Konto beschrieben werden können.
- Füllen Sie eine `.env`-Datei mit mindestens `DOCKFLARE_MASTER_URL` und `DOCKFLARE_API_KEY` aus; alle anderen Variablen sind optionale Overrides.
---
@ -127,16 +148,18 @@ networks:
* **Master API Key** schützt die administrative API. Die UI zeigt ihn erst an, nachdem Sie auf *Show master API key* geklickt haben.
* **Agent API Keys** eindeutig pro Agent. Ein Widerruf sperrt sofort weitere Registrierungen und Befehle von diesem Host.
* **Cloudflare Zero Trust Service-Tokens** *(Opt-in)* wenn konfiguriert, erstellt DockFlare eine Cloudflare Access-Anwendung, die auf `/api/v2/agents/` beschränkt ist, mit einer `non_identity`-Richtlinie. Agenten übermitteln bei jeder Anfrage die Header `CF-Access-Client-Id` und `CF-Access-Client-Secret`, die Cloudflare am Edge validiert, bevor der Traffic den Master erreicht. Dies fügt zusätzlich zum Agenten-API-Key eine zweite Authentifizierungsschicht hinzu. Der Browser-Zugriff für Administratoren funktioniert weiterhin über eine `bypass`-Richtlinie auf derselben Anwendung. Aktivieren Sie es über `Agents → Setup Zero Trust`.
* **Redis** wird für Queues und Caches verwendet; sichern Sie Redis (Passwort + Network ACLs), wenn es außerhalb eines vertrauenswürdigen LANs läuft.
* **Transport** betreiben Sie den Master hinter HTTPS (zum Beispiel via Cloudflare Access), damit der Agent-Traffic verschlüsselt ist.
* **Transport** betreiben Sie den Master hinter HTTPS (zum Beispiel via Cloudflare Tunnel), damit der Agent-Traffic verschlüsselt ist.
* **Least-Privilege Runtime** der Agent-Container läuft als `dockflare`-User (UID/GID 65532) und verwendet den Socket-Proxy, um Docker-Zugriff auf Container-Inspection und Lifecycle-Operationen zu begrenzen.
### Empfohlene Härtung
1. Bewahren Sie Agent Keys in einem Vault/Passwortmanager auf und rotieren Sie sie regelmäßig.
2. **Deaktivieren Sie das Passwort-Login nicht**: Verwenden Sie stattdessen OAuth/OIDC-Anbieter für SSO, ohne Sicherheitsrisiken zu erzeugen. Falls Sie Passwort-Login unbedingt deaktivieren müssen, beachten Sie, dass Container im selben Docker-Netzwerk externe Authentifizierung umgehen und direkt auf die DockFlare-API zugreifen können. Details siehe [Zugriff auf die Web-UI - Passwort-Anmeldung deaktivieren](Accessing-the-Web-UI.md#passwort-anmeldung-deaktivieren).
3. Nutzen Sie nach Möglichkeit einen eigenen Tunnel pro Agent, um Privilegien sauber zu isolieren.
4. Überwachen Sie in der UI unter `Agents` Heartbeat-Lücken; offline Nodes können direkt aus der UI entfernt werden.
2. Aktivieren Sie **Cloudflare Zero Trust** auf dem Master für eine zusätzliche Authentifizierungsschicht am Cloudflare-Edge (`Agents → Setup Zero Trust`).
3. **Deaktivieren Sie das Passwort-Login nicht** verwenden Sie stattdessen OAuth/OIDC-Anbieter für SSO-Komfort ohne Sicherheitsrisiken. Falls Sie das Passwort-Login unbedingt deaktivieren müssen, beachten Sie, dass dies eine Docker-Netzwerk-Sicherheitslücke schafft, durch die Container im selben Netzwerk externe Authentifizierung umgehen können. Details siehe [Zugriff auf die Web-UI - Passwort-Anmeldung deaktivieren](Accessing-the-Web-UI.md#disabling-password-login).
4. Nutzen Sie nach Möglichkeit einen eigenen Tunnel pro Agent, um Privilegien sauber zu isolieren.
5. Überwachen Sie in der UI unter `Agents` Heartbeat-Lücken; offline Nodes können direkt aus der UI entfernt werden.
---
@ -155,6 +178,6 @@ networks:
* Überprüfen Sie den aktualisierten Schnellstart im README, um sicherzustellen, dass Redis eingerichtet ist.
* Prüfen Sie das Changelog auf Breaking Changes und Migrationshinweise.
* Abonnieren Sie das öffentliche DockFlare-Agent-Repository, sobald es veröffentlicht ist, um Releases nicht zu verpassen.
* Erwägen Sie, Cloudflare Zero Trust für eine verstärkte Agenten-Authentifizierung zu aktivieren (`Agents → Setup Zero Trust`).
Viel Spaß beim Tunnelbau! 🚇

View file

@ -50,24 +50,45 @@ El Master y Redis suelen ejecutarse juntos, mientras que los agentes se ejecutan
## Despliegue del DockFlare Agent
> El agente se publicará como `alplat/dockflare-agent`. Hasta que el repositorio público esté disponible, puede compilarlo desde el árbol fuente `DockFlare-agent` incluido con DockFlare 3.0.
El agente se publica como `alplat/dockflare-agent:latest` en Docker Hub.
Existen dos métodos de despliegue — elija el que mejor se adapte a su configuración:
### Opción A — Script de despliegue en una línea (recomendado, opt-in)
Si ha configurado **Cloudflare Zero Trust** en el Master (`Agents → Setup Zero Trust`), DockFlare puede generar un script bash completamente preconfigurado para cada clave API de agente. El script:
- Comprueba que `docker compose` está disponible
- Crea la red Docker `cloudflare-net` si no existe
- Escribe un archivo `docker-compose.yml` con los cuatro valores requeridos incorporados (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Inicia la pila del agente de inmediato
Para utilizarlo: vaya a `Agents → (fila de clave) → Deploy Agent → Quick Deploy`, copie el script y péguelo en una sesión SSH en el servidor de destino. No es necesario configurar un archivo `.env`.
> Esta opción requiere que la funcionalidad de Cloudflare Zero Trust esté configurada en el Master. Consulte la sección [Modelo de seguridad](#modelo-de-seguridad) para más detalles.
### Opción B — Configuración manual con Compose
Para entornos donde gestiona sus propios archivos de configuración:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
`docker-compose.yml` mínimo en el host del agente:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,8 +139,8 @@ networks:
- Ejecute `docker network create cloudflare-net` una vez para aprovisionar la red compartida utilizada por el Master y los agentes.
- El socket proxy limita la superficie de la API de Docker a la que puede acceder el agente; solo se exponen las capacidades configuradas con `1`.
- La imagen del agente se ejecuta como el usuario sin privilegios `dockflare` (UID/GID 65532). Asegúrese de que los directorios montados, como `/app/data`, sean escribibles por esa cuenta o reconstruya con `DOCKFLARE_UID/DOCKFLARE_GID` para ajustarlos a su host.
- Complete un archivo `.env` con `DOCKFLARE_MASTER_URL` y `DOCKFLARE_API_KEY`; las anulaciones opcionales, como `LOG_LEVEL` o `DOCKER_HOST`, pueden proporcionarse del mismo modo.
- La imagen del agente se ejecuta como el usuario sin privilegios `dockflare` (UID/GID 65532). Asegúrese de que los directorios montados, como `/app/data`, sean escribibles por esa cuenta.
- Complete un archivo `.env` con al menos `DOCKFLARE_MASTER_URL` y `DOCKFLARE_API_KEY`; todas las demás variables son anulaciones opcionales.
---
@ -127,16 +148,18 @@ networks:
* **Clave API del Master**: protege la API administrativa. La interfaz web solo la muestra después de hacer clic en *Show master API key*.
* **Claves API de agente**: únicas por agente. Revocar una clave bloquea inmediatamente nuevas inscripciones y comandos desde ese host.
* **Tokens de servicio de Cloudflare Zero Trust** *(opt-in)*: cuando están configurados, DockFlare crea una aplicación de Cloudflare Access limitada a `/api/v2/agents/` con una política `non_identity`. Los agentes presentan las cabeceras `CF-Access-Client-Id` y `CF-Access-Client-Secret` en cada solicitud, que Cloudflare valida en el edge antes de que el tráfico llegue al Master. Esto añade una segunda capa de autenticación además de la clave API del agente. El acceso por navegador de los administradores sigue funcionando mediante una política `bypass` en la misma aplicación. Actívelo desde `Agents → Setup Zero Trust`.
* **Redis**: se usa para colas y cachés; protéjalo con contraseña y ACL de red si se ejecuta fuera de una LAN de confianza.
* **Transporte**: ejecute el Master detrás de HTTPS, por ejemplo mediante Cloudflare Access, para que el tráfico del agente vaya cifrado.
* **Transporte**: ejecute el Master detrás de HTTPS, por ejemplo mediante Cloudflare Tunnel, para que el tráfico del agente vaya cifrado en tránsito.
* **Ejecución de privilegio mínimo**: el contenedor del agente se ejecuta como el usuario `dockflare` (UID/GID 65532) y depende del socket proxy para limitar el acceso a Docker a la inspección de contenedores y al control de su ciclo de vida.
### Endurecimiento recomendado
1. Guarde las claves de agente en una bóveda o gestor de contraseñas y rótelas periódicamente.
2. **No desactive el inicio de sesión con contraseña**. Use proveedores OAuth/OIDC para obtener la comodidad del single sign-on sin asumir riesgos de seguridad. Si debe desactivarlo, tenga en cuenta que esto crea una vulnerabilidad de red en Docker por la que cualquier contenedor de la misma red puede eludir la autenticación externa. Consulte [Acceso a la interfaz web](Accessing-the-Web-UI.md) para ver todas las implicaciones de seguridad.
3. Utilice túneles independientes por agente para mantener el aislamiento de privilegio mínimo.
4. Supervise la página `Agents` para detectar huecos en el heartbeat. Los nodos sin conexión pueden eliminarse directamente desde la interfaz.
2. Active **Cloudflare Zero Trust** en el Master para una capa de autenticación adicional en el edge de Cloudflare (`Agents → Setup Zero Trust`).
3. **No desactive el inicio de sesión con contraseña** — use proveedores OAuth/OIDC para obtener la comodidad del single sign-on sin asumir riesgos de seguridad. Si debe desactivarlo, tenga en cuenta que esto crea una vulnerabilidad de red en Docker por la que cualquier contenedor de la misma red puede eludir la autenticación externa. Consulte [Acceso a la interfaz web - Desactivar el inicio de sesión con contraseña](Accessing-the-Web-UI.md#disabling-password-login) para ver todas las implicaciones de seguridad.
4. Utilice túneles independientes por agente para mantener el aislamiento de privilegio mínimo.
5. Supervise la página `Agents` para detectar huecos en el heartbeat. Los nodos sin conexión pueden eliminarse directamente desde la interfaz.
---
@ -153,8 +176,8 @@ networks:
## Próximos pasos
* Revise la guía de inicio rápido actualizada en el README del repositorio para confirmar que Redis está configurado.
* Revise la guía de inicio rápido en el README del repositorio para confirmar que Redis está configurado.
* Consulte el registro de cambios para ver cambios incompatibles y notas de migración.
* Suscríbase al repositorio público de DockFlare Agent cuando se publique para mantenerse al día con las versiones.
* Considere activar Cloudflare Zero Trust para una autenticación reforzada de los agentes (`Agents → Setup Zero Trust`).
Buena gestión de túneles.
Buena gestión de túneles. 🚇

View file

@ -50,24 +50,45 @@ Le Master et Redis s'exécutent généralement ensemble, tandis que les agents s
## Déploiement du DockFlare Agent
> L'agent sera publié sous le nom `alplat/dockflare-agent`. Tant que le dépôt public n'est pas disponible, vous pouvez le construire à partir de l'arborescence source `DockFlare-agent` incluse avec DockFlare 3.0.
L'agent est publié sous le nom `alplat/dockflare-agent:latest` sur Docker Hub.
Deux méthodes de déploiement sont disponibles — choisissez celle qui convient à votre configuration :
### Option A — Script de déploiement en une ligne (recommandé, opt-in)
Si vous avez configuré **Cloudflare Zero Trust** sur le Master (`Agents → Setup Zero Trust`), DockFlare peut générer un script bash entièrement préconfiguré pour chaque clé API d'agent. Le script :
- Vérifie que `docker compose` est disponible
- Crée le réseau Docker `cloudflare-net` s'il n'existe pas
- Écrit un fichier `docker-compose.yml` avec les quatre valeurs requises intégrées (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Démarre immédiatement la pile de l'agent
Pour l'utiliser : accédez à `Agents → (ligne de clé) → Deploy Agent → Quick Deploy`, copiez le script et collez-le dans une session SSH sur le serveur cible. Aucune configuration de fichier `.env` n'est requise.
> Cette option nécessite que la fonctionnalité Cloudflare Zero Trust soit configurée sur le Master. Consultez la section [Modèle de sécurité](#modèle-de-sécurité) pour plus de détails.
### Option B — Configuration manuelle avec Compose
Pour les environnements où vous gérez vos propres fichiers de configuration :
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
`docker-compose.yml` minimal sur l'hôte de l'agent :
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,8 +139,8 @@ networks:
- Exécutez `docker network create cloudflare-net` une seule fois pour provisionner le réseau partagé utilisé par le Master et les agents.
- Le proxy de socket limite la surface de l'API Docker accessible à l'agent ; seules les capacités définies sur `1` sont exposées.
- L'image de l'agent s'exécute sous l'utilisateur non privilégié `dockflare` (UID/GID 65532). Assurez-vous que les répertoires montés, comme `/app/data`, sont accessibles en écriture par ce compte ou reconstruisez avec `DOCKFLARE_UID/DOCKFLARE_GID` pour qu'ils correspondent à votre hôte.
- Remplissez un fichier `.env` avec `DOCKFLARE_MASTER_URL` et `DOCKFLARE_API_KEY` ; des surcharges facultatives, comme `LOG_LEVEL` ou `DOCKER_HOST`, peuvent être fournies de la même manière.
- L'image de l'agent s'exécute sous l'utilisateur non privilégié `dockflare` (UID/GID 65532). Assurez-vous que les répertoires montés, comme `/app/data`, sont accessibles en écriture par ce compte.
- Remplissez un fichier `.env` avec au minimum `DOCKFLARE_MASTER_URL` et `DOCKFLARE_API_KEY` ; toutes les autres variables sont des surcharges facultatives.
---
@ -127,16 +148,18 @@ networks:
* **Clé API du Master** : protège l'API d'administration. L'interface ne l'affiche qu'après un clic sur *Show master API key*.
* **Clés API d'agent** : uniques par agent. Révoquer une clé bloque immédiatement toute nouvelle inscription ou commande depuis cet hôte.
* **Jetons de service Cloudflare Zero Trust** *(opt-in)* : lorsqu'ils sont configurés, DockFlare crée une application Cloudflare Access limitée à `/api/v2/agents/` avec une politique `non_identity`. Les agents transmettent les en-têtes `CF-Access-Client-Id` et `CF-Access-Client-Secret` à chaque requête, que Cloudflare valide en périphérie avant que le trafic n'atteigne le Master. Cela ajoute une deuxième couche d'authentification par-dessus la clé API d'agent. L'accès navigateur des administrateurs continue de fonctionner grâce à une politique `bypass` sur la même application. Activez cette fonctionnalité via `Agents → Setup Zero Trust`.
* **Redis** : utilisé pour les files d'attente et les caches ; sécurisez-le avec un mot de passe et des ACL réseau s'il s'exécute en dehors d'un LAN de confiance.
* **Transport** : exécutez le Master derrière HTTPS, par exemple via Cloudflare Access, afin que le trafic des agents soit chiffré.
* **Transport** : exécutez le Master derrière HTTPS, par exemple via Cloudflare Tunnel, afin que le trafic des agents soit chiffré en transit.
* **Exécution de moindre privilège** : le conteneur de l'agent s'exécute sous l'utilisateur `dockflare` (UID/GID 65532) et s'appuie sur le proxy de socket pour limiter l'accès à Docker à l'inspection des conteneurs et au contrôle du cycle de vie.
### Renforcement recommandé
1. Stockez les clés des agents dans un coffre-fort ou un gestionnaire de mots de passe et faites-les tourner régulièrement.
2. **Ne désactivez pas la connexion par mot de passe**. Utilisez plutôt des fournisseurs OAuth/OIDC pour bénéficier du single sign-on sans compromettre la sécurité. Si vous devez la désactiver, gardez à l'esprit que cela crée une vulnérabilité réseau Docker : n'importe quel conteneur sur le même réseau peut contourner l'authentification externe. Consultez [Accès à l'interface web](Accessing-the-Web-UI.md) pour connaître toutes les implications de sécurité.
3. Utilisez des tunnels séparés par agent afin de conserver une isolation de moindre privilège.
4. Surveillez la page `Agents` pour détecter les trous dans le heartbeat ; les nœuds hors ligne peuvent être supprimés directement depuis l'interface.
2. Activez **Cloudflare Zero Trust** sur le Master pour une couche d'authentification supplémentaire au niveau de l'edge Cloudflare (`Agents → Setup Zero Trust`).
3. **Ne désactivez pas la connexion par mot de passe** — utilisez plutôt des fournisseurs OAuth/OIDC pour bénéficier du single sign-on sans compromettre la sécurité. Si vous devez la désactiver, gardez à l'esprit que cela crée une vulnérabilité réseau Docker : n'importe quel conteneur sur le même réseau peut contourner l'authentification externe. Consultez [Accès à l'interface web - Désactiver la connexion par mot de passe](Accessing-the-Web-UI.md#disabling-password-login) pour connaître toutes les implications de sécurité.
4. Utilisez des tunnels séparés par agent afin de conserver une isolation de moindre privilège.
5. Surveillez la page `Agents` pour détecter les trous dans le heartbeat ; les nœuds hors ligne peuvent être supprimés directement depuis l'interface.
---
@ -153,8 +176,8 @@ networks:
## Étapes suivantes
* Consultez le guide de démarrage rapide mis à jour dans le README du dépôt afin de confirmer que Redis est configuré.
* Consultez le guide de démarrage rapide dans le README du dépôt afin de confirmer que Redis est configuré.
* Consultez le journal des modifications pour voir les changements incompatibles et les notes de migration.
* Abonnez-vous au dépôt public DockFlare Agent lorsqu'il sera publié afin de rester à jour sur les versions.
* Envisagez d'activer Cloudflare Zero Trust pour une authentification renforcée des agents (`Agents → Setup Zero Trust`).
Bonne gestion des tunnels.
Bonne gestion des tunnels ! 🚇

View file

@ -50,24 +50,45 @@ Master dan Redis biasanya berjalan bersama, sementara agent berjalan di dekat wo
## Deploy DockFlare Agent
> Agent akan dipublikasikan sebagai `alplat/dockflare-agent`. Sampai repository publiknya tersedia, Anda bisa build dari source tree `DockFlare-agent` yang disertakan bersama DockFlare 3.0.
Agent dipublikasikan sebagai `alplat/dockflare-agent:latest` di Docker Hub.
Tersedia dua metode deployment — pilih yang sesuai dengan konfigurasi Anda:
### Opsi A — Skrip deploy one-liner (direkomendasikan, opt-in)
Jika **Cloudflare Zero Trust** telah dikonfigurasi di master (`Agents → Setup Zero Trust`), DockFlare dapat menghasilkan skrip bash yang sudah sepenuhnya terkonfigurasi untuk setiap agent API key. Skrip tersebut:
- Memeriksa bahwa `docker compose` tersedia
- Membuat jaringan Docker `cloudflare-net` jika belum ada
- Menulis file `docker-compose.yml` dengan keempat nilai yang diperlukan sudah tertanam (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Langsung menjalankan stack agent
Cara menggunakannya: buka `Agents → (baris key) → Deploy Agent → Quick Deploy`, salin skrip, lalu tempel ke sesi SSH di server target. Tidak diperlukan konfigurasi file `.env`.
> Opsi ini mengharuskan fitur Cloudflare Zero Trust dikonfigurasi di master. Lihat bagian [Model Keamanan](#model-keamanan) untuk detailnya.
### Opsi B — Konfigurasi Compose manual
Untuk lingkungan di mana Anda mengelola file konfigurasi sendiri:
```bash
# Contoh file environment yang dipakai container agent
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# mengontrol image Docker yang dipakai untuk tunnel cloudflared yang dikelola
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
`docker-compose.yml` minimal di host agent:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -118,8 +139,8 @@ networks:
- Jalankan `docker network create cloudflare-net` sekali untuk menyiapkan shared network yang dipakai master dan agent.
- Socket proxy membatasi permukaan Docker API yang bisa dijangkau agent; hanya capability yang diset `1` yang akan terekspos.
- Image agent berjalan sebagai user tanpa hak istimewa `dockflare` (UID/GID 65532). Pastikan mounted directory seperti `/app/data` bisa ditulis oleh akun tersebut, atau rebuild dengan `DOCKFLARE_UID/DOCKFLARE_GID` agar cocok dengan host.
- Isi file `.env` dengan `DOCKFLARE_MASTER_URL` dan `DOCKFLARE_API_KEY`; override opsional seperti `LOG_LEVEL` atau `DOCKER_HOST` bisa diberikan dengan cara yang sama.
- Image agent berjalan sebagai user tanpa hak istimewa `dockflare` (UID/GID 65532). Pastikan mounted directory seperti `/app/data` bisa ditulis oleh akun tersebut.
- Isi file `.env` dengan minimal `DOCKFLARE_MASTER_URL` dan `DOCKFLARE_API_KEY`; semua variabel lainnya bersifat opsional.
---
@ -127,16 +148,18 @@ networks:
* **Master API key** melindungi administrative API. UI hanya menampilkannya setelah Anda mengklik *Show master API key*.
* **Agent API keys** unik untuk tiap agent. Jika key dicabut, pendaftaran atau command lebih lanjut dari host tersebut akan langsung diblokir.
* **Service token Cloudflare Zero Trust** *(opt-in)* setelah dikonfigurasi, DockFlare membuat Cloudflare Access Application yang dicakupkan ke `/api/v2/agents/` dengan kebijakan `non_identity`. Agent menyertakan header `CF-Access-Client-Id` dan `CF-Access-Client-Secret` pada setiap permintaan, yang divalidasi Cloudflare di edge sebelum trafik mencapai master. Ini menambahkan lapisan autentikasi kedua di atas agent API key. Akses browser administrator tetap berfungsi melalui kebijakan `bypass` pada aplikasi yang sama. Aktifkan melalui `Agents → Setup Zero Trust`.
* **Redis** dipakai untuk queue dan cache; amankan dengan password dan network ACL jika berjalan di luar LAN tepercaya.
* **Transport** jalankan master di balik HTTPS, misalnya lewat Cloudflare Access, agar trafik agent terenkripsi.
* **Transport** jalankan master di balik HTTPS, misalnya lewat Cloudflare Tunnel, agar trafik agent terenkripsi saat transit.
* **Runtime least-privilege** container agent berjalan sebagai user `dockflare` (UID/GID 65532) dan mengandalkan socket proxy untuk membatasi akses Docker hanya ke inspeksi container dan kontrol lifecycle.
### Hardening yang Direkomendasikan
1. Simpan agent key di vault atau password manager, dan rotasi secara berkala.
2. **Jangan menonaktifkan password login** - gunakan OAuth/OIDC provider untuk SSO yang nyaman tanpa risiko keamanan. Jika Anda tetap harus mematikannya, pahami bahwa ini menciptakan kerentanan pada jaringan Docker karena container lain di network yang sama dapat melewati autentikasi eksternal. Lihat [Accessing the Web UI - Disabling Password Login](Accessing-the-Web-UI.md#menonaktifkan-login-dengan-password) untuk implikasi lengkapnya.
3. Gunakan tunnel terpisah per agent untuk isolasi least-privilege.
4. Pantau halaman `Agents` untuk heartbeat yang hilang; node offline bisa dihapus langsung dari UI.
2. Aktifkan **Cloudflare Zero Trust** di master untuk lapisan autentikasi tambahan di Cloudflare edge (`Agents → Setup Zero Trust`).
3. **Jangan menonaktifkan password login** - gunakan OAuth/OIDC provider untuk SSO yang nyaman tanpa risiko keamanan. Jika Anda tetap harus mematikannya, pahami bahwa ini menciptakan kerentanan pada jaringan Docker karena container lain di network yang sama dapat melewati autentikasi eksternal. Lihat [Accessing the Web UI - Disabling Password Login](Accessing-the-Web-UI.md#disabling-password-login) untuk implikasi keamanan selengkapnya.
4. Gunakan tunnel terpisah per agent untuk isolasi least-privilege.
5. Pantau halaman `Agents` untuk heartbeat yang hilang; node offline bisa dihapus langsung dari UI.
---
@ -153,8 +176,8 @@ networks:
## Langkah Berikutnya
* Tinjau Quick Start yang diperbarui di README repository agar Redis dipastikan terkonfigurasi.
* Tinjau Quick Start di README repository untuk memastikan Redis sudah terkonfigurasi.
* Periksa changelog untuk breaking changes dan catatan migrasi.
* Ikuti repository publik DockFlare Agent saat sudah dipublikasikan agar tetap up to date dengan rilis terbaru.
* Pertimbangkan untuk mengaktifkan Cloudflare Zero Trust guna memperkuat autentikasi agent (`Agents → Setup Zero Trust`).
Selamat bertunneling.
Selamat bertunneling! 🚇

View file

@ -40,34 +40,55 @@ Il Master e Redis vengono generalmente eseguiti insieme, mentre gli agenti vengo
## Panoramica del flusso di lavoro
1. **Genera una chiave API dell'agente** nell'interfaccia web di DockFlare (`Agents → Generate Key`).
2. **Distribuire il contenitore DockFlare Agent** sull'host remoto, passando l'URL principale e la chiave.
3. L'agente **si registra** presso il Master e appare con lo stato *In sospeso*.
2. **Distribuisci il contenitore DockFlare Agent** sull'host remoto, passando l'URL del Master e la chiave.
3. L'agente **si registra** presso il Master e appare con lo stato *Pending*.
4. Dall'interfaccia principale, **approva** l'agente: assegna o crea un tunnel Cloudflare per quell'host.
5. Il Master mette in coda i comandi; l'agente **esegue il polling**, applica la configurazione e segnala lo stato/battito cardiaco. DockFlare rileva automaticamente la zona di destinazione per ciascun nome host (ritornando alla zona predefinita solo quando il rilevamento fallisce).
5. Il Master mette in coda i comandi; l'agente **esegue il polling**, applica la configurazione e segnala lo stato/heartbeat. DockFlare rileva automaticamente la zona di destinazione per ciascun nome host (ritornando alla zona predefinita solo quando il rilevamento fallisce).
6. Quando i container vengono avviati/arrestati sull'host dell'agente, l'agente trasmette gli eventi al Master che aggiorna DNS, policy di accesso e regole ingress del tunnel.
---
## Distribuzione dell'agente DockFlare
> L'agente verrà pubblicato come `alplat/dockflare-agent`. Fino a quando il repository pubblico non sarà attivo, puoi creare dall'albero dei sorgenti `DockFlare-agent` incluso con DockFlare 3.0.
L'agente è pubblicato come `alplat/dockflare-agent:latest` su Docker Hub.
Sono disponibili due metodi di distribuzione — scegliere quello più adatto alla propria configurazione:
### Opzione A — Script di distribuzione one-liner (consigliato, opt-in)
Se è stato configurato **Cloudflare Zero Trust** sul Master (`Agents → Setup Zero Trust`), DockFlare può generare uno script bash completamente preconfigurato per ciascuna chiave API dell'agente. Lo script:
- Verifica che `docker compose` sia disponibile
- Crea la rete Docker `cloudflare-net` se non esiste
- Scrive un `docker-compose.yml` con tutti e quattro i valori richiesti già inclusi (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Avvia immediatamente lo stack dell'agente
Per utilizzarlo: andare su `Agents → (riga della chiave) → Deploy Agent → Quick Deploy`, copiare lo script e incollarlo in una sessione SSH sul server di destinazione. Non è richiesta alcuna configurazione di file `.env`.
> Questa opzione richiede che la funzionalità Cloudflare Zero Trust sia configurata sul Master. Consultare la sezione [Modello di sicurezza](#modello-di-sicurezza) per i dettagli.
### Opzione B — Configurazione manuale con Compose
Per gli ambienti in cui si gestiscono i propri file di configurazione:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
`docker-compose.yml` minimo sull'host dell'agente:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,8 +139,8 @@ networks:
- Esegui `docker network create cloudflare-net` una volta per eseguire il provisioning della rete condivisa utilizzata dal Master e dagli agenti.
- Il proxy socket limita la superficie dell'API Docker che l'agente può raggiungere; vengono esposte solo le funzionalità impostate su `1`.
- L'immagine dell'agente viene eseguita come utente `dockflare` non privilegiato (UID/GID 65532). Assicurati che le directory montate come `/app/data` siano scrivibili da quell'account o ricostruiscile con `DOCKFLARE_UID/DOCKFLARE_GID` in modo che corrispondano al tuo host.
- Compilare un file `.env` con `DOCKFLARE_MASTER_URL` e `DOCKFLARE_API_KEY`; le sostituzioni facoltative (ad esempio `LOG_LEVEL` o `DOCKER_HOST`) possono essere fornite allo stesso modo.
- L'immagine dell'agente viene eseguita come utente `dockflare` non privilegiato (UID/GID 65532). Assicurarsi che le directory montate come `/app/data` siano scrivibili da quell'account.
- Compilare un file `.env` con almeno `DOCKFLARE_MASTER_URL` e `DOCKFLARE_API_KEY`; tutte le altre variabili sono sostituzioni facoltative.
---
@ -127,16 +148,18 @@ networks:
* **Chiave API principale**: protegge l'API amministrativa. L'interfaccia la mostra solo dopo aver fatto clic su *Mostra chiave API principale*.
* **Chiavi API dell'agente**: univoche per agente. La revoca di una chiave blocca immediatamente ulteriori registrazioni/comandi da quell'host.
* **Token di servizio Cloudflare Zero Trust** *(opt-in)* quando configurato, DockFlare crea un'applicazione Cloudflare Access con scope su `/api/v2/agents/` con policy `non_identity`. Gli agenti presentano le intestazioni `CF-Access-Client-Id` e `CF-Access-Client-Secret` ad ogni richiesta, che Cloudflare valida al perimetro prima che il traffico raggiunga il Master. Questo aggiunge un secondo livello di autenticazione oltre alla chiave API dell'agente. L'accesso al browser degli amministratori continua a funzionare tramite una policy `bypass` sulla stessa applicazione. Abilitare tramite `Agents → Setup Zero Trust`.
* **Redis** utilizzato per code e cache; proteggerlo (password + ACL di rete) se eseguito all'esterno di una LAN attendibile.
* **Trasporto** esegui il Master dietro HTTPS (ad esempio, tramite Cloudflare Access) in modo che il traffico dell'agente sia crittografato.
* **Trasporto** eseguire il Master dietro HTTPS (ad esempio, tramite Cloudflare Tunnel) in modo che il traffico dell'agente sia crittografato in transito.
* **Runtime con privilegi minimi**: il contenitore dell'agente viene eseguito come utente `dockflare` (UID/GID 65532) e si basa sul proxy socket per mantenere l'accesso Docker limitato all'ispezione del contenitore e al controllo del ciclo di vita.
### Indurimento consigliato
1. Conservare le chiavi dell'agente in un vault/gestore di password; ruotare regolarmente.
2. **Non disabilitare l'accesso tramite password**: utilizza invece i provider OAuth/OIDC per ottenere il single sign-on senza introdurre rischi per la sicurezza. Se è necessario disabilitare l'accesso tramite password, tieni presente che ciò crea una vulnerabilità sulla rete Docker: qualsiasi container sulla stessa rete può ignorare l'autenticazione esterna. Consulta [Accesso all'interfaccia web](Accessing-the-Web-UI.md) per tutte le implicazioni sulla sicurezza.
3. Utilizzare tunnel separati per agente per l'isolamento con privilegi minimi.
4. Monitora la pagina `Agents` per eventuali lacune di heartbeat: i nodi offline possono essere rimossi direttamente dall'interfaccia utente.
2. Abilitare **Cloudflare Zero Trust** sul Master per un ulteriore livello di autenticazione al perimetro Cloudflare (`Agents → Setup Zero Trust`).
3. **Non disabilitare l'accesso tramite password**: utilizza invece i provider OAuth/OIDC per ottenere il single sign-on senza introdurre rischi per la sicurezza. Se è necessario disabilitare l'accesso tramite password, tieni presente che ciò crea una vulnerabilità sulla rete Docker: qualsiasi container sulla stessa rete può ignorare l'autenticazione esterna. Consulta [Accessing the Web UI - Disabling Password Login](Accessing-the-Web-UI.md#disabling-password-login) per tutte le implicazioni sulla sicurezza.
4. Utilizzare tunnel separati per agente per l'isolamento con privilegi minimi.
5. Monitora la pagina `Agents` per eventuali lacune di heartbeat: i nodi offline possono essere rimossi direttamente dall'interfaccia utente.
---
@ -144,17 +167,17 @@ networks:
| Sintomo | Correzione |
|---------|-----|
| Agente bloccato in `pending` | Assicurati che sia stato registrato con la chiave API corretta e approvalo dall'interfaccia web. |
| I comandi non cancellano mai | Conferma la connettività Redis e che gli orologi del contenitore dell'agente siano sincronizzati. |
| DNS non aggiornato | Il Master deve raggiungere Cloudflare e l'agente deve inviare eventi container; verifica `docker logs dockflare-agent`. |
| Battito cardiaco offline | Controlla il percorso di rete tra agente e Master; i problemi relativi al firewall o al TLS sono cause comuni. |
| Agente bloccato in `pending` | Assicurarsi che sia stato registrato con la chiave API corretta e approvarlo dall'interfaccia web. |
| I comandi non cancellano mai | Confermare la connettività Redis e che gli orologi del contenitore dell'agente siano sincronizzati. |
| DNS non aggiornato | Il Master deve raggiungere Cloudflare e l'agente deve inviare eventi container; verificare `docker logs dockflare-agent`. |
| Heartbeat offline | Controllare il percorso di rete tra agente e Master; i problemi relativi al firewall o al TLS sono cause comuni. |
---
## Passaggi successivi
* Esamina il Quick Start aggiornato nel file README del repository per assicurarti che Redis sia configurato.
* Controlla il registro delle modifiche per eventuali modifiche importanti e note di migrazione.
* Iscriviti al repository pubblico di DockFlare Agent una volta pubblicato per rimanere aggiornato con le versioni.
* Esaminare il Quick Start nel file README del repository per assicurarsi che Redis sia configurato.
* Controllare il registro delle modifiche per eventuali modifiche importanti e note di migrazione.
* Valutare di abilitare Cloudflare Zero Trust per un'autenticazione rafforzata degli agenti (`Agents → Setup Zero Trust`).
Buon tunneling! 🚇

View file

@ -42,7 +42,7 @@ DockFlare 3.0 では、複数の Docker ホストにまたがって Cloudflare T
1. DockFlare 管理画面(`Agents → Generate Key`)で **Agent API キー** を生成します。
2. リモートホストに **DockFlare エージェント** コンテナをデプロイし、Master URL とキーを渡します。
3. エージェントが Master に **登録**され、ステータスが *Pending* として表示されます。
4. Master の管理画面でエージェントを **承認** し、そのホストに Cloudflare Tunnel を割り当てるか作成します。
4. Master の管理画面でエージェントを **登録承認** し、そのホストに Cloudflare Tunnel を割り当てるか作成します。
5. Master はコマンドをキューに入れます。エージェントは **ポーリング** して設定を適用し、状態とハートビートを報告します。DockFlare はホスト名ごとに対象ゾーンを自動検出します(検出に失敗した場合のみデフォルトゾーンにフォールバックします)。
6. エージェントホスト上でコンテナが起動または停止すると、エージェントがイベントを Master にストリーミングし、DNS、Access ポリシー、Tunnel の入口ルールを更新します。
@ -50,24 +50,45 @@ DockFlare 3.0 では、複数の Docker ホストにまたがって Cloudflare T
## DockFlare Agent のデプロイ
> エージェントは `alplat/dockflare-agent` として公開されます。パブリックリポジトリが公開されるまでは、DockFlare 3.0 に含まれる `DockFlare-agent` ソースツリーからビルドできます。
エージェントは Docker Hub に `alplat/dockflare-agent:latest` として公開されています。
デプロイ方法は 2 種類あります。環境に合った方を選択してください。
### オプション A — ワンライナーデプロイスクリプト(推奨、オプトイン)
Master で **Cloudflare Zero Trust** を設定している場合(`Agents → Setup Zero Trust`、DockFlare は各エージェント API キーに対して完全に事前設定された bash スクリプトを生成できます。このスクリプトは以下を実行します:
- `docker compose` が利用可能かどうかを確認する
- `cloudflare-net` Docker ネットワークが存在しない場合は作成する
- 4 つの必須値をすべて含む `docker-compose.yml` を生成する(`DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY``CF_ACCESS_CLIENT_ID``CF_ACCESS_CLIENT_SECRET`
- エージェントスタックをすぐに起動する
使用方法:`Agents → (キーの行) → Deploy Agent → Quick Deploy` に移動し、スクリプトをコピーして対象サーバーの SSH セッションに貼り付けます。`.env` ファイルのセットアップは不要です。
> このオプションを使用するには、Master で Cloudflare Zero Trust 機能を設定する必要があります。詳細については[セキュリティモデル](#セキュリティモデル)セクションを参照してください。
### オプション B — 手動 Compose 設定
構成ファイルを自分で管理する環境向けです:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
Agent ホスト上の最小限の `docker-compose.yml`:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,25 +139,27 @@ networks:
- `docker network create cloudflare-net` を 1 回実行して、Master とエージェントが使う共有ネットワークを作成します。
- socket proxy は、エージェントが到達できる Docker API の範囲を制限します。`1` に設定した機能だけが公開されます。
- エージェントイメージは特権のない `dockflare` ユーザーUID/GID 65532として実行されます。`/app/data` などのマウント先がそのアカウントで書き込み可能であることを確認するか、ホストに合わせるために `DOCKFLARE_UID/DOCKFLARE_GID` を使って再ビルドしてください。
- `.env``DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY` を設定します。`LOG_LEVEL``DOCKER_HOST` などの上書きも同じ方法で指定できます。
- エージェントイメージは特権のない `dockflare` ユーザーUID/GID 65532として実行されます。`/app/data` などのマウント先がそのアカウントで書き込み可能であることを確認してください。
- `.env`最低限 `DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY` を設定します。その他の変数はすべてオプションの上書きです。
---
## セキュリティモデル
* **Master API キー** 管理 API を保護します。管理画面では `Show Master API Key` をクリックした後にのみ表示されます。
* **Master API キー** 管理 API を保護します。管理画面では *Show master API key* をクリックした後にのみ表示されます。
* **Agent API キー** エージェントごとに一意です。キーを取り消すと、そのホストからの以後の登録やコマンドが即座にブロックされます。
* **Cloudflare Zero Trust サービストークン**(オプトイン)– 設定すると、DockFlare は `/api/v2/agents/` にスコープされた Cloudflare Access アプリケーションを `non_identity` ポリシーで作成します。エージェントはすべてのリクエストに `CF-Access-Client-Id``CF-Access-Client-Secret` ヘッダーを付与し、Cloudflare がエッジでこれを検証してからトラフィックが Master に到達します。これにより、Agent API キーに加えた第 2 の認証レイヤーが追加されます。管理者のブラウザアクセスは同じアプリの `bypass` ポリシーにより引き続き機能します。`Agents → Setup Zero Trust` から有効化します。
* **Redis** キューとキャッシュに使用されます。信頼できる LAN の外部で実行している場合は、パスワードやネットワーク ACL で保護してください。
* **トランスポート** エージェントの通信が暗号化されるように、Master は HTTPS の背後で運用してください(例: Cloudflare Access 経由)。
* **トランスポート** エージェントの通信が暗号化されるように、Master は HTTPS の背後で運用してください(例: Cloudflare Tunnel 経由)。
* **最小特権ランタイム** エージェントコンテナは `dockflare` ユーザーUID/GID 65532として実行され、socket proxy によって Docker アクセスの範囲をコンテナ検査とライフサイクル制御に限定します。
### 推奨されるハードニング
1. Agent キーをシークレットストアやパスワードマネージャーに保管し、定期的にローテーションします。
2. **パスワードログインを無効にしないでください** - 代わりに OAuth/OIDC で SSO を有効にしてください。どうしても無効にする場合は、同一 Docker ネットワーク上のコンテナが外部認証を迂回できるリスクがある点を理解してください。詳細は [管理画面へのアクセス - パスワードログインの無効化](Accessing-the-Web-UI.md) を参照してください。
3. 権限の分離を強めるには、エージェントごとに個別のトンネルを使用します。
4. `Agents` ページでハートビートの欠落を監視します。オフラインノードは管理画面から直接削除できます。
2. Master で **Cloudflare Zero Trust** を有効にして、Cloudflare エッジで追加の認証レイヤーを設けます(`Agents → Setup Zero Trust`)。
3. **パスワードログインを無効にしないでください** — 代わりに OAuth/OIDC プロバイダーを使用して、セキュリティリスクなしに SSO の利便性を実現してください。どうしても無効にする場合は、同一 Docker ネットワーク上のコンテナが外部認証を迂回できるというセキュリティ上の問題があることを理解してください。詳細は [管理画面へのアクセス - パスワードログインの無効化](Accessing-the-Web-UI.md#disabling-password-login) を参照してください。
4. 権限の分離を強化するには、エージェントごとに個別のトンネルを使用します。
5. `Agents` ページでハートビートの欠落を監視します。オフラインノードは管理画面から直接削除できます。
---
@ -144,7 +167,7 @@ networks:
| 症状 | 対処 |
|---------|------|
| status `pending` のまま | 正しい API キーで登録されていることを確認し、管理画面から承認してください。 |
| ステータス`pending` のまま | 正しい API キーで登録されていることを確認し、管理画面から承認してください。 |
| コマンドが消化されない | Redis 接続と、エージェントコンテナの時刻同期を確認します。 |
| DNS が更新されない | Master が Cloudflare に到達でき、エージェントがコンテナイベントを送信できている必要があります。`docker logs dockflare-agent` を確認してください。 |
| ハートビートが offline | エージェントと Master 間のネットワーク経路を確認します。一般的な原因はファイアウォールや TLS の問題です。 |
@ -153,8 +176,8 @@ networks:
## 次のステップ
* リポジトリの README で更新されたクイックスタートを確認し、Redis が正しく構成されていることを確認します。
* リポジトリの README でクイックスタートを確認し、Redis が正しく構成されていることを確認します。
* 重大な変更や移行に関する注意事項は、変更ログで確認してください。
* リリースを追いかけるために、公開されたら DockFlare Agent リポジトリをウォッチしてください
* エージェント認証を強化するために Cloudflare Zero Trust の有効化を検討します(`Agents → Setup Zero Trust`
楽しいトンネリングを! 🚇

View file

@ -1,6 +1,6 @@
# Agent DockFlare i architektura wieloserwerowa
DockFlare 3.0 wprowadza rozproszony model działania, który pozwala zarządzać tunelami Cloudflare na wielu hostach Docker. **Master** DockFlare koordynuje konfigurację, a lekkie **agenty** działają obok Twoich obciążeń i utrzymują lokalną instancję `cloudflared` w synchronizacji.
DockFlare 3.0 wprowadza rozproszony model działania, który pozwala zarządzać tunelami Cloudflare na wielu hostach Docker. **Master** DockFlare koordynuje konfigurację, a lekkie **agenty** działają obok Twoich obciążeń i utrzymują lokalną instancję `cloudflared` w synchronizacji z masterem.
Ten przewodnik wyjaśnia architekturę, model zabezpieczeń i krok po kroku pokazuje wdrożenie agentów.
@ -50,24 +50,45 @@ Master i Redis zwykle działają razem, a agenci uruchamiani są obok obciąże
## Wdrażanie agenta DockFlare
> Agent będzie publikowany jako `alplat/dockflare-agent`. Dopóki publiczne repozytorium nie zostanie uruchomione, możesz budować go z drzewa źródłowego `DockFlare-agent` dołączonego do DockFlare 3.0.
Agent jest publikowany jako `alplat/dockflare-agent:latest` w Docker Hub.
Dostępne są dwie metody wdrożenia — należy wybrać tę, która odpowiada konfiguracji środowiska:
### Opcja A — Jednolinijkowy skrypt wdrożeniowy (zalecane, opt-in)
Jeśli na Masterze skonfigurowano **Cloudflare Zero Trust** (`Agents → Setup Zero Trust`), DockFlare może wygenerować w pełni wstępnie skonfigurowany skrypt bash dla każdego klucza API agenta. Skrypt:
- Sprawdza, czy `docker compose` jest dostępne
- Tworzy sieć Docker `cloudflare-net`, jeśli nie istnieje
- Zapisuje plik `docker-compose.yml` z wbudowanymi wszystkimi czterema wymaganymi wartościami (`DOCKFLARE_MASTER_URL`, `DOCKFLARE_API_KEY`, `CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`)
- Natychmiast uruchamia stos agenta
Aby z niego skorzystać: przejdź do `Agents → (wiersz klucza) → Deploy Agent → Quick Deploy`, skopiuj skrypt i wklej go do sesji SSH na docelowym serwerze. Konfiguracja pliku `.env` nie jest wymagana.
> Ta opcja wymaga skonfigurowania funkcji Cloudflare Zero Trust na Masterze. Szczegóły zawiera sekcja [Model zabezpieczeń](#model-zabezpieczeń).
### Opcja B — Ręczna konfiguracja Compose
Dla środowisk, w których samodzielnie zarządzasz plikami konfiguracyjnymi:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
Minimalny `docker-compose.yml` na hoście agenta:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,25 +139,27 @@ networks:
- Uruchom `docker network create cloudflare-net` jeden raz, aby przygotować współdzieloną sieć używaną przez Mastera i agentów.
- Socket proxy ogranicza zakres Docker API dostępny dla agenta; udostępniane są tylko możliwości ustawione na `1`.
- Obraz agenta działa jako nieuprzywilejowany użytkownik `dockflare` (UID/GID 65532). Upewnij się, że zamontowane katalogi, takie jak `/app/data`, są zapisywalne dla tego konta, albo przebuduj obraz z `DOCKFLARE_UID/DOCKFLARE_GID`, aby dopasować go do hosta.
- Uzupełnij plik `.env` o `DOCKFLARE_MASTER_URL` i `DOCKFLARE_API_KEY`; opcjonalne nadpisania, takie jak `LOG_LEVEL` lub `DOCKER_HOST`, można podać w ten sam sposób.
- Obraz agenta działa jako nieuprzywilejowany użytkownik `dockflare` (UID/GID 65532). Upewnij się, że zamontowane katalogi, takie jak `/app/data`, są zapisywalne dla tego konta.
- Uzupełnij plik `.env` co najmniej o `DOCKFLARE_MASTER_URL` i `DOCKFLARE_API_KEY`; wszystkie pozostałe zmienne są opcjonalnymi nadpisaniami.
---
## Model zabezpieczeń
* **Klucz API Mastera** chroni administracyjne API. Interfejs pokazuje go dopiero po kliknięciu *Show Master API Key*.
* **Klucz API Mastera** chroni administracyjne API. Interfejs pokazuje go dopiero po kliknięciu *Show master API key*.
* **Klucze API agentów** unikalne dla każdego agenta. Unieważnienie klucza natychmiast blokuje dalsze rejestracje i polecenia z tego hosta.
* **Tokeny serwisowe Cloudflare Zero Trust** *(opt-in)* po skonfigurowaniu DockFlare tworzy aplikację Cloudflare Access o zakresie `/api/v2/agents/` z polityką `non_identity`. Agenci dołączają nagłówki `CF-Access-Client-Id` i `CF-Access-Client-Secret` do każdego żądania, które Cloudflare weryfikuje na krawędzi sieci, zanim ruch dotrze do Mastera. Dodaje to drugą warstwę uwierzytelniania ponad kluczem API agenta. Dostęp przeglądarki administratorów nadal działa dzięki polityce `bypass` w tej samej aplikacji. Włącz przez `Agents → Setup Zero Trust`.
* **Redis** używany do kolejek i cache; zabezpiecz go hasłem i sieciowymi ACL-ami, jeśli działa poza zaufaną siecią LAN.
* **Transport** uruchom Mastera za HTTPS, na przykład przez Cloudflare Access, aby ruch agentów był szyfrowany.
* **Transport** uruchom Mastera za HTTPS, na przykład przez Cloudflare Tunnel, aby ruch agentów był szyfrowany podczas przesyłania.
* **Uruchomienie z minimalnymi uprawnieniami** kontener agenta działa jako użytkownik `dockflare` (UID/GID 65532) i korzysta z socket proxy, aby ograniczyć dostęp do Dockera do inspekcji kontenerów i sterowania ich cyklem życia.
### Zalecane utwardzenie
1. Przechowuj klucze agentów w sejfie lub menedżerze haseł i regularnie je rotuj.
2. **Nie wyłączaj logowania hasłem**. Zamiast tego użyj dostawców OAuth/OIDC, aby zapewnić wygodę single sign-on bez ryzyka dla bezpieczeństwa. Jeśli musisz wyłączyć logowanie hasłem, pamiętaj, że tworzy to lukę w zabezpieczeniach sieci Docker: każdy kontener w tej samej sieci może ominąć zewnętrzne uwierzytelnianie. Zobacz [Dostęp do panelu administracyjnego](Accessing-the-Web-UI.md), aby poznać pełne konsekwencje bezpieczeństwa.
3. Używaj oddzielnych tuneli dla każdego agenta, aby zachować izolację minimalnych uprawnień.
4. Monitoruj stronę `Agents` pod kątem przerw w heartbeat; węzły offline można usunąć bezpośrednio z interfejsu.
2. Włącz **Cloudflare Zero Trust** na Masterze, aby uzyskać dodatkową warstwę uwierzytelniania na krawędzi Cloudflare (`Agents → Setup Zero Trust`).
3. **Nie wyłączaj logowania hasłem**. Zamiast tego użyj dostawców OAuth/OIDC, aby zapewnić wygodę single sign-on bez ryzyka dla bezpieczeństwa. Jeśli musisz wyłączyć logowanie hasłem, pamiętaj, że tworzy to lukę w zabezpieczeniach sieci Docker: każdy kontener w tej samej sieci może ominąć zewnętrzne uwierzytelnianie. Zobacz [Accessing the Web UI - Disabling Password Login](Accessing-the-Web-UI.md#disabling-password-login), aby poznać pełne konsekwencje bezpieczeństwa.
4. Używaj oddzielnych tuneli dla każdego agenta, aby zachować izolację minimalnych uprawnień.
5. Monitoruj stronę `Agents` pod kątem przerw w heartbeat; węzły offline można usunąć bezpośrednio z interfejsu.
---
@ -144,7 +167,7 @@ networks:
| Objaw | Rozwiązanie |
|---------|-----|
| Agent utknął w `pending` | Upewnij się, że zarejestrował się przy użyciu właściwego klucza API, a następnie zarejestruj go w interfejsie. |
| Agent utknął w `pending` | Upewnij się, że zarejestrował się przy użyciu właściwego klucza API, a następnie zatwierdź go w interfejsie. |
| Polecenia nie znikają z kolejki | Sprawdź łączność z Redisem i synchronizację zegarów w kontenerach agentów. |
| DNS się nie aktualizuje | Master musi mieć dostęp do Cloudflare, a agent musi wysyłać zdarzenia kontenerów; sprawdź `docker logs dockflare-agent`. |
| Heartbeat offline | Sprawdź ścieżkę sieciową między agentem a Masterem; częstą przyczyną są problemy z firewallem lub TLS. |
@ -153,8 +176,8 @@ networks:
## Kolejne kroki
* Przejrzyj zaktualizowany szybki start w README repozytorium, aby upewnić się, że Redis jest skonfigurowany.
* Przejrzyj Quick Start w README repozytorium, aby upewnić się, że Redis jest skonfigurowany.
* Sprawdź dziennik zmian pod kątem zmian niekompatybilnych i uwag migracyjnych.
* Zacznij obserwować publiczne repozytorium agenta DockFlare po jego opublikowaniu, aby być na bieżąco z wydaniami.
* Rozważ włączenie Cloudflare Zero Trust w celu wzmocnienia uwierzytelniania agentów (`Agents → Setup Zero Trust`).
Miłego tunelowania!
Miłego tunelowania! 🚇

View file

@ -1,6 +1,6 @@
# DockFlare 代理与多服务器架构
DockFlare 3.0 引入了分布式架构,让您能够跨多台 Docker 主机统一管理 Cloudflare 隧道。DockFlare **主控端Master** 负责协调配置,而轻量级 **代理端Agent** 则部署在各个工作负载所在的主机上,并保持本机 `cloudflared` 实例与主控端同步。
DockFlare 3.0 引入了分布式执行模型,让您能够跨多台 Docker 主机统一管理 Cloudflare 隧道。DockFlare **主控端Master** 负责协调配置,而轻量级 **代理端Agent** 则部署在各个工作负载所在的主机上,并保持本机 `cloudflared` 实例与主控端同步。
本文介绍代理模式下的整体架构、安全模型和部署流程。
@ -10,7 +10,7 @@ DockFlare 3.0 引入了分布式架构,让您能够跨多台 Docker 主机统
* **将计算与入口流量控制解耦**:工作负载可以更靠近用户部署,而控制平面仍保持统一。
* **按主机查看状态**:您可以单独监控每个代理端的心跳、隧道状态和命令历史。
* **最小权限隔离**:可以单独撤销某个代理端,而不影响主控端或其他主机。
* **最小权限令牌**:可以单独撤销某个受损代理端,而不影响主控端或其他主机。
* **具备弹性**:即使主控端短暂不可用,代理端仍会继续使用上一次已知配置提供服务。
---
@ -42,7 +42,7 @@ DockFlare 3.0 引入了分布式架构,让您能够跨多台 Docker 主机统
1. **在 DockFlare 管理界面中生成代理 API 密钥**`Agents → Generate Key`)。
2. **在远程主机上部署 DockFlare 代理端**,并传入主控端 URL 和密钥。
3. 代理端会向主控端**注册**,并显示为 *Pending* 状态。
4. 在主控端界面中**完成注册**,并为该主机分配或创建 Cloudflare 隧道。
4. 在主控端界面中**注册启用**代理端,并为该主机分配或创建 Cloudflare 隧道。
5. 主控端将命令写入队列;代理端会**轮询**、应用配置并回报状态与心跳。DockFlare 会自动检测每个主机名所属的目标区域,只有检测失败时才会回退到默认区域。
6. 当代理主机上的容器启动或停止时,代理端会将事件流式回传给主控端,由主控端更新 DNS、Access 策略和隧道入口规则。
@ -50,24 +50,45 @@ DockFlare 3.0 引入了分布式架构,让您能够跨多台 Docker 主机统
## 部署 DockFlare 代理端
> 该镜像将以 `alplat/dockflare-agent` 的名称发布。在公共仓库上线之前,您可以直接从 DockFlare 3.0 附带的 `DockFlare-agent` 源码目录构建。
代理端镜像已在 Docker Hub 上以 `alplat/dockflare-agent:latest` 发布。
部署方式有两种,请根据您的环境选择合适的方案:
### 方案 A — 一键部署脚本(推荐,需选择启用)
如果您已在主控端配置了 **Cloudflare Zero Trust**`Agents → Setup Zero Trust`DockFlare 可以为每个代理 API 密钥生成一个完整的预配置 bash 脚本。该脚本将:
- 检查 `docker compose` 是否可用
- 如果 `cloudflare-net` Docker 网络不存在则自动创建
- 生成包含所有四个必填值的 `docker-compose.yml``DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY``CF_ACCESS_CLIENT_ID``CF_ACCESS_CLIENT_SECRET`
- 立即启动代理服务栈
使用方式:进入 `Agents → (密钥行) → Deploy Agent → Quick Deploy`,复制脚本后粘贴到目标服务器的 SSH 会话中。无需手动配置 `.env` 文件。
> 此方案需要在主控端配置 Cloudflare Zero Trust 功能。详情请参阅[安全模型](#安全模型)章节。
### 方案 B — 手动 Compose 配置
适用于自行管理配置文件的环境:
```bash
# Example environment file used by the agent container
# .env on the agent host
DOCKFLARE_MASTER_URL=https://dockflare.example.com
DOCKFLARE_API_KEY=agent_api_key_goes_here
DOCKER_HOST=tcp://docker-socket-proxy:2375
# control the docker image used for the managed cloudflared tunnel (accepts repo:tag or repo@sha256:<digest>)
CLOUDFLARED_IMAGE=cloudflare/cloudflared:2025.9.0
# Optional: pin the cloudflared image (accepts repo:tag or repo@sha256:<digest>)
# Defaults to cloudflare/cloudflared:latest when not set
CLOUDFLARED_IMAGE=cloudflare/cloudflared:latest
LOG_LEVEL=info
TZ=Europe/Zurich
# Optional: Cloudflare Zero Trust service token (generated by the master)
CF_ACCESS_CLIENT_ID=
CF_ACCESS_CLIENT_SECRET=
```
代理主机上的最小 `docker-compose.yml` 示例:
```yaml
version: '3.8'
services:
docker-socket-proxy:
image: tecnativa/docker-socket-proxy:v0.4.1
@ -86,7 +107,7 @@ services:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- dockflare-internal
dockflare-agent:
image: alplat/dockflare-agent:latest
container_name: dockflare-agent
@ -118,8 +139,8 @@ networks:
- 运行一次 `docker network create cloudflare-net`,为主控端和代理端准备共享网络。
- Socket proxy 会限制代理端可访问的 Docker API 范围;只有设为 `1` 的能力才会开放。
- 代理镜像以非特权用户 `dockflare`UID/GID 65532运行。请确保 `/app/data` 等挂载目录对该用户可写,或者使用 `DOCKFLARE_UID/DOCKFLARE_GID` 重新构建以匹配宿主机权限
- 在 `.env` 文件中填写 `DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY`也可以用同样的方式提供可选覆盖项,例如 `LOG_LEVEL``DOCKER_HOST`
- 代理镜像以非特权用户 `dockflare`UID/GID 65532运行。请确保 `/app/data` 等挂载目录对该用户可写。
- 在 `.env` 文件中至少填写 `DOCKFLARE_MASTER_URL``DOCKFLARE_API_KEY`其他变量均为可选覆盖项
---
@ -127,16 +148,18 @@ networks:
* **Master API 密钥**:用于保护管理 API。只有在您点击 *Show master API key* 之后,界面才会显示它。
* **Agent API 密钥**:每个代理端都有独立密钥。撤销后,该主机会立刻失去注册和接收命令的能力。
* **Cloudflare Zero Trust 服务令牌**可选启用配置后DockFlare 会创建一个范围限定在 `/api/v2/agents/` 的 Cloudflare Access 应用,并配置 `non_identity` 策略。代理端在每次请求时都会附带 `CF-Access-Client-Id``CF-Access-Client-Secret` 请求头Cloudflare 会在边缘节点验证这些凭证,然后流量才会到达主控端。这在代理 API 密钥之上增加了第二层认证。管理员的浏览器访问仍通过同一应用上的 `bypass` 策略正常工作。通过 `Agents → Setup Zero Trust` 启用。
* **Redis**:用于队列和缓存;如果运行在不受信任的局域网之外,请启用密码保护并配置网络访问控制。
* **传输层**:建议将主控端部署在 HTTPS 之后,例如配合 Cloudflare Access,确保代理流量全程加密。
* **最小权限运行时**:代理容器以 `dockflare` 用户UID/GID 65532运行并通过 socket proxy 将 Docker 的访问范围限制在必要能力内。
* **传输层**:建议将主控端部署在 HTTPS 之后(例如通过 Cloudflare 隧道),确保代理流量全程加密。
* **最小权限运行时**:代理容器以 `dockflare` 用户UID/GID 65532运行并通过 socket proxy 将 Docker 的访问范围限制在容器检查和生命周期控制内。
### 建议的加固措施
1. 将 Agent 密钥保存在密码管理器或密钥库中,并定期轮换。
2. **不要禁用密码登录**。请改用 OAuth/OIDC 提供程序,以获得 SSO 的便利而不牺牲安全性。如果您必须禁用密码登录,需要明白这会带来 Docker 网络层面的安全漏洞,同一网络中的任意容器都可能绕过外部认证。有关完整安全影响,请参阅 [访问网页管理界面](Accessing-the-Web-UI.md)。
3. 为每个代理端使用单独的隧道,以实现更好的最小权限隔离。
4. 监控 `Agents` 页面中的心跳间隔;离线节点可以直接从界面中移除。
2. 在主控端启用 **Cloudflare Zero Trust**,在 Cloudflare 边缘节点增加额外的认证层(`Agents → Setup Zero Trust`)。
3. **不要禁用密码登录**,而应改用 OAuth/OIDC 提供程序,以获得 SSO 的便利而不牺牲安全性。如果您必须禁用密码登录,需要明白这会带来 Docker 网络层面的安全漏洞——同一网络中的任意容器都可能绕过外部认证。有关完整安全影响,请参阅[访问网页管理界面 - 禁用密码登录](Accessing-the-Web-UI.md#disabling-password-login)。
4. 为每个代理端使用单独的隧道,以实现更好的最小权限隔离。
5. 监控 `Agents` 页面中的心跳间隔;离线节点可以直接从界面中移除。
---
@ -144,7 +167,7 @@ networks:
| 症状 | 解决方法 |
|---------|-----|
| Agent 卡在 `pending` | 确认它使用了正确的 API 密钥完成注册,并在界面中批准入驻。 |
| Agent 卡在 `pending` | 确认它使用了正确的 API 密钥完成注册,并在界面中批准注册。 |
| 命令一直不清空 | 检查 Redis 连通性,并确认代理容器的时钟已同步。 |
| DNS 未更新 | 主控端必须能够连接 Cloudflare代理端也必须发送容器事件请检查 `docker logs dockflare-agent`。 |
| Heartbeat 离线 | 检查代理端与主控端之间的网络路径;防火墙或 TLS 问题很常见。 |
@ -153,8 +176,8 @@ networks:
## 后续步骤
* 查看仓库 README 中更新后的快速开始说明,确认 Redis 已正确配置。
* 查看仓库 README 中的快速开始说明,确认 Redis 已正确配置。
* 查看更新日志,了解破坏性变更和迁移说明。
* 等 DockFlare Agent 公共仓库发布后订阅它,以便及时掌握新版本
* 考虑启用 Cloudflare Zero Trust加强代理端认证`Agents → Setup Zero Trust`
祝您使用顺利。
祝您使用顺利。 🚇