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 dev environment with Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI,
and can work with JUICE shared storage and PGSQL database capabilities.
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:8888, base path/jupyter/; the current template allows any Origin and disables XSRF checks, so it is for trusted development networks only - Module default is
jupyter_enabled: false, whileconf/vibe.ymltemplate explicitly enables Jupyter
The VIBE Jupyter template relies on its token as the default authentication barrier, and conf/vibe.yml does not enable additional Basic Auth on infra_portal.home. Set a strong random token, restrict port 8888 and portal sources, and use a trusted TLS endpoint before deployment. 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
VIBE supports enabling components on demand and exposes services via a unified workspace and 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: module default is jupyter_enabled: false, while conf/vibe.yml explicitly sets it to true.
Config usually lives in cluster vars, and can be overridden at 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, owned by node_user.
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 relax the security boundary for a reverse-proxied development sandbox - Venv is not created automatically, use
node_uv_envinNODEmodule beforehand
Use a high-entropy random token and 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
claude_env is merged with default OpenTelemetry env vars, sending telemetry to VictoriaMetrics / VictoriaLogs.
Codex CLI
The codex task runs npm install -g @openai/codex. VIBE installs Codex CLI only; it does not write Codex configuration or connect it 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
VIBE module has 18 parameters, grouped as:
- 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, default /fs. Code-Server and JupyterLab use it as their workspace root; vibe_dir 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, default 8443; bound to 127.0.0.1 and forwarded by Nginx /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, default Vibe.Coding; it must be changed in production.
code_gallery
Extension marketplace: openvsx / microsoft.
When region=china and openvsx, Tsinghua mirror is used.
JupyterLab
jupyter_enabled
Enable JupyterLab.
Module default is false; conf/vibe.yml explicitly sets it to true to enable 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, default /data/venv; it must be created beforehand (usually by the NODE module).
Node.js
nodejs_enabled
Enable the standalone Node.js installation task, default true.
nodejs_registry
npm registry mirror; when empty and region=china, defaults to 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, default true. claude_install installs the CLI, while claude_config 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
Whether to install Codex CLI; defaults to true. When enabled, codex_install runs npm install -g @openai/codex.
VIBE installs Codex CLI only; it does not manage Codex configuration or configure OpenTelemetry for it.
3 - Playbook
VIBE provides the vibe.yml playbook to deploy Code-Server, JupyterLab, Node.js, Claude Code, and Codex CLI.
vibe.ymlincludes onlynode_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 venvnodejs_pkginstalls only the additional packages declared innpm_packages; the list is empty by defaultclaude_installinstalls Claude CLI withclaude_package, whileclaude_configwrites the~/.claudeconfigurationcodex_installinstalls@openai/codexand does not manage Codex configuration
Common Commands
Full deploy:
Component-level:
Config updates:
Skip components for this run:
These switches are task conditions. Setting one to false only skips the corresponding installation and configuration tasks; it does not stop, disable, or uninstall a service or package deployed earlier. To retire Code-Server or JupyterLab, run systemctl disable --now code-server or systemctl disable --now jupyter separately. VIBE currently has no dedicated removal playbook.
Node.js is a runtime dependency of Claude Code and Codex CLI. If nodejs_enabled=false but either claude_enabled or codex_enabled remains true, the nodejs phase still runs. 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 also allows any Origin and disables XSRF checks, so the token is its primary authentication barrier. Use a strong random token, restrict TCP/8888, and access it through a trusted TLS reverse proxy. Persist a new token in inventory, then preview and apply it:
Code-Server Extensions
Switch extension marketplace:
Redeploy:
JupyterLab Environment
VIBE does not create venv automatically, ensure jupyter_venv exists:
Install/upgrade JupyterLab:
Install extensions (in venv):
Claude Code
The claude_install subtask installs Claude CLI, while claude_config writes the 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, but does not manage 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 focuses on Claude Code OpenTelemetry data. Code-Server and JupyterLab do not expose Prometheus metrics; use systemd and logs for health checks.
Claude Code Observability
VIBE writes default OpenTelemetry env vars into ~/.claude/settings.json:
claude_env is merged with the defaults, and can be used for 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
Ensure NODE and repo config are in place:
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
Persist the new password in inventory first so it does not enter shell history:
Change JupyterLab token
Persist a high-entropy random token in inventory first. The current template allows any Origin and disables XSRF checks, so 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 Codex CLI only and does not generate 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