From 3e46bf5ec152d7fa78e3664298e9a0ffd588a2a7 Mon Sep 17 00:00:00 2001 From: DevContainer User Date: Tue, 24 Feb 2026 14:49:03 +0000 Subject: [PATCH] feat: add Helm CLI and built-in web file manager - Install Helm v3.17.1 in Dockerfile for chart development (closes #49) - Add fileManager toggle using base image's WEB_FILE_MANAGER (closes #11) - Wire WEB_FILE_MANAGER env vars in deployment template - Update CLAUDE.md, README.md with new features and values Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy --- CLAUDE.md | 6 +++++- Dockerfile | 6 ++++++ README.md | 21 +++++++++++++++++++++ chart/templates/deployment.yaml | 10 ++++++++++ chart/values.yaml | 10 ++++++++++ 5 files changed, 52 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index d1de000..4cd405b 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -7,6 +7,7 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co The Dev Container is a Docker-based cloud development environment that provides: - Web-based GUI IDE (VSCode/Antigravity) via VNC on port 5800 - Claude Code, Happy Coder, OpenCode, and Crush AI coding agents (terminal-based) +- Built-in web file manager for uploading/downloading files (optional, via `fileManager.enabled`) - Automatic GitHub repository cloning on startup - Kubernetes-native deployment with persistent home storage - MCP (Model Context Protocol) sidecars for AI assistant integrations @@ -68,7 +69,7 @@ Container start | File | Purpose | |------|---------| -| `Dockerfile` | Image definition — installs Chrome, Node.js, VSCode, Claude Code, Happy Coder, OpenCode, Crush; creates non-root user (UID 1000) | +| `Dockerfile` | Image definition — installs Chrome, Node.js, VSCode, Helm, Claude Code, Happy Coder, OpenCode, Crush; creates non-root user (UID 1000) | | `scripts/init-repo.sh` | Configures git credentials, clones GitHub repo | | `scripts/startapp.sh` | Calls init-repo.sh then opens VSCode in the workspace | | `chart/` | Helm chart for Kubernetes deployment | @@ -183,6 +184,9 @@ helm install my-devcontainer ./chart -f custom-values.yaml - `USER_ID` / `GROUP_ID` — Override UID/GID (default 1000) - `HAPPY_SERVER_URL` / `HAPPY_WEBAPP_URL` — Custom Happy Coder endpoints - `HAPPY_HOME_DIR` / `HAPPY_EXPERIMENTAL` +- `WEB_FILE_MANAGER` — Set to `1` to enable the built-in web file manager (controlled via `fileManager.enabled` in Helm values) +- `WEB_FILE_MANAGER_ALLOWED_PATHS` — Paths accessible by the file manager (default: `/workspace,/config`) +- `WEB_FILE_MANAGER_DENIED_PATHS` — Paths to deny access to (takes precedence over allowed) ### CI/CD diff --git a/Dockerfile b/Dockerfile index a29d5d7..c99f6a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -78,6 +78,12 @@ RUN CRUSH_VERSION=$(curl -sL https://api.github.com/repos/charmbracelet/crush/re chmod +x /usr/local/bin/crush && \ rm -rf /tmp/crush* +# Install Helm CLI for Kubernetes chart management +ARG HELM_VERSION=3.17.1 +RUN curl -fsSL "https://get.helm.sh/helm-v${HELM_VERSION}-linux-amd64.tar.gz" | \ + tar -xz --strip-components=1 -C /usr/local/bin linux-amd64/helm && \ + chmod +x /usr/local/bin/helm + # Install VSCode RUN wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o /usr/share/keyrings/packages.microsoft.gpg && \ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list && \ diff --git a/README.md b/README.md index 07dbb7f..659aa64 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,8 @@ A containerized cloud development environment with web-based GUI access, featuri - **VSCode or Google Antigravity** via browser-based VNC (port 5800) - **SSH access** option (OpenSSH on port 22, additive with any IDE) - **Claude Code**, **Happy Coder**, **OpenCode**, and **Crush** AI coding agents (terminal-based) +- **Built-in web file manager** for uploading/downloading files via the VNC web interface +- **Helm CLI** included for Kubernetes chart development and deployment - **Automatic GitHub repo cloning** on startup - **Persistent home directory** via ReadWriteMany PVC - **Kubernetes-native** Helm chart deployment @@ -121,6 +123,7 @@ The Helm chart uses a logical organization with these main sections: | `githubRepo` | `""` | Repository to clone into `/workspace` on startup | | `ide.type` | `vscode` | IDE to launch — `vscode`, `antigravity`, or `none` (see below) | | `ssh.enabled` | `false` | Also start an OpenSSH server on port 22 (additive, any IDE) | +| `fileManager.enabled` | `false` | Enable the built-in web file manager for upload/download | | `image.repository` | `ghcr.io/cpfarhood/devcontainer` | Container image | | `image.tag` | `latest` | Image tag | @@ -161,6 +164,24 @@ kubectl port-forward deployment/devcontainer-mydev 2222:22 ssh -p 2222 user@localhost ``` +### Web file manager + +The base image includes a built-in web file manager for uploading and downloading files through the VNC web interface (port 5800). No additional sidecar is needed. + +| Value | Default | Description | +|-------|---------|-------------| +| `fileManager.enabled` | `false` | Enable the web file manager | +| `fileManager.allowedPaths` | `/workspace,/config` | Paths accessible by the file manager (`AUTO`, `ALL`, or comma-separated) | +| `fileManager.deniedPaths` | `""` | Paths to deny (takes precedence over allowed) | + +```bash +# Enable the file manager +helm install mydev ./chart \ + --set name=mydev \ + --set githubRepo=https://github.com/youruser/yourrepo \ + --set fileManager.enabled=true +``` + ### Happy Coder | Value | Default | Description | diff --git a/chart/templates/deployment.yaml b/chart/templates/deployment.yaml index 7a9a0e4..c2a3f69 100644 --- a/chart/templates/deployment.yaml +++ b/chart/templates/deployment.yaml @@ -69,6 +69,16 @@ spec: value: {{ .Values.display.height | quote }} - name: SECURE_CONNECTION value: {{ .Values.display.secureConnection | quote }} + {{- if .Values.fileManager.enabled }} + - name: WEB_FILE_MANAGER + value: "1" + - name: WEB_FILE_MANAGER_ALLOWED_PATHS + value: {{ .Values.fileManager.allowedPaths | quote }} + {{- if .Values.fileManager.deniedPaths }} + - name: WEB_FILE_MANAGER_DENIED_PATHS + value: {{ .Values.fileManager.deniedPaths | quote }} + {{- end }} + {{- end }} - name: HAPPY_HOME_DIR value: {{ .Values.happy.homeDir | quote }} - name: HAPPY_EXPERIMENTAL diff --git a/chart/values.yaml b/chart/values.yaml index 420c37c..9412a86 100644 --- a/chart/values.yaml +++ b/chart/values.yaml @@ -27,6 +27,16 @@ ide: ssh: enabled: false +# Web file manager — built-in upload/download via the VNC web interface (port 5800) +# Uses the base image's WEB_FILE_MANAGER feature (no extra sidecar needed) +fileManager: + enabled: false + # Paths the file manager can access (default: AUTO = mapped volumes) + # Options: AUTO | ALL | comma-separated list of paths + allowedPaths: "/workspace,/config" + # Paths to deny (takes precedence over allowedPaths) + deniedPaths: "" + # VNC display settings display: width: "1920"