initial commit

This commit is contained in:
2025-11-03 19:47:43 +01:00
commit e211ce6770
6 changed files with 144 additions and 0 deletions

11
.env.sample Normal file
View 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
View File

@@ -0,0 +1,14 @@
# Lokale Umgebungsdateien
.env
.env.*
!.env.sample
# Docker
tailscale/
__pycache__/
*.log
# Build-Artefakte
*.bak
*.swp
*.tmp

41
Dockerfile Normal file
View 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
View 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
View 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
View 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