You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/SECURITY.md
+11Lines changed: 11 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -39,6 +39,17 @@ The container has unrestricted outbound network access. This is required for:
39
39
- Git operations (clone, push, pull)
40
40
- Any web requests Claude Code makes during development tasks
41
41
42
+
## Exposing HolyClaude to the Internet
43
+
44
+
**Do not port-forward HolyClaude to the public internet.** CloudCLI exposes a full shell and holds your AI provider credentials. A simple password is not sufficient protection — basic auth gets brute-forced, and one compromise means an attacker has arbitrary code execution, access to your workspace, and a paid Claude Code instance running on your credentials.
45
+
46
+
If you need to reach HolyClaude from outside your local network, use:
47
+
48
+
-**[Tailscale](https://tailscale.com)** — WireGuard mesh VPN, zero open ports, identity-based auth. Recommended for personal and small-team use.
49
+
-**[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** — Outbound-only tunnel to Cloudflare's edge, optional Cloudflare Access SSO in front. Recommended when you need a public hostname or shared access.
50
+
51
+
Both options are free for personal use, encrypt the connection end-to-end, and never require opening a port on your router. See the [Remote Access & Exposure](../README.md#shield-remote-access--exposure) section of the README for full details.
52
+
42
53
## Reporting a Vulnerability
43
54
44
55
If you discover a security vulnerability in HolyClaude:
> No `.env` files. No pre-configuration. No reading 40 pages of docs before you can start. It just runs.
127
128
129
+
> **Want to reach it from outside your network?** Don't port-forward it. See [Remote Access & Exposure](#shield-remote-access--exposure) — use Tailscale or Cloudflare Tunnel instead.
130
+
128
131
<palign="right">
129
132
<ahref="#top">↑ back to top</a>
130
133
</p>
@@ -734,18 +737,19 @@ holyclaude/
734
737
| What | Where (container) | Where (host) | Survives rebuild? |
> **Never delete `./data/claude/` entirely.** That's where your credentials live. Delete the sentinel file if you want a fresh bootstrap. Delete specific config files if you want to reset settings. But never nuke the whole folder.
758
762
763
+
### Persisting the CloudCLI account (optional, local storage only)
764
+
765
+
By default, the CloudCLI account database (`~/.cloudcli`) is container-local and gets wiped on rebuild. Re-creating the account takes 10 seconds, so most people leave it as-is.
766
+
767
+
If you want it to survive rebuilds, add a **named Docker volume** to your compose file:
768
+
769
+
```yaml
770
+
services:
771
+
holyclaude:
772
+
volumes:
773
+
- ./data/claude:/home/claude/.claude
774
+
- ./workspace:/workspace
775
+
- cloudcli-data:/home/claude/.cloudcli # add this line
776
+
777
+
volumes:
778
+
cloudcli-data: # and this block
779
+
```
780
+
781
+
> **Do NOT bind-mount `./data/cloudcli` on a network share (NAS, SMB/CIFS, NFS).** CloudCLI stores its account in SQLite, and SQLite's file locking breaks on network mounts. You'll hit `database is locked` errors constantly. Named volumes live on the Docker engine's local filesystem, which is why this works — bind mounts pointing at a NAS will not.
782
+
783
+
A bind mount to a local SSD path is fine too, just keep it off any network share.
784
+
759
785
<p align="right">
760
786
<a href="#top">↑ back to top</a>
761
787
</p>
@@ -793,6 +819,57 @@ This is how I personally run it. Edit `./data/claude/settings.json` on your host
793
819
794
820
---
795
821
822
+
## :shield: Remote Access & Exposure
823
+
824
+
HolyClaude binds CloudCLI to port `3001`. By default that's local-only — fine for running on your laptop or a home server you SSH into.
825
+
826
+
**The moment you want to reach it from outside your network, read this section.**
827
+
828
+
### Don't port-forward it to the public internet
829
+
830
+
I'll say it flat out: do not punch a hole in your router and expose `3001` to the open internet. Not even with a password. Here's why:
831
+
832
+
- CloudCLI exposes a full shell through the web terminal plugin
833
+
- It can run arbitrary code, install packages, and read/write your entire `/workspace`
834
+
- It holds your Anthropic OAuth tokens and API keys
835
+
- Basic auth / app-level passwords get brute-forced, credential-stuffed, and scraped out of logs
836
+
- One leaked password = someone else has a paid Claude Code instance running on your box with your money
837
+
838
+
A password is a speed bump, not a door. Treat HolyClaude like you'd treat an SSH session: never on the open internet without a proper tunnel in front of it.
839
+
840
+
### Use a proper tunnel instead
841
+
842
+
These are the two options I actually recommend:
843
+
844
+
| Option | Who it's for | Why |
845
+
|--------|-------------|-----|
846
+
| **[Tailscale](https://tailscale.com)** | Personal use, small teams | WireGuard mesh VPN. Install Tailscale on your server + your laptop/phone, and you reach `http://holyclaude:3001` from anywhere as if you were on the LAN. No ports opened, no DNS, no certs. Free for personal use. |
847
+
| **[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** | Sharing with others, public hostname | Cloudflare proxies the connection, so port `3001` stays closed. You get a real domain with HTTPS, and you can put Cloudflare Access (Google/GitHub SSO) in front of it. Free tier covers most personal use. |
848
+
849
+
Both give you:
850
+
- Zero open ports on your router
851
+
- Encrypted transport end to end
852
+
- Real identity-based auth (not a shared password)
853
+
- Audit logs
854
+
855
+
### If you insist on exposing it directly (please don't)
856
+
857
+
If you absolutely have to skip the tunnel (self-hosting tutorial, isolated lab network, whatever), at the very minimum:
858
+
859
+
1. **Put a reverse proxy in front of it** (Caddy, nginx, Traefik) with real TLS
860
+
2. **Add IP allowlisting** at the firewall or proxy level — only your known IPs
861
+
3. **Enable `bypassPermissions: false`** (the default) so shell commands still prompt
862
+
4. **Rotate your Anthropic credentials** if anything looks off
863
+
5. **Run behind Cloudflare Access or similar SSO**, not basic auth
864
+
865
+
Even with all that, the risk surface is huge. Use Tailscale or Cloudflare Tunnel. They're free, they take five minutes to set up, and they're what I personally use.
866
+
867
+
<p align="right">
868
+
<a href="#top">↑ back to top</a>
869
+
</p>
870
+
871
+
---
872
+
796
873
## :bell: Notifications
797
874
798
875
Walk away from your computer and know when your AI agents are done. Claude Code, Codex, and Gemini CLI all send notifications when a task completes. Uses [Apprise](https://github.com/caronc/apprise) — supports 100+ services including Discord, Telegram, Slack, Email, Pushover, Gotify, and more.
> Keine `.env`-Dateien. Keine Vorkonfiguration. Kein Lesen von 40 Seiten Dokumentation, bevor du anfangen kannst. Es läuft einfach.
127
128
129
+
> **Willst du von außerhalb deines Netzwerks darauf zugreifen?** Kein Port-Forwarding. Sieh [Fernzugriff & Exposition](#shield-remote-access--exposure) — nutze stattdessen Tailscale oder Cloudflare Tunnel.
130
+
128
131
<palign="right">
129
132
<ahref="#top">↑ nach oben</a>
130
133
</p>
@@ -734,18 +737,19 @@ holyclaude/
734
737
| Was | Wo (Container) | Wo (Host) | Überlebt Rebuild? |
> **Lösche niemals `./data/claude/` vollständig.** Dort leben deine Zugangsdaten. Lösche die Sentinel-Datei, wenn du einen frischen Bootstrap willst. Lösche bestimmte Konfigurationsdateien, wenn du Einstellungen zurücksetzen möchtest. Aber vernichte niemals den gesamten Ordner.
758
762
763
+
### CloudCLI-Konto persistieren (optional, nur lokaler Speicher)
764
+
765
+
Standardmäßig ist die CloudCLI-Kontodatenbank (`~/.cloudcli`) container-lokal und wird beim Rebuild gelöscht. Das Konto neu zu erstellen dauert 10 Sekunden, also lassen die meisten Leute es so.
766
+
767
+
Wenn du willst, dass es Rebuilds überlebt, füge ein **named Docker volume** zu deiner compose-Datei hinzu:
768
+
769
+
```yaml
770
+
services:
771
+
holyclaude:
772
+
volumes:
773
+
- ./data/claude:/home/claude/.claude
774
+
- ./workspace:/workspace
775
+
- cloudcli-data:/home/claude/.cloudcli # add this line
776
+
777
+
volumes:
778
+
cloudcli-data: # and this block
779
+
```
780
+
781
+
> **Mache KEIN Bind-Mount von `./data/cloudcli` auf einem Netzwerk-Share (NAS, SMB/CIFS, NFS).** CloudCLI speichert sein Konto in SQLite, und SQLites File-Locking funktioniert auf Netzwerk-Mounts nicht. Du wirst ständig `database is locked`-Fehler bekommen. Named Volumes leben auf dem lokalen Dateisystem des Docker-Engines, deshalb funktioniert das — Bind-Mounts auf ein NAS werden nicht funktionieren.
782
+
783
+
Ein Bind-Mount zu einem lokalen SSD-Pfad ist auch in Ordnung, halte ihn nur von jedem Netzwerk-Share fern.
784
+
759
785
<p align="right">
760
786
<a href="#top">↑ nach oben</a>
761
787
</p>
@@ -793,6 +819,57 @@ So betreibe ich es persönlich. Bearbeite `./data/claude/settings.json` auf dein
793
819
794
820
---
795
821
822
+
## :shield: Fernzugriff & Exposition
823
+
824
+
HolyClaude bindet CloudCLI an Port `3001`. Standardmäßig ist das nur lokal — gut für den Betrieb auf deinem Laptop oder einem Heimserver, auf den du per SSH zugreifst.
825
+
826
+
**In dem Moment, in dem du von außerhalb deines Netzwerks darauf zugreifen willst, lies diesen Abschnitt.**
827
+
828
+
### Kein Port-Forwarding ins öffentliche Internet
829
+
830
+
Ich sage es direkt: Schlag kein Loch in deinen Router und exponiere `3001` nicht ins offene Internet. Nicht mal mit einem Passwort. Warum:
831
+
832
+
- CloudCLI exponiert eine vollständige Shell über das Web-Terminal-Plugin
833
+
- Es kann beliebigen Code ausführen, Pakete installieren und dein gesamtes `/workspace` lesen/schreiben
834
+
- Es hält deine Anthropic-OAuth-Tokens und API-Keys
835
+
- Basic-Auth-Passwörter werden gebrute-forced, credential-gestuffed und aus Logs extrahiert
836
+
- Ein geleaktes Passwort = jemand anderes hat eine bezahlte Claude-Code-Instanz auf deiner Maschine mit deinem Geld
837
+
838
+
Ein Passwort ist eine Bodenschwelle, keine Tür. Behandle HolyClaude wie eine SSH-Session: niemals im offenen Internet ohne einen ordentlichen Tunnel davor.
839
+
840
+
### Nutze stattdessen einen ordentlichen Tunnel
841
+
842
+
Das sind die zwei Optionen, die ich wirklich empfehle:
843
+
844
+
| Option | Für wen | Warum |
845
+
|--------|-------------|-----|
846
+
| **[Tailscale](https://tailscale.com)** | Persönliche Nutzung, kleine Teams | WireGuard-Mesh-VPN. Installiere Tailscale auf deinem Server + Laptop/Telefon, und du erreichst `http://holyclaude:3001` von überall, als wärst du im LAN. Keine offenen Ports, kein DNS, keine Zertifikate. Kostenlos für persönliche Nutzung. |
847
+
| **[Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)** | Teilen mit anderen, öffentlicher Hostname | Cloudflare proxied die Verbindung, sodass Port `3001` geschlossen bleibt. Du bekommst eine echte Domain mit HTTPS, und kannst Cloudflare Access (Google/GitHub SSO) davor schalten. Das kostenlose Tier deckt die meiste persönliche Nutzung ab. |
### Wenn du darauf bestehst, es direkt zu exponieren (bitte nicht)
856
+
857
+
Wenn du den Tunnel absolut überspringen musst (Self-Hosting-Tutorial, isoliertes Lab-Netzwerk, was auch immer), mindestens:
858
+
859
+
1. **Stelle einen Reverse Proxy davor** (Caddy, nginx, Traefik) mit echtem TLS
860
+
2. **Füge IP-Allowlisting** auf Firewall- oder Proxy-Ebene hinzu — nur deine bekannten IPs
861
+
3. **Aktiviere `bypassPermissions: false`** (der Standard), damit Shell-Befehle noch nachfragen
862
+
4. **Rotiere deine Anthropic-Zugangsdaten**, wenn etwas seltsam aussieht
863
+
5. **Betreibe hinter Cloudflare Access oder ähnlichem SSO**, nicht Basic Auth
864
+
865
+
Selbst mit all dem ist die Angriffsfläche riesig. Nutze Tailscale oder Cloudflare Tunnel. Sie sind kostenlos, brauchen fünf Minuten zum Einrichten, und das ist, was ich persönlich nutze.
866
+
867
+
<p align="right">
868
+
<a href="#top">↑ nach oben</a>
869
+
</p>
870
+
871
+
---
872
+
796
873
## :bell: Notifications
797
874
798
875
Geh von deinem Computer weg und erfahre, wenn Claude fertig ist. Verwendet [Apprise](https://github.com/caronc/apprise) für Benachrichtigungen — unterstützt 100+ Dienste einschließlich Discord, Telegram, Slack, E-Mail, Pushover, Gotify und mehr.
0 commit comments