Dohub
Dohub
Loading workspace hub…
Dohub Dohub

Welcome,

Workspace

Dohub

Please login to continue

Sign in with GitHub to create and run codehub workspaces on Kubernetes.

Account not activated

Please contact an administrator to activate your account.

My drives

No drives yet. Use Create drive or Bulk create drive to provision a DirectPV volume.

No drives match your filter.

· Right-click to select · Shift+right-click for range

My images

Submit custom Docker images for use in servers. New images require admin approval.

Submit image

No images submitted yet.

No images match your filter.

· Right-click row to select · Shift+right-click for range
Label Repository Default tag Tags Status Actions

Cluster overall

Cluster information

Loading cluster data…

Join new node

Runs microk8s add-node on the host where this hub can reach the microk8s CLI.


                        
                    

                

Kubernetes nodes

Name Status Roles Internal IP External IP Version OS CPU Memory

No nodes reported.

SSH nodes

Manage external SSH hosts. Add the hub public key to each node before connecting.

Hub SSH manager public key

Add this key to ~/.ssh/authorized_keys on each node (as the configured user).


                    

Loading manager key…

Loading SSH nodes…

No SSH nodes yet. Click Add SSH node to register one.

No status yet

DirectPV drives

From kubectl directpv list drives


                

No DirectPV drives listed.

DirectPV discover

Runs kubectl directpv discover --output-file and lets you choose drives to initialize.

Saving selection…

No discover file yet. Click Discover to scan cluster nodes for available drives.


            

Initialize DirectPV drives?

This runs kubectl directpv init … --dangerous and will format the selected drives. Data on those disks will be destroyed.


                

Add SSH node

Register a host reachable from the hub. Add the manager public key to the node first.

Host
Port
Username
Last checked

Drive management

Resources Usage

Allocated (requested) resources by node. Drive from DirectPV.

Loading…

Node CPU RAM Drive GPU

No node data.

My servers

No servers yet. Use Create server or Bulk create server to get started.

No servers match your filter.

· Right-click to select · Shift+right-click for range

User management

Server management

Docker images

· Right-click row to select · Shift+right-click for range
Label Repository Default tag Tags Creator Status Active Actions
No images match your filters.
—

Networking

Public ingress and in-cluster addresses (when the server is deployed).

Service domain

Custom ingress host. Default would be . Use Edit to change.

Service DNS
Pod name
Pod domain
Pod IP

Environment variables

None

Exposing port through websocket tunnel

Forward TCP ports through wss://<domain>/<user>/<slug>/port-tunnel on the hub domain (HTTPS port 443).

Comma-separated TCP ports on the main container (127.0.0.1 inside the pod). Clear the field and click Expose to disable the tunnel sidecar.

SSH via stdio tunnel (ports 22 / 2222)

Use wstunnel in stdio mode with OpenSSH ProxyCommand. SSH traffic is proxied through the same WebSocket tunnel — no local TCP listener and no ssh-bridge sidecar.

ProxyCommand (wstunnel stdio)


                                    
                                

One-shot SSH


                                    
                                

~/.ssh/config snippet — then ssh <Host>


                                    
                                

Replace coder with the SSH user inside the container if different. %h and %p are expanded by SSH to reach 127.0.0.1:<port> in the pod.

How to connect (wstunnel client)

  1. Install wstunnel from wstunnel releases and add it to your PATH.
  2. Click Expose above while the server is running (or start it after saving ports).
  3. Run the client command below — it listens on your machine and forwards through the WebSocket tunnel to the container port.
  4. Open http://localhost:<port> (or your DB/client tool) on the local port shown.
  5. For ports 22 or 2222, use the SSH via ProxyCommand guide above (stdio) instead of binding those ports locally.

Path prefix must match the server sidecar (-P on the client, -r on the server).

WSS URL
All ports

                            
                        

TCP

                                
                            

Enter container ports and click Expose. The server must be running for the sidecar to start immediately.

Collaborators

Add users by username and grant permissions for this server.

  • No matching users
User Start/Stop Edit Terminal Delete Manage Actions
Loading…
No collaborators yet.

Auto-refreshes every 2s · kubectl logs


            

kubectl describe deployment,pod


            

Interactive shell in the main container via kubectl exec -it. Server must be running.

Auto-refreshes every 2s · Last · monitor-sidecar · Daily files metrics-YYYY-MM-DD.jsonl (30-day retention) · Download is a .tar.gz archive

Waiting for metrics… Start the server or redeploy to include the monitor sidecar.

CPU

RAM

GPU

GPU memory

rclone backup

Sync workspace folders to cloud storage with rclone. The backup sidecar always runs with the server. Schedule pushes config and starts cron in the sidecar. Backup now runs rclone immediately via kubectl exec. Stop backup stops cron only — the sidecar container stays running.

Five-field cron (minute hour day month weekday). Remote is remote:path from your config — each selected volume syncs to a subfolder under that path (named from the mount path).

Volumes to backup

Choose workspace PVCs by their mount path in the main container. The backup sidecar mounts only the selected volume(s) at the same path.

No drives mounted on this server — add drives in the General tab first.

Select at least one volume before scheduling.

Latest backup

Running… Success Failed No run yet Last run:

Auto-refreshes every 1s · Uses rclone sync with --log-file and --stats 30s

Import Docker images

Paste JSON/CSV or upload a file. Existing images are updated by id, or by repository+label.

Import quick templates

Paste JSON/CSV or upload a file. Existing templates are updated by id, or by name.

Group : CPU ≤ vCPU, RAM ≤ G, GPU VRAM ≤ G, servers

Quick templates

Click to fill the form below.

Configuration

Optional custom hostname for nginx/traefik ingress. Leave empty to use the default auto-generated subdomain. Applied on save (and on next start if the release already exists).

Kubernetes resources.limits for CPU and memory. Example: CPU request vCPU → limit vCPU; RAM request → limit .

Choose auto to let Kubernetes schedule. Selecting a node pins the workspace using nodeSelector.

Leave empty for ephemeral storage. The same drive may be mounted at multiple paths — each path uses a matching PVC subPath.

No drives yet. Create one in the Drives tab or remove mount rows.

No drives mounted.

Upload text files (txt, js, json, .env, yaml, …). Each file is stored in a Kubernetes ConfigMap and mounted at the path you choose. Max 1 MiB per file; total across all files must stay under 1 MiB.

No files mounted.

  • No matching images

Kubernetes imagePullPolicy when the pod starts.

Select a Docker image above to use the main container image for the init container.

Click a row to load it into the editor. Long keys and values wrap instead of overflowing.

No variables yet.

Current specifications

Bulk create server

Import many servers from JSON or CSV.

Upload .json or .csv

Example: [{"name":"ws1","cpu":2,"ram":"4G","drive_mounts":[{"drive_id":"<uuid>","mount_path":"/app/data"},{"drive_id":"<uuid>","mount_path":"/app/logs"}],"docker_repository":"codercom/code-server","docker_tag":"4.89.0-ubuntu"}] Same drive_id twice mounts one PVC at multiple paths (subPath = mount path). Use drive_name or drive_slug instead of drive_id if you prefer.

CSV header: name,cpu,ram,drive_id,drive_name,mount_path,gpu,docker_repository,docker_tag,ports,command,env_json

Create drive

Provision one DirectPV volume.

Max drive size: · drives

Bulk create drive

Import many drives from JSON or CSV.

Upload .json or .csv

Example: [{"name":"data-a","size":"20Gi"},{"name":"data-b","size":"50Gi"}]

CSV header: name,size

Delete drive

Type delete to remove and its PVC.

Delete server

This will remove (@). Running releases will be stopped. This cannot be undone.

Type delete to confirm:

Delete user

This will permanently remove and all of their servers, drives, and submitted images.

Type to confirm:

Delete image

Remove ()? This cannot be undone.

Edit quick template

Comma-separated container paths (or JSON array). Applied when users pick this quick template; they assign drives per row.

Text files stored in the template (max 1 MiB each, 1 MiB total). Pre-filled when users pick this template.

No files in template.

Use <<rdstring:N>>, <<rdnum:N>>, <<tmsp>>, <<username>> in values for expansion on template click.

Limits apply per member. Use 0 for unlimited servers, drives, or images.

Search by username or email, or paste a list of emails.

No members yet.