From cb99673b7c77a499271dc6c218dc4cfa67bb0d2b Mon Sep 17 00:00:00 2001 From: rcourtman Date: Thu, 1 Jan 2026 19:42:01 +0000 Subject: [PATCH] Improve devcontainer configuration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Simplify Dockerfile: use golang:1.24 base, install Node via features - Add proper port forwarding for Pulse (7655 frontend, 7656 API) - Add Vue Volar extension for frontend development - Add start-pulse-dev.sh helper script for auto-starting dev server - Add FRONTEND_DEV_HOST to containerEnv for proper binding - Add .env.devcontainer to .gitignore (local override file) - Update frontend dependencies 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .devcontainer/Dockerfile | 15 ++++++--------- .devcontainer/devcontainer.json | 27 ++++++++++++++++++++++++--- .devcontainer/start-pulse-dev.sh | 20 ++++++++++++++++++++ .gitignore | 1 + frontend-modern/package-lock.json | 20 -------------------- mock.env | 21 ++++----------------- 6 files changed, 55 insertions(+), 49 deletions(-) create mode 100755 .devcontainer/start-pulse-dev.sh diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index f2eed4ea2..c8808521a 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1,17 +1,17 @@ -FROM golang:1.24-bookworm +FROM golang:1.24 -# Install Node.js 20 -RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash - && apt-get install -y nodejs && npm install -g npm@latest +# Set bash as default shell for features +SHELL ["/bin/bash", "-c"] -# Install additional dev tools -RUN apt-get update && apt-get install -y git make docker.io curl vim && rm -rf /var/lib/apt/lists/* +# Install dev tools needed for hot-dev.sh +RUN apt-get update && apt-get install -y bash git make curl vim sudo lsof inotify-tools && rm -rf /var/lib/apt/lists/* # Create non-root user ARG USERNAME=vscode ARG USER_UID=1000 ARG USER_GID=$USER_UID -RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME && apt-get update && apt-get install -y sudo && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && chmod 0440 /etc/sudoers.d/$USERNAME +RUN groupadd --gid $USER_GID $USERNAME && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME -s /bin/bash && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME && chmod 0440 /etc/sudoers.d/$USERNAME # Set up Go environment for non-root user ENV GOPATH=/go @@ -21,7 +21,4 @@ RUN mkdir -p $GOPATH/pkg $GOPATH/bin && chown -R $USERNAME:$USERNAME $GOPATH USER $USERNAME WORKDIR /workspace -# Install common Go tools -RUN go install golang.org/x/tools/gopls@latest && go install github.com/go-delve/delve/cmd/dlv@latest - CMD ["/bin/bash"] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1a72fdc5f..39b1d5290 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -4,12 +4,18 @@ "dockerfile": "Dockerfile", "context": "." }, + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "20" + } + }, "customizations": { "vscode": { "extensions": [ "golang.go", "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "vue.volar" ], "settings": { "go.gopath": "/go", @@ -17,7 +23,22 @@ } } }, - "forwardPorts": [8080, 3000], - "postCreateCommand": "go version && node --version", + "forwardPorts": [7655, 7656], + "portsAttributes": { + "7655": { + "label": "Pulse Frontend", + "onAutoForward": "openBrowser" + }, + "7656": { + "label": "Pulse Backend API", + "onAutoForward": "silent" + } + }, + "containerEnv": { + "PULSE_DEV_API_HOST": "localhost", + "FRONTEND_DEV_HOST": "0.0.0.0", + "LAN_IP": "localhost" + }, + "updateContentCommand": "sudo chown -R vscode:vscode /workspaces/pulse && cd frontend-modern && npm install", "remoteUser": "vscode" } diff --git a/.devcontainer/start-pulse-dev.sh b/.devcontainer/start-pulse-dev.sh new file mode 100755 index 000000000..362c9f8c3 --- /dev/null +++ b/.devcontainer/start-pulse-dev.sh @@ -0,0 +1,20 @@ +#!/bin/bash +# Auto-start script for pulse dev environment + +PIDFILE="/tmp/pulse-dev.pid" +LOGFILE="/tmp/pulse-dev.log" + +# Check if already running +if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") 2>/dev/null; then + echo "Pulse dev server already running (PID: $(cat $PIDFILE))" + exit 0 +fi + +# Start hot-dev.sh +cd /workspaces/pulse +nohup ./scripts/hot-dev.sh > "$LOGFILE" 2>&1 & +echo $! > "$PIDFILE" + +echo "Pulse dev server starting... (PID: $(cat $PIDFILE))" +echo "Logs: tail -f $LOGFILE" +echo "Frontend will be available at http://localhost:7655" diff --git a/.gitignore b/.gitignore index b6f63aefe..ba7c7a407 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ data/ .env .env.local .env.*.local +.env.devcontainer # Build outputs dist/ diff --git a/frontend-modern/package-lock.json b/frontend-modern/package-lock.json index e4e4d31dc..ddc80c190 100644 --- a/frontend-modern/package-lock.json +++ b/frontend-modern/package-lock.json @@ -116,7 +116,6 @@ "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.5", @@ -490,7 +489,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -514,7 +512,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -1589,7 +1586,6 @@ "resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.10.10.tgz", "integrity": "sha512-nGl7gMgsojuaupI5MAK2cFtkndmWWSAPhill/8La3IjujY3vMBamcQFymBsA2ejzxEYJjkOlEQHYgp2jNFkwuQ==", "license": "MIT", - "peer": true, "peerDependencies": { "solid-js": "^1.8.6" } @@ -1759,7 +1755,6 @@ "integrity": "sha512-0l6cjgF0XnihUpndDhk+nyD3exio3iKaYROSgvh/qSevPXax3L8p5DBRFjbvalnwatGgHEQn2R88y2fA3g4irg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1806,7 +1801,6 @@ "integrity": "sha512-N9lBGA9o9aqb1hVMc9hzySbhKibHmB+N3IpoShyV6HyQYRGIhlrO5rQgttypi+yEeKsKI4idxC8Jw6gXKD4THA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.49.0", "@typescript-eslint/types": "8.49.0", @@ -2167,7 +2161,6 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2479,7 +2472,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3056,7 +3048,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -4044,7 +4035,6 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -4075,7 +4065,6 @@ "integrity": "sha512-MyL55p3Ut3cXbeBEG7Hcv0mVM8pp8PBNWxRqchZnSfAiES1v1mRnMeFfaHWIPULpwsYfvO+ZmMZz5tGCnjzDUQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.0.1", "data-urls": "^5.0.0", @@ -4754,7 +4743,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5238,7 +5226,6 @@ "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.3.2.tgz", "integrity": "sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==", "license": "MIT", - "peer": true, "engines": { "node": ">=10" } @@ -5303,7 +5290,6 @@ "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.9.10.tgz", "integrity": "sha512-Coz956cos/EPDlhs6+jsdTxKuJDPT7B5SVIWgABwROyxjY7Xbr8wkzD68Et+NxnV7DLJ3nJdAC2r9InuV/4Jew==", "license": "MIT", - "peer": true, "dependencies": { "csstype": "^3.1.0", "seroval": "~1.3.0", @@ -5564,7 +5550,6 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -5732,7 +5717,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -5864,7 +5848,6 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -5955,7 +5938,6 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -6097,7 +6079,6 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -6131,7 +6112,6 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", diff --git a/mock.env b/mock.env index 34837b75c..b0c0e73e6 100644 --- a/mock.env +++ b/mock.env @@ -1,17 +1,4 @@ -# Pulse Mock Mode Configuration -# Enable with: pulse mock enable -# Disable with: pulse mock disable - -PULSE_MOCK_MODE=false -PULSE_MOCK_NODES=7 -PULSE_MOCK_VMS_PER_NODE=5 -PULSE_MOCK_LXCS_PER_NODE=8 -PULSE_MOCK_DOCKER_HOSTS=3 -PULSE_MOCK_DOCKER_CONTAINERS=12 -PULSE_MOCK_GENERIC_HOSTS=4 -PULSE_MOCK_K8S_CLUSTERS=2 -PULSE_MOCK_K8S_NODES=4 -PULSE_MOCK_K8S_PODS=30 -PULSE_MOCK_K8S_DEPLOYMENTS=12 -PULSE_MOCK_RANDOM_METRICS=true -PULSE_MOCK_STOPPED_PERCENT=20 +PULSE_MOCK_MODE=true +PULSE_MOCK_NODES=2 +PULSE_MOCK_VMS_PER_NODE=3 +PULSE_MOCK_LXCS_PER_NODE=2