Deploy web applications to Domino Data Lab with expertise in React apps (Vite) behind Domino's reverse proxy. Covers app.sh configuration, port configuration, base path handling for SPAs, CI/CD with GitHub Actions, and proxy troubleshooting. Use when deploying apps to Domino, setting up CI/CD pipelines, fixing broken routing, or configuring JavaScript frameworks for Domino's proxy.
This skill provides comprehensive knowledge for deploying web applications to Domino Data Lab, with special focus on React applications using Vite.
Domino apps run in containers behind a reverse proxy that:
Note: Port selection is flexible; port 8888 is no longer required. You can use any port your application prefers.
0.0.0.0 (not localhost) so Domino can reach your appbase: './' in Vite config for React apps// vite.config.js
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
base: './', // CRITICAL for Domino proxy
server: { host: '0.0.0.0', port: 8888, strictPort: true },
preview: { host: '0.0.0.0', port: 8888, strictPort: true },
})# app.sh
#!/bin/bash
set -e
cd /mnt/code
npm ci
npm run build
npx serve -s dist -l 8888 --no-clipboard# app.sh
#!/bin/bash
streamlit run app.py --server.port 8888 --server.address 0.0.0.0# app.sh
#!/bin/bash
python app.py # Must bind to 0.0.0.0:8888Domino provides these environment variables to your app:
| Variable | Description |
|---|---|
DOMINO_PROJECT_NAME | Current project name |
DOMINO_PROJECT_OWNER | Project owner username |
DOMINO_RUN_ID | Current run identifier |
DOMINO_STARTING_USERNAME | User who started the app |
Domino apps can communicate with each other using bearer token authentication. This is useful for:
Domino provides an access token service at localhost:8899:
import requests
# Get bearer token for inter-app communication
API_TOKEN = requests.get("http://localhost:8899/access-token").textimport requests
# 1. Get access token from Domino's token service
API_TOKEN = requests.get("http://localhost:8899/access-token").text
# 2. Set up headers with bearer token
headers = {
"Authorization": f"Bearer {API_TOKEN}",
"Content-Type": "application/json"
}
# 3. Make request to another Domino app or service
payload = {
"query": "Your request data here"
}
try:
resp = requests.post(
"https://your-domino-instance/apps-internal/APP_ID/endpoint",
json=payload,
headers=headers,
timeout=100
)
resp.raise_for_status()
data = resp.json()
print(data)
except requests.exceptions.RequestException as err:
print("API call failed:", err)http://localhost:8899/access-token (only accessible from within Domino)For create, publish, start, and stop from code, read API-APPS.md. Use /api/apps/v1 for writes; use /api/apps/beta only for instance logs, views, and runtime telemetry.
OpenAPI and route discovery: API-SPECS.md (public routes section).
/api/apps/v1) for all apps creation, update, preview, publication, start and stop workflows./api/apps/beta) is deprecated for new automation and maintained for backward compatibility and runtime reads. Do not build new functionality against beta endpoints if a v1 equivalent exists.realTimeLogs, views, listing active running instances, or issuing an instance-level DELETE) were not migrated to the v1 spec. They remain under /api/apps/beta.Rule of Thumb: Use v1 for automating write or publish actions. Fall back to beta for streaming runtime telemetry like logs or views.
Authentication: https://docs.domino.ai/cloud/reference/api/domino-api-authentication . In-run: DOMINO_API_PROXY (no Authorization header) or DOMINO_USER_HOST + http://localhost:8899/access-token. Outside run: public deployment URL + PAT/SA. Do not use API keys.
Get the cluster base URL: $DOMINO_USER_HOST or $DOMINO_API_HOST in-run; confirm apps routes with GET .../api/apps/v1/apps?limit=1.
Public docs:
Blueprint Reference:
92a240b
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.