Marketplace Checklist¶
Use this checklist before uploading any Gaia application to the Cohesity Marketplace.
Code & Configuration¶
Required Files¶
-
appspec.yaml— Validates with./appspecvalidator_exec appspec.yaml(no errors) -
app.json— Containsname,description,version,min_software_version -
Dockerfile— Builds successfully; image starts and serves traffic -
wrapper.sh— Present, executable (chmod +x), restarts server on crash
app.json Fields¶
-
min_software_versionis"7.2"(Gaia requires Cohesity 7.2+) -
unrestricted_app_ui_accessis set correctly: falsefor browser apps (use Cohesity token gate)truefor MCP servers / programmatic clients only
appspec.yaml¶
- Only uses supported kinds:
Service,ReplicaSet,StatefulSet,Job - No
kind: Deployment— useReplicaSetinstead -
replicas:uses Cohesity format:fixed: 1orshare: 0.1(not bare integer) -
cohesityTag: uion at least one port (for apps with a UI) -
cohesityEnv: VAR_NAMEdeclared for ports that need runtime NodePort discovery - Resource requests defined (
cpu,memory) -
GAIA_API_KEYplaceholder is replaced with actual key -
image:tag matchesdocker build -tname exactly
Security¶
-
GAIA_API_KEYis not committed to source control - No hardcoded credentials in source files
- API key is scoped appropriately for the datasets this app should expose
- If
unrestricted_app_ui_access: true: network access to the NodePort is restricted (VPN, network policy, or firewall) - HTTPS is used for Gaia API calls (
GAIA_VERIFY_SSL=true)
Docker Image¶
- Built with
--platform linux/amd64if developing on Apple Silicon - Image size is reasonable (under 1GB, ideally under 500MB)
- Uses
-slimbase images (python:3.11-slim,node:20-slim) -
.dockerignoreexcludes:node_modules,.git,.env,__pycache__, test files - Application starts within 30 seconds (Marketplace has a startup health check)
- Container exits cleanly on
SIGTERM(for graceful shutdown)
Application Behavior¶
For Web Apps (browser-based)¶
- App loads at
http://localhost:8080afterdocker run - All static assets load (no 404s in browser console)
- React Router deep links work (navigate to routes directly, not just
/) - API endpoints return correct responses
- Error states are handled gracefully (invalid API key, network timeout, no datasets)
- Gaia streaming responses display progressively (SSE working)
For MCP Servers¶
-
http://localhost:8002/mcpaccepts MCP connections - Landing page at
http://localhost:8002/shows correct connection instructions - All MCP tools execute without errors (
npx @modelcontextprotocol/inspectorpasses) - Landing page uses
HOST_IP+MCP_NODE_PORTfor the URL (not hardcoded)
Marketplace-Specific¶
- App tested with Marketplace environment variables simulated:
HOST_IP,APP_AUTHENTICATION_TOKEN,APPS_API_ENDPOINT_IP,APPS_API_ENDPOINT_PORT,POD_UID- For
cohesityEnvports: tested with the injected variable name set to a realistic value -
wrapper.shtested: kill the server process, confirm it restarts automatically - App bundle (
tar.gz) verified: containsappspec.yaml,app.json, and image.tar
Documentation¶
-
README.mdin the example directory explains: - Purpose and architecture
- Local development instructions
- Docker build and run instructions
- Marketplace deployment steps
- Environment variable reference
- Minimum cluster version
-
.env.examplecontains all required variables (no actual secrets)
Pre-Upload Final Check¶
Bash
# 1. Validate AppSpec
./appspecvalidator_exec appspec.yaml
# 2. Build Docker image
docker build --platform linux/amd64 -t my-app:latest .
# 3. Run with production-like settings
docker run --rm -p 8080:8080 \
-e GAIA_API_KEY="your-api-key" \
-e HOST_IP="192.168.1.10" \
-e APP_AUTHENTICATION_TOKEN="test-token" \
my-app:latest
# 4. Verify in browser
open http://localhost:8080
# 5. Create bundle
docker save my-app:latest -o my-app.tar
tar -czf my-app-bundle.tar.gz appspec.yaml app.json my-app.tar
# 6. Verify bundle contents
tar -tzf my-app-bundle.tar.gz
After Deployment¶
- App appears in the cluster Apps catalog
- App installs without errors
- App launches and is accessible at the assigned NodePort
- For MCP: landing page shows correct
HOST_IP:NODE_PORT - Container logs show no crashes or error loops
Reference¶
- How It Works — Marketplace lifecycle
- AppSpec Reference — Complete field reference
- Auth in the Marketplace — Token gate and API key patterns
- Packaging a Gaia App — Build and bundle instructions
- Testing & Submission — Detailed testing procedures