This is the multi-page printable view of this section. .
Module: VIBE
- 1: Configuration
- 2: Parameters
- 3: Playbook
- 4: Administration
- 5: Monitoring
- 6: FAQ
The VIBE module provides a browser-based development environment. It includes Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI. It can use JUICE for shared storage and PGSQL for database functions.
VIBE depends on NODE and INFRA:
NODEprovides base software and PythonuvenvironmentINFRAprovides Nginx reverse proxy, Grafana and portal entry
Components
| Component | Description | Local Port | Access Path |
|---|---|---|---|
| Code-Server | VS Code in browser | 8443 | /code/ |
| JupyterLab | Interactive notebooks | 8888 | /jupyter/ |
| Node.js | Runtime and npm | - | CLI |
| Claude Code | CLI + observability config | - | CLI / Grafana |
| Codex CLI | CLI installation; configuration is not managed | - | CLI |
Notes:
- Code-Server listens on
127.0.0.1:8443, exposed via Nginx - JupyterLab listens on
0.0.0.0:8888with base path/jupyter/. The current template allows any Origin and disables XSRF checks. Use it only on trusted development networks. - The module default is
jupyter_enabled: false. Theconf/vibe.ymltemplate explicitly enables Jupyter.
The VIBE Jupyter template uses its token as the default authentication barrier. The conf/vibe.yml template does not enable extra Basic Auth on infra_portal.home. Before deployment, set a strong random token. Restrict port 8888 and portal sources. Use a trusted TLS endpoint. Never expose the default template directly to the Internet.
Quick Start
Default entry points (via infra_portal.home):
- Code-Server:
https://<domain>/code/ - JupyterLab:
https://<domain>/jupyter/ - Claude Dashboard:
https://<domain>/ui/d/claude-code
Features
- Unified workspace:
vibe_dataas root for Code-Server and Jupyter - Optional shared storage: work with
JUICEfor multi-node sharing - Observability: Claude Code OpenTelemetry integrates with VictoriaMetrics/VictoriaLogs
- Composable: enable Code/Jupyter/Node.js/Claude/Codex as needed
Documentation
- Configuration: component config and workspace settings
- Parameters: VIBE parameter list and defaults
- Playbook:
vibe.ymlusage and tags - Administration: operations, passwords, and extensions
- Monitoring: Claude Code metrics and logs
- FAQ: common questions
1 - Configuration
Enable VIBE components as needed. VIBE provides a shared workspace and exposes services through the Nginx portal.
Overview
| Component | Enable Param | Default | Description |
|---|---|---|---|
| Code-Server | code_enabled | Enabled | VS Code in browser |
| JupyterLab | jupyter_enabled | Disabled | Notebook / terminal / editor |
| Node.js | nodejs_enabled | Enabled | Node.js runtime and npm |
| Claude Code | claude_enabled | Enabled | CLI installation, config, and observability |
| Codex CLI | codex_enabled | Enabled | CLI installation only; configuration is not managed |
Note: The module default is jupyter_enabled: false. The conf/vibe.yml template explicitly sets it to true.
Configuration usually resides in cluster vars. You can override it at the instance level:
Workspace
vibe_data is the unified workspace for VIBE:
- Code-Server default open directory
- JupyterLab
root_dir - Claude Code working dir
- Render the
AGENTS.mdcontext file and create aCLAUDE.mdsymlink to it
The vibe_dir task creates the directory and context files. The node_user owns them.
Code-Server
Notes:
- Service listens on
127.0.0.1:<code_port>(default 8443), accessed via Nginx/code/ - Config file:
code_data/code-server/config.yaml(default/data/code/code-server/config.yaml) - Env file:
/etc/default/code, used to configure extension marketplace
Extension marketplace:
code_gallery: microsoftuses Microsoft marketplace- When
region=china, Open VSX defaults to Tsinghua mirror
JupyterLab
Notes:
- Service listens on
0.0.0.0:<jupyter_port>(default 8888), base path/jupyter/ - Config file:
jupyter_data/jupyter_config.py(default/data/jupyter/jupyter_config.py) - Login token:
c.IdentityProvider.token - The v4.5 template also sets
allow_origin = '*',disable_check_xsrf = True, andtrust_xheaders = True. These settings relax security checks for a development sandbox behind a reverse proxy. - The module does not create the venv automatically. First, create it with
node_uv_envin theNODEmodule.
Use a high-entropy random token. Restrict TCP/8888 to trusted networks or the reverse proxy. infra_portal.home does not enable Basic Auth by default. For a second authentication layer, configure nginx_users and set auth: true on the portal. If you tighten the Jupyter settings, validate WebSockets, origin handling, and login before rollout.
Create venv example:
Node.js
Notes:
- When
nodejs_registryis empty andregion=china, default registry ishttps://registry.npmmirror.com npm_packagesinstalls additional global npm packages and is empty by default- Claude Code and Codex CLI are installed by their own dedicated tasks
Claude Code
The claude task installs the CLI (claude_install) and writes its configuration (claude_config).
When Claude or Codex is enabled, VIBE ensures that the Node.js runtime is installed. Override claude_package to use a different Claude npm package.
Generated files:
~/.claude.json~/.claude/settings.json
VIBE merges claude_env with the default OpenTelemetry environment variables. These settings send telemetry to VictoriaMetrics / VictoriaLogs.
Codex CLI
The codex task runs npm install -g @openai/codex. VIBE installs only Codex CLI. It does not write the Codex configuration or connect Codex to VIBE’s Claude Code observability.
Nginx Portal
VIBE exposes services through infra_portal.
By default, home domain includes /code/ and /jupyter/ paths.
For dedicated domains:
2 - Parameters
The VIBE module has 18 parameters in these groups:
- Common
- Code-Server
- JupyterLab
- Node.js
- Claude Code
- Codex CLI
Overview
| Parameter | Type | Level | Default | Description |
|---|---|---|---|---|
vibe_data | path | C | /fs | Workspace dir |
code_enabled | bool | C | true | Enable Code-Server |
code_port | port | C | 8443 | Code-Server port |
code_data | path | C | /data/code | Code-Server data dir |
code_password | string | C | Vibe.Coding | Code-Server password |
code_gallery | enum | C | openvsx | Extension marketplace |
jupyter_enabled | bool | C | false | Enable JupyterLab |
jupyter_port | port | C | 8888 | JupyterLab port |
jupyter_data | path | C | /data/jupyter | JupyterLab data dir |
jupyter_password | string | C | Vibe.Coding | JupyterLab token |
jupyter_venv | path | C | /data/venv | Python venv path |
nodejs_enabled | bool | C | true | Enable Node.js |
nodejs_registry | url | C | '' | npm registry mirror |
npm_packages | string[] | C | [] | Additional global npm packages |
claude_enabled | bool | C | true | Install and configure Claude Code |
claude_package | string | C | @anthropic-ai/claude-code | Claude Code npm package |
claude_env | dict | C | {} | Claude env vars |
codex_enabled | bool | C | true | Install Codex CLI |
Default Parameters
Defined in roles/vibe/defaults/main.yml:
Common
vibe_data
Workspace directory. The default is /fs. Code-Server and JupyterLab use it as their workspace root. The vibe_dir task renders AGENTS.md here and creates a CLAUDE.md symlink to it.
Code-Server
code_enabled
Enable Code-Server, default true.
code_port
Listen port. The default is 8443, bound to 127.0.0.1. Nginx forwards requests through /code/.
code_data
Data dir, config file at code_data/code-server/config.yaml (default /data/code/code-server/config.yaml).
code_password
Login password. The default is Vibe.Coding. You must change it in production.
code_gallery
Extension marketplace: openvsx / microsoft.
If region=china and the marketplace is openvsx, VIBE uses the Tsinghua mirror.
JupyterLab
jupyter_enabled
Enable JupyterLab.
The module default is false. The conf/vibe.yml template explicitly sets it to true for a full sandbox.
jupyter_port
Listen port, default 0.0.0.0:8888.
jupyter_data
Data dir, config file at jupyter_data/jupyter_config.py (default /data/jupyter/jupyter_config.py).
jupyter_password
Access token, default Vibe.Coding, written to c.IdentityProvider.token.
jupyter_venv
Python venv path for JupyterLab. The default is /data/venv. You must create it first, usually through the NODE module.
Node.js
nodejs_enabled
Enable the standalone Node.js installation task, default true.
nodejs_registry
npm registry mirror. If this value is empty and region=china, the default is https://registry.npmmirror.com.
npm_packages
Additional global npm packages, tagged nodejs_pkg; empty by default.
Claude Code and Codex CLI are installed by their own dedicated tasks and do not need to be added here.
Claude Code
claude_enabled
Enable Claude Code installation and configuration. The default is true. The claude_install task installs the CLI. The claude_config task writes its configuration.
claude_package
The npm package used for Claude Code; defaults to @anthropic-ai/claude-code.
claude_env
Extra env vars merged into default OpenTelemetry config.
Default env vars include:
CLAUDE_CODE_ENABLE_TELEMETRY=1OTEL_METRICS_EXPORTER=otlpOTEL_LOGS_EXPORTER=otlpOTEL_EXPORTER_OTLP_METRICS_PROTOCOL=http/protobufOTEL_EXPORTER_OTLP_LOGS_PROTOCOL=http/protobufOTEL_EXPORTER_OTLP_METRICS_ENDPOINT=http://127.0.0.1:8428/opentelemetry/v1/metricsOTEL_EXPORTER_OTLP_LOGS_ENDPOINT=http://127.0.0.1:9428/insert/opentelemetry/v1/logsOTEL_RESOURCE_ATTRIBUTES=ip=<inventory_hostname>,job=claude
Codex CLI
codex_enabled
Specifies whether to install Codex CLI. The default is true. If enabled, codex_install runs npm install -g @openai/codex.
VIBE installs only Codex CLI. It does not manage the Codex configuration or configure OpenTelemetry for Codex.
3 - Playbook
VIBE provides the vibe.yml playbook to deploy Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI.
vibe.ymlincludes only thenode_idandviberoles. It does not includenode/infra. Rundeploy.ymlfirst, or explicitly runnode.ymlandinfra.yml.
vibe.yml
Task Structure
Notes:
jupyter_installusesuv pip. It does not create a venv.nodejs_pkginstalls only the additional packages declared innpm_packages; the list is empty by defaultclaude_installinstalls Claude CLI withclaude_package. Theclaude_configtask writes the~/.claudeconfiguration.codex_installinstalls@openai/codexand does not manage Codex configuration
Common Commands
Full deploy:
Component-level:
Config updates:
Skip components for this run:
These switches control task execution. If a switch is false, the corresponding installation and configuration tasks are skipped. This does not stop, disable, or uninstall a previously deployed service or package. To stop and disable Code-Server, run systemctl disable --now code-server separately. For JupyterLab, run systemctl disable --now jupyter. VIBE currently has no dedicated removal playbook.
Node.js is a runtime dependency of Claude Code and Codex CLI. The nodejs phase runs if either claude_enabled or codex_enabled is true, even with nodejs_enabled=false. It is skipped only when all three switches are false.
Deployment Order
Idempotency
vibe.yml is idempotent. Re-run after config changes.
4 - Administration
Service Management
Logs:
Workspace and Context
vibe_dir creates these under vibe_data:
AGENTS.md: Context file rendered from the role templateCLAUDE.md: Symlink toAGENTS.md
Default locations (adjustable via vibe_data):
Password and Auth
Code-Server
Edit config:
Or via Ansible:
JupyterLab
Config file: /data/jupyter/jupyter_config.py
Field: c.IdentityProvider.token
The current v4.5 template allows any Origin and disables XSRF checks. Thus, the token is its primary authentication barrier. Use a strong random token. Restrict TCP/8888 and access Jupyter through a trusted TLS reverse proxy.
Save the new token in the inventory. Then preview and apply the change:
Code-Server Extensions
Switch extension marketplace:
Redeploy:
JupyterLab Environment
VIBE does not create the venv automatically. Make sure that jupyter_venv exists:
Install/upgrade JupyterLab:
Install extensions (in venv):
Claude Code
The claude_install subtask installs Claude CLI. The claude_config subtask writes its configuration files.
Config files:
~/.claude.json~/.claude/settings.json
Update config:
Reinstall/install Claude CLI:
Override claude_package if you need a different npm package.
Codex CLI
VIBE installs @openai/codex through codex_install. It does not manage the Codex configuration:
To configure for another user, run as that user or copy the files manually.
File Locations
| Component | Key Files |
|---|---|
| Code-Server | /data/code/code-server/config.yaml |
| Code-Server | /etc/default/code |
| Code-Server | /etc/systemd/system/code-server.service |
| JupyterLab | /data/jupyter/jupyter_config.py |
| JupyterLab | /etc/default/jupyter |
| JupyterLab | /etc/systemd/system/jupyter.service |
| Claude Code | ~/.claude.json / ~/.claude/settings.json |
Troubleshooting
Port checks:
Nginx entry:
5 - Monitoring
VIBE monitoring mainly uses Claude Code OpenTelemetry data. Code-Server and JupyterLab do not expose Prometheus metrics. Use systemd and logs to check their health.
Claude Code Observability
VIBE writes default OpenTelemetry env vars into ~/.claude/settings.json:
VIBE merges claude_env with the default settings. Use it to specify API keys or custom endpoints.
Grafana Dashboard
Grafana includes claude-code dashboard by default:
- Portal:
https://<domain>/ui/d/claude-code - Direct:
http://<ip>:3000/d/claude-code
Runtime Checks
Port checks:
Claude Logs Query
Via VictoriaLogs:
6 - FAQ
Deployment
code-server package not found
Make sure that NODE and the repository configuration are ready:
JupyterLab installation failed
jupyter_venv must exist:
Access
Cannot access /code/ or /jupyter/
- Check service status
- Check port listening
- Check Nginx config
WebSocket connection fails
Ensure Nginx enables WebSocket (default is enabled).
If using custom infra_portal, set websocket: true.
Password and Token
Change Code-Server password
First, save the new password in the inventory. This keeps it out of shell history:
Change JupyterLab token
First, save a high-entropy random token in the inventory. The current template allows any Origin and disables XSRF checks. Never use an example token or expose TCP/8888 directly:
Claude Code
CLI not found
First check whether claude_install completed:
If claude_enabled is disabled, install manually:
Use claude_package to select a different npm package.
Codex CLI not found
Confirm that codex_enabled: true. VIBE installs only Codex CLI. It does not generate the Codex configuration.
API key not set
Telemetry not showing
Check local VictoriaMetrics/VictoriaLogs:
Ensure OTEL endpoints in ~/.claude/settings.json are correct.
Extensions and Plugins
Code-Server extension install fails
- Check network
- Try switching
code_gallery - Or install VSIX manually