Skip to content

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 — Contains name, 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_version is "7.2" (Gaia requires Cohesity 7.2+)
  • unrestricted_app_ui_access is set correctly:
  • false for browser apps (use Cohesity token gate)
  • true for MCP servers / programmatic clients only

appspec.yaml

  • Only uses supported kinds: Service, ReplicaSet, StatefulSet, Job
  • No kind: Deployment — use ReplicaSet instead
  • replicas: uses Cohesity format: fixed: 1 or share: 0.1 (not bare integer)
  • cohesityTag: ui on at least one port (for apps with a UI)
  • cohesityEnv: VAR_NAME declared for ports that need runtime NodePort discovery
  • Resource requests defined (cpu, memory)
  • GAIA_API_KEY placeholder is replaced with actual key
  • image: tag matches docker build -t name exactly

Security

  • GAIA_API_KEY is 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/amd64 if developing on Apple Silicon
  • Image size is reasonable (under 1GB, ideally under 500MB)
  • Uses -slim base images (python:3.11-slim, node:20-slim)
  • .dockerignore excludes: 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:8080 after docker 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/mcp accepts MCP connections
  • Landing page at http://localhost:8002/ shows correct connection instructions
  • All MCP tools execute without errors (npx @modelcontextprotocol/inspector passes)
  • Landing page uses HOST_IP + MCP_NODE_PORT for 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 cohesityEnv ports: tested with the injected variable name set to a realistic value
  • wrapper.sh tested: kill the server process, confirm it restarts automatically
  • App bundle (tar.gz) verified: contains appspec.yaml, app.json, and image .tar

Documentation

  • README.md in 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.example contains 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