initial commit
This commit is contained in:
11
.env.sample
Normal file
11
.env.sample
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Headscale / Tailscale Einstellungen
|
||||||
|
TS_AUTHKEY=tskey-xxxxxxxxxxxxxxxxxxxxxxxx
|
||||||
|
TS_LOGIN_SERVER=https://headscale.example.com
|
||||||
|
TS_HOSTNAME=portainer-agent-hamburg
|
||||||
|
|
||||||
|
# Optionale Parameter
|
||||||
|
TS_ACCEPT_DNS=false
|
||||||
|
TS_ACCEPT_ROUTES=true
|
||||||
|
|
||||||
|
# Container Verhalten
|
||||||
|
TZ=Europe/Berlin
|
||||||
14
.gitignore
vendored
Normal file
14
.gitignore
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# Lokale Umgebungsdateien
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.sample
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
tailscale/
|
||||||
|
__pycache__/
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Build-Artefakte
|
||||||
|
*.bak
|
||||||
|
*.swp
|
||||||
|
*.tmp
|
||||||
41
Dockerfile
Normal file
41
Dockerfile
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# --- Stage 1: Portainer Agent ---
|
||||||
|
FROM portainer/agent:latest AS agent
|
||||||
|
|
||||||
|
# --- Stage 2: Tailscale ---
|
||||||
|
FROM tailscale/tailscale:latest AS tailscale
|
||||||
|
|
||||||
|
# --- Stage 3: Finales Image (Alpine) ---
|
||||||
|
FROM alpine:3.20
|
||||||
|
|
||||||
|
# Basis-Pakete
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
iptables \
|
||||||
|
iproute2 \
|
||||||
|
ca-certificates \
|
||||||
|
curl \
|
||||||
|
bash \
|
||||||
|
tini
|
||||||
|
|
||||||
|
# Binaries von Tailscale kopieren
|
||||||
|
COPY --from=tailscale /usr/local/bin/tailscaled /usr/local/bin/tailscaled
|
||||||
|
COPY --from=tailscale /usr/local/bin/tailscale /usr/local/bin/tailscale
|
||||||
|
|
||||||
|
# Komplette Portainer-Agent-App übernehmen
|
||||||
|
COPY --from=agent /app /app
|
||||||
|
|
||||||
|
# Arbeitsverzeichnis
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Startskript hinzufügen
|
||||||
|
COPY entrypoint.sh /entrypoint.sh
|
||||||
|
RUN chmod +x /entrypoint.sh
|
||||||
|
|
||||||
|
# TUN-Gerät vorbereiten
|
||||||
|
RUN mkdir -p /dev/net
|
||||||
|
VOLUME ["/var/lib/tailscale"]
|
||||||
|
|
||||||
|
# Portainer Agent Port
|
||||||
|
EXPOSE 9001
|
||||||
|
|
||||||
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
CMD ["/entrypoint.sh"]
|
||||||
28
README.md
Normal file
28
README.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# .. Portainer Agent + Tailscale (Headscale)
|
||||||
|
|
||||||
|
Ein schlankes Alpine-basiertes Docker-Image, das den **Portainer Agent** über **Tailscale oder Headscale** sicher erreichbar macht .
|
||||||
|
ohne offene Ports im Internet.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## .. Features
|
||||||
|
|
||||||
|
- .. Kombinierter Container mit **Portainer Agent** & **Tailscale Client**
|
||||||
|
- .. Sichere Kommunikation über Tailscale / Headscale (kein Port 9001 nach außen nötig)
|
||||||
|
- .. Basierend auf **Alpine Linux** (minimaler Footprint, ca. 70 MB)
|
||||||
|
- .. Automatische Wiederverbindung dank persistentem `/var/lib/tailscale`
|
||||||
|
- .. Konfiguration über `.env`-Datei
|
||||||
|
- .. Multi-Stage-Dockerfile (nutzt offizielle `portainer/agent` + `tailscale/tailscale` Images)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ... Projektstruktur
|
||||||
|
|
||||||
|
```bash
|
||||||
|
.
|
||||||
|
... Dockerfile # Multi-Stage-Build (Portainer-Agent + Tailscale)
|
||||||
|
... entrypoint.sh # Startskript für Tailscale + Agent
|
||||||
|
... docker-compose.yml # Beispiel-Compose für schnellen Start
|
||||||
|
... .env.sample # Konfigurationsvorlage
|
||||||
|
... .gitignore # ignoriert deine lokale .env
|
||||||
|
... README.md
|
||||||
26
docker-compose.yml
Normal file
26
docker-compose.yml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
version: "3.8"
|
||||||
|
|
||||||
|
services:
|
||||||
|
agent:
|
||||||
|
build: .
|
||||||
|
container_name: portainer_agent_tailscale
|
||||||
|
cap_add:
|
||||||
|
- NET_ADMIN
|
||||||
|
devices:
|
||||||
|
- /dev/net/tun
|
||||||
|
environment:
|
||||||
|
- TZ=${TZ}
|
||||||
|
- TS_AUTHKEY=${TS_AUTHKEY}
|
||||||
|
- TS_LOGIN_SERVER=${TS_LOGIN_SERVER}
|
||||||
|
- TS_HOSTNAME=${TS_HOSTNAME}
|
||||||
|
- TS_ACCEPT_DNS=${TS_ACCEPT_DNS}
|
||||||
|
- TS_ACCEPT_ROUTES=${TS_ACCEPT_ROUTES}
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- /var/lib/docker/volumes:/var/lib/docker/volumes
|
||||||
|
- tailscale-state:/var/lib/tailscale
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
tailscale-state:
|
||||||
|
name: portainer_tailscale_state
|
||||||
24
entrypoint.sh
Normal file
24
entrypoint.sh
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "[+] Starting Tailscale daemon..."
|
||||||
|
/usr/local/bin/tailscaled --state=/var/lib/tailscale/tailscaled.state &
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
# Prüfen, ob bereits verbunden
|
||||||
|
if ! tailscale status >/dev/null 2>&1; then
|
||||||
|
echo "[+] Bringing up Tailscale..."
|
||||||
|
tailscale up \
|
||||||
|
--authkey="${TS_AUTHKEY}" \
|
||||||
|
--login-server="${TS_LOGIN_SERVER:-https://controlplane.tailscale.com}" \
|
||||||
|
--hostname="${TS_HOSTNAME:-portainer-agent}" \
|
||||||
|
--accept-dns="${TS_ACCEPT_DNS:-false}" \
|
||||||
|
--accept-routes="${TS_ACCEPT_ROUTES:-true}"
|
||||||
|
else
|
||||||
|
echo "[+] Existing Tailscale session found, skipping login."
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[+] Tailscale IP: $(tailscale ip -4 || true)"
|
||||||
|
echo "[+] Starting Portainer Agent..."
|
||||||
|
exec /app/agent
|
||||||
Reference in New Issue
Block a user