Deployment Profiles
Deployment profiles act like "Helm values files" for Anomstack, allowing you to configure different environments without modifying the original metric batch examples. This approach gives you environment-specific overlays while keeping examples pristine as templates for users.
Overview
Deployment profiles solve the common problem of wanting different configurations for different environments (demo, production, development) without duplicating code or modifying the original example metric batches.
Key Benefits
✅ Keep examples pristine - Original examples remain as clean templates for users
✅ Environment-specific configs - Different settings for demo, dev, production
✅ Source controlled - All configurations are versioned and shareable
✅ User-friendly - Others can easily redeploy your exact configuration
✅ Flexible layering - Secrets in .env
, configs in profiles
✅ Hot-reloadable - Changes can be applied without container restarts
How It Works
Profiles use Anomstack's existing environment variable override system (ANOMSTACK__<METRIC_BATCH>__<PARAMETER>
) to enable and configure metric batches at deployment time.
Configuration Layering
- Your
.env
file: API keys, secrets, personal settings - Profile overlay: Environment-specific metric batch configurations
- Merged deployment: Combined configuration sent as deployment secrets
Available Profiles
Demo Profile (profiles/demo.env
)
Purpose: Configuration for public demo instances
Use Case: Showcase Anomstack capabilities with real examples
# Enable examples for demo visibility
ANOMSTACK_IGNORE_EXAMPLES=no
# Enable netdata infrastructure monitoring demo
ANOMSTACK__NETDATA__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__CHANGE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__LLMALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__PLOT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__NETDATA__ALERT_ALWAYS=True
ANOMSTACK__NETDATA__ALERT_METHODS=email
# Enable weather API integration demo
ANOMSTACK__WEATHER__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__WEATHER__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__WEATHER__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__WEATHER__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__WEATHER__INGEST_CRON_SCHEDULE=*/30 * * * *
# Enable hackernews viral detection demo
ANOMSTACK__HN_TOP_STORIES_SCORES__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__HN_TOP_STORIES_SCORES__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__HN_TOP_STORIES_SCORES__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__HN_TOP_STORIES_SCORES__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
# Demo-specific global settings
ANOMSTACK_ALERT_EMAIL_FROM=demo@anomstack.com
ANOMSTACK_TABLE_KEY=demo_metrics
ANOMSTACK_LLM_PLATFORM=openai
ANOMSTACK_OPENAI_MODEL=gpt-4o-mini
Production Profile (profiles/production.env
)
Purpose: Production-ready deployment template
Use Case: Conservative, focused production deployments
# Disable examples in production for clean deployment
ANOMSTACK_IGNORE_EXAMPLES=yes
# Production-grade database configuration
ANOMSTACK_TABLE_KEY=production.metrics
ANOMSTACK_MODEL_PATH=gs://your-company-models/anomstack/
# Reliable email alerting
ANOMSTACK_ALERT_EMAIL_FROM=anomstack-alerts@yourcompany.com
ANOMSTACK_ALERT_EMAIL_TO=ops-team@yourcompany.com,data-team@yourcompany.com
# Conservative alert settings
ANOMSTACK_ALERT_THRESHOLD=0.8
ANOMSTACK_ALERT_METRIC_TIMESTAMP_MAX_DAYS_AGO=7
# Production LLM settings
ANOMSTACK_LLM_PLATFORM=anthropic
ANOMSTACK_ANTHROPIC_MODEL=claude-3-sonnet-20240229
# Production Dagster settings
ANOMSTACK_DAGSTER_OVERALL_CONCURRENCY_LIMIT=3
ANOMSTACK_MAX_RUNTIME_SECONDS_TAG=7200
Development Profile (profiles/development.env
)
Purpose: Development and staging environments
Use Case: Testing with all examples enabled and sensitive settings
# Enable all examples for development testing
ANOMSTACK_IGNORE_EXAMPLES=no
# Development database configuration
ANOMSTACK_TABLE_KEY=dev_metrics
ANOMSTACK_MODEL_PATH=local://./tmp/models
# Development-friendly alert settings
ANOMSTACK_ALERT_EMAIL_FROM=dev-anomstack@yourcompany.com
ANOMSTACK_ALERT_EMAIL_TO=dev-team@yourcompany.com
ANOMSTACK_ALERT_THRESHOLD=0.6
ANOMSTACK_ALERT_ALWAYS=True
# Enable hot reload features for development
ANOMSTACK_AUTO_CONFIG_RELOAD=true
ANOMSTACK_CONFIG_WATCHER=true
ANOMSTACK_CONFIG_WATCHER_INTERVAL=30
# Enable key examples for development testing
ANOMSTACK__PYTHON_INGEST_SIMPLE__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__PYTHON_INGEST_SIMPLE__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__PYTHON_INGEST_SIMPLE__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__PYTHON_INGEST_SIMPLE__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__EXAMPLE_SIMPLE__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__EXAMPLE_SIMPLE__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__EXAMPLE_SIMPLE__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__EXAMPLE_SIMPLE__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
Using Profiles
Deployment Commands
With Makefile (recommended):
# Deploy demo instance (enables key examples)
make fly-deploy-demo
# Deploy production instance (clean, focused)
make fly-deploy-production
# Deploy development instance (all examples enabled)
make fly-deploy-development
With deployment script:
# Deploy with specific profile
./scripts/deployment/deploy_fly.sh --profile demo my-demo-app
# Deploy with default app name
./scripts/deployment/deploy_fly.sh --profile production
Preview Commands
Always preview your deployment configuration before deploying:
# Preview demo deployment
make fly-preview-demo
# Preview production deployment
make fly-preview-production
# Preview with script
./scripts/deployment/preview_fly_secrets.sh --profile demo
Configuration Precedence
Profiles override your personal .env
settings while preserving secrets:
Example precedence:
# Your .env file (base layer - secrets preserved)
ANOMSTACK_OPENAI_KEY=sk-your-secret-key # ✅ Preserved
ANOMSTACK_ALERT_EMAIL_FROM=you@company.com # ✅ Preserved
ANOMSTACK_TABLE_KEY=my_personal_metrics # ❌ Will be overridden
# Profile layer (demo.env - takes precedence)
ANOMSTACK_TABLE_KEY=demo_metrics # ✅ Wins!
ANOMSTACK_IGNORE_EXAMPLES=no # ✅ Added
ANOMSTACK__NETDATA__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING # ✅ Added
# Final deployment result
ANOMSTACK_OPENAI_KEY=sk-your-secret-key # From .env
ANOMSTACK_ALERT_EMAIL_FROM=you@company.com # From .env
ANOMSTACK_TABLE_KEY=demo_metrics # From profile
ANOMSTACK_IGNORE_EXAMPLES=no # From profile
ANOMSTACK__NETDATA__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING # From profile
Creating Custom Profiles
Company-Specific Profile
Create profiles tailored to your organization:
# Create custom profile
cat > profiles/acme-corp.env << EOF
# ACME Corp Production Anomstack Profile
ANOMSTACK_IGNORE_EXAMPLES=yes
ANOMSTACK_TABLE_KEY=acme.production.metrics
ANOMSTACK_MODEL_PATH=gs://acme-ml-models/anomstack/
# Enable ACME-specific metric batches
ANOMSTACK__SALES_METRICS__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__SALES_METRICS__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__SALES_METRICS__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__SALES_METRICS__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__USER_METRICS__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__USER_METRICS__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__USER_METRICS__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__USER_METRICS__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
# ACME alert configuration
ANOMSTACK_ALERT_EMAIL_FROM=anomstack@acme-corp.com
ANOMSTACK_ALERT_EMAIL_TO=data-team@acme-corp.com,ops@acme-corp.com
ANOMSTACK_SLACK_CHANNEL=#data-alerts
EOF
# Deploy with custom profile
./scripts/deployment/deploy_fly.sh --profile acme-corp acme-anomstack-prod
Multi-Environment Setup
Use different profiles for different environments:
# Development environment
./scripts/deployment/deploy_fly.sh --profile development acme-anomstack-dev
# Staging environment (using production profile as base)
./scripts/deployment/deploy_fly.sh --profile production acme-anomstack-staging
# Production environment
./scripts/deployment/deploy_fly.sh --profile acme-corp acme-anomstack-prod
# Demo environment for stakeholders
./scripts/deployment/deploy_fly.sh --profile demo acme-anomstack-demo
Environment Variable Format
Profiles use Anomstack's metric batch override system:
Format
ANOMSTACK__<METRIC_BATCH>__<PARAMETER>=<VALUE>
Rules:
<METRIC_BATCH>
: Uppercase metric batch name with dashes replaced by underscores<PARAMETER>
: Uppercase parameter name<VALUE>
: The configuration value
Common Parameters
Schedule Controls:
ANOMSTACK__BATCH_NAME__INGEST_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__TRAIN_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__SCORE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__ALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__CHANGE_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__LLMALERT_DEFAULT_SCHEDULE_STATUS=RUNNING
ANOMSTACK__BATCH_NAME__PLOT_DEFAULT_SCHEDULE_STATUS=RUNNING
Alert Configuration:
ANOMSTACK__BATCH_NAME__ALERT_METHODS=email,slack
ANOMSTACK__BATCH_NAME__ALERT_THRESHOLD=0.7
ANOMSTACK__BATCH_NAME__ALERT_ALWAYS=True
Scheduling:
ANOMSTACK__BATCH_NAME__INGEST_CRON_SCHEDULE="*/15 * * * *"
ANOMSTACK__BATCH_NAME__TRAIN_CRON_SCHEDULE="*/60 * * * *"
Profile Composition Workflows
For Demo Creators
-
Develop your demo configuration:
# Test locally first
cp profiles/demo.env .env
# Add your API keys to .env
make local -
Deploy your demo:
make fly-deploy-demo my-awesome-demo
-
Share with others:
# Others can recreate your exact demo
git clone your-repo
cp .example.env .env # They add their API keys
make fly-deploy-demo their-demo-name
For Production Teams
-
Create company profile:
vim profiles/company-prod.env
# Configure your production-specific settings -
Test in staging:
./scripts/deployment/deploy_fly.sh --profile company-prod staging-app
-
Deploy to production:
./scripts/deployment/deploy_fly.sh --profile company-prod production-app
For Multi-Tenant SaaS
# Create tenant-specific profiles
vim profiles/tenant-a.env
vim profiles/tenant-b.env
# Deploy separate instances
./scripts/deployment/deploy_fly.sh --profile tenant-a tenant-a-anomstack
./scripts/deployment/deploy_fly.sh --profile tenant-b tenant-b-anomstack
Best Practices
Profile Organization
- Keep profiles focused: One environment or use case per profile
- Use descriptive names:
company-production.env
vsprod.env
- Document purpose: Add comments explaining profile intent
- Version control: Always commit profiles (they don't contain secrets)
Security
- Secrets in
.env
: Never put API keys or passwords in profiles - Public profiles: Profiles are source-controlled and visible
- Sensitive overrides: Use deployment-time environment variables for sensitive config
Testing
- Always preview: Use
make fly-preview-<profile>
before deploying - Test in staging: Use profiles in non-production first
- Validate configurations: Ensure all required variables are set
Documentation
- Document your profiles: Add README files explaining custom profiles
- Share examples: Provide example
.env
files for your profiles - Update regularly: Keep profiles in sync with new features
Related Documentation
- Environment Variables - Complete list of available environment variables
- Metrics Configuration - How to configure metric batches
- Fly.io Deployment - Fly.io-specific deployment details
- Hot Reload - Dynamic configuration updates