From 3581e1fe1b1deee809aff4a5262b790894fff94b Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Mon, 2 Feb 2026 14:42:41 -0500 Subject: [PATCH 01/14] refactor: Restructure AWS docs with improved user journey - Reorganize into logical sections: After Deploy, Configure, Operate, Reference - Add "What You'll Deploy" table combining resources and costs upfront - Group deployment steps with section headers (Prerequisites, Setup, Configure, Deploy) - Use stepNumber prop for continuous 1-12 numbering across sections - Fix broken os.agno.com flow (requires HTTPS first) - Add missing ECR setup steps - Fix project structure to match actual template - Create new pages: verify.mdx, https.mdx, connect.mdx - Move reference content: env-vars, database-tables, troubleshooting Co-Authored-By: Claude Opus 4.5 --- docs.json | 60 ++-- images/agent-os-connection-dialog-live.png | Bin 0 -> 81982 bytes images/aws-architecture-dark.svg | 254 +++++++++++++++++ images/aws-architecture-light.svg | 254 +++++++++++++++++ production/aws/after-deploy/connect.mdx | 84 ++++++ production/aws/after-deploy/https.mdx | 103 +++++++ production/aws/after-deploy/verify.mdx | 80 ++++++ production/aws/ci-cd.mdx | 174 ------------ production/aws/configure/database.mdx | 149 ++++++++++ production/aws/configure/efs.mdx | 281 +++++++++++++++++++ production/aws/configure/local.mdx | 94 +++++++ production/aws/configure/packages.mdx | 103 +++++++ production/aws/configure/secrets.mdx | 180 ++++++++++++ production/aws/configure/settings.mdx | 112 ++++++++ production/aws/database-tables.mdx | 209 -------------- production/aws/development-app.mdx | 106 ------- production/aws/domain-https.mdx | 89 ------ production/aws/env-vars.mdx | 51 ---- production/aws/format-and-validate.mdx | 42 --- production/aws/getting-started.mdx | 245 ++++++++++++++++ production/aws/git-repo.mdx | 28 -- production/aws/infra-settings.mdx | 79 ------ production/aws/install.mdx | 72 ----- production/aws/new-users.mdx | 124 -------- production/aws/operate/ci-cd.mdx | 150 ++++++++++ production/aws/operate/monitoring.mdx | 123 ++++++++ production/aws/operate/troubleshooting.mdx | 201 +++++++++++++ production/aws/operate/updates.mdx | 210 ++++++++++++++ production/aws/production-app.mdx | 165 ----------- production/aws/python-packages.mdx | 128 --------- production/aws/reference/database-tables.mdx | 156 ++++++++++ production/aws/reference/env-vars.mdx | 78 +++++ production/aws/secrets.mdx | 73 ----- production/aws/ssh-access.mdx | 29 -- production/overview.mdx | 2 +- production/templates/aws.mdx | 178 ------------ production/templates/overview.mdx | 4 +- 37 files changed, 2898 insertions(+), 1572 deletions(-) create mode 100644 images/agent-os-connection-dialog-live.png create mode 100644 images/aws-architecture-dark.svg create mode 100644 images/aws-architecture-light.svg create mode 100644 production/aws/after-deploy/connect.mdx create mode 100644 production/aws/after-deploy/https.mdx create mode 100644 production/aws/after-deploy/verify.mdx delete mode 100644 production/aws/ci-cd.mdx create mode 100644 production/aws/configure/database.mdx create mode 100644 production/aws/configure/efs.mdx create mode 100644 production/aws/configure/local.mdx create mode 100644 production/aws/configure/packages.mdx create mode 100644 production/aws/configure/secrets.mdx create mode 100644 production/aws/configure/settings.mdx delete mode 100644 production/aws/database-tables.mdx delete mode 100644 production/aws/development-app.mdx delete mode 100644 production/aws/domain-https.mdx delete mode 100644 production/aws/env-vars.mdx delete mode 100644 production/aws/format-and-validate.mdx create mode 100644 production/aws/getting-started.mdx delete mode 100644 production/aws/git-repo.mdx delete mode 100644 production/aws/infra-settings.mdx delete mode 100644 production/aws/install.mdx delete mode 100644 production/aws/new-users.mdx create mode 100644 production/aws/operate/ci-cd.mdx create mode 100644 production/aws/operate/monitoring.mdx create mode 100644 production/aws/operate/troubleshooting.mdx create mode 100644 production/aws/operate/updates.mdx delete mode 100644 production/aws/production-app.mdx delete mode 100644 production/aws/python-packages.mdx create mode 100644 production/aws/reference/database-tables.mdx create mode 100644 production/aws/reference/env-vars.mdx delete mode 100644 production/aws/secrets.mdx delete mode 100644 production/aws/ssh-access.mdx delete mode 100644 production/templates/aws.mdx diff --git a/docs.json b/docs.json index 8b965f986..f3095cc66 100644 --- a/docs.json +++ b/docs.json @@ -2956,30 +2956,46 @@ "pages": [ "production/templates/overview", "production/templates/docker", - "production/templates/railway", + "production/templates/railway" + ] + }, + { + "group": "AWS", + "pages": [ + "production/aws/getting-started", { - "group": "AWS", + "group": "After Deploy", "pages": [ - "production/templates/aws", - { - "group": "Managing AgentOS on AWS", - "pages": [ - "production/aws/development-app", - "production/aws/production-app", - "production/aws/install", - "production/aws/python-packages", - "production/aws/secrets", - "production/aws/env-vars", - "production/aws/database-tables", - "production/aws/ci-cd", - "production/aws/domain-https", - "production/aws/ssh-access", - "production/aws/infra-settings", - "production/aws/git-repo", - "production/aws/new-users", - "production/aws/format-and-validate" - ] - } + "production/aws/after-deploy/verify", + "production/aws/after-deploy/https", + "production/aws/after-deploy/connect" + ] + }, + { + "group": "Configure", + "pages": [ + "production/aws/configure/secrets", + "production/aws/configure/settings", + "production/aws/configure/database", + "production/aws/configure/efs", + "production/aws/configure/local", + "production/aws/configure/packages" + ] + }, + { + "group": "Operate", + "pages": [ + "production/aws/operate/updates", + "production/aws/operate/ci-cd", + "production/aws/operate/monitoring", + "production/aws/operate/troubleshooting" + ] + }, + { + "group": "Reference", + "pages": [ + "production/aws/reference/database-tables", + "production/aws/reference/env-vars" ] } ] diff --git a/images/agent-os-connection-dialog-live.png b/images/agent-os-connection-dialog-live.png new file mode 100644 index 0000000000000000000000000000000000000000..22045c952c07192c59ded57a5d5ddb1ee628457a GIT binary patch literal 81982 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�Wjd$y6sXEo6326AfS44qx{(V@TiI86yAdARR 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 P_|rXYbSh8NCh&g%M*_H1 literal 0 HcmV?d00001 diff --git a/images/aws-architecture-dark.svg b/images/aws-architecture-dark.svg new file mode 100644 index 000000000..6c17fdf0c --- /dev/null +++ b/images/aws-architecture-dark.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + External + + + + + + Users + HTTP(S) + + + + + + + os.agno.com + Control Plane + + + + + Your VPC + (with Internet Gateway) + + + + Public Subnets (aws_subnet_ids) + + + AGNO CREATES: + + + + + + Application + Load Balancer + HTTP (HTTPS optional) + + + + + + LB Security Group + + + + + + ECS Fargate + + + + + + AgentOS + Container + port 8000 + + + + + + + Your + Agents/ + Teams + + + + + + /health (built-in) + + + + + + + App Security Group + + + + + + + RDS + PostgreSQL + + pgvector + (single AZ) + + + + + + DB Security Group + + + + + + + EFS + Storage + (optional, you create) + + + + + AWS Regional Services (not in VPC) + + + + + + ECR + Images + + + + + + + Secrets Manager + API Keys, DB Creds + + + + + + + + + CloudWatch + Logs + + + + + + + IAM + Roles & Policies + + + + + + + + + + + + + + + + + + + + + + + + Agno Creates + + + You Provide + + + Optional + + + + Data Flow + + + Security Group + + diff --git a/images/aws-architecture-light.svg b/images/aws-architecture-light.svg new file mode 100644 index 000000000..f34573b44 --- /dev/null +++ b/images/aws-architecture-light.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + External + + + + + + Users + HTTP(S) + + + + + + + os.agno.com + Control Plane + + + + + Your VPC + (with Internet Gateway) + + + + Public Subnets (aws_subnet_ids) + + + AGNO CREATES: + + + + + + Application + Load Balancer + HTTP (HTTPS optional) + + + + + + LB Security Group + + + + + + ECS Fargate + + + + + + AgentOS + Container + port 8000 + + + + + + + Your + Agents/ + Teams + + + + + + /health (built-in) + + + + + + + App Security Group + + + + + + + RDS + PostgreSQL + + pgvector + (single AZ) + + + + + + DB Security Group + + + + + + + EFS + Storage + (optional, you create) + + + + + AWS Regional Services (not in VPC) + + + + + + ECR + Images + + + + + + + Secrets Manager + API Keys, DB Creds + + + + + + + + + CloudWatch + Logs + + + + + + + IAM + Roles & Policies + + + + + + + + + + + + + + + + + + + + + + + + Agno Creates + + + You Provide + + + Optional + + + + Data Flow + + + Security Group + + diff --git a/production/aws/after-deploy/connect.mdx b/production/aws/after-deploy/connect.mdx new file mode 100644 index 000000000..85df2ff43 --- /dev/null +++ b/production/aws/after-deploy/connect.mdx @@ -0,0 +1,84 @@ +--- +title: "Connect to Control Plane" +sidebarTitle: "Connect" +description: "Connect your AgentOS to os.agno.com" +--- + +Connect your AWS deployment to [os.agno.com](https://os.agno.com) to monitor and manage your agents. + +## Prerequisites + +Before connecting, ensure: + +| Requirement | Check | +|-------------|-------| +| Deployment is running | `curl https://your-domain.com/health` returns OK | +| HTTPS is configured | URL starts with `https://` | +| Certificate is valid | No browser warnings when visiting your domain | + + +HTTPS is required. If you haven't set it up yet, see [Add HTTPS](/production/aws/after-deploy/https). + + +## Connect Your AgentOS + + + +Go to [os.agno.com](https://os.agno.com) and sign in. + + + +Click "Connect OS" and select "Live". + + + AgentOS connection dialog + + + + +Enter your production URL: +``` +https://api.yourdomain.com +``` + + + +The instance should show "Connected" status. + + + +## Verify Connection + +Once connected, you should see: +- Your agents listed in the dashboard +- Real-time status updates +- Ability to interact with your agents + +## Troubleshooting + +| Status | Cause | Solution | +|--------|-------|----------| +| "Unhealthy" | Health check failing | Check `/health` endpoint returns 200 | +| "Unreachable" | Network issue | Verify HTTPS certificate is valid | +| "Connection refused" | Firewall blocking | Check security group allows inbound 443 | + +### Check from os.agno.com's perspective + +Your endpoint must be publicly accessible. Test from outside your network: + +```bash +curl -I https://api.yourdomain.com/health +``` + +Should return `HTTP/2 200`. + +## What's Next? + +Your AgentOS is now deployed and connected. Here's what to do next: + +| Task | Guide | +|------|-------| +| Add persistent storage | [Configure EFS](/production/aws/configure/efs) | +| Set up automated deployments | [CI/CD](/production/aws/operate/ci-cd) | +| Monitor logs and metrics | [Monitoring](/production/aws/operate/monitoring) | +| Update your deployment | [Push Updates](/production/aws/operate/updates) | diff --git a/production/aws/after-deploy/https.mdx b/production/aws/after-deploy/https.mdx new file mode 100644 index 000000000..3ee8e4fc3 --- /dev/null +++ b/production/aws/after-deploy/https.mdx @@ -0,0 +1,103 @@ +--- +title: "Add HTTPS" +sidebarTitle: "HTTPS" +description: "Add a custom domain and SSL certificate" +--- + +HTTPS is required to connect your AgentOS to os.agno.com. + +## Overview + +1. Register a domain (or use an existing one) +2. Create an SSL certificate in AWS ACM +3. Configure your load balancer to use HTTPS + +## Step 1: Set Up Your Domain + +Register your domain with [Route 53](https://us-east-1.console.aws.amazon.com/route53/) or use an existing domain. + +Create an A record pointing to your load balancer: + +| Record | Type | Value | +|--------|------|-------| +| `api.yourdomain.com` | A (Alias) | Your ALB DNS name | + +## Step 2: Create SSL Certificate + + + +Go to [AWS ACM](https://us-east-1.console.aws.amazon.com/acm) and request a certificate for your domain (e.g., `*.yourdomain.com` or `api.yourdomain.com`). + + + +Choose DNS validation. ACM will provide CNAME records to add to Route 53. + +Click "Create records in Route 53" to add them automatically. + + +Certificate validation takes 5-30 minutes. Wait until status shows "Issued". + + + + +Once issued, copy the ARN. It looks like: +``` +arn:aws:acm:us-east-1:[ACCOUNT_ID]:certificate/[CERTIFICATE_ID] +``` + + + +## Step 3: Configure Load Balancer + + + +Add the certificate ARN: + +```python infra/prd_resources.py +prd_fastapi = FastApi( + ... + load_balancer_enable_https=True, + load_balancer_certificate_arn="arn:aws:acm:us-east-1:[ACCOUNT_ID]:certificate/[CERTIFICATE_ID]", +) +``` + + + +```bash +ag infra up prd:aws:::listener +``` + + + +```bash +ag infra patch prd:aws:::listener +``` + +All HTTP requests now redirect to HTTPS. + + + +## Verify HTTPS Works + +```bash +curl https://api.yourdomain.com/health +``` + +Should return: +```json +{"status": "ok", "instantiated_at": "..."} +``` + +## Troubleshooting + +| Issue | Solution | +|-------|----------| +| Certificate not validating | Check CNAME records in Route 53, wait up to 30 min | +| Certificate not showing in dropdown | Must be in same region as load balancer (us-east-1) | +| HTTPS not working after setup | Run `ag infra patch prd:aws:::listener` again | + +## Next Step + +Now you can connect to os.agno.com: + +→ [Connect to Control Plane](/production/aws/after-deploy/connect) diff --git a/production/aws/after-deploy/verify.mdx b/production/aws/after-deploy/verify.mdx new file mode 100644 index 000000000..d1f16a212 --- /dev/null +++ b/production/aws/after-deploy/verify.mdx @@ -0,0 +1,80 @@ +--- +title: "Verify Your Deployment" +sidebarTitle: "Verify" +description: "Confirm your AWS deployment is working" +--- + +After running `ag infra up prd:aws`, verify everything is working before proceeding. + +## Check the Health Endpoint + +Get your load balancer DNS from the AWS Console (EC2 → Load Balancers), then: + +```bash +curl http://[LOAD_BALANCER_DNS]/health +``` + +Expected response: +```json +{"status": "ok", "instantiated_at": "2025-01-01T12:00:00Z"} +``` + +## Check CloudWatch Logs + +```bash +aws logs tail /ecs/{infra_name}-prd --follow +``` + +Look for these lines indicating successful startup: + +``` +INFO: Started server process [1] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8000 +``` + + +Replace `{infra_name}` with your `infra_name` from `settings.py` (e.g., `agentos-aws-template`). + + +## Check ECS Service Status + +```bash +aws ecs describe-services \ + --cluster {infra_name}-prd \ + --services {infra_name}-prd-service \ + --query 'services[0].{status:status,running:runningCount,desired:desiredCount}' +``` + +Expected output: +```json +{ + "status": "ACTIVE", + "running": 1, + "desired": 1 +} +``` + +## What Success Looks Like + +| Check | Expected | +|-------|----------| +| Health endpoint | Returns `{"status": "ok", ...}` | +| CloudWatch logs | Shows "Application startup complete" | +| ECS service | Running count matches desired count | +| Load balancer targets | Shows "healthy" in AWS Console | + +## If Something Is Wrong + +| Symptom | Next Step | +|---------|-----------| +| Health returns error | Check [CloudWatch logs](/production/aws/operate/monitoring) | +| No logs appearing | Check ECS task started in AWS Console | +| Task keeps restarting | See [Troubleshooting](/production/aws/operate/troubleshooting) | + +## Next Step + +Once verified, add HTTPS to connect to os.agno.com: + +→ [Add HTTPS](/production/aws/after-deploy/https) diff --git a/production/aws/ci-cd.mdx b/production/aws/ci-cd.mdx deleted file mode 100644 index 57e609367..000000000 --- a/production/aws/ci-cd.mdx +++ /dev/null @@ -1,174 +0,0 @@ ---- -title: CI/CD ---- - -Agno templates come pre-configured with [Github Actions](https://docs.github.com/en/actions) for CI/CD. We can - -1. [Test and Validate on every PR](#test-and-validate-on-every-pr) -2. [Build Docker Images with Github Releases](#build-docker-images-with-github-releases) -3. [Build ECR Images with Github Releases](#build-ecr-images-with-github-releases) - -## Test and Validate on every PR - -Whenever a PR is opened against the `main` branch, a validate script runs that ensures - -1. The changes are formatted using ruff -2. All unit-tests pass -3. The changes don't have any typing or linting errors. - -Checkout the `.github/workflows/validate.yml` file for more information. - -validate-cicd - -## Build Docker Images with Github Releases - -If you're using [Dockerhub](https://hub.docker.com/) for images, you can buld and push the images throug a Github Release. This action is defined in the `.github/workflows/docker-images.yml` file. - -1. Create a [Docker Access Token](https://hub.docker.com/settings/security) for Github Actions - -docker-access-token - -2. Create secret variables `DOCKERHUB_REPO`, `DOCKERHUB_TOKEN` and `DOCKERHUB_USERNAME` in your github repo. These variables are used by the action in `.github/workflows/docker-images.yml` - -github-actions-docker-secrets - -3. Run workflow using a Github Release - -This workflow is configured to run when a release is created. Create a new release using: - - - -Confirm the image name in the `.github/workflows/docker-images.yml` file before running - - - - - -```bash Mac -gh release create v0.1.0 --title "v0.1.0" -n "" -``` - -```bash Windows -gh release create v0.1.0 --title "v0.1.0" -n "" -``` - - - -github-actions-build-docker - - - -You can also run the workflow using `gh workflow run` - - - -## Build ECR Images with Github Releases - -If you're using ECR for images, you can buld and push the images through a Github Release. This action is defined in the `.github/workflows/ecr-images.yml` file and uses the new OpenID Connect (OIDC) approach to request the access token, without using IAM access keys. - -We will follow this [guide](https://aws.amazon.com/blogs/security/use-iam-roles-to-connect-github-actions-to-actions-in-aws/) to create an IAM role which will be used by the github action. - -1. Open the IAM console. -2. In the left navigation menu, choose Identity providers. -3. In the Identity providers pane, choose Add provider. -4. For Provider type, choose OpenID Connect. -5. For Provider URL, enter the URL of the GitHub OIDC IdP: https://token.actions.githubusercontent.com -6. Get thumbprint to verify the server certificate -7. For Audience, enter sts.amazonaws.com. - -Verify the information matches the screenshot below and Add provider - -github-oidc-provider - -8. Assign a Role to the provider. - -github-oidc-provider-assign-role - -9. Create a new role. - -github-oidc-provider-create-new-role - -10. Confirm that Web identity is already selected as the trusted entity and the Identity provider field is populated with the IdP. In the Audience list, select sts.amazonaws.com, and then select Next. - -github-oidc-provider-trusted-entity - -11. Add the `AmazonEC2ContainerRegistryPowerUser` permission to this role. - -12. Create the role with the name `GithubActionsRole`. - -13. Find the role `GithubActionsRole` and copy the ARN. - -github-oidc-role - -14. Create the ECR Repositories: `llm` and `jupyter-llm` which are built by the workflow. - -create-ecr-image - -15. Update the workflow with the `GithubActionsRole` ARN and ECR Repository. - -```yaml .github/workflows/ecr-images.yml -name: Build ECR Images - -on: - release: - types: [published] - -permissions: - # For AWS OIDC Token access as per https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services#updating-your-github-actions-workflow - id-token: write # This is required for requesting the JWT - contents: read # This is required for actions/checkout - -env: - ECR_REPO: [YOUR_ECR_REPO] - # Create role using https://aws.amazon.com/blogs/security/use-iam-roles-to-connect-github-actions-to-actions-in-aws/ - AWS_ROLE: [GITHUB_ACTIONS_ROLE_ARN] - AWS_REGION: us-east-1 -``` - -16. Update the `docker-images` workflow to **NOT** run on a release - -```yaml .github/workflows/docker-images.yml -name: Build Docker Images - -on: workflow_dispatch -``` - -17. Run workflow using a Github Release - - - -```bash Mac -gh release create v0.2.0 --title "v0.2.0" -n "" -``` - -```bash Windows -gh release create v0.2.0 --title "v0.2.0" -n "" -``` - - - -github-actions-build-ecr - - - -You can also run the workflow using `gh workflow run` - - diff --git a/production/aws/configure/database.mdx b/production/aws/configure/database.mdx new file mode 100644 index 000000000..00dfa2baf --- /dev/null +++ b/production/aws/configure/database.mdx @@ -0,0 +1,149 @@ +--- +title: "Database Setup" +sidebarTitle: "Database" +description: "Configure RDS PostgreSQL and run migrations" +--- + +## Overview + +AgentOS uses PostgreSQL for: +- Agent memory and sessions +- Knowledge embeddings (pgvector) +- Custom application data + +RDS is created automatically by `ag infra up prd:aws`. + +## Prerequisites + +Complete [Secrets Setup](/production/aws/configure/secrets) first. The database credentials must exist before deployment. + +## Database Credentials + +Edit `infra/secrets/prd_db_secrets.yml`: + +```yaml +DB_USER: "ai" +DB_PASS: "YourSecurePassword123" +``` + +Generate a secure password: + +```bash +openssl rand -base64 24 +``` + + +Avoid `@`, `#`, `%`, `&` in passwords. These require URL encoding and cause silent connection failures. + +Safe characters: alphanumeric, `!`, `-`, `_` + + +## RDS Configuration + +Default configuration in `prd_resources.py`: + +| Setting | Default | Description | +|---------|---------|-------------| +| `engine` | `postgres` | PostgreSQL | +| `engine_version` | `17.2` | PostgreSQL 17 | +| `allocated_storage` | `64` | 64 GB storage | +| `db_instance_class` | `db.t4g.small` | ~$25/month | +| `db_name` | `ai` | Database name | +| `port` | `5432` | PostgreSQL port | + +### Customize RDS + +Edit `prd_resources.py`: + +```python prd_resources.py +prd_db = DbInstance( + ... + db_instance_class="db.t4g.medium", # Larger instance + allocated_storage=128, # More storage + engine_version="17.2", # PostgreSQL version +) +``` + +After changes: +```bash +ag infra patch prd:aws:::db +``` + + +Some changes (like instance class) require a reboot. Check AWS Console for status. + + +## Connection Settings + +The app connects via environment variables set automatically in `prd_resources.py`: + +| Variable | Source | +|----------|--------| +| `DB_HOST` | RDS endpoint (auto-populated) | +| `DB_PORT` | RDS port (auto-populated) | +| `DB_USER` | From `prd_db_secrets.yml` | +| `DB_PASS` | From `prd_db_secrets.yml` | +| `DB_DATABASE` | RDS database name | + +## Migrations + +### Option 1: Run on Deployment + +Add `MIGRATE_DB` to `prd_resources.py`: + +```python prd_resources.py +container_env = { + ... + "MIGRATE_DB": True, +} +``` + +Then update and redeploy: +```bash +ag infra patch prd:aws:::td && ag infra patch prd:aws:::service +``` + +### Option 2: Run Manually via ECS Exec + +```bash +ECS_CLUSTER={infra_name}-prd +TASK_ARN=$(aws ecs list-tasks --cluster $ECS_CLUSTER --query "taskArns[0]" --output text) + +aws ecs execute-command \ + --cluster $ECS_CLUSTER \ + --task $TASK_ARN \ + --container {infra_name}-prd \ + --interactive \ + --command "alembic -c db/alembic.ini upgrade head" +``` + +## Verify Connection + +After deployment, verify the database is accessible: + +```bash +# Get RDS endpoint +aws rds describe-db-instances \ + --db-instance-identifier {infra_name}-prd-db \ + --query 'DBInstances[0].Endpoint.Address' \ + --output text +``` + +Test connection (requires `psql`): +```bash +psql -h [RDS_ENDPOINT] -U ai -d ai +``` + +## Troubleshooting + +| Issue | Solution | +|-------|----------| +| Cannot connect to RDS | Check security group allows port 5432 from your IP | +| Connection fails silently | Remove special characters from password | +| RDS not ready | Wait ~5 minutes, check AWS Console | +| ECS can't connect | Verify security group allows ECS security group | + +## Next Steps + +- [Database Tables Reference](/production/aws/reference/database-tables) - SQLAlchemy models +- [Troubleshooting](/production/aws/operate/troubleshooting) - Common issues diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx new file mode 100644 index 000000000..fc6c444f5 --- /dev/null +++ b/production/aws/configure/efs.mdx @@ -0,0 +1,281 @@ +--- +title: "Persistent Storage with EFS" +sidebarTitle: "EFS" +description: "Use Amazon EFS for data that survives container restarts" +--- + +Amazon Elastic File System (EFS) provides shared, persistent storage for your ECS containers. Use it when your agents need data to survive container restarts or deployments. + +## When to Use EFS + + + + Agents like Pal use DuckDB to store structured data locally. Without EFS, this data is lost when containers restart. + + + Each `ag infra up` creates new containers. EFS ensures your data persists across deployments. + + + If you scale to multiple ECS tasks, EFS provides a shared filesystem all containers can access. + + + +## Pal Agent Requirements + + +**Pal agent requires EFS in production.** Without EFS, Pal's DuckDB data (notes, bookmarks, research) is lost when containers restart or redeploy. + + +| Agent | EFS Required? | Why | +|-------|---------------|-----| +| Pal | Yes | Stores DuckDB at `/data/pal.db` | +| Knowledge Agent | No | Uses PostgreSQL (RDS) | +| MCP Agent | No | Stateless | + +### DuckDB Single Worker Requirement + + +DuckDB requires single-writer access. The template sets `--workers 1` in the uvicorn command. Do not increase workers if using Pal or any DuckDB-based agent. + + +Multiple workers cause "database is locked" errors and potential data corruption. + +## Data Persistence Summary + +| Data Type | Storage | Survives Restart? | +|-----------|---------|-------------------| +| Agent memory & sessions | PostgreSQL (RDS) | ✓ Yes | +| Knowledge embeddings | PostgreSQL (RDS) | ✓ Yes | +| Pal's DuckDB (notes, bookmarks) | Local `/data` | ✗ No (needs EFS) | +| File uploads | Local filesystem | ✗ No (needs EFS or S3) | + +## Architecture + +```mermaid +flowchart TB + subgraph ECS["ECS Fargate"] + C1["Container 1
/data (mount)"] + C2["Container 2
/data (mount)"] + end + + subgraph EFS["Amazon EFS"] + FS["File System (fs-xxx)"] + AP["Access Point (fsap-xxx)
Path: /data | UID/GID: 61000"] + FS --> AP + end + + C1 -->|"NFS (2049)"| AP + C2 -->|"NFS (2049)"| AP +``` + +## Setup Guide + + + + + +Create a new file system in your AWS region: + +```bash +aws efs create-file-system \ + --creation-token agentos-efs \ + --performance-mode generalPurpose \ + --throughput-mode bursting \ + --region us-east-1 +``` + +Save the `FileSystemId` from the response (e.g., `fs-0123456789abcdef0`). + + +Use `generalPurpose` performance mode for most workloads. Only use `maxIO` for highly parallelized applications. + + + + + + +Access points provide application-specific entry points with user/permission mapping: + +```bash +aws efs create-access-point \ + --file-system-id fs-0123456789abcdef0 \ + --posix-user Uid=61000,Gid=61000 \ + --root-directory "Path=/data,CreationInfo={OwnerUid=61000,OwnerGid=61000,Permissions=755}" \ + --region us-east-1 +``` + +Save the `AccessPointId` from the response (e.g., `fsap-0123456789abcdef0`). + + +The UID/GID `61000` matches the non-root user in the AgentOS container. This ensures your application can read and write to EFS. + + + + + + +Update `infra/settings.py` with your EFS IDs: + +```python infra/settings.py +infra_settings = InfraSettings( + ... + # EFS for persistent storage + efs_file_system_id="fs-0123456789abcdef0", + efs_access_point_id="fsap-0123456789abcdef0", +) +``` + + + + + +EFS needs mount targets in each subnet your ECS tasks use. First, deploy to create the EFS security group: + +```bash +ag infra up prd:aws +``` + +Then get the security group ID: + +```bash +aws ec2 describe-security-groups \ + --filters "Name=group-name,Values=*-efs-sg" \ + --query 'SecurityGroups[0].GroupId' \ + --output text +``` + +Create mount targets in each subnet: + +```bash +# Replace with your subnet IDs and security group +aws efs create-mount-target \ + --file-system-id fs-0123456789abcdef0 \ + --subnet-id subnet-0abc123def456789a \ + --security-groups sg-0123456789abcdef0 + +aws efs create-mount-target \ + --file-system-id fs-0123456789abcdef0 \ + --subnet-id subnet-0def456789abc123b \ + --security-groups sg-0123456789abcdef0 +``` + + + + + +Redeploy to pick up the EFS configuration: + +```bash +ag infra up prd:aws -y +``` + +Verify the mount by checking your container logs: + +```bash +aws logs tail /ecs/agentos-aws-template-prd --follow +``` + +You should see your application start without errors. Data written to `/data` now persists across restarts. + + + + + +## Settings Reference + +| Setting | Type | Description | +|---------|------|-------------| +| `efs_file_system_id` | `str` | EFS file system ID (e.g., `fs-0123456789abcdef0`) | +| `efs_access_point_id` | `str` | Access point ID (e.g., `fsap-0123456789abcdef0`). Optional but recommended for permission mapping. | + +## How It Works + +When you configure EFS settings, the infrastructure automatically: + +1. **Creates a security group** (`*-efs-sg`) allowing NFS traffic (port 2049) from your app containers +2. **Configures an ECS volume** with transit encryption enabled +3. **Mounts the volume** at `/data` in your container + +The relevant code in `prd_resources.py`: + +```python +# EFS Volume configuration +prd_efs_volume = EcsVolume( + name="efs-data-volume", + efs_volume_configuration={ + "fileSystemId": efs_file_system_id, + "transitEncryption": "ENABLED", + "authorizationConfig": { + "accessPointId": efs_access_point_id, + "iam": "DISABLED", + }, + }, +) + +# Mount point in FastApi app +prd_fastapi = FastApi( + ... + ecs_volumes=[prd_efs_volume], + ecs_container_mount_points=[ + {"sourceVolume": "efs-data-volume", "containerPath": "/data"} + ], +) +``` + +## Cost + +EFS pricing is based on storage used: + +| Storage Class | Price (US East) | +|---------------|-----------------| +| Standard | $0.30/GB-month | +| Infrequent Access | $0.016/GB-month | +| Archive | $0.008/GB-month | + +**Example costs:** +- 1 GB of agent data: ~$0.30/month +- 10 GB of documents: ~$3.00/month + +There's no minimum fee. You only pay for what you use. + + +Enable lifecycle policies to automatically move infrequently accessed files to cheaper storage classes. + + +## Troubleshooting + + + + Ensure you've created mount targets in the same subnets specified in `infra/settings.py`. Each subnet needs its own mount target. + + ```bash + aws efs describe-mount-targets --file-system-id fs-xxx + ``` + + + + Check that your access point uses UID/GID `61000` to match the container user. Verify with: + + ```bash + aws efs describe-access-points --access-point-id fsap-xxx + ``` + + + + Check that the EFS security group allows inbound NFS (port 2049) from your app security group. View the security group rules: + + ```bash + aws ec2 describe-security-groups --group-names "*-efs-sg" + ``` + + + + Ensure your application writes to `/data`, not another directory. Check your `DATA_DIR` environment variable. + + + +## Next Steps + +- [Secrets](/production/aws/configure/secrets) - API keys and credentials +- [Domain & HTTPS](/production/aws/after-deploy/https) - Custom domain and SSL +- [Monitoring](/production/aws/operate/monitoring) - CloudWatch logs diff --git a/production/aws/configure/local.mdx b/production/aws/configure/local.mdx new file mode 100644 index 000000000..f70992d6e --- /dev/null +++ b/production/aws/configure/local.mdx @@ -0,0 +1,94 @@ +--- +title: "Local Development" +sidebarTitle: "Local" +description: "Build and run your application locally with Docker" +--- + +Local development uses Docker Compose. Resources are defined in `infra/dev_resources.py`. + +## Start Local Environment + +```bash +ag infra up +``` + +This starts: +- PostgreSQL database (port 5432) +- AgentOS API (port 8000) + +Access points: +- **API docs:** http://localhost:8000/docs +- **Health check:** http://localhost:8000/health + +## View Logs + +```bash +docker logs -f ai-api +``` + +Expected startup output: +``` +INFO: Started server process [1] +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8000 +``` + +## Building Custom Images + +By default, the dev environment uses pre-built `agno` images. To build your own: + +### 1. Update Settings + +```python infra/settings.py +infra_settings = InfraSettings( + ... + image_repo="local", + build_images=True, +) +``` + +### 2. Build the Image + +```bash +ag infra up dev:docker -t image +``` + +Force rebuild (no cache): +```bash +ag infra up dev:docker -t image -f +``` + +## Common Operations + +| Task | Command | +|------|---------| +| Start all | `ag infra up` | +| Stop all | `ag infra down` | +| Restart containers | `ag infra restart dev:docker -t container` | +| Rebuild everything | `ag infra up dev:docker -f` | +| View API logs | `docker logs -f ai-api` | +| View DB logs | `docker logs -f ai-db` | + +## Target Types + +The `-t` flag filters what to create: + +| Target | Creates | +|--------|---------| +| (none) | Everything | +| `image` | Docker image only | +| `container` | Containers only | + +## Troubleshooting + +| Issue | Solution | +|-------|----------| +| Port 8000 in use | Stop other services: `docker ps` then `docker stop ` | +| Port 5432 in use | Stop local PostgreSQL: `brew services stop postgresql` | +| Database errors | Restart: `ag infra down && ag infra up` | +| Old image cached | Force rebuild: `ag infra up dev:docker -t image -f` | + +## Next Steps + +- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS +- [CI/CD](/production/aws/operate/ci-cd) - Automate builds diff --git a/production/aws/configure/packages.mdx b/production/aws/configure/packages.mdx new file mode 100644 index 000000000..b51ed72ec --- /dev/null +++ b/production/aws/configure/packages.mdx @@ -0,0 +1,103 @@ +--- +title: "Python Packages" +sidebarTitle: "Python Packages" +description: "Manage dependencies with pyproject.toml" +--- + +Dependencies are managed in `pyproject.toml` and compiled to `requirements.txt`. + +## Adding a Package + +1. Add to `pyproject.toml` +2. Regenerate `requirements.txt` +3. Rebuild images + +## Update pyproject.toml + +Add packages to the `dependencies` array: + +```toml pyproject.toml +[project] +name = "agentos-aws-template" +version = "0.1.0" +requires-python = ">=3.12" +dependencies = [ + "agno", + "fastapi", + "uvicorn", + "your-new-package", # Add here +] + +[project.optional-dependencies] +dev = [ + "pytest", + "ruff", +] +``` + +## Generate requirements.txt + +```bash +./scripts/generate_requirements.sh +``` + +Or directly with pip-compile: + +```bash +pip-compile \ + --no-annotate \ + --pip-args "--no-cache-dir" \ + -o requirements.txt pyproject.toml +``` + +Upgrade all packages to latest versions: + +```bash +./scripts/generate_requirements.sh upgrade +``` + +## Rebuild Images + +### Development + +```bash +ag infra up dev:docker -t image -f +ag infra restart dev:docker -t container +``` + +### Production + +```bash +ag infra up prd:docker +ag infra patch prd:aws:::service +``` + +## Verify Locally First + +Before rebuilding production, test locally: + +```bash +# Rebuild dev image +ag infra up dev:docker -t image -f + +# Restart containers +ag infra restart dev:docker -t container + +# Test your app +curl http://localhost:8000/health +``` + +## If Something Breaks + +Roll back by reverting `requirements.txt`: + +```bash +git checkout requirements.txt +ag infra up dev:docker -t image -f +ag infra restart dev:docker -t container +``` + +## Next Steps + +- [Local Development](/production/aws/configure/local) - Docker setup +- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS diff --git a/production/aws/configure/secrets.mdx b/production/aws/configure/secrets.mdx new file mode 100644 index 000000000..5beaf014f --- /dev/null +++ b/production/aws/configure/secrets.mdx @@ -0,0 +1,180 @@ +--- +title: "Secrets & API Keys" +sidebarTitle: "Secrets" +description: "Configure API keys and database credentials for your deployment" +--- + +Secrets are stored in YAML files locally and synced to AWS Secrets Manager for production. + +## Quick Setup + +```bash +# Copy example files +cp infra/secrets/prd_api_secrets.example.yml infra/secrets/prd_api_secrets.yml +cp infra/secrets/prd_db_secrets.example.yml infra/secrets/prd_db_secrets.yml +``` + + +The `infra/secrets/` directory is excluded from version control (see `.gitignore`). Treat these files with the same security as passwords. + + +## API Keys + +### Required + +| Service | Get Key At | Used For | +|---------|-----------|----------| +| OpenAI | [platform.openai.com/api-keys](https://platform.openai.com/api-keys) | All agents | + +### Optional + +| Service | Get Key At | Used For | +|---------|-----------|----------| +| Exa | [dashboard.exa.ai](https://dashboard.exa.ai) | Pal research feature | + +### Set your keys + +Edit `infra/secrets/prd_api_secrets.yml`: + +```yaml infra/secrets/prd_api_secrets.yml +OPENAI_API_KEY: "sk-your-key-here" +EXA_API_KEY: "exa-your-key-here" # Optional +``` + +### Verify keys work + +Before deploying, test that your keys are valid: + +```bash +# Test OpenAI - should return a list of models +curl -s https://api.openai.com/v1/models \ + -H "Authorization: Bearer $OPENAI_API_KEY" | head -20 + +# Test Exa (optional) - should return search results +curl -s https://api.exa.ai/search \ + -H "x-api-key: $EXA_API_KEY" \ + -H "Content-Type: application/json" \ + -d '{"query": "test", "numResults": 1}' +``` + +## Database Credentials + +Edit `infra/secrets/prd_db_secrets.yml`: + +```yaml infra/secrets/prd_db_secrets.yml +DB_USER: "ai" +DB_PASS: "YourSecurePassword123" +``` + +Generate a secure password: + +```bash +openssl rand -base64 24 +``` + + +**Avoid special characters** in `DB_PASS`: `@`, `#`, `%`, `&`, `"`, `'` + +These require URL encoding and cause silent connection failures. Stick to alphanumeric characters and `!`. + +Safe example: `MySecurePass123!` + + +### How credentials flow + +``` +prd_db_secrets.yml → AWS Secrets Manager → ECS Task → App environment +``` + +| File | Variable | Becomes in App | +|------|----------|----------------| +| `prd_db_secrets.yml` | `DB_USER` | `DB_USER` | +| `prd_db_secrets.yml` | `DB_PASS` | `DB_PASS` | + +## How Secrets Work + +### Local Development + +Apps read secrets directly from YAML files: + +```python dev_resources.py +dev_fastapi = FastApi( + ... + secrets_file=infra_settings.infra_root.joinpath("infra/secrets/dev_api_secrets.yml"), +) +``` + +### Production + +Secrets are stored in AWS Secrets Manager and injected into ECS tasks: + +```python prd_resources.py +# API secrets (OpenAI, Exa) +prd_secret = SecretsManager( + name=f"{infra_settings.prd_key}-secrets", + secret_files=[infra_settings.infra_root.joinpath("infra/secrets/prd_api_secrets.yml")], +) + +# Database secrets +prd_db_secret = SecretsManager( + name=f"{infra_settings.prd_key}-db-secrets", + secret_files=[infra_settings.infra_root.joinpath("infra/secrets/prd_db_secrets.yml")], +) +``` + + +**Why two secrets?** API keys and database credentials are stored separately for security isolation. You can rotate one without affecting the other. + + +## Verify Secrets in AWS + +After deploying (`ag infra up prd:aws`), verify secrets were created: + +```bash +# List your secrets (replace with your infra_name) +aws secretsmanager list-secrets \ + --query "SecretList[?contains(Name, 'agentos-aws-template-prd')].[Name]" \ + --output table +``` + +Expected output: +``` +------------------------------------------- +| ListSecrets | ++----------------------------------------+ +| agentos-aws-template-prd-secrets | +| agentos-aws-template-prd-db-secrets | ++----------------------------------------+ +``` + +To view secret values (be careful - this exposes credentials): + +```bash +aws secretsmanager get-secret-value \ + --secret-id agentos-aws-template-prd-secrets \ + --query SecretString --output text +``` + +## Troubleshooting + + + + The secret doesn't exist yet. Run `ag infra up prd:aws` to create it from your YAML files. + + + + Check for special characters in `DB_PASS`. Remove any `@`, `#`, `%`, `&` characters and redeploy. + + + + 1. Verify the key works locally (use the curl commands above) + 2. Check the secret was updated: `aws secretsmanager get-secret-value --secret-id {name}` + 3. Redeploy the task to pick up new secrets: `ag infra patch prd:aws:::service` + + + +## Next Steps + +- [Infrastructure Settings](/production/aws/configure/settings) - Region, subnets, ECR +- [Database Setup](/production/aws/configure/database) - RDS configuration +- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS diff --git a/production/aws/configure/settings.mdx b/production/aws/configure/settings.mdx new file mode 100644 index 000000000..920f7dedf --- /dev/null +++ b/production/aws/configure/settings.mdx @@ -0,0 +1,112 @@ +--- +title: "Infrastructure Settings" +sidebarTitle: "Settings" +description: "Configure AWS region, subnets, and ECR" +--- + +The `InfraSettings` object in `infra/settings.py` defines common settings used by your apps and resources. + +```python infra/settings.py +infra_settings = InfraSettings( + infra_name="my-agentos", + aws_region="us-east-1", + aws_az1="us-east-1a", + aws_az2="us-east-1b", + aws_subnet_ids=["subnet-0abc123...", "subnet-0def456..."], + image_repo="123456789012.dkr.ecr.us-east-1.amazonaws.com", + build_images=True, + push_images=True, +) +``` + + +Settings can also be set using environment variables or `.env` file. See `example.env`. + + +## Required Settings + +| Setting | Description | Example | +|---------|-------------|---------| +| `infra_name` | Prefix for all AWS resource names | `my-agentos` | +| `aws_region` | AWS region for resources | `us-east-1` | +| `aws_subnet_ids` | VPC subnets (minimum 2) | `["subnet-xxx", "subnet-yyy"]` | +| `image_repo` | ECR repository URL | `123456789012.dkr.ecr.us-east-1.amazonaws.com` | + +## What `infra_name` Names + +The `infra_name` value prefixes all AWS resources: + +| Resource | Name Pattern | +|----------|--------------| +| ECS Cluster | `{infra_name}-prd` | +| ECS Service | `{infra_name}-prd-service` | +| Load Balancer | `{infra_name}-prd-alb` | +| RDS Instance | `{infra_name}-prd-db` | +| Secrets | `{infra_name}-prd-secrets` | +| CloudWatch Logs | `/ecs/{infra_name}-prd` | + +## Image Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `image_repo` | `agnohq` | Repository URL (DockerHub or ECR) | +| `image_name` | `agentos-aws-template` | Image name | +| `build_images` | `True` | Build Docker images locally | +| `push_images` | `False` | Push to registry after build | + +For ECR, set `image_repo` to your ECR URL: +``` +123456789012.dkr.ecr.us-east-1.amazonaws.com +``` + +## AWS Settings + +| Setting | Default | Description | +|---------|---------|-------------| +| `aws_region` | `us-east-1` | AWS region | +| `aws_az1` | `us-east-1a` | First availability zone | +| `aws_az2` | `us-east-1b` | Second availability zone | +| `aws_subnet_ids` | None | VPC subnets (required for production) | +| `aws_security_group_ids` | None | Security groups (optional) | + + +**Why 2 subnets?** AWS requires resources in at least 2 availability zones for high availability. If one zone has issues, your app stays running. + + +### Finding Your Subnet IDs + +```bash +aws ec2 describe-subnets \ + --query 'Subnets[*].[SubnetId,AvailabilityZone,CidrBlock]' \ + --output table +``` + +Choose subnets in different availability zones (e.g., `us-east-1a` and `us-east-1b`). + +## Optional: EFS Settings + +For persistent storage (required for Pal agent's data): + +```python infra/settings.py +infra_settings = InfraSettings( + ... + efs_file_system_id="fs-0123456789abcdef0", + efs_access_point_id="fsap-0123456789abcdef0", +) +``` + +See [EFS Setup](/production/aws/configure/efs) for complete instructions. + +## Verify Settings + +After updating settings, verify they're correct: + +```bash +python -c "from infra.settings import infra_settings; print(infra_settings)" +``` + +## Next Steps + +- [Secrets & API Keys](/production/aws/configure/secrets) - API keys and credentials +- [Database Setup](/production/aws/configure/database) - RDS configuration +- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS diff --git a/production/aws/database-tables.mdx b/production/aws/database-tables.mdx deleted file mode 100644 index 2a9b57703..000000000 --- a/production/aws/database-tables.mdx +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: Database Tables ---- - -Agno templates come pre-configured with [SqlAlchemy](https://www.sqlalchemy.org/) and [Alembic](https://alembic.sqlalchemy.org/en/latest/) to manage databases. You can use these tables to store data for your Agents, Teams and Workflows. The general way to add a table is: - -1. Add table definition to the `db/tables` directory. -2. Import the table class in the `db/tables/__init__.py` file. -3. Create a database migration. -4. Run database migration. - -## Table Definition - -Let's create a `UsersTable`, copy the following code to `db/tables/user.py` - -```python db/tables/user.py -from datetime import datetime -from typing import Optional - -from sqlalchemy.orm import Mapped, mapped_column -from sqlalchemy.sql.expression import text -from sqlalchemy.types import BigInteger, DateTime, String - -from db.tables.base import Base - - -class UsersTable(Base): - """Table for storing user data.""" - - __tablename__ = "dim_users" - - id_user: Mapped[int] = mapped_column( - BigInteger, primary_key=True, autoincrement=True, nullable=False, index=True - ) - email: Mapped[str] = mapped_column(String) - is_active: Mapped[bool] = mapped_column(default=True) - created_at: Mapped[datetime] = mapped_column( - DateTime(timezone=True), server_default=text("now()") - ) - updated_at: Mapped[Optional[datetime]] = mapped_column( - DateTime(timezone=True), onupdate=text("now()") - ) -``` - -Update the `db/tables/__init__.py` file: - -```python db/tables/__init__.py -from db.tables.base import Base -from db.tables.user import UsersTable -``` - -## Create a database revision - -Run the alembic command to create a database migration in the dev container: - -```bash -docker exec -it ai-api alembic -c db/alembic.ini revision --autogenerate -m "Initialize DB" -``` - -## Migrate dev database - -Run the alembic command to migrate the dev database: - -```bash -docker exec -it ai-api alembic -c db/alembic.ini upgrade head -``` - -### Optional: Add test user - -Now lets's add a test user. Copy the following code to `db/tables/test_add_user.py` - -```python db/tables/test_add_user.py -from typing import Optional -from sqlalchemy.orm import Session - -from db.session import SessionLocal -from db.tables.user import UsersTable -from utils.log import logger - - -def create_user(db_session: Session, email: str) -> UsersTable: - """Create a new user.""" - new_user = UsersTable(email=email) - db_session.add(new_user) - return new_user - - -def get_user(db_session: Session, email: str) -> Optional[UsersTable]: - """Get a user by email.""" - return db_session.query(UsersTable).filter(UsersTable.email == email).first() - - -if __name__ == "__main__": - test_user_email = "test@test.com" - with SessionLocal() as sess, sess.begin(): - logger.info(f"Creating user: {test_user_email}") - create_user(db_session=sess, email=test_user_email) - logger.info(f"Getting user: {test_user_email}") - user = get_user(db_session=sess, email=test_user_email) - if user: - logger.info(f"User created: {user.id_user}") - else: - logger.info(f"User not found: {test_user_email}") - -``` - -Run the script to add a test adding a user: - -```bash -docker exec -it ai-api python db/tables/test_add_user.py -``` - -## Migrate production database - -We recommended migrating the production database by setting the environment variable `MIGRATE_DB = True` and restarting the production service. This runs `alembic -c db/alembic.ini upgrade head` from the entrypoint script at container startup. - -### Update the `workspace/prd_resources.py` file - -```python workspace/prd_resources.py -... -# -*- Build container environment -container_env = { - ... - # Migrate database on startup using alembic - "MIGRATE_DB": ws_settings.prd_db_enabled, -} -... -``` - -### Update the ECS Task Definition - -Because we updated the Environment Variables, we need to update the Task Definition: - - - -```bash terminal -ag infra patch --env prd --infra aws --name td -``` - -```bash shorthand -ag infra patch -e prd -i aws -n td -``` - - - -### Update the ECS Service - -After updating the task definition, redeploy the production application: - - - -```bash terminal -ag infra patch --env prd --infra aws --name service -``` - -```bash shorthand -ag infra patch -e prd -i aws -n service -``` - - - -## Manually migrate prodution database - -Another approach is to SSH into the production container to run the migration manually. Your ECS tasks are already enabled with SSH access. Run the alembic command to migrate the production database: - -```bash -ECS_CLUSTER=ai-app-prd-cluster -TASK_ARN=$(aws ecs list-tasks --cluster ai-app-prd-cluster --query "taskArns[0]" --output text) -CONTAINER_NAME=ai-api-prd - -aws ecs execute-command --cluster $ECS_CLUSTER \ - --task $TASK_ARN \ - --container $CONTAINER_NAME \ - --interactive \ - --command "alembic -c db/alembic.ini upgrade head" -``` - ---- - -## How the migrations directory was created - - - -These commands have been run and are described for completeness - - - -The migrations directory was created using: - -```bash -docker exec -it ai-api cd db && alembic init migrations -``` - -- After running the above command, the `db/migrations` directory should be created. -- Update `alembic.ini` - - set `script_location = db/migrations` - - uncomment `black` hook in `[post_write_hooks]` -- Update `db/migrations/env.py` file following [this link](https://alembic.sqlalchemy.org/en/latest/autogenerate.html) -- Add the following function to `configure` to only include tables in the target_metadata - -```python db/migrations/env.py -# -*- Only include tables that are in the target_metadata -def include_name(name, type_, parent_names): - if type_ == "table": - return name in target_metadata.tables - else: - return True -... -``` diff --git a/production/aws/development-app.mdx b/production/aws/development-app.mdx deleted file mode 100644 index fc3565649..000000000 --- a/production/aws/development-app.mdx +++ /dev/null @@ -1,106 +0,0 @@ ---- -title: Development Application ---- - -Your development application runs locally on docker and its resources are defined in the `infra/dev_resources.py` file. This guide shows how to: - -1. [Build a development image](#build-your-development-image) -2. [Restart all docker containers](#restart-all-containers) -3. [Recreate development resources](#recreate-development-resources) - -## Infra Settings - -The `InfraSettings` object in the `infra/settings.py` file defines common settings used by your Agno Infra apps and resources. - -## Build your development image - -Your application uses the `agno` docker images by default. To use your own image: - -- Open `infra/settings.py` file -- Update the `image_repo` to your image repository -- Set `build_images=True` - -```python infra/settings.py -infra_settings = InfraSettings( - ... - # -*- Image Settings - # Repository for images - image_repo="local", - # Build images locally - build_images=True, -) -``` - -### Build a new image - -Build the development image using: - - - -```bash terminal -ag infra up --env dev --infra docker --type image -``` - -```bash short options -ag infra up -e dev -i docker -t image -``` - - - -To `force` rebuild images, use the `--force` or `-f` flag - - - -```bash terminal -ag infra up --env dev --infra docker --type image --force -``` - -```bash short options -ag infra up -e dev -i docker -t image -f -``` - - - ---- - -## Restart all containers - -Restart all docker containers using: - - - -```bash terminal -ag infra restart --env dev --infra docker --type container -``` - -```bash short options -ag infra restart -e dev -c docker -t container -``` - - - ---- - -## Recreate development resources - -To recreate all dev resources, use the `--force` flag: - - - -```bash terminal -ag infra up -f -``` - -```bash full options -ag infra up --env dev --infra docker --force -``` - -```bash shorthand -ag infra up dev:docker -f -``` - -```bash short options -ag infra up -e dev -i docker -f -``` - - diff --git a/production/aws/domain-https.mdx b/production/aws/domain-https.mdx deleted file mode 100644 index 8821f4bc5..000000000 --- a/production/aws/domain-https.mdx +++ /dev/null @@ -1,89 +0,0 @@ ---- -title: Use Custom Domain and HTTPS -sidebarTitle: Custom Domain & HTTPS ---- - -## Overview - -To add a live AgentOS instance to os.agno.com, the endpoint must be HTTPS. Here is how you can add a custom domain and HTTPS to your AWS loadbalancer. - -## Use a custom domain - -1. Register your domain with [Route 53](https://us-east-1.console.aws.amazon.com/route53/). -2. Point the domain to the loadbalancer DNS. - -### Custom domain for your AgentOS App - -Create a record in the Route53 console to point `app.[YOUR_DOMAIN]` to the AgentOS endpoint. - -llm-app-aidev-run - -You can visit the app at `[http://app.[YOUR_DOMAIN]` - -Note the `http` in the domain name. - -## Add HTTPS - -To add HTTPS: - -1. Create a certificate using [AWS ACM](https://us-east-1.console.aws.amazon.com/acm). Request a certificat for `*.[YOUR_DOMAIN]` - -llm-app-request-cert - -2. Creating records in Route 53. - -llm-app-validate-cert - -3. Add the certificate ARN to Apps - -Make sure the certificate is `Issued` before adding it to your Apps - -Update the `infra/prd_resources.py` file and add the `load_balancer_certificate_arn` to the `FastAPI` app. - -```python infra/prd_resources.py - -# -*- FastAPI running on ECS -prd_fastapi = FastApi( - ... - # To enable HTTPS, create an ACM certificate and add the ARN below: - load_balancer_enable_https=True, - load_balancer_certificate_arn="arn:aws:acm:us-east-1:497891874516:certificate/6598c24a-d4fc-4f17-8ee0-0d3906eb705f", - ... -) -``` - -4. Create new Loadbalancer Listeners - -Create new listeners for the loadbalancer to pickup the HTTPs configuration. - - - -```bash terminal -ag infra up --env prd --infra aws --name listener -``` - -```bash shorthand -ag infra up -e prd -i aws -n listener -``` - - - -The certificate should be `Issued` before applying it. - -After this, `https` should be working on your custom domain. - -5. Update existing listeners to redirect HTTP to HTTPS - - - -```bash terminal -ag infra patch --env prd --infra aws --name listener -``` - -```bash shorthand -ag infra patch -e prd -i aws -n listener -``` - - - -After this, all HTTP requests should redirect to HTTPS automatically. diff --git a/production/aws/env-vars.mdx b/production/aws/env-vars.mdx deleted file mode 100644 index 3ffab5fea..000000000 --- a/production/aws/env-vars.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: Environment variables ---- - -Environment variables can be added to resources using the `env_vars` parameter or the `env_file` parameter pointing to a `yaml` file. Examples - -```python dev_resources.py -dev_fastapi = FastApi( - ... - env_vars={ - "RUNTIME_ENV": "dev", - # Get the OpenAI API key from the local environment - "OPENAI_API_KEY": getenv("OPENAI_API_KEY"), - # Database configuration - "DB_HOST": dev_db.get_db_host(), - "DB_PORT": dev_db.get_db_port(), - "DB_USER": dev_db.get_db_user(), - "DB_PASS": dev_db.get_db_password(), - "DB_DATABASE": dev_db.get_db_database(), - # Wait for database to be available before starting the application - "WAIT_FOR_DB": ws_settings.dev_db_enabled, - # Migrate database on startup using alembic - # "MIGRATE_DB": ws_settings.prd_db_enabled, - }, - ... -) -``` - -```python prd_resources.py -prd_fastapi = FastApi( - ... - env_vars={ - "RUNTIME_ENV": "prd", - # Get the OpenAI API key from the local environment - "OPENAI_API_KEY": getenv("OPENAI_API_KEY"), - # Database configuration - "DB_HOST": AwsReference(prd_db.get_db_endpoint), - "DB_PORT": AwsReference(prd_db.get_db_port), - "DB_USER": AwsReference(prd_db.get_master_username), - "DB_PASS": AwsReference(prd_db.get_master_user_password), - "DB_DATABASE": AwsReference(prd_db.get_db_name), - # Wait for database to be available before starting the application - "WAIT_FOR_DB": ws_settings.prd_db_enabled, - # Migrate database on startup using alembic - # "MIGRATE_DB": ws_settings.prd_db_enabled, - }, - ... -) -``` - -The apps in your templates are already configured to read environment variables. diff --git a/production/aws/format-and-validate.mdx b/production/aws/format-and-validate.mdx deleted file mode 100644 index f5dac31b4..000000000 --- a/production/aws/format-and-validate.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Format & Validate -description: ---- - -## Format - -Formatting the codebase using a set standard saves us time and mental energy. Agno templates are pre-configured with [ruff](https://docs.astral.sh/ruff/) that you can run using a helper script or directly. - - - -```bash terminal -./scripts/format.sh -``` - -```bash ruff -ruff format . -``` - - - -## Validate - -Linting and Type Checking add an extra layer of protection to the codebase. We highly recommending running the validate script before pushing any changes. - -Agno templates are pre-configured with [ruff](https://docs.astral.sh/ruff/) and [mypy](https://mypy.readthedocs.io/en/stable/) that you can run using a helper script or directly. Checkout the `pyproject.toml` file for the configuration. - - - -```bash terminal -./scripts/validate.sh -``` - -```bash ruff -ruff check . -``` - -```bash mypy -mypy . -``` - - diff --git a/production/aws/getting-started.mdx b/production/aws/getting-started.mdx new file mode 100644 index 000000000..cf1d9793f --- /dev/null +++ b/production/aws/getting-started.mdx @@ -0,0 +1,245 @@ +--- +title: "AgentOS on AWS" +sidebarTitle: "Getting Started" +description: "Deploy AgentOS to AWS with ECS Fargate" +--- + +Deploy AgentOS to AWS with ECS Fargate, RDS PostgreSQL, and an Application Load Balancer. Production-grade infrastructure that runs entirely in your cloud. + +## Architecture + +AWS Architecture + +AWS Architecture + +## What You'll Deploy + +| Resource | Purpose | Monthly Cost | +|----------|---------|--------------| +| ECS Fargate | Serverless container hosting | $30-50 | +| RDS PostgreSQL | Managed database with pgvector | $25 | +| Application Load Balancer | HTTP/HTTPS endpoint | $20-25 | +| AWS Secrets Manager | Secure credential storage | < $1 | +| Security Groups | Network access controls | Free | +| **Total** | | **~$75-100** | + +Use the [AWS Pricing Calculator](https://calculator.aws/) for detailed estimates. + +--- + +## Deploy to AWS + +### Prerequisites + + + + +- Install [Docker Desktop](https://docs.docker.com/desktop/install/mac-install/) +- Install [uv](https://docs.astral.sh/uv/) (Python package manager) +- Install and configure the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) + + + + +```bash +uv venv --python 3.12 +source .venv/bin/activate +``` + + + + +```bash +uv pip install -U 'agno[infra]' +``` + + + + +### Setup Your Project + + + +```bash +ag infra create --template agentos-aws --name my-agentos + +cd my-agentos +``` + + +Or clone directly: `git clone https://github.com/agno-agi/agentos-aws-template.git` + + + + + +```bash +export OPENAI_API_KEY=sk-*** +``` + + + + +### Configure AWS + + + + +Create a repository in ECR to store your Docker images: + +```bash +aws ecr create-repository \ + --repository-name my-agentos \ + --region us-east-1 +``` + +Note your ECR URL from the output: +``` +[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com +``` + + + + + +```bash +aws ecr get-login-password --region us-east-1 | \ + docker login --username AWS --password-stdin \ + [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com +``` + + +ECR tokens expire after 12 hours. Re-run this command if you get "no basic auth credentials" errors. + + + + + + +Update `infra/settings.py`: + +```python +infra_settings = InfraSettings( + infra_name="my-agentos", + aws_region="us-east-1", + aws_subnet_ids=["subnet-xxx", "subnet-yyy"], + image_repo="[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com", + push_images=True, +) +``` + +To find your subnet IDs: +```bash +aws ec2 describe-subnets --query 'Subnets[*].[SubnetId,AvailabilityZone]' --output table +``` + + + + + +```bash +cp infra/secrets/prd_api_secrets.example.yml infra/secrets/prd_api_secrets.yml +cp infra/secrets/prd_db_secrets.example.yml infra/secrets/prd_db_secrets.yml +``` + +Edit both files with your credentials. See [Secrets](/production/aws/configure/secrets) for details. + + + + +### Deploy + + + +```bash +ag infra up +``` + +Open http://localhost:8000/docs to verify it works. + + + + +```bash +ag infra up prd:aws +``` + +Press Enter to confirm. This creates: +- Docker image pushed to ECR +- RDS PostgreSQL instance +- ECS Cluster, Service, and Task Definition +- Application Load Balancer with Target Group + +RDS takes about 5 minutes to provision. Monitor progress in the AWS Console. + + + + + +Find your Load Balancer DNS in the AWS Console (EC2 → Load Balancers). + +Test your deployment: +```bash +curl http://[LOAD_BALANCER_DNS]/health +``` + +Should return: `{"status": "ok", "instantiated_at": "..."}` + + + + +--- + +## What's Next? + +Your AgentOS is deployed. Follow these steps to finish setup: + + + +Confirm everything is working. + +→ [Verify Deployment](/production/aws/after-deploy/verify) + + + +Required to connect to os.agno.com. + +→ [Add HTTPS](/production/aws/after-deploy/https) + + + +Monitor and manage your agents from the control plane. + +→ [Connect to Control Plane](/production/aws/after-deploy/connect) + + + +--- + +## Reference + +### Project Structure + +``` +my-agentos/ +├── agents/ # Your agents +├── app/ # AgentOS application +├── db/ # Database tables and migrations +├── infra/ # Infrastructure configuration +│ ├── settings.py # InfraSettings (region, subnets, etc.) +│ ├── prd_resources.py # Production AWS resources +│ └── secrets/ # API keys and credentials +├── scripts/ # Helper scripts (auth_ecr.sh, etc.) +├── Dockerfile # Container build +├── pyproject.toml # Python dependencies +└── requirements.txt # Locked dependencies +``` + diff --git a/production/aws/git-repo.mdx b/production/aws/git-repo.mdx deleted file mode 100644 index b76ab5803..000000000 --- a/production/aws/git-repo.mdx +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Create Git Repo ---- - -Create a git repository to share your application with your team. - - - - Create a new [git repository](https://github.com/new). - - - Push your code to the git repository. - - ```bash terminal - git init - git add . - git commit -m "Init LLM App" - git branch -M main - git remote add origin https://github.com/[YOUR_GIT_REPO].git - git push -u origin main - ``` - - - - Ask your team to follow the [setup steps for new users](/templates/infra-management/new-users) to use this workspace. - - - diff --git a/production/aws/infra-settings.mdx b/production/aws/infra-settings.mdx deleted file mode 100644 index e70f15e44..000000000 --- a/production/aws/infra-settings.mdx +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Infra Settings ---- - -The `InfraSettings` object in the `infra/settings.py` file defines common settings used by your apps and resources. Here are the settings we recommend updating: - -```python infra/settings.py -infra_settings = InfraSettings( - # Update this to your project name - infra_name="ai", - # Add your AWS subnets - subnet_ids=["subnet-xyz", "subnet-xyz"], - # Add your image repository - image_repo="[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com", - # Set to True to build images locally - build_images=True, - # Set to True to push images after building - push_images=True, -) -``` - - - -`InfraSettings` can also be updated using environment variables or the `.env` file. - -Checkout the `example.env` file for an example. - - - -### Infra Name - -The `infra_name` is used to name your apps and resources. Change it to your project or team name, for example: - -- `infra_name="booking-ai"` -- `infra_name="reddit-ai"` -- `infra_name="vantage-ai"` - -The `infra_name` is used to name: - -- The image for your application -- Apps like db, streamlit app and FastAPI server -- Resources like buckets, secrets and loadbalancers - -Checkout the `infra/dev_resources.py` and `infra/prd_resources.py` file to see how its used. - -## Image Repository - -The `image_repo` defines the repo for your image. - -- If using dockerhub it would be something like `agno`. -- If using ECR it would be something like `[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com` - -Checkout the `dev_image` in `infra/dev_resources.py` and `prd_image` in `infra/prd_resources.py` to see how its used. - -## Build Images - -Setting `build_images=True` will build images locally when running `ag infra up dev:docker` or `ag infra up prd:docker`. - -Checkout the `dev_image` in `infra/dev_resources.py` and `prd_image` in `infra/prd_resources.py` to see how its used. - -Read more about: - -- [Building your development image](/templates/infra-management/development-app#build-your-development-image) -- [Building your production image](/templates/infra-management/production-app#build-your-production-image) - -## Push Images - -Setting `push_images=True` will push images after building when running `ag infra up dev:docker` or `ag infra up prd:docker`. - -Checkout the `dev_image` in `infra/dev_resources.py` and `prd_image` in `infra/prd_resources.py` to see how its used. - -Read more about: - -- [Building your development image](/templates/infra-management/development-app#build-your-development-image) -- [Building your production image](/templates/infra-management/production-app#build-your-production-image) - -## AWS Settings - -The `aws_region` and `subnet_ids` provide values used for creating production resources. Checkout the `infra/prd_resources.py` file to see how its used. diff --git a/production/aws/install.mdx b/production/aws/install.mdx deleted file mode 100644 index 78483972c..000000000 --- a/production/aws/install.mdx +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Install & Setup ---- - -## Install Agno - -We highly recommend: - -- Installing `agno` using `pip` in a python virtual environment. -- Creating an `ai` directory for your ai infra - - - - Open the `Terminal` and create an `ai` directory with a python virtual environment. - - - - ```bash Mac - mkdir ai && cd ai - - python3 -m venv aienv - source aienv/bin/activate - ``` - - ```bash Windows - mkdir ai; cd ai - - python3 -m venv aienv - aienv/scripts/activate - ``` - - - - - - Install `agno` using pip - - - - ```bash Mac - pip install -U agno - ``` - - ```bash Windows - pip install -U agno - ``` - - - - - - Install [docker desktop](https://docs.docker.com/desktop/install/mac-install/) to run apps locally - - - -
- - - -If you encounter errors, try updating pip using `python -m pip install --upgrade pip` - - - ---- - -## Upgrade Agno - -To upgrade `agno`, run this in your virtual environment - -```bash -pip install -U agno --no-cache-dir -``` diff --git a/production/aws/new-users.mdx b/production/aws/new-users.mdx deleted file mode 100644 index 8d728efbb..000000000 --- a/production/aws/new-users.mdx +++ /dev/null @@ -1,124 +0,0 @@ ---- -title: Setup infra for new users -sidebarTitle: "Add New Users" ---- - -Follow these steps to setup an existing infra: - - - - -Clone the git repo and `cd` into the infra directory - - - -```bash Mac -git clone https://github.com/[YOUR_GIT_REPO].git - -cd your_infra_directory -``` - -```bash Windows -git clone https://github.com/[YOUR_GIT_REPO].git - -cd your_infra_directory -``` - - - - - - - - -```bash Mac -python3 -m venv aienv -source aienv/bin/activate -``` - -```bash Windows -python3 -m venv aienv -aienv/scripts/activate -``` - - - - - - - - -```bash Mac -pip install -U agno -``` - -```bash Windows -pip install -U agno -``` - - - - - - -Copy `infra/example_secrets` to `infra/secrets` - - - -```bash Mac -cp -r infra/example_secrets infra/secrets -``` - -```bash Windows -cp -r infra/example_secrets infra/secrets -``` - - - - - - - - -Install [docker desktop](https://docs.docker.com/desktop/install/mac-install/) if needed. - - - - - -```bash terminal -ag infra up -``` - -```bash full options -ag infra up --env dev --infra docker -``` - -```bash shorthand -ag infra up dev:docker -``` - - - - - - - - -```bash terminal -ag infra down -``` - -```bash full options -ag infra down --env dev --infra docker -``` - -```bash shorthand -ag infra down dev:docker -``` - - - - - - diff --git a/production/aws/operate/ci-cd.mdx b/production/aws/operate/ci-cd.mdx new file mode 100644 index 000000000..f01f88efc --- /dev/null +++ b/production/aws/operate/ci-cd.mdx @@ -0,0 +1,150 @@ +--- +title: "CI/CD Automation" +sidebarTitle: "CI/CD" +description: "Automate builds with GitHub Actions" +--- + +## Choose Your Method + +| Method | When to Use | Setup Effort | +|--------|-------------|--------------| +| Manual builds | Small teams, infrequent deploys | Low | +| DockerHub + GitHub | Using DockerHub, simpler setup | Medium | +| ECR + GitHub OIDC | Using ECR, no stored credentials | Higher | + + +For manual builds, see [Production Deployment](/production/aws/operate/updates#create-an-ecr-repository). ECR tokens expire after 12 hours. + + +## PR Validation + +Every PR runs automatic validation. The workflow is in `.github/workflows/validate.yml`: + +```yaml +# Runs on every PR +on: + pull_request: +``` + +This checks formatting, tests, and types before merging. + +## DockerHub with GitHub + +Build and push images on GitHub release. Workflow: `.github/workflows/docker-images.yml` + + + +Go to [Docker Hub Settings → Security](https://hub.docker.com/settings/security) and create an access token. + + + +In your GitHub repo, go to **Settings → Secrets and variables → Actions**. + +Add these secrets: + +| Name | Value | +|------|-------| +| `DOCKERHUB_USERNAME` | Your Docker Hub username | +| `DOCKERHUB_TOKEN` | The access token from Step 1 | + +Add this variable: + +| Name | Value | +|------|-------| +| `DOCKERHUB_NAMESPACE` | Your Docker Hub namespace (usually your username) | + + + +```bash +gh release create v0.1.0 --title "v0.1.0" -n "" +``` + +The workflow builds and pushes `your-namespace/agentos-template:dev` and `:prd` tags. + + + +## ECR with GitHub OIDC + +Build and push to ECR using OpenID Connect. No IAM access keys stored in GitHub. + +Workflow: `.github/workflows/ecr-images.yml` + +### Set Up OIDC Provider + + + +1. Open IAM Console → **Identity providers** → **Add provider** +2. Provider type: **OpenID Connect** +3. Provider URL: `https://token.actions.githubusercontent.com` +4. Click **Get thumbprint** +5. Audience: `sts.amazonaws.com` + + + +1. After adding the provider, click **Assign role** → **Create a new role** +2. Trusted entity: **Web identity** +3. Identity provider: Select the GitHub provider +4. Audience: `sts.amazonaws.com` +5. Add permission: `AmazonEC2ContainerRegistryPowerUser` +6. Role name: `GithubActionsRole` +7. Copy the Role ARN (format: `arn:aws:iam::[ACCOUNT_ID]:role/GithubActionsRole`) + + + +Edit `.github/workflows/ecr-images.yml`: + +```yaml +env: + ECR_REPO: [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com + AWS_ROLE: arn:aws:iam::[ACCOUNT_ID]:role/GithubActionsRole + AWS_REGION: us-east-1 +``` + + + +The workflow defaults to `workflow_dispatch` (manual trigger). To trigger on release: + +```yaml +on: + release: + types: [published] +``` + +If using ECR, disable the DockerHub workflow by changing its trigger: + +```yaml +# In docker-images.yml +on: workflow_dispatch +``` + + + +```bash +gh release create v0.1.0 --title "v0.1.0" -n "" +``` + +Or trigger manually: +```bash +gh workflow run ecr-images.yml +``` + + + + +**Why OIDC?** GitHub Actions requests a temporary token from AWS instead of using stored credentials. More secure, no credential rotation needed. + + +## After CI/CD Builds + +After a new image is pushed, update your ECS deployment: + +```bash +ag infra patch prd:aws:::service +``` + +This triggers a new deployment with the latest image. + +## Next Steps + +- [Production Deployment](/production/aws/operate/updates) - Manual deployment steps +- [Monitoring](/production/aws/operate/monitoring) - Watch your deployments diff --git a/production/aws/operate/monitoring.mdx b/production/aws/operate/monitoring.mdx new file mode 100644 index 000000000..3096ed95a --- /dev/null +++ b/production/aws/operate/monitoring.mdx @@ -0,0 +1,123 @@ +--- +title: "Monitoring" +sidebarTitle: "Monitoring" +description: "View logs and monitor your AWS deployment" +--- + +CloudWatch Logs captures output from your ECS containers. + +## View Logs + +Tail logs in real-time: +```bash +aws logs tail /ecs/{infra_name}-prd --follow +``` + +Search recent logs: +```bash +aws logs filter-log-events \ + --log-group-name /ecs/{infra_name}-prd \ + --filter-pattern "ERROR" \ + --start-time $(date -d '1 hour ago' +%s)000 +``` + + +Replace `{infra_name}` with your `infra_name` from `settings.py` (e.g., `agentos-aws-template`). + + +## ECS Service Status + +View service status and recent events: +```bash +aws ecs describe-services \ + --cluster {infra_name}-prd \ + --services {infra_name}-prd-service \ + --query 'services[0].{status:status,running:runningCount,desired:desiredCount,events:events[:5]}' +``` + +List running tasks: +```bash +aws ecs list-tasks --cluster {infra_name}-prd +``` + +## What Success Looks Like + +After a successful deployment, logs show: + +``` +INFO: Started server process [1] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8000 +``` + +Health check passing: +``` +INFO: 192.168.x.x - "GET /health HTTP/1.1" 200 OK +``` + +## Warning Signs + +| Log Pattern | Meaning | Action | +|-------------|---------|--------| +| `database is locked` | DuckDB concurrency issue | Reduce workers to 1 | +| `connection refused` | Can't reach RDS | Check security group | +| `OOMKilled` | Out of memory | Increase task memory | +| `CannotPullContainerError` | ECR auth expired | Re-run `auth_ecr.sh` | +| `SIGTERM` then restart loop | Health check failing | Check app logs for errors | + +## Health Checks + +The load balancer checks `/health` every 30 seconds. + +| Target Status | Meaning | +|---------------|---------| +| healthy | Task passing health checks | +| unhealthy | Health check failing | +| draining | Task being replaced | + +If unhealthy, check: +1. Container logs for startup errors +2. Security group allows port 8000 from ALB +3. Database connectivity (`DB_HOST`, `DB_PASS`) + +## Log Retention + +CloudWatch retains logs indefinitely by default. Set a retention policy to control costs: + +```bash +aws logs put-retention-policy \ + --log-group-name /ecs/{infra_name}-prd \ + --retention-in-days 30 +``` + +| Retention | Monthly Cost (10GB/day) | +|-----------|------------------------| +| 7 days | ~$3 | +| 30 days | ~$15 | +| 90 days | ~$45 | + +## Alerts (Optional) + +Create a CloudWatch alarm for task failures: + +```bash +aws cloudwatch put-metric-alarm \ + --alarm-name "{infra_name}-task-failures" \ + --metric-name "FailedTasks" \ + --namespace "AWS/ECS" \ + --statistic Sum \ + --period 300 \ + --threshold 1 \ + --comparison-operator GreaterThanOrEqualToThreshold \ + --dimensions Name=ClusterName,Value={infra_name}-prd \ + --evaluation-periods 1 \ + --alarm-actions [YOUR_SNS_TOPIC_ARN] +``` + +See [AWS SNS documentation](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) to create a notification topic. + +## Next Steps + +- [Troubleshooting](/production/aws/operate/troubleshooting) - Common errors +- [EFS Setup](/production/aws/configure/efs) - Persistent storage diff --git a/production/aws/operate/troubleshooting.mdx b/production/aws/operate/troubleshooting.mdx new file mode 100644 index 000000000..7267078c4 --- /dev/null +++ b/production/aws/operate/troubleshooting.mdx @@ -0,0 +1,201 @@ +--- +title: "Troubleshooting" +sidebarTitle: "Troubleshooting" +description: "Common AWS deployment errors and solutions" +--- + +Solutions for common issues encountered when deploying to AWS. + +## ECS Task Issues + + + + **Cause:** Container not responding to health checks + + Verify the `/health` endpoint works: + ```bash + curl http://localhost:8000/health + ``` + Should return: `{"status": "ok", "instantiated_at": "..."}` + + If this fails, check CloudWatch logs for startup errors: + ```bash + aws logs tail /ecs/{infra_name}-prd --follow + ``` + + + + **Cause:** Container starts but fails health checks + + Check the logs for the startup sequence: + ```bash + aws logs tail /ecs/{infra_name}-prd --since 10m + ``` + + Look for: + - `Application startup complete` - Container started + - `SIGTERM` - Health check failed, container being killed + + Common causes: + - Database connection failing (check `DB_HOST`, `DB_PASS`) + - Missing environment variables + - App crashes after startup + + + + **Cause:** Multiple uvicorn workers with DuckDB + + DuckDB requires single-writer access. Ensure your command uses one worker: + ```python + command="uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 1", + ``` + + Do NOT increase `--workers` if using Pal agent. + + + + **Cause:** No EFS configured + + Pal stores data in DuckDB at `/data/pal.db`. Without EFS, this is lost on container restart. + + See: [EFS Setup Guide](/production/aws/configure/efs) + + + + **Cause:** IAM permissions or secret doesn't exist + + Verify secrets exist: + ```bash + aws secretsmanager list-secrets \ + --query "SecretList[?contains(Name, '{infra_name}-prd')].[Name]" \ + --output table + ``` + + If missing, redeploy with `ag infra up prd:aws` to create them from your YAML files. + + + +## Docker & ECR Issues + + + + **Cause:** Docker not authenticated to ECR + + Run the authentication script: + ```bash + ./scripts/auth_ecr.sh + ``` + + Or manually: + ```bash + aws ecr get-login-password --region us-east-1 | \ + docker login --username AWS --password-stdin \ + [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com + ``` + + ECR tokens expire after 12 hours. Re-run if you get this error after a break. + + + + Large images can timeout on slow connections. Try: + 1. Build with `-f` flag to ensure fresh layers + 2. Check your network connection + 3. Consider using GitHub Actions for CI/CD builds + + + +## Database Issues + + + + **Cause:** Special characters in password + + Avoid `@`, `#`, `%`, `&` in `DB_PASS`. These require URL encoding and cause silent connection failures. + + Safe characters: alphanumeric, `!`, `-`, `_` + + + + Check security group allows ECS to access RDS: + ```bash + aws ec2 describe-security-groups \ + --filters "Name=group-name,Values=*-db-sg" \ + --query 'SecurityGroups[0].IpPermissions' + ``` + + The database security group must allow inbound port 5432 from the ECS security group. + + + + RDS must be in a public subnet with `publicly_accessible=True` (the default). + + Add your IP to the security group or use a bastion host. + + + +## EFS Issues + + + + Ensure mount targets exist in the same subnets as your ECS tasks: + ```bash + aws efs describe-mount-targets --file-system-id fs-xxx + ``` + + Each subnet in `aws_subnet_ids` needs its own mount target. + + + + Check that your access point uses UID/GID `61000` to match the container user: + ```bash + aws efs describe-access-points --access-point-id fsap-xxx + ``` + + The POSIX user should be `Uid: 61000, Gid: 61000`. + + + +## Debugging Commands + +```bash +# View ECS service events (replace {infra_name} with your infra_name) +aws ecs describe-services \ + --cluster {infra_name}-prd \ + --services {infra_name}-prd-service \ + --query 'services[0].events[:5]' + +# View recent logs +aws logs tail /ecs/{infra_name}-prd --follow + +# Check task status +aws ecs list-tasks --cluster {infra_name}-prd +aws ecs describe-tasks --cluster {infra_name}-prd --tasks [TASK_ARN] +``` + +## SSH Access + +### Local Development + +```bash +docker exec -it ai-api zsh +``` + +### Production (ECS) + +```bash +ECS_CLUSTER={infra_name}-prd +TASK_ARN=$(aws ecs list-tasks --cluster $ECS_CLUSTER --query "taskArns[0]" --output text) + +aws ecs execute-command \ + --cluster $ECS_CLUSTER \ + --task $TASK_ARN \ + --container {infra_name}-prd \ + --interactive \ + --command "zsh" +``` + +## Next Steps + +- [Monitoring](/production/aws/operate/monitoring) - Logs and alerts +- [EFS Setup](/production/aws/configure/efs) - Persistent storage +- [Secrets](/production/aws/configure/secrets) - API keys and credentials diff --git a/production/aws/operate/updates.mdx b/production/aws/operate/updates.mdx new file mode 100644 index 000000000..10674a951 --- /dev/null +++ b/production/aws/operate/updates.mdx @@ -0,0 +1,210 @@ +--- +title: "Production Deployment" +sidebarTitle: "Production" +description: "Deploy your application to AWS with ECS Fargate" +--- + +Your production application runs on AWS ECS Fargate. Resources are defined in `infra/prd_resources.py`. + +## Prerequisites + +Before deploying, complete these steps: + +| Step | Guide | Why | +|------|-------|-----| +| Configure secrets | [Secrets](/production/aws/configure/secrets) | API keys and database password | +| Configure settings | [Settings](/production/aws/configure/settings) | Region, subnets, image repo | +| Create ECR repository | [Below](#create-an-ecr-repository) | Store your Docker images | + +## Deploy to AWS + +Once prerequisites are complete: + +```bash +ag infra up prd:aws +``` + +This creates: +- Docker image pushed to ECR +- RDS PostgreSQL instance +- ECS Cluster, Service, and Task Definition +- Application Load Balancer with Target Group +- AWS Secrets Manager entries + + +RDS takes about 5 minutes to provision. You can monitor progress in the AWS Console. + + +## Verify Deployment + +After deployment completes, verify everything is working: + +### Check the health endpoint + +Get your load balancer DNS from the AWS Console (EC2 → Load Balancers), then: + +```bash +curl http://[LOAD_BALANCER_DNS]/health +``` + +Expected response: +```json +{"status": "ok", "instantiated_at": "2025-01-01T12:00:00Z"} +``` + +### Check CloudWatch logs + +```bash +aws logs tail /ecs/{infra_name}-prd --follow +``` + +Look for `Application startup complete` to confirm the app started. + +### Check ECS service status + +```bash +aws ecs describe-services \ + --cluster {infra_name}-prd \ + --services {infra_name}-prd-service \ + --query 'services[0].{status:status,running:runningCount,desired:desiredCount}' +``` + +## Create an ECR Repository + +ECR (Elastic Container Registry) stores your Docker images in AWS. + +### Step 1: Create the repository + +Create a repository with the same name as your `image_name` setting (default: `agentos-aws-template`): + +```bash +aws ecr create-repository \ + --repository-name agentos-aws-template \ + --region us-east-1 +``` + +create-ecr-image + +### Step 2: Get your ECR URL + +Your ECR URL follows this format: +``` +[ACCOUNT_ID].dkr.ecr.[REGION].amazonaws.com +``` + +Get your account ID: +```bash +aws sts get-caller-identity --query Account --output text +``` + +Example URL: `123456789012.dkr.ecr.us-east-1.amazonaws.com` + +### Step 3: Authenticate Docker with ECR + +```bash +aws ecr get-login-password --region us-east-1 | \ + docker login --username AWS --password-stdin \ + [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com +``` + +Or use the helper script (update with your ECR URL first): + +```bash +./scripts/auth_ecr.sh +``` + + +ECR tokens expire after 12 hours. If you get "no basic auth credentials" errors, re-run the authentication command. + + +### Step 4: Update settings + +Update `infra/settings.py` with your ECR URL: + +```python infra/settings.py +infra_settings = InfraSettings( + ... + # Your ECR repository URL + image_repo="123456789012.dkr.ecr.us-east-1.amazonaws.com", + # Build images locally + build_images=True, + # Push images to ECR after building + push_images=True, +) +``` + +## Update Deployments + +After making changes to your code or configuration: + +### Rebuild and push image + +```bash +ag infra up prd:docker +``` + +### Update task definition + +Required when you change: image, CPU, memory, or environment variables. + +```bash +ag infra patch prd:aws:::td +``` + +### Update service + +Triggers a new deployment with the latest task definition: + +```bash +ag infra patch prd:aws:::service +``` + + +**Shortcut:** If you only rebuilt the image (no config changes), you can skip the task definition update and just patch the service. + + +## Customize Your Deployment + +Edit `infra/prd_resources.py` to customize: + +| Setting | Location | Default | +|---------|----------|---------| +| CPU | `prd_fastapi` | 1024 (1 vCPU) | +| Memory | `prd_fastapi` | 2048 (2 GB) | +| Task count | `ecs_service_count` | 1 | +| Health check path | `health_check_path` | `/health` | + +Example customization: + +```python prd_resources.py +prd_fastapi = FastApi( + ... + ecs_task_cpu="2048", # 2 vCPU + ecs_task_memory="4096", # 4 GB + ecs_service_count=2, # 2 tasks for redundancy +) +``` + +After changes, update the task definition and service: + +```bash +ag infra patch prd:aws:::td && ag infra patch prd:aws:::service +``` + +## Stop Deployment + +To remove all AWS resources: + +```bash +ag infra down prd:aws +``` + + +This deletes everything including the database. Back up your data first. + + +## Next Steps + +- [CI/CD](/production/aws/operate/ci-cd) - Automate builds with GitHub Actions +- [Domain & HTTPS](/production/aws/after-deploy/https) - Custom domain and SSL +- [Monitoring](/production/aws/operate/monitoring) - CloudWatch logs and alerts diff --git a/production/aws/production-app.mdx b/production/aws/production-app.mdx deleted file mode 100644 index 9ddf6fda8..000000000 --- a/production/aws/production-app.mdx +++ /dev/null @@ -1,165 +0,0 @@ ---- -title: Production Application ---- - -Your production application runs on AWS and its resources are defined in the `infra/prd_resources.py` file. This guide shows how to: - -1. [Build a production image](#build-your-production-image) -2. [Update ECS Task Definitions](#ecs-task-definition) -3. [Update ECS Services](#ecs-service) - -## Workspace Settings - -The `InfraSettings` object in the `infra/settings.py` file defines common settings used by your workspace apps and resources. - -## Build your production image - -Your application uses the `agno` images by default. To use your own image: - -- Create a Repository in `ECR` and authenticate or use `Dockerhub`. -- Open `infra/settings.py` file -- Update the `image_repo` to your image repository -- Set `build_images=True` and `push_images=True` -- Optional - Set `build_images=False` and `push_images=False` to use an existing image in the repository - -### Create an ECR Repository - -To use ECR, **create the image repo and authenticate with ECR** before pushing images. - -**1. Create the image repository in ECR** - -The repo name should match the `infra_name`. Meaning if you're using the default infra name, the repo name would be `ai`. - -create-ecr-image - -**2. Authenticate with ECR** - -```bash Authenticate with ECR -aws ecr get-login-password --region [region] | docker login --username AWS --password-stdin [account].dkr.ecr.[region].amazonaws.com -``` - -You can also use a helper script to avoid running the full command - - - -Update the script with your ECR repo before running. - - - - - -```bash Mac -./scripts/auth_ecr.sh -``` - - - -### Update the `InfraSettings` - -```python infra/settings.py -infra_settings = InfraSettings( - ... - # Subnet IDs in the aws_region - subnet_ids=["subnet-xyz", "subnet-xyz"], - # -*- Image Settings - # Repository for images - image_repo="your-image-repo", - # Build images locally - build_images=True, - # Push images after building - push_images=True, -) -``` - - - -The `image_repo` defines the repo for your image. - -- If using dockerhub it would be something like `agno`. -- If using ECR it would be something like `[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com` - - - -### Build a new image - -Build the production image using: - - - -```bash terminal -ag infra up --env prd --infra docker --type image -``` - -```bash shorthand -ag infra up -e prd -i docker -t image -``` - - - -To `force` rebuild images, use the `--force` or `-f` flag - - - -```bash terminal -ag infra up --env prd --infra docker --type image --force -``` - -```bash shorthand -ag infra up -e prd -i docker -t image -f -``` - - - -Because the only docker resources in the production env are docker images, you can also use: - - - -```bash Build Images -ag infra up prd:docker -``` - -```bash Force Build Images -ag infra up prd:docker -f -``` - - - -## ECS Task Definition - -If you updated the Image, CPU, Memory or Environment Variables, update the Task Definition using: - - - -```bash terminal -ag infra patch --env prd --infra aws --name td -``` - -```bash shorthand -ag infra patch -e prd -i aws -n td -``` - - - -## ECS Service - -To redeploy the production application, update the ECS Service using: - - - -```bash terminal -ag infra patch --env prd --infra aws --name service -``` - -```bash shorthand -ag infra patch -e prd -i aws -n service -``` - - - -
- - - -If you **ONLY** rebuilt the image, you do not need to update the task definition and can just patch the service to pickup the new image. - - diff --git a/production/aws/python-packages.mdx b/production/aws/python-packages.mdx deleted file mode 100644 index 518fdf9b6..000000000 --- a/production/aws/python-packages.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -title: Add Python Libraries ---- - -Agno templates are setup to manage dependencies using a [pyproject.toml](https://packaging.python.org/en/latest/specifications/declaring-project-metadata/#declaring-project-metadata) file, **which is used to generate the `requirements.txt` file using [uv](https://github.com/astral-sh/uv) or [pip-tools](https://pip-tools.readthedocs.io/en/latest/).** - -Adding or Updating a python library is a 2 step process: - -1. Add library to the `pyproject.toml` file -2. Auto-Generate the `requirements.txt` file - - - -We highly recommend auto-generating the `requirements.txt` file using this process. - - - -## Update pyproject.toml - -- Open the `pyproject.toml` file -- Add new libraries to the dependencies section. - -## Generate requirements - -After updating the `dependencies` in the `pyproject.toml` file, auto-generate the `requirements.txt` file using a helper script or running `pip-compile` directly. - - - -```bash terminal -./scripts/generate_requirements.sh -``` - -```bash pip compile -pip-compile \ - --no-annotate \ - --pip-args "--no-cache-dir" \ - -o requirements.txt pyproject.toml -``` - - - -If you'd like to upgrade all python libraries to their latest version, run: - - - -```bash terminal -./scripts/generate_requirements.sh upgrade -``` - -```bash pip compile -pip-compile \ - --upgrade \ - --no-annotate \ - --pip-args "--no-cache-dir" \ - -o requirements.txt pyproject.toml -``` - - - -## Rebuild Images - -After updating the `requirements.txt` file, rebuild your images. - -### Rebuild dev images - - - -```bash terminal -ag infra up --env dev --infra docker --type image -``` - -```bash short options -ag infra up -e dev -i docker -t image -``` - - - -### Rebuild production images - - - -Remember to [authenticate with ECR](/templates/infra-management/production-app#ecr-images) if needed. - - - - - -```bash terminal -ag infra up --env prd --infra aws --type image -``` - -```bash short options -ag infra up -e prd -i aws -t image -``` - - - -## Recreate Resources - -After rebuilding images, recreate the resources. - -### Recreate dev containers - - - -```bash terminal -ag infra restart --env dev --infra docker --type container -``` - -```bash short options -ag infra restart -e dev -c docker -t container -``` - - - -### Update ECS services - - - -```bash terminal -ag infra patch --env prd --infra aws --name service -``` - -```bash short options -ag infra patch -e prd -i aws -n service -``` - - diff --git a/production/aws/reference/database-tables.mdx b/production/aws/reference/database-tables.mdx new file mode 100644 index 000000000..b45be0d4e --- /dev/null +++ b/production/aws/reference/database-tables.mdx @@ -0,0 +1,156 @@ +--- +title: "Database Tables" +sidebarTitle: "Database Tables" +description: "SQLAlchemy models and Alembic migrations" +--- + +AgentOS uses [SQLAlchemy](https://www.sqlalchemy.org/) for models and [Alembic](https://alembic.sqlalchemy.org/) for migrations. + +## Adding a Table + +1. Create table definition in `db/tables/` +2. Import in `db/tables/__init__.py` +3. Generate migration +4. Run migration + +## Example: Users Table + +Create `db/tables/user.py`: + +```python db/tables/user.py +from datetime import datetime +from typing import Optional + +from sqlalchemy.orm import Mapped, mapped_column +from sqlalchemy.sql.expression import text +from sqlalchemy.types import BigInteger, DateTime, String + +from db.tables.base import Base + + +class UsersTable(Base): + __tablename__ = "dim_users" + + id_user: Mapped[int] = mapped_column( + BigInteger, primary_key=True, autoincrement=True, index=True + ) + email: Mapped[str] = mapped_column(String, unique=True) + is_active: Mapped[bool] = mapped_column(default=True) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), server_default=text("now()") + ) + updated_at: Mapped[Optional[datetime]] = mapped_column( + DateTime(timezone=True), onupdate=text("now()") + ) +``` + +Register in `db/tables/__init__.py`: + +```python db/tables/__init__.py +from db.tables.base import Base +from db.tables.user import UsersTable +``` + +## Generate Migration + +```bash +docker exec -it ai-api alembic -c db/alembic.ini revision --autogenerate -m "Add users table" +``` + +This creates a migration file in `db/migrations/versions/`. + +## Run Migration + +### Local (dev) + +```bash +docker exec -it ai-api alembic -c db/alembic.ini upgrade head +``` + +### Production + +Option 1: Auto-migrate on startup (add to `prd_resources.py`): + +```python +container_env = { + ... + "MIGRATE_DB": True, +} +``` + +Then update: +```bash +ag infra patch prd:aws:::td && ag infra patch prd:aws:::service +``` + +Option 2: Run manually via ECS Exec: + +```bash +ECS_CLUSTER={infra_name}-prd +TASK_ARN=$(aws ecs list-tasks --cluster $ECS_CLUSTER --query "taskArns[0]" --output text) + +aws ecs execute-command \ + --cluster $ECS_CLUSTER \ + --task $TASK_ARN \ + --container {infra_name}-prd \ + --interactive \ + --command "alembic -c db/alembic.ini upgrade head" +``` + +## Common Patterns + +### Foreign Key Relationship + +```python +from sqlalchemy import ForeignKey +from sqlalchemy.orm import relationship + +class OrdersTable(Base): + __tablename__ = "dim_orders" + + id_order: Mapped[int] = mapped_column(BigInteger, primary_key=True) + id_user: Mapped[int] = mapped_column(ForeignKey("dim_users.id_user")) + + user: Mapped["UsersTable"] = relationship(back_populates="orders") +``` + +### Index for Queries + +```python +from sqlalchemy import Index + +class EventsTable(Base): + __tablename__ = "fact_events" + + # Composite index for common queries + __table_args__ = ( + Index("idx_events_user_created", "id_user", "created_at"), + ) +``` + +### Enum Column + +```python +from enum import Enum +from sqlalchemy import Enum as SQLEnum + +class Status(str, Enum): + pending = "pending" + complete = "complete" + +class TasksTable(Base): + status: Mapped[Status] = mapped_column(SQLEnum(Status), default=Status.pending) +``` + +## Naming Conventions + +| Prefix | Use For | Example | +|--------|---------|---------| +| `dim_` | Dimension tables (entities) | `dim_users`, `dim_products` | +| `fact_` | Fact tables (events) | `fact_orders`, `fact_sessions` | +| `bridge_` | Many-to-many relationships | `bridge_user_roles` | + +## Next Steps + +- [Database Setup](/production/aws/configure/database) - Credentials and connections +- [Troubleshooting](/production/aws/operate/troubleshooting) - Common issues diff --git a/production/aws/reference/env-vars.mdx b/production/aws/reference/env-vars.mdx new file mode 100644 index 000000000..e9b06516e --- /dev/null +++ b/production/aws/reference/env-vars.mdx @@ -0,0 +1,78 @@ +--- +title: "Environment Variables" +sidebarTitle: "Env Vars" +description: "Reference for app environment configuration" +--- + +Environment variables are set in `dev_resources.py` (local) and `prd_resources.py` (production). + +## Production Variables + +These variables are set in `prd_resources.py`: + +| Variable | Source | Description | +|----------|--------|-------------| +| `RUNTIME_ENV` | Hardcoded | `prd` in production | +| `DATA_DIR` | Hardcoded | `/data` (EFS mount point) | +| `OPENAI_API_KEY` | Secrets | From `prd_api_secrets.yml` | +| `EXA_API_KEY` | Secrets | From `prd_api_secrets.yml` (optional) | +| `DB_HOST` | AWS | RDS endpoint (auto-populated) | +| `DB_PORT` | AWS | RDS port (auto-populated) | +| `DB_USER` | Secrets | From `prd_db_secrets.yml` | +| `DB_PASS` | Secrets | From `prd_db_secrets.yml` | +| `DB_DATABASE` | AWS | RDS database name (auto-populated) | +| `WAIT_FOR_DB` | Hardcoded | `True` when database enabled | + + +`MIGRATE_DB` is **not** set in production by default. Add it manually if you want migrations to run on startup. See [Adding Custom Variables](#adding-custom-variables). + + +## Development Variables + +These variables are set in `dev_resources.py`: + +| Variable | Value | Notes | +|----------|-------|-------| +| `RUNTIME_ENV` | `dev` | | +| `DATA_DIR` | `/app/.data` | Local container path | +| `MIGRATE_DB` | `True` | Auto-migrates on startup | +| `WAIT_FOR_DB` | `True` | Waits for Docker Postgres | + +Database variables (`DB_HOST`, `DB_PORT`, etc.) come from the local Docker container. + +## Adding Custom Variables + +Add variables to the `container_env` dict in `prd_resources.py`: + +```python prd_resources.py +container_env = { + ... + "MY_CUSTOM_VAR": "value", + "FROM_LOCAL_ENV": getenv("LOCAL_VAR"), + "MIGRATE_DB": True, # Enable auto-migrations +} +``` + +After adding variables: + +```bash +ag infra patch prd:aws:::td && ag infra patch prd:aws:::service +``` + +## Reading in Code + +```python +import os + +# With default fallback +my_var = os.getenv("MY_CUSTOM_VAR", "default_value") + +# Required (raises if missing) +api_key = os.environ["OPENAI_API_KEY"] +``` + +## Next Steps + +- [Secrets](/production/aws/configure/secrets) - API keys and database credentials +- [Database Setup](/production/aws/configure/database) - Connection configuration +- [Settings](/production/aws/configure/settings) - Infrastructure configuration diff --git a/production/aws/secrets.mdx b/production/aws/secrets.mdx deleted file mode 100644 index 009b6ed72..000000000 --- a/production/aws/secrets.mdx +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Add Secrets ---- - -Secret management is a critical part of your application security and should be taken seriously. - -Local secrets are defined in the `infra/secrets` directory which is excluded from version control (see `.gitignore`). Its contents should be handled with the same security as passwords. - -Production secrets are managed by [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html). - - - -Incase you're missing the secrets dir, copy `infra/example_secrets` - - - -## Development Secrets - -Apps running locally can read secrets using a `yaml` file, for example: - -```python dev_resources.py -dev_fastapi = FastApi( - ... - # Read secrets from secrets/dev_app_secrets.yml - secrets_file=infra_settings.infra_root.joinpath("infra/secrets/dev_app_secrets.yml"), -) -``` - -## Production Secrets - -`AWS Secrets` are used to manage production secrets, which are read by the production apps. - -```python prd_resources.py -# -*- Secrets for production application -prd_secret = SecretsManager( - ... - # Create secret from workspace/secrets/prd_app_secrets.yml - secret_files=[ - infra_settings.infra_root.joinpath("infra/secrets/prd_app_secrets.yml") - ], -) - -# -*- Secrets for production database -prd_db_secret = SecretsManager( - ... - # Create secret from workspace/secrets/prd_db_secrets.yml - secret_files=[infra_settings.infra_root.joinpath("infra/secrets/prd_db_secrets.yml")], -) -``` - -Read the secret in production apps using: - - - -```python FastApi -prd_fastapi = FastApi( - ... - aws_secrets=[prd_secret], - ... -) -``` - -```python RDS -prd_db = DbInstance( - ... - aws_secret=prd_db_secret, - ... -) -``` - - - -Production resources can also read secrets using yaml files but we highly recommend using [AWS Secrets](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html). diff --git a/production/aws/ssh-access.mdx b/production/aws/ssh-access.mdx deleted file mode 100644 index 416245bbe..000000000 --- a/production/aws/ssh-access.mdx +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: SSH Access ---- - -SSH Access is an important part of the developer workflow. - -## Dev SSH Access - -SSH into the dev containers using the `docker exec` command - -```bash -docker exec -it ai-api zsh -``` - -## Production SSH Access - -Your ECS tasks are already enabled with SSH access. SSH into the production containers using: - -```bash -ECS_CLUSTER=ai-app-prd-cluster -TASK_ARN=$(aws ecs list-tasks --cluster ai-app-prd-cluster --query "taskArns[0]" --output text) -CONTAINER_NAME=ai-api-prd - -aws ecs execute-command --cluster $ECS_CLUSTER \ - --task $TASK_ARN \ - --container $CONTAINER_NAME \ - --interactive \ - --command "zsh" -``` diff --git a/production/overview.mdx b/production/overview.mdx index 55aed49ce..8be5a7dab 100644 --- a/production/overview.mdx +++ b/production/overview.mdx @@ -31,7 +31,7 @@ Start here. Clone a template to get AgentOS running in your environment. Deploy AgentOS to Railway. - + Deploy AgentOS to ECS. diff --git a/production/templates/aws.mdx b/production/templates/aws.mdx deleted file mode 100644 index cfbe76ac6..000000000 --- a/production/templates/aws.mdx +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: "AgentOS on AWS" -description: "Deploy AgentOS to AWS ECS." ---- - -This template deploys AgentOS to AWS with ECS Fargate, RDS PostgreSQL, and an Application Load Balancer. Production-grade infrastructure that runs entirely in your cloud. - -## Step-by-step Guide - - - - -- Install [Docker Desktop](https://docs.docker.com/desktop/install/mac-install/) -- Install [uv](https://docs.astral.sh/uv/) (Python package manager) -- Install and configure the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) - - - - -```bash -uv venv --python 3.12 -source .venv/bin/activate -``` - - - - -```bash -uv pip install -U 'agno[infra]' -``` - - - - -```bash -ag infra create --template agentos-aws --name agentos-aws - -cd agentos-aws -``` - - -Or clone directly: `git clone https://github.com/agno-agi/agentos-aws-template.git` - - - - - -```bash -export OPENAI_API_KEY=sk-*** -``` - - -Agno works with any model provider. Just update the agents in your codebase. - - - - - - -Update `infra/settings.py` with your AWS configuration: -```python -infra_settings = InfraSettings( - aws_region="us-east-1", - subnet_ids=["subnet-xxx", "subnet-yyy"], - image_repo="[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com", -) -``` - - - - -```bash -ag infra up -``` - -Open http://localhost:8000/docs to verify it works. - - - - -```bash -ag infra up prd:aws -``` - -Press Enter to confirm. This creates: -- Docker image pushed to ECR -- RDS PostgreSQL instance -- ECS Cluster, Service, and Task Definition -- Application Load Balancer with Target Group - -RDS takes about 5 minutes to provision. Monitor progress on the AWS Console. - - - - - -Find your Load Balancer DNS in the AWS Console (EC2 → Load Balancers). Navigate to `https:///docs` to see your AgentOS API. - - - - - -1. Open [os.agno.com](https://os.agno.com) -2. Click "Connect OS" and select "Live" -3. Enter your Load Balancer DNS as the endpoint - - - AgentOS connection dialog - - - - - - -## Tips - -**Update deployment**: After making changes to your agents: -```bash -ag infra patch prd:aws -``` - -**Stop deployment**: -```bash -ag infra down prd:aws -``` - - -This removes all AWS resources including the database. Back up your data first. - - -**Project structure:** -``` -agentos-aws/ -├── agents/ # Your agents -├── teams/ # Your teams -├── workflows/ # Your workflows -├── app/ # AgentOS directory -├── db/ # Database tables -├── infra/ # AWS infrastructure configuration -│ └── settings.py # InfraSettings (region, subnets, etc.) -├── compose.yml # Docker Compose for local testing -├── Dockerfile # Container build -└── pyproject.toml # Python dependencies -``` - -**AWS Resources Created:** - -The `ag infra up prd:aws` command provisions: - -- **ECR**: Container registry for your Docker image -- **ECS Fargate**: Serverless container hosting -- **RDS PostgreSQL**: Managed database with pgvector -- **Application Load Balancer**: HTTPS endpoint -- **AWS Secrets Manager**: Secure credential storage -- **Security Groups**: Network access controls - -**Cost Estimate:** - -Estimated monthly costs (US East): -- ECS Fargate: $30-50 -- RDS db.t3.micro: $15-20 -- Load Balancer: $20-25 - -Total: ~$65-100/month. Use the [AWS Pricing Calculator](https://calculator.aws/) for detailed estimates. - -## Troubleshooting - - - - The RDS instance takes about 5 minutes to provision. Check status in the AWS Console (RDS → Databases). - - - View task logs in CloudWatch. Common issues: missing environment variables, incorrect database connection string. - - - The ECS service may still be starting. Wait 2-3 minutes for health checks to pass. - - \ No newline at end of file diff --git a/production/templates/overview.mdx b/production/templates/overview.mdx index c01bae63f..53e13221c 100644 --- a/production/templates/overview.mdx +++ b/production/templates/overview.mdx @@ -15,7 +15,7 @@ Templates are production-ready codebases that you can clone and build on top of. Deploy AgentOS to Railway. - + Deploy AgentOS to ECS. @@ -24,7 +24,7 @@ Templates are production-ready codebases that you can clone and build on top of. |----------|----------|------| | [Docker](/production/templates/docker) | Local development, testing, self-hosting | ~5 min | | [Railway](/production/templates/railway) | Quick production deployments, MVPs | ~10 min | -| [AWS](/production/templates/aws) | Production at scale, enterprise | ~15 min | +| [AWS](/production/aws/getting-started) | Production at scale, enterprise | ~15 min | ## Which Template Should I Use? From 13315b5c3cb98e5f2227c10e18f648b40a6ff501 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Mon, 2 Feb 2026 15:27:19 -0500 Subject: [PATCH 02/14] fix: Restore 15 AWS Console images and rename After Deploy to Go Live - Rename "After Deploy" section to "Go Live" in navigation - Restore 10 dashboard images to CI/CD page: - GitHub Actions secrets, Docker build workflow - OIDC provider setup (4 screenshots) - IAM role creation steps - ECR build workflow - Restore 3 AWS Console images to HTTPS page: - Route 53 A record configuration - ACM certificate request - Certificate validation with CNAME Images existed in /images/ but references were lost during restructure. Co-Authored-By: Claude Opus 4.5 --- docs.json | 2 +- production/aws/after-deploy/https.mdx | 6 +++++ production/aws/operate/ci-cd.mdx | 34 ++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/docs.json b/docs.json index f3095cc66..c6213d58a 100644 --- a/docs.json +++ b/docs.json @@ -2964,7 +2964,7 @@ "pages": [ "production/aws/getting-started", { - "group": "After Deploy", + "group": "Go Live", "pages": [ "production/aws/after-deploy/verify", "production/aws/after-deploy/https", diff --git a/production/aws/after-deploy/https.mdx b/production/aws/after-deploy/https.mdx index 3ee8e4fc3..35e291ffb 100644 --- a/production/aws/after-deploy/https.mdx +++ b/production/aws/after-deploy/https.mdx @@ -22,11 +22,15 @@ Create an A record pointing to your load balancer: |--------|------|-------| | `api.yourdomain.com` | A (Alias) | Your ALB DNS name | +Route 53 A record configuration + ## Step 2: Create SSL Certificate Go to [AWS ACM](https://us-east-1.console.aws.amazon.com/acm) and request a certificate for your domain (e.g., `*.yourdomain.com` or `api.yourdomain.com`). + +AWS ACM request certificate @@ -34,6 +38,8 @@ Choose DNS validation. ACM will provide CNAME records to add to Route 53. Click "Create records in Route 53" to add them automatically. +AWS ACM certificate validation + Certificate validation takes 5-30 minutes. Wait until status shows "Issued". diff --git a/production/aws/operate/ci-cd.mdx b/production/aws/operate/ci-cd.mdx index f01f88efc..25213ba3d 100644 --- a/production/aws/operate/ci-cd.mdx +++ b/production/aws/operate/ci-cd.mdx @@ -28,6 +28,8 @@ on: This checks formatting, tests, and types before merging. +PR validation workflow + ## DockerHub with GitHub Build and push images on GitHub release. Workflow: `.github/workflows/docker-images.yml` @@ -35,6 +37,8 @@ Build and push images on GitHub release. Workflow: `.github/workflows/docker-ima Go to [Docker Hub Settings → Security](https://hub.docker.com/settings/security) and create an access token. + +Docker Hub access token @@ -52,6 +56,8 @@ Add this variable: | Name | Value | |------|-------| | `DOCKERHUB_NAMESPACE` | Your Docker Hub namespace (usually your username) | + +GitHub Actions secrets configuration @@ -60,6 +66,8 @@ gh release create v0.1.0 --title "v0.1.0" -n "" ``` The workflow builds and pushes `your-namespace/agentos-template:dev` and `:prd` tags. + +GitHub Actions Docker build workflow @@ -78,16 +86,28 @@ Workflow: `.github/workflows/ecr-images.yml` 3. Provider URL: `https://token.actions.githubusercontent.com` 4. Click **Get thumbprint** 5. Audience: `sts.amazonaws.com` + +AWS IAM OIDC Provider configuration 1. After adding the provider, click **Assign role** → **Create a new role** -2. Trusted entity: **Web identity** -3. Identity provider: Select the GitHub provider -4. Audience: `sts.amazonaws.com` -5. Add permission: `AmazonEC2ContainerRegistryPowerUser` -6. Role name: `GithubActionsRole` -7. Copy the Role ARN (format: `arn:aws:iam::[ACCOUNT_ID]:role/GithubActionsRole`) + +Assign role to OIDC provider + +2. Select **Create a new role** + +Create new IAM role + +3. Confirm **Web identity** is selected as trusted entity, Identity provider shows GitHub, and Audience is `sts.amazonaws.com` + +Configure trusted entity + +4. Add permission: `AmazonEC2ContainerRegistryPowerUser` +5. Role name: `GithubActionsRole` +6. Copy the Role ARN (format: `arn:aws:iam::[ACCOUNT_ID]:role/GithubActionsRole`) + +GitHub Actions IAM Role @@ -127,6 +147,8 @@ Or trigger manually: ```bash gh workflow run ecr-images.yml ``` + +GitHub Actions ECR build workflow From 6efe8a0a7773bfb7aad0fbf260d7053e7c3120e8 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Mon, 2 Feb 2026 15:28:55 -0500 Subject: [PATCH 03/14] feat: Add code-quality.mdx reference page Restores format and validate documentation that was lost during restructure: - ./scripts/format.sh and ./scripts/validate.sh usage - Direct ruff and mypy commands - Pre-commit workflow - Common issues troubleshooting Co-Authored-By: Claude Opus 4.5 --- docs.json | 1 + production/aws/reference/code-quality.mdx | 75 +++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 production/aws/reference/code-quality.mdx diff --git a/docs.json b/docs.json index c6213d58a..494b45b28 100644 --- a/docs.json +++ b/docs.json @@ -2994,6 +2994,7 @@ { "group": "Reference", "pages": [ + "production/aws/reference/code-quality", "production/aws/reference/database-tables", "production/aws/reference/env-vars" ] diff --git a/production/aws/reference/code-quality.mdx b/production/aws/reference/code-quality.mdx new file mode 100644 index 000000000..b90dea032 --- /dev/null +++ b/production/aws/reference/code-quality.mdx @@ -0,0 +1,75 @@ +--- +title: "Code Quality" +sidebarTitle: "Code Quality" +description: "Format and validate your code before committing" +--- + +Run formatting and validation before pushing changes to ensure code quality. + +## Format + +Format the codebase using [ruff](https://docs.astral.sh/ruff/): + + + +```bash Script +./scripts/format.sh +``` + +```bash Direct +ruff format . +``` + + + +## Validate + +Lint and type-check using [ruff](https://docs.astral.sh/ruff/) and [mypy](https://mypy.readthedocs.io/en/stable/): + + + +```bash Script +./scripts/validate.sh +``` + +```bash Ruff only +ruff check . +``` + +```bash Mypy only +mypy . +``` + + + + +Configuration is in `pyproject.toml`. Run both scripts before every commit. + + +## Pre-commit Workflow + +```bash +# 1. Format +./scripts/format.sh + +# 2. Validate +./scripts/validate.sh + +# 3. If both pass, commit +git add . +git commit -m "your message" +``` + +## Common Issues + +| Issue | Solution | +|-------|----------| +| `ruff` not found | Run `uv pip install ruff` | +| `mypy` not found | Run `uv pip install mypy` | +| Type errors | Fix the types or add `# type: ignore` comment | +| Import sorting | Run `ruff check --fix .` to auto-fix | + +## Next Steps + +- [CI/CD](/production/aws/operate/ci-cd) - Automated validation on every PR +- [Local Development](/production/aws/configure/local) - Development workflow From f693f9d298f583250758a4fe860bf827f90d87f1 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Mon, 2 Feb 2026 17:16:33 -0500 Subject: [PATCH 04/14] Update --- images/aws-architecture-dark.svg | 57 ++-- images/aws-architecture-light.svg | 57 ++-- production/aws/after-deploy/connect.mdx | 3 +- production/aws/after-deploy/https.mdx | 6 +- production/aws/after-deploy/verify.mdx | 6 +- production/aws/configure/database.mdx | 1 + production/aws/configure/efs.mdx | 1 + production/aws/configure/local.mdx | 1 + production/aws/configure/packages.mdx | 1 + production/aws/configure/secrets.mdx | 1 + production/aws/configure/settings.mdx | 1 + production/aws/getting-started.mdx | 270 +++++++++++++------ production/aws/operate/ci-cd.mdx | 1 + production/aws/operate/monitoring.mdx | 1 + production/aws/operate/troubleshooting.mdx | 1 + production/aws/operate/updates.mdx | 1 + production/aws/reference/code-quality.mdx | 1 + production/aws/reference/database-tables.mdx | 1 + production/aws/reference/env-vars.mdx | 1 + 19 files changed, 248 insertions(+), 164 deletions(-) diff --git a/images/aws-architecture-dark.svg b/images/aws-architecture-dark.svg index 6c17fdf0c..35b62e7ec 100644 --- a/images/aws-architecture-dark.svg +++ b/images/aws-architecture-dark.svg @@ -64,6 +64,11 @@ + + + + + @@ -78,7 +83,7 @@ Users - HTTP(S) + HTTPS @@ -107,7 +112,10 @@ Application Load Balancer - HTTP (HTTPS optional) + + + HTTPS + @@ -118,31 +126,16 @@ - + ECS Fargate - + - + - AgentOS - Container - port 8000 - - - - - - - Your - Agents/ - Teams - - - - - - /health (built-in) + AgentOS Container + Your Agents, Teams, Workflows + port 8000 @@ -238,17 +231,17 @@ Agno Creates - - You Provide + + Optional - - Optional + + + Data Flow - - - Data Flow + + Security Group - - Security Group + + HTTPS Required diff --git a/images/aws-architecture-light.svg b/images/aws-architecture-light.svg index f34573b44..361082e02 100644 --- a/images/aws-architecture-light.svg +++ b/images/aws-architecture-light.svg @@ -64,6 +64,11 @@ + + + + + @@ -78,7 +83,7 @@ Users - HTTP(S) + HTTPS @@ -107,7 +112,10 @@ Application Load Balancer - HTTP (HTTPS optional) + + + HTTPS + @@ -118,31 +126,16 @@ - + ECS Fargate - + - + - AgentOS - Container - port 8000 - - - - - - - Your - Agents/ - Teams - - - - - - /health (built-in) + AgentOS Container + Your Agents, Teams, Workflows + port 8000 @@ -238,17 +231,17 @@ Agno Creates - - You Provide + + Optional - - Optional + + + Data Flow - - - Data Flow + + Security Group - - Security Group + + HTTPS Required diff --git a/production/aws/after-deploy/connect.mdx b/production/aws/after-deploy/connect.mdx index 85df2ff43..074eee548 100644 --- a/production/aws/after-deploy/connect.mdx +++ b/production/aws/after-deploy/connect.mdx @@ -1,7 +1,8 @@ --- title: "Connect to Control Plane" -sidebarTitle: "Connect" +sidebarTitle: "Connect to AgentOS" description: "Connect your AgentOS to os.agno.com" +keywords: ["control plane", "os.agno.com", "connect", "link", "monitor", "manage"] --- Connect your AWS deployment to [os.agno.com](https://os.agno.com) to monitor and manage your agents. diff --git a/production/aws/after-deploy/https.mdx b/production/aws/after-deploy/https.mdx index 35e291ffb..613225c1d 100644 --- a/production/aws/after-deploy/https.mdx +++ b/production/aws/after-deploy/https.mdx @@ -2,6 +2,7 @@ title: "Add HTTPS" sidebarTitle: "HTTPS" description: "Add a custom domain and SSL certificate" +keywords: ["SSL", "TLS", "certificate", "ACM", "Route 53", "domain", "HTTPS", "secure"] --- HTTPS is required to connect your AgentOS to os.agno.com. @@ -102,8 +103,3 @@ Should return: | Certificate not showing in dropdown | Must be in same region as load balancer (us-east-1) | | HTTPS not working after setup | Run `ag infra patch prd:aws:::listener` again | -## Next Step - -Now you can connect to os.agno.com: - -→ [Connect to Control Plane](/production/aws/after-deploy/connect) diff --git a/production/aws/after-deploy/verify.mdx b/production/aws/after-deploy/verify.mdx index d1f16a212..b2affcfd9 100644 --- a/production/aws/after-deploy/verify.mdx +++ b/production/aws/after-deploy/verify.mdx @@ -2,6 +2,7 @@ title: "Verify Your Deployment" sidebarTitle: "Verify" description: "Confirm your AWS deployment is working" +keywords: ["health check", "CloudWatch", "logs", "ECS", "status", "verify", "confirm"] --- After running `ag infra up prd:aws`, verify everything is working before proceeding. @@ -73,8 +74,3 @@ Expected output: | No logs appearing | Check ECS task started in AWS Console | | Task keeps restarting | See [Troubleshooting](/production/aws/operate/troubleshooting) | -## Next Step - -Once verified, add HTTPS to connect to os.agno.com: - -→ [Add HTTPS](/production/aws/after-deploy/https) diff --git a/production/aws/configure/database.mdx b/production/aws/configure/database.mdx index 00dfa2baf..9a43a4b89 100644 --- a/production/aws/configure/database.mdx +++ b/production/aws/configure/database.mdx @@ -2,6 +2,7 @@ title: "Database Setup" sidebarTitle: "Database" description: "Configure RDS PostgreSQL and run migrations" +keywords: ["database", "RDS", "PostgreSQL", "pgvector", "migrations", "Alembic", "SQL"] --- ## Overview diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx index fc6c444f5..a971030b4 100644 --- a/production/aws/configure/efs.mdx +++ b/production/aws/configure/efs.mdx @@ -2,6 +2,7 @@ title: "Persistent Storage with EFS" sidebarTitle: "EFS" description: "Use Amazon EFS for data that survives container restarts" +keywords: ["EFS", "storage", "persistent", "volume", "data", "DuckDB", "Pal"] --- Amazon Elastic File System (EFS) provides shared, persistent storage for your ECS containers. Use it when your agents need data to survive container restarts or deployments. diff --git a/production/aws/configure/local.mdx b/production/aws/configure/local.mdx index f70992d6e..6a38e8102 100644 --- a/production/aws/configure/local.mdx +++ b/production/aws/configure/local.mdx @@ -2,6 +2,7 @@ title: "Local Development" sidebarTitle: "Local" description: "Build and run your application locally with Docker" +keywords: ["local", "development", "Docker", "dev", "localhost", "testing"] --- Local development uses Docker Compose. Resources are defined in `infra/dev_resources.py`. diff --git a/production/aws/configure/packages.mdx b/production/aws/configure/packages.mdx index b51ed72ec..cb3684397 100644 --- a/production/aws/configure/packages.mdx +++ b/production/aws/configure/packages.mdx @@ -2,6 +2,7 @@ title: "Python Packages" sidebarTitle: "Python Packages" description: "Manage dependencies with pyproject.toml" +keywords: ["packages", "dependencies", "pyproject.toml", "requirements", "pip", "install"] --- Dependencies are managed in `pyproject.toml` and compiled to `requirements.txt`. diff --git a/production/aws/configure/secrets.mdx b/production/aws/configure/secrets.mdx index 5beaf014f..5524a3d82 100644 --- a/production/aws/configure/secrets.mdx +++ b/production/aws/configure/secrets.mdx @@ -2,6 +2,7 @@ title: "Secrets & API Keys" sidebarTitle: "Secrets" description: "Configure API keys and database credentials for your deployment" +keywords: ["API keys", "credentials", "secrets", "environment variables", "env vars", "OpenAI", "database password"] --- Secrets are stored in YAML files locally and synced to AWS Secrets Manager for production. diff --git a/production/aws/configure/settings.mdx b/production/aws/configure/settings.mdx index 920f7dedf..22895949f 100644 --- a/production/aws/configure/settings.mdx +++ b/production/aws/configure/settings.mdx @@ -2,6 +2,7 @@ title: "Infrastructure Settings" sidebarTitle: "Settings" description: "Configure AWS region, subnets, and ECR" +keywords: ["settings", "configuration", "region", "subnets", "ECR", "VPC", "infrastructure"] --- The `InfraSettings` object in `infra/settings.py` defines common settings used by your apps and resources. diff --git a/production/aws/getting-started.mdx b/production/aws/getting-started.mdx index cf1d9793f..50b61255c 100644 --- a/production/aws/getting-started.mdx +++ b/production/aws/getting-started.mdx @@ -2,25 +2,27 @@ title: "AgentOS on AWS" sidebarTitle: "Getting Started" description: "Deploy AgentOS to AWS with ECS Fargate" +keywords: ["deploy", "AWS", "ECS", "Fargate", "RDS", "PostgreSQL", "production", "infrastructure"] --- Deploy AgentOS to AWS with ECS Fargate, RDS PostgreSQL, and an Application Load Balancer. Production-grade infrastructure that runs entirely in your cloud. ## Architecture -AWS Architecture - -AWS Architecture - -## What You'll Deploy + + AWS Architecture + AWS Architecture + + +## Cost | Resource | Purpose | Monthly Cost | |----------|---------|--------------| @@ -35,9 +37,7 @@ Use the [AWS Pricing Calculator](https://calculator.aws/) for detailed estimates --- -## Deploy to AWS - -### Prerequisites +## Prerequisites @@ -62,12 +62,8 @@ uv pip install -U 'agno[infra]' ``` - - -### Setup Your Project - - + ```bash ag infra create --template agentos-aws --name my-agentos @@ -80,7 +76,7 @@ Or clone directly: `git clone https://github.com/agno-agi/agentos-aws-template.g - + ```bash export OPENAI_API_KEY=sk-*** ``` @@ -88,12 +84,62 @@ export OPENAI_API_KEY=sk-*** -### Configure AWS + +HTTPS is required to connect your AgentOS to os.agno.com. You'll configure this after deployment. + - - +--- + +## Deploy + +### Step 1: AWS Setup -Create a repository in ECR to store your Docker images: +Choose your preferred method to create the ECR repository and find your subnet IDs: + + + + +**Create ECR repository:** + +1. Open [Amazon ECR](https://console.aws.amazon.com/ecr/) +2. Click **Create repository** +3. Set repository name to `my-agentos` +4. Keep defaults and click **Create repository** +5. Copy the repository URI (e.g., `[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com/my-agentos`) + + + ECR Create Repository page + + +**Authenticate Docker with ECR:** + +Click **View push commands** in the ECR console and run the login command: + +```bash +aws ecr get-login-password --region us-east-1 | \ + docker login --username AWS --password-stdin \ + [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com +``` + + +ECR tokens expire after 12 hours. Re-run this command if you get authentication errors. + + +**Find your subnet IDs:** + +1. Open [VPC Console](https://console.aws.amazon.com/vpc/) → **Subnets** +2. Look for subnets with **Auto-assign public IP** = Yes +3. Note the Subnet IDs for 2+ subnets in different availability zones + + +Public subnets typically have "public" in their name or have a route to an Internet Gateway. + + + + + + +**Create ECR repository:** ```bash aws ecr create-repository \ @@ -106,9 +152,7 @@ Note your ECR URL from the output: [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com ``` - - - +**Authenticate Docker with ECR:** ```bash aws ecr get-login-password --region us-east-1 | \ @@ -117,33 +161,42 @@ aws ecr get-login-password --region us-east-1 | \ ``` -ECR tokens expire after 12 hours. Re-run this command if you get "no basic auth credentials" errors. +ECR tokens expire after 12 hours. Re-run this command if you get authentication errors. - +**Find your subnet IDs:** + +```bash +aws ec2 describe-subnets --query 'Subnets[*].[SubnetId,AvailabilityZone,MapPublicIpOnLaunch]' --output table +``` - + +Choose subnets where `MapPublicIpOnLaunch` is `True`. Select subnets in different availability zones for high availability. + + + + + +### Step 2: Configure + + + -Update `infra/settings.py`: +Edit `infra/settings.py` with your AWS details: ```python infra_settings = InfraSettings( infra_name="my-agentos", aws_region="us-east-1", - aws_subnet_ids=["subnet-xxx", "subnet-yyy"], + aws_subnet_ids=["subnet-xxx", "subnet-yyy"], # Your subnet IDs image_repo="[ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com", push_images=True, ) ``` -To find your subnet IDs: -```bash -aws ec2 describe-subnets --query 'Subnets[*].[SubnetId,AvailabilityZone]' --output table -``` - - + ```bash cp infra/secrets/prd_api_secrets.example.yml infra/secrets/prd_api_secrets.yml @@ -155,91 +208,130 @@ Edit both files with your credentials. See [Secrets](/production/aws/configure/s -### Deploy +### Step 3: Test & Deploy - + + ```bash ag infra up ``` -Open http://localhost:8000/docs to verify it works. +Open http://localhost:8000/docs to verify your agents load correctly. - + + ```bash ag infra up prd:aws ``` Press Enter to confirm. This creates: - Docker image pushed to ECR -- RDS PostgreSQL instance +- RDS PostgreSQL instance with pgvector - ECS Cluster, Service, and Task Definition - Application Load Balancer with Target Group +- Security Groups for network isolation -RDS takes about 5 minutes to provision. Monitor progress in the AWS Console. + +RDS takes 5-10 minutes to provision. The deployment will wait for it automatically. + + + +### Step 4: Get Your Endpoint - + + -Find your Load Balancer DNS in the AWS Console (EC2 → Load Balancers). +1. Open [EC2 Console](https://console.aws.amazon.com/ec2/) → **Load Balancers** +2. Find your load balancer (named `my-agentos-...`) +3. Copy the **DNS name** Test your deployment: ```bash curl http://[LOAD_BALANCER_DNS]/health ``` -Should return: `{"status": "ok", "instantiated_at": "..."}` + - - - ---- + -## What's Next? - -Your AgentOS is deployed. Follow these steps to finish setup: - - - -Confirm everything is working. - -→ [Verify Deployment](/production/aws/after-deploy/verify) - - - -Required to connect to os.agno.com. +```bash +aws elbv2 describe-load-balancers \ + --query 'LoadBalancers[?contains(LoadBalancerName, `my-agentos`)].DNSName' \ + --output text +``` -→ [Add HTTPS](/production/aws/after-deploy/https) - +Test your deployment: +```bash +curl http://[LOAD_BALANCER_DNS]/health +``` - -Monitor and manage your agents from the control plane. + + -→ [Connect to Control Plane](/production/aws/after-deploy/connect) - - +Should return: `{"status": "ok", "instantiated_at": "..."}` --- -## Reference +## Next Steps -### Project Structure + + + Confirm all services are healthy + + + Required for os.agno.com connection + + + Link to the control plane + + -``` -my-agentos/ -├── agents/ # Your agents -├── app/ # AgentOS application -├── db/ # Database tables and migrations -├── infra/ # Infrastructure configuration -│ ├── settings.py # InfraSettings (region, subnets, etc.) -│ ├── prd_resources.py # Production AWS resources -│ └── secrets/ # API keys and credentials -├── scripts/ # Helper scripts (auth_ecr.sh, etc.) -├── Dockerfile # Container build -├── pyproject.toml # Python dependencies -└── requirements.txt # Locked dependencies -``` +--- +## Troubleshooting + + + + ECR tokens expire after 12 hours. Re-run the authentication command: + ```bash + aws ecr get-login-password --region us-east-1 | \ + docker login --username AWS --password-stdin \ + [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com + ``` + + + + RDS typically takes 5-10 minutes. Check status in [RDS Console](https://console.aws.amazon.com/rds/) → Databases. + Look for the database status to change from "Creating" to "Available". + + + + Public subnets have a route to an Internet Gateway. In the VPC Console: + 1. Go to **Route Tables** + 2. Find tables with a route to `igw-xxx` (Internet Gateway) + 3. Check which subnets are associated with those route tables + + + + The container may still be starting. Wait 2-3 minutes and retry. + + If it persists, check ECS task logs: + 1. Open [ECS Console](https://console.aws.amazon.com/ecs/) → Clusters → `my-agentos` + 2. Click on the running task + 3. Go to **Logs** tab to see container output + + + + This usually indicates the container is crashing. Common causes: + - Missing environment variables (check your secrets files) + - Invalid API keys + - Database connection issues + + Check the **Stopped** tasks in ECS Console for error messages. + + diff --git a/production/aws/operate/ci-cd.mdx b/production/aws/operate/ci-cd.mdx index 25213ba3d..8c2e85acb 100644 --- a/production/aws/operate/ci-cd.mdx +++ b/production/aws/operate/ci-cd.mdx @@ -2,6 +2,7 @@ title: "CI/CD Automation" sidebarTitle: "CI/CD" description: "Automate builds with GitHub Actions" +keywords: ["CI/CD", "GitHub Actions", "automation", "continuous integration", "continuous deployment", "pipeline"] --- ## Choose Your Method diff --git a/production/aws/operate/monitoring.mdx b/production/aws/operate/monitoring.mdx index 3096ed95a..d90ace18a 100644 --- a/production/aws/operate/monitoring.mdx +++ b/production/aws/operate/monitoring.mdx @@ -2,6 +2,7 @@ title: "Monitoring" sidebarTitle: "Monitoring" description: "View logs and monitor your AWS deployment" +keywords: ["monitoring", "logs", "CloudWatch", "metrics", "alerts", "observability"] --- CloudWatch Logs captures output from your ECS containers. diff --git a/production/aws/operate/troubleshooting.mdx b/production/aws/operate/troubleshooting.mdx index 7267078c4..5d741b2f9 100644 --- a/production/aws/operate/troubleshooting.mdx +++ b/production/aws/operate/troubleshooting.mdx @@ -2,6 +2,7 @@ title: "Troubleshooting" sidebarTitle: "Troubleshooting" description: "Common AWS deployment errors and solutions" +keywords: ["troubleshooting", "errors", "debug", "fix", "issues", "problems", "help"] --- Solutions for common issues encountered when deploying to AWS. diff --git a/production/aws/operate/updates.mdx b/production/aws/operate/updates.mdx index 10674a951..89acc97c1 100644 --- a/production/aws/operate/updates.mdx +++ b/production/aws/operate/updates.mdx @@ -2,6 +2,7 @@ title: "Production Deployment" sidebarTitle: "Production" description: "Deploy your application to AWS with ECS Fargate" +keywords: ["deploy", "update", "push", "release", "production", "ECS", "task definition"] --- Your production application runs on AWS ECS Fargate. Resources are defined in `infra/prd_resources.py`. diff --git a/production/aws/reference/code-quality.mdx b/production/aws/reference/code-quality.mdx index b90dea032..de320b676 100644 --- a/production/aws/reference/code-quality.mdx +++ b/production/aws/reference/code-quality.mdx @@ -2,6 +2,7 @@ title: "Code Quality" sidebarTitle: "Code Quality" description: "Format and validate your code before committing" +keywords: ["format", "lint", "ruff", "mypy", "type check", "code quality", "pre-commit"] --- Run formatting and validation before pushing changes to ensure code quality. diff --git a/production/aws/reference/database-tables.mdx b/production/aws/reference/database-tables.mdx index b45be0d4e..121c392d6 100644 --- a/production/aws/reference/database-tables.mdx +++ b/production/aws/reference/database-tables.mdx @@ -2,6 +2,7 @@ title: "Database Tables" sidebarTitle: "Database Tables" description: "SQLAlchemy models and Alembic migrations" +keywords: ["tables", "models", "SQLAlchemy", "Alembic", "migrations", "schema", "ORM"] --- AgentOS uses [SQLAlchemy](https://www.sqlalchemy.org/) for models and [Alembic](https://alembic.sqlalchemy.org/) for migrations. diff --git a/production/aws/reference/env-vars.mdx b/production/aws/reference/env-vars.mdx index e9b06516e..e662822fb 100644 --- a/production/aws/reference/env-vars.mdx +++ b/production/aws/reference/env-vars.mdx @@ -2,6 +2,7 @@ title: "Environment Variables" sidebarTitle: "Env Vars" description: "Reference for app environment configuration" +keywords: ["environment variables", "env vars", "config", "configuration", "settings", "RUNTIME_ENV"] --- Environment variables are set in `dev_resources.py` (local) and `prd_resources.py` (production). From 8b170a6937436c84f737cd358e8bfed8e2a491ec Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Tue, 3 Feb 2026 13:08:54 -0500 Subject: [PATCH 05/14] feat: update AWS architecture images to high-res PNG - Replace SVG with 2x PNG for better text readability - Add w-full class for full-width display - Uses Mintlify's built-in click-to-zoom lightbox --- images/aws-architecture-dark.png | Bin 0 -> 131627 bytes images/aws-architecture-dark.svg | 247 ----------------------------- images/aws-architecture-light.png | Bin 0 -> 128191 bytes images/aws-architecture-light.svg | 247 ----------------------------- production/aws/getting-started.mdx | 22 ++- 5 files changed, 10 insertions(+), 506 deletions(-) create mode 100644 images/aws-architecture-dark.png delete mode 100644 images/aws-architecture-dark.svg create mode 100644 images/aws-architecture-light.png delete mode 100644 images/aws-architecture-light.svg diff --git a/images/aws-architecture-dark.png b/images/aws-architecture-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2af501c958964053cbdc953b5c29f9ad56985b09 GIT binary patch literal 131627 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - External - - - - - - Users - HTTPS - - - - - - - os.agno.com - Control Plane - - - - - Your VPC - (with Internet Gateway) - - - - Public Subnets (aws_subnet_ids) - - - AGNO CREATES: - - - - - - Application - Load Balancer - - - HTTPS - - - - - - - LB Security Group - - - - - - ECS Fargate - - - - - - AgentOS Container - Your Agents, Teams, Workflows - port 8000 - - - - - - - App Security Group - - - - - - - RDS - PostgreSQL - + pgvector - (single AZ) - - - - - - DB Security Group - - - - - - - EFS - Storage - (optional, you create) - - - - - AWS Regional Services (not in VPC) - - - - - - ECR - Images - - - - - - - Secrets Manager - API Keys, DB Creds - - - - - - - - - CloudWatch - Logs - - - - - - - IAM - Roles & Policies - - - - - - - - - - - - - - - - - - - - - - - - Agno Creates - - - Optional - - - - Data Flow - - - Security Group - - - HTTPS Required - - diff --git a/images/aws-architecture-light.png b/images/aws-architecture-light.png new file mode 100644 index 0000000000000000000000000000000000000000..dc2c0014c2aebced3942978ab5ea8570162e8e3d GIT binary patch literal 128191 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

)9lux)MK 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

C(deZKyli7I^21c|R@Z*^X9j(6Swz;^v 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 literal 0 HcmV?d00001 diff --git a/images/aws-architecture-light.svg b/images/aws-architecture-light.svg deleted file mode 100644 index 361082e02..000000000 --- a/images/aws-architecture-light.svg +++ /dev/null @@ -1,247 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - External - - - - - - Users - HTTPS - - - - - - - os.agno.com - Control Plane - - - - - Your VPC - (with Internet Gateway) - - - - Public Subnets (aws_subnet_ids) - - - AGNO CREATES: - - - - - - Application - Load Balancer - - - HTTPS - - - - - - - LB Security Group - - - - - - ECS Fargate - - - - - - AgentOS Container - Your Agents, Teams, Workflows - port 8000 - - - - - - - App Security Group - - - - - - - RDS - PostgreSQL - + pgvector - (single AZ) - - - - - - DB Security Group - - - - - - - EFS - Storage - (optional, you create) - - - - - AWS Regional Services (not in VPC) - - - - - - ECR - Images - - - - - - - Secrets Manager - API Keys, DB Creds - - - - - - - - - CloudWatch - Logs - - - - - - - IAM - Roles & Policies - - - - - - - - - - - - - - - - - - - - - - - - Agno Creates - - - Optional - - - - Data Flow - - - Security Group - - - HTTPS Required - - diff --git a/production/aws/getting-started.mdx b/production/aws/getting-started.mdx index 50b61255c..c3b78911e 100644 --- a/production/aws/getting-started.mdx +++ b/production/aws/getting-started.mdx @@ -9,18 +9,16 @@ Deploy AgentOS to AWS with ECS Fargate, RDS PostgreSQL, and an Application Load ## Architecture - - AWS Architecture - AWS Architecture - +AWS Architecture +AWS Architecture ## Cost From eb14f50d05b6c87a7486ce30c5a7959dd0e84717 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Tue, 3 Feb 2026 14:20:04 -0500 Subject: [PATCH 06/14] refactor: restructure AWS docs sidebar and folder layout MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Reorder sidebar: Configure → Go Live → Manage → More - Rename folders: operate → manage, reference → more - Create deploy/ folder, move updates.mdx there - Merge Deploy into Go Live section - Rename top-level tab: Production → Deploy - Convert Next Steps to CardGroup components - Remove database-tables.mdx (intentional) - Update all internal links --- docs.json | 37 ++--- production/aws/after-deploy/connect.mdx | 22 ++- production/aws/after-deploy/https.mdx | 10 ++ production/aws/after-deploy/verify.mdx | 16 +- production/aws/configure/database.mdx | 14 +- production/aws/configure/efs.mdx | 14 +- production/aws/configure/local.mdx | 14 +- production/aws/configure/packages.mdx | 10 +- production/aws/configure/secrets.mdx | 11 +- production/aws/configure/settings.mdx | 18 +- .../aws/{operate => deploy}/updates.mdx | 70 ++------ production/aws/getting-started.mdx | 14 +- production/aws/{operate => manage}/ci-cd.mdx | 6 +- .../aws/{operate => manage}/monitoring.mdx | 7 +- .../{operate => manage}/troubleshooting.mdx | 5 - .../aws/{reference => more}/code-quality.mdx | 4 - .../aws/{reference => more}/env-vars.mdx | 5 - production/aws/reference/database-tables.mdx | 157 ------------------ 18 files changed, 152 insertions(+), 282 deletions(-) rename production/aws/{operate => deploy}/updates.mdx (69%) rename production/aws/{operate => manage}/ci-cd.mdx (93%) rename production/aws/{operate => manage}/monitoring.mdx (94%) rename production/aws/{operate => manage}/troubleshooting.mdx (96%) rename production/aws/{reference => more}/code-quality.mdx (88%) rename production/aws/{reference => more}/env-vars.mdx (89%) delete mode 100644 production/aws/reference/database-tables.mdx diff --git a/docs.json b/docs.json index 494b45b28..a73eee2af 100644 --- a/docs.json +++ b/docs.json @@ -2943,10 +2943,10 @@ ] }, { - "tab": "Production", + "tab": "Deploy", "groups": [ { - "group": "Production", + "group": "Deploy", "pages": [ "production/overview" ] @@ -2963,14 +2963,6 @@ "group": "AWS", "pages": [ "production/aws/getting-started", - { - "group": "Go Live", - "pages": [ - "production/aws/after-deploy/verify", - "production/aws/after-deploy/https", - "production/aws/after-deploy/connect" - ] - }, { "group": "Configure", "pages": [ @@ -2983,20 +2975,27 @@ ] }, { - "group": "Operate", + "group": "Go Live", + "pages": [ + "production/aws/deploy/updates", + "production/aws/after-deploy/verify", + "production/aws/after-deploy/https", + "production/aws/after-deploy/connect" + ] + }, + { + "group": "Manage", "pages": [ - "production/aws/operate/updates", - "production/aws/operate/ci-cd", - "production/aws/operate/monitoring", - "production/aws/operate/troubleshooting" + "production/aws/manage/ci-cd", + "production/aws/manage/monitoring", + "production/aws/manage/troubleshooting" ] }, { - "group": "Reference", + "group": "More", "pages": [ - "production/aws/reference/code-quality", - "production/aws/reference/database-tables", - "production/aws/reference/env-vars" + "production/aws/more/code-quality", + "production/aws/more/env-vars" ] } ] diff --git a/production/aws/after-deploy/connect.mdx b/production/aws/after-deploy/connect.mdx index 074eee548..275a9a31a 100644 --- a/production/aws/after-deploy/connect.mdx +++ b/production/aws/after-deploy/connect.mdx @@ -73,13 +73,21 @@ curl -I https://api.yourdomain.com/health Should return `HTTP/2 200`. -## What's Next? +## Next Steps Your AgentOS is now deployed and connected. Here's what to do next: -| Task | Guide | -|------|-------| -| Add persistent storage | [Configure EFS](/production/aws/configure/efs) | -| Set up automated deployments | [CI/CD](/production/aws/operate/ci-cd) | -| Monitor logs and metrics | [Monitoring](/production/aws/operate/monitoring) | -| Update your deployment | [Push Updates](/production/aws/operate/updates) | + + + Automate deployments + + + CloudWatch logs and alerts + + + Push code changes + + + Common issues + + diff --git a/production/aws/after-deploy/https.mdx b/production/aws/after-deploy/https.mdx index 613225c1d..c2477a6a9 100644 --- a/production/aws/after-deploy/https.mdx +++ b/production/aws/after-deploy/https.mdx @@ -103,3 +103,13 @@ Should return: | Certificate not showing in dropdown | Must be in same region as load balancer (us-east-1) | | HTTPS not working after setup | Run `ag infra patch prd:aws:::listener` again | +## Next Steps + + + + Link to os.agno.com + + + Set up CloudWatch logs + + diff --git a/production/aws/after-deploy/verify.mdx b/production/aws/after-deploy/verify.mdx index b2affcfd9..a4bc7c5d0 100644 --- a/production/aws/after-deploy/verify.mdx +++ b/production/aws/after-deploy/verify.mdx @@ -70,7 +70,17 @@ Expected output: | Symptom | Next Step | |---------|-----------| -| Health returns error | Check [CloudWatch logs](/production/aws/operate/monitoring) | +| Health returns error | Check [CloudWatch logs](/production/aws/manage/monitoring) | | No logs appearing | Check ECS task started in AWS Console | -| Task keeps restarting | See [Troubleshooting](/production/aws/operate/troubleshooting) | - +| Task keeps restarting | See [Troubleshooting](/production/aws/manage/troubleshooting) | + +## Next Steps + + + + Required for os.agno.com connection + + + Link to the control plane + + diff --git a/production/aws/configure/database.mdx b/production/aws/configure/database.mdx index 9a43a4b89..14a495c8a 100644 --- a/production/aws/configure/database.mdx +++ b/production/aws/configure/database.mdx @@ -1,8 +1,8 @@ --- title: "Database Setup" sidebarTitle: "Database" -description: "Configure RDS PostgreSQL and run migrations" -keywords: ["database", "RDS", "PostgreSQL", "pgvector", "migrations", "Alembic", "SQL"] +description: "Configure RDS PostgreSQL for agent memory and knowledge" +keywords: ["database", "RDS", "PostgreSQL", "pgvector", "migrations", "SQL"] --- ## Overview @@ -146,5 +146,11 @@ psql -h [RDS_ENDPOINT] -U ai -d ai ## Next Steps -- [Database Tables Reference](/production/aws/reference/database-tables) - SQLAlchemy models -- [Troubleshooting](/production/aws/operate/troubleshooting) - Common issues + + + Confirm everything is working + + + Common database issues + + diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx index a971030b4..239c18dd2 100644 --- a/production/aws/configure/efs.mdx +++ b/production/aws/configure/efs.mdx @@ -277,6 +277,14 @@ Enable lifecycle policies to automatically move infrequently accessed files to c ## Next Steps -- [Secrets](/production/aws/configure/secrets) - API keys and credentials -- [Domain & HTTPS](/production/aws/after-deploy/https) - Custom domain and SSL -- [Monitoring](/production/aws/operate/monitoring) - CloudWatch logs + + + Confirm deployment works + + + Add SSL certificate + + + CloudWatch logs + + diff --git a/production/aws/configure/local.mdx b/production/aws/configure/local.mdx index 6a38e8102..69833601c 100644 --- a/production/aws/configure/local.mdx +++ b/production/aws/configure/local.mdx @@ -91,5 +91,15 @@ The `-t` flag filters what to create: ## Next Steps -- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS -- [CI/CD](/production/aws/operate/ci-cd) - Automate builds + + + Deploy to AWS + + + Automate builds + + + + +See [Code Quality](/production/aws/more/code-quality) for formatting and validation scripts. + diff --git a/production/aws/configure/packages.mdx b/production/aws/configure/packages.mdx index cb3684397..a9c2d3df6 100644 --- a/production/aws/configure/packages.mdx +++ b/production/aws/configure/packages.mdx @@ -100,5 +100,11 @@ ag infra restart dev:docker -t container ## Next Steps -- [Local Development](/production/aws/configure/local) - Docker setup -- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS + + + Test with Docker + + + Deploy to AWS + + diff --git a/production/aws/configure/secrets.mdx b/production/aws/configure/secrets.mdx index 5524a3d82..7b7baaff4 100644 --- a/production/aws/configure/secrets.mdx +++ b/production/aws/configure/secrets.mdx @@ -176,6 +176,11 @@ aws secretsmanager get-secret-value \ ## Next Steps -- [Infrastructure Settings](/production/aws/configure/settings) - Region, subnets, ECR -- [Database Setup](/production/aws/configure/database) - RDS configuration -- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS + + + RDS configuration + + + Persistent storage (optional) + + diff --git a/production/aws/configure/settings.mdx b/production/aws/configure/settings.mdx index 22895949f..0ebb1eeb7 100644 --- a/production/aws/configure/settings.mdx +++ b/production/aws/configure/settings.mdx @@ -108,6 +108,18 @@ python -c "from infra.settings import infra_settings; print(infra_settings)" ## Next Steps -- [Secrets & API Keys](/production/aws/configure/secrets) - API keys and credentials -- [Database Setup](/production/aws/configure/database) - RDS configuration -- [Production Deployment](/production/aws/operate/updates) - Deploy to AWS + + + API keys and credentials + + + RDS configuration + + + Deploy to AWS + + + + +See [Environment Variables Reference](/production/aws/more/env-vars) for a complete list of app configuration options. + diff --git a/production/aws/operate/updates.mdx b/production/aws/deploy/updates.mdx similarity index 69% rename from production/aws/operate/updates.mdx rename to production/aws/deploy/updates.mdx index 89acc97c1..09a69f23e 100644 --- a/production/aws/operate/updates.mdx +++ b/production/aws/deploy/updates.mdx @@ -70,37 +70,13 @@ aws ecs describe-services \ --query 'services[0].{status:status,running:runningCount,desired:desiredCount}' ``` -## Create an ECR Repository +## ECR Authentication -ECR (Elastic Container Registry) stores your Docker images in AWS. - -### Step 1: Create the repository - -Create a repository with the same name as your `image_name` setting (default: `agentos-aws-template`): - -```bash -aws ecr create-repository \ - --repository-name agentos-aws-template \ - --region us-east-1 -``` - -create-ecr-image - -### Step 2: Get your ECR URL - -Your ECR URL follows this format: -``` -[ACCOUNT_ID].dkr.ecr.[REGION].amazonaws.com -``` - -Get your account ID: -```bash -aws sts get-caller-identity --query Account --output text -``` - -Example URL: `123456789012.dkr.ecr.us-east-1.amazonaws.com` + +If you haven't set up ECR yet, see [Getting Started - AWS Setup](/production/aws/getting-started#step-1-aws-setup). + -### Step 3: Authenticate Docker with ECR +ECR tokens expire after 12 hours. Re-authenticate before pushing: ```bash aws ecr get-login-password --region us-east-1 | \ @@ -108,32 +84,12 @@ aws ecr get-login-password --region us-east-1 | \ [ACCOUNT_ID].dkr.ecr.us-east-1.amazonaws.com ``` -Or use the helper script (update with your ECR URL first): +Or use the helper script: ```bash ./scripts/auth_ecr.sh ``` - -ECR tokens expire after 12 hours. If you get "no basic auth credentials" errors, re-run the authentication command. - - -### Step 4: Update settings - -Update `infra/settings.py` with your ECR URL: - -```python infra/settings.py -infra_settings = InfraSettings( - ... - # Your ECR repository URL - image_repo="123456789012.dkr.ecr.us-east-1.amazonaws.com", - # Build images locally - build_images=True, - # Push images to ECR after building - push_images=True, -) -``` - ## Update Deployments After making changes to your code or configuration: @@ -206,6 +162,14 @@ This deletes everything including the database. Back up your data first. ## Next Steps -- [CI/CD](/production/aws/operate/ci-cd) - Automate builds with GitHub Actions -- [Domain & HTTPS](/production/aws/after-deploy/https) - Custom domain and SSL -- [Monitoring](/production/aws/operate/monitoring) - CloudWatch logs and alerts + + + Automate with GitHub Actions + + + CloudWatch logs and alerts + + + Common deployment issues + + diff --git a/production/aws/getting-started.mdx b/production/aws/getting-started.mdx index c3b78911e..f62e7d676 100644 --- a/production/aws/getting-started.mdx +++ b/production/aws/getting-started.mdx @@ -83,7 +83,7 @@ export OPENAI_API_KEY=sk-*** -HTTPS is required to connect your AgentOS to os.agno.com. You'll configure this after deployment. +[HTTPS](/production/aws/after-deploy/https) is required to connect to os.agno.com. You'll set this up after deployment. --- @@ -278,14 +278,14 @@ Should return: `{"status": "ok", "instantiated_at": "..."}` ## Next Steps - - Confirm all services are healthy + + Region, subnets, and ECR - - Required for os.agno.com connection + + API keys and credentials - - Link to the control plane + + Confirm everything is working diff --git a/production/aws/operate/ci-cd.mdx b/production/aws/manage/ci-cd.mdx similarity index 93% rename from production/aws/operate/ci-cd.mdx rename to production/aws/manage/ci-cd.mdx index 8c2e85acb..9c65d5d84 100644 --- a/production/aws/operate/ci-cd.mdx +++ b/production/aws/manage/ci-cd.mdx @@ -14,7 +14,7 @@ keywords: ["CI/CD", "GitHub Actions", "automation", "continuous integration", "c | ECR + GitHub OIDC | Using ECR, no stored credentials | Higher | -For manual builds, see [Production Deployment](/production/aws/operate/updates#create-an-ecr-repository). ECR tokens expire after 12 hours. +For manual builds, see [Production Deployment](/production/aws/deploy/updates#create-an-ecr-repository). ECR tokens expire after 12 hours. ## PR Validation @@ -169,5 +169,5 @@ This triggers a new deployment with the latest image. ## Next Steps -- [Production Deployment](/production/aws/operate/updates) - Manual deployment steps -- [Monitoring](/production/aws/operate/monitoring) - Watch your deployments +- [Production Deployment](/production/aws/deploy/updates) - Manual deployment steps +- [Monitoring](/production/aws/manage/monitoring) - Watch your deployments diff --git a/production/aws/operate/monitoring.mdx b/production/aws/manage/monitoring.mdx similarity index 94% rename from production/aws/operate/monitoring.mdx rename to production/aws/manage/monitoring.mdx index d90ace18a..b85f829d0 100644 --- a/production/aws/operate/monitoring.mdx +++ b/production/aws/manage/monitoring.mdx @@ -120,5 +120,8 @@ See [AWS SNS documentation](https://docs.aws.amazon.com/sns/latest/dg/sns-create ## Next Steps -- [Troubleshooting](/production/aws/operate/troubleshooting) - Common errors -- [EFS Setup](/production/aws/configure/efs) - Persistent storage + + + Solutions for common errors + + diff --git a/production/aws/operate/troubleshooting.mdx b/production/aws/manage/troubleshooting.mdx similarity index 96% rename from production/aws/operate/troubleshooting.mdx rename to production/aws/manage/troubleshooting.mdx index 5d741b2f9..57a0cbc7b 100644 --- a/production/aws/operate/troubleshooting.mdx +++ b/production/aws/manage/troubleshooting.mdx @@ -195,8 +195,3 @@ aws ecs execute-command \ --command "zsh" ``` -## Next Steps - -- [Monitoring](/production/aws/operate/monitoring) - Logs and alerts -- [EFS Setup](/production/aws/configure/efs) - Persistent storage -- [Secrets](/production/aws/configure/secrets) - API keys and credentials diff --git a/production/aws/reference/code-quality.mdx b/production/aws/more/code-quality.mdx similarity index 88% rename from production/aws/reference/code-quality.mdx rename to production/aws/more/code-quality.mdx index de320b676..0aad5baa2 100644 --- a/production/aws/reference/code-quality.mdx +++ b/production/aws/more/code-quality.mdx @@ -70,7 +70,3 @@ git commit -m "your message" | Type errors | Fix the types or add `# type: ignore` comment | | Import sorting | Run `ruff check --fix .` to auto-fix | -## Next Steps - -- [CI/CD](/production/aws/operate/ci-cd) - Automated validation on every PR -- [Local Development](/production/aws/configure/local) - Development workflow diff --git a/production/aws/reference/env-vars.mdx b/production/aws/more/env-vars.mdx similarity index 89% rename from production/aws/reference/env-vars.mdx rename to production/aws/more/env-vars.mdx index e662822fb..b3698930a 100644 --- a/production/aws/reference/env-vars.mdx +++ b/production/aws/more/env-vars.mdx @@ -72,8 +72,3 @@ my_var = os.getenv("MY_CUSTOM_VAR", "default_value") api_key = os.environ["OPENAI_API_KEY"] ``` -## Next Steps - -- [Secrets](/production/aws/configure/secrets) - API keys and database credentials -- [Database Setup](/production/aws/configure/database) - Connection configuration -- [Settings](/production/aws/configure/settings) - Infrastructure configuration diff --git a/production/aws/reference/database-tables.mdx b/production/aws/reference/database-tables.mdx deleted file mode 100644 index 121c392d6..000000000 --- a/production/aws/reference/database-tables.mdx +++ /dev/null @@ -1,157 +0,0 @@ ---- -title: "Database Tables" -sidebarTitle: "Database Tables" -description: "SQLAlchemy models and Alembic migrations" -keywords: ["tables", "models", "SQLAlchemy", "Alembic", "migrations", "schema", "ORM"] ---- - -AgentOS uses [SQLAlchemy](https://www.sqlalchemy.org/) for models and [Alembic](https://alembic.sqlalchemy.org/) for migrations. - -## Adding a Table - -1. Create table definition in `db/tables/` -2. Import in `db/tables/__init__.py` -3. Generate migration -4. Run migration - -## Example: Users Table - -Create `db/tables/user.py`: - -```python db/tables/user.py -from datetime import datetime -from typing import Optional - -from sqlalchemy.orm import Mapped, mapped_column -from sqlalchemy.sql.expression import text -from sqlalchemy.types import BigInteger, DateTime, String - -from db.tables.base import Base - - -class UsersTable(Base): - __tablename__ = "dim_users" - - id_user: Mapped[int] = mapped_column( - BigInteger, primary_key=True, autoincrement=True, index=True - ) - email: Mapped[str] = mapped_column(String, unique=True) - is_active: Mapped[bool] = mapped_column(default=True) - created_at: Mapped[datetime] = mapped_column( - DateTime(timezone=True), server_default=text("now()") - ) - updated_at: Mapped[Optional[datetime]] = mapped_column( - DateTime(timezone=True), onupdate=text("now()") - ) -``` - -Register in `db/tables/__init__.py`: - -```python db/tables/__init__.py -from db.tables.base import Base -from db.tables.user import UsersTable -``` - -## Generate Migration - -```bash -docker exec -it ai-api alembic -c db/alembic.ini revision --autogenerate -m "Add users table" -``` - -This creates a migration file in `db/migrations/versions/`. - -## Run Migration - -### Local (dev) - -```bash -docker exec -it ai-api alembic -c db/alembic.ini upgrade head -``` - -### Production - -Option 1: Auto-migrate on startup (add to `prd_resources.py`): - -```python -container_env = { - ... - "MIGRATE_DB": True, -} -``` - -Then update: -```bash -ag infra patch prd:aws:::td && ag infra patch prd:aws:::service -``` - -Option 2: Run manually via ECS Exec: - -```bash -ECS_CLUSTER={infra_name}-prd -TASK_ARN=$(aws ecs list-tasks --cluster $ECS_CLUSTER --query "taskArns[0]" --output text) - -aws ecs execute-command \ - --cluster $ECS_CLUSTER \ - --task $TASK_ARN \ - --container {infra_name}-prd \ - --interactive \ - --command "alembic -c db/alembic.ini upgrade head" -``` - -## Common Patterns - -### Foreign Key Relationship - -```python -from sqlalchemy import ForeignKey -from sqlalchemy.orm import relationship - -class OrdersTable(Base): - __tablename__ = "dim_orders" - - id_order: Mapped[int] = mapped_column(BigInteger, primary_key=True) - id_user: Mapped[int] = mapped_column(ForeignKey("dim_users.id_user")) - - user: Mapped["UsersTable"] = relationship(back_populates="orders") -``` - -### Index for Queries - -```python -from sqlalchemy import Index - -class EventsTable(Base): - __tablename__ = "fact_events" - - # Composite index for common queries - __table_args__ = ( - Index("idx_events_user_created", "id_user", "created_at"), - ) -``` - -### Enum Column - -```python -from enum import Enum -from sqlalchemy import Enum as SQLEnum - -class Status(str, Enum): - pending = "pending" - complete = "complete" - -class TasksTable(Base): - status: Mapped[Status] = mapped_column(SQLEnum(Status), default=Status.pending) -``` - -## Naming Conventions - -| Prefix | Use For | Example | -|--------|---------|---------| -| `dim_` | Dimension tables (entities) | `dim_users`, `dim_products` | -| `fact_` | Fact tables (events) | `fact_orders`, `fact_sessions` | -| `bridge_` | Many-to-many relationships | `bridge_user_roles` | - -## Next Steps - -- [Database Setup](/production/aws/configure/database) - Credentials and connections -- [Troubleshooting](/production/aws/operate/troubleshooting) - Common issues From be1fb2b4fb65e619a2d91ba0a2b77647286d112e Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:07:59 -0500 Subject: [PATCH 07/14] fix: revert tab name from Deploy to Production --- docs.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs.json b/docs.json index a73eee2af..cfc720434 100644 --- a/docs.json +++ b/docs.json @@ -2943,10 +2943,10 @@ ] }, { - "tab": "Deploy", + "tab": "Production", "groups": [ { - "group": "Deploy", + "group": "Production", "pages": [ "production/overview" ] From 74fde96003727faeb8679803d501e4bbcb10485d Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:14:05 -0500 Subject: [PATCH 08/14] fix: nest AWS inside Templates group, remove style violation --- docs.json | 76 ++++++++++++++++---------------- production/aws/configure/efs.mdx | 2 +- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/docs.json b/docs.json index cfc720434..71515f2d3 100644 --- a/docs.json +++ b/docs.json @@ -2956,46 +2956,46 @@ "pages": [ "production/templates/overview", "production/templates/docker", - "production/templates/railway" - ] - }, - { - "group": "AWS", - "pages": [ - "production/aws/getting-started", - { - "group": "Configure", - "pages": [ - "production/aws/configure/secrets", - "production/aws/configure/settings", - "production/aws/configure/database", - "production/aws/configure/efs", - "production/aws/configure/local", - "production/aws/configure/packages" - ] - }, - { - "group": "Go Live", - "pages": [ - "production/aws/deploy/updates", - "production/aws/after-deploy/verify", - "production/aws/after-deploy/https", - "production/aws/after-deploy/connect" - ] - }, - { - "group": "Manage", - "pages": [ - "production/aws/manage/ci-cd", - "production/aws/manage/monitoring", - "production/aws/manage/troubleshooting" - ] - }, + "production/templates/railway", { - "group": "More", + "group": "AWS", "pages": [ - "production/aws/more/code-quality", - "production/aws/more/env-vars" + "production/aws/getting-started", + { + "group": "Configure", + "pages": [ + "production/aws/configure/secrets", + "production/aws/configure/settings", + "production/aws/configure/database", + "production/aws/configure/efs", + "production/aws/configure/local", + "production/aws/configure/packages" + ] + }, + { + "group": "Go Live", + "pages": [ + "production/aws/deploy/updates", + "production/aws/after-deploy/verify", + "production/aws/after-deploy/https", + "production/aws/after-deploy/connect" + ] + }, + { + "group": "Manage", + "pages": [ + "production/aws/manage/ci-cd", + "production/aws/manage/monitoring", + "production/aws/manage/troubleshooting" + ] + }, + { + "group": "More", + "pages": [ + "production/aws/more/code-quality", + "production/aws/more/env-vars" + ] + } ] } ] diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx index 239c18dd2..9fe5f6634 100644 --- a/production/aws/configure/efs.mdx +++ b/production/aws/configure/efs.mdx @@ -263,7 +263,7 @@ Enable lifecycle policies to automatically move infrequently accessed files to c - Check that the EFS security group allows inbound NFS (port 2049) from your app security group. View the security group rules: + Check that the EFS security group allows inbound NFS (port 2049) from your app security group: ```bash aws ec2 describe-security-groups --group-names "*-efs-sg" From fd26536ee6478b4fede8e0abca50723614f5066c Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:19:33 -0500 Subject: [PATCH 09/14] fix(aws): use placeholder for log paths and add missing Next Steps - Replace hardcoded agentos-aws-template-prd with {infra_name} in efs.mdx - Add Next Steps sections to troubleshooting.mdx, code-quality.mdx, env-vars.mdx --- production/aws/configure/efs.mdx | 2 +- production/aws/manage/troubleshooting.mdx | 11 +++++++++++ production/aws/more/code-quality.mdx | 11 +++++++++++ production/aws/more/env-vars.mdx | 11 +++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx index 9fe5f6634..1dce902ca 100644 --- a/production/aws/configure/efs.mdx +++ b/production/aws/configure/efs.mdx @@ -173,7 +173,7 @@ ag infra up prd:aws -y Verify the mount by checking your container logs: ```bash -aws logs tail /ecs/agentos-aws-template-prd --follow +aws logs tail /ecs/{infra_name}-prd --follow ``` You should see your application start without errors. Data written to `/data` now persists across restarts. diff --git a/production/aws/manage/troubleshooting.mdx b/production/aws/manage/troubleshooting.mdx index 57a0cbc7b..9ac1707ae 100644 --- a/production/aws/manage/troubleshooting.mdx +++ b/production/aws/manage/troubleshooting.mdx @@ -195,3 +195,14 @@ aws ecs execute-command \ --command "zsh" ``` +## Next Steps + + + + View logs and metrics + + + Automate deployments + + + diff --git a/production/aws/more/code-quality.mdx b/production/aws/more/code-quality.mdx index 0aad5baa2..a71af76bf 100644 --- a/production/aws/more/code-quality.mdx +++ b/production/aws/more/code-quality.mdx @@ -70,3 +70,14 @@ git commit -m "your message" | Type errors | Fix the types or add `# type: ignore` comment | | Import sorting | Run `ruff check --fix .` to auto-fix | +## Next Steps + + + + Configure app settings + + + Automate quality checks + + + diff --git a/production/aws/more/env-vars.mdx b/production/aws/more/env-vars.mdx index b3698930a..d61dce376 100644 --- a/production/aws/more/env-vars.mdx +++ b/production/aws/more/env-vars.mdx @@ -72,3 +72,14 @@ my_var = os.getenv("MY_CUSTOM_VAR", "default_value") api_key = os.environ["OPENAI_API_KEY"] ``` +## Next Steps + + + + Manage sensitive values + + + Apply your changes + + + From 38d31b6294496c22dc3a9d9bd3ed7340ec64317a Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:23:11 -0500 Subject: [PATCH 10/14] fix(aws): correct Next Steps to point forward in navigation flow - troubleshooting: link to Code Quality and Env Vars (next in flow) - code-quality: link to Env Vars and Getting Started - env-vars: link to Getting Started and Deploy Updates --- production/aws/manage/troubleshooting.mdx | 8 ++++---- production/aws/more/code-quality.mdx | 4 ++-- production/aws/more/env-vars.mdx | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/production/aws/manage/troubleshooting.mdx b/production/aws/manage/troubleshooting.mdx index 9ac1707ae..bcce8bcc7 100644 --- a/production/aws/manage/troubleshooting.mdx +++ b/production/aws/manage/troubleshooting.mdx @@ -198,11 +198,11 @@ aws ecs execute-command \ ## Next Steps - - View logs and metrics + + Format and validate code - - Automate deployments + + Configure app settings diff --git a/production/aws/more/code-quality.mdx b/production/aws/more/code-quality.mdx index a71af76bf..dae07ea0f 100644 --- a/production/aws/more/code-quality.mdx +++ b/production/aws/more/code-quality.mdx @@ -76,8 +76,8 @@ git commit -m "your message" Configure app settings - - Automate quality checks + + Back to AWS overview diff --git a/production/aws/more/env-vars.mdx b/production/aws/more/env-vars.mdx index d61dce376..e1d0f0d0c 100644 --- a/production/aws/more/env-vars.mdx +++ b/production/aws/more/env-vars.mdx @@ -75,11 +75,11 @@ api_key = os.environ["OPENAI_API_KEY"] ## Next Steps - - Manage sensitive values + + Back to AWS overview - - Apply your changes + + Deploy your changes From 7af59f269f6890fd503e864f3d8319d1ff4f3c6f Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:34:49 -0500 Subject: [PATCH 11/14] fix(aws): correct Next Steps navigation to point forward - deploy/updates: Replace CI/CD, Monitoring, Troubleshooting with Verify, HTTPS, Connect, CI/CD (matches Go Live flow) - settings: Replace Deploy with EFS (stays in Configure section) - local: Replace CI/CD with Packages (next in Configure) - packages: Remove backwards Local link, keep only Deploy --- production/aws/configure/local.mdx | 4 ++-- production/aws/configure/packages.mdx | 9 +++------ production/aws/configure/settings.mdx | 4 ++-- production/aws/deploy/updates.mdx | 17 ++++++++++------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/production/aws/configure/local.mdx b/production/aws/configure/local.mdx index 69833601c..7d1eb460b 100644 --- a/production/aws/configure/local.mdx +++ b/production/aws/configure/local.mdx @@ -95,8 +95,8 @@ The `-t` flag filters what to create: Deploy to AWS - - Automate builds + + Add custom dependencies diff --git a/production/aws/configure/packages.mdx b/production/aws/configure/packages.mdx index a9c2d3df6..8aa5653db 100644 --- a/production/aws/configure/packages.mdx +++ b/production/aws/configure/packages.mdx @@ -100,11 +100,8 @@ ag infra restart dev:docker -t container ## Next Steps - - - Test with Docker - - - Deploy to AWS + + + Deploy your configured AgentOS diff --git a/production/aws/configure/settings.mdx b/production/aws/configure/settings.mdx index 0ebb1eeb7..31e5d7083 100644 --- a/production/aws/configure/settings.mdx +++ b/production/aws/configure/settings.mdx @@ -115,8 +115,8 @@ python -c "from infra.settings import infra_settings; print(infra_settings)" RDS configuration - - Deploy to AWS + + Persistent storage for Pal diff --git a/production/aws/deploy/updates.mdx b/production/aws/deploy/updates.mdx index 09a69f23e..51c5f8e3e 100644 --- a/production/aws/deploy/updates.mdx +++ b/production/aws/deploy/updates.mdx @@ -162,14 +162,17 @@ This deletes everything including the database. Back up your data first. ## Next Steps - - - Automate with GitHub Actions + + + Confirm everything is working - - CloudWatch logs and alerts + + Set up SSL certificate - - Common deployment issues + + Link to os.agno.com + + + Automate deployments From be79468ba0db4fd7e6a34f8fe24fa8c89ecc46d6 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:48:34 -0500 Subject: [PATCH 12/14] refactor(aws): remove redundant Next Steps, rely on built-in nav Remove internal-linking Next Steps from AWS docs pages. These were redundant with Mintlify's built-in < prev | next > navigation and causing confusion. Keep Next Steps only on: - getting-started.mdx (hub page with section entry points) - connect.mdx (end of flow, now points outside AWS to Agents/Tools/Knowledge) This follows the Railway template pattern where Next Steps only appear at the end of a flow to guide users to their next task. --- production/aws/after-deploy/connect.mdx | 18 ++++++++---------- production/aws/after-deploy/https.mdx | 10 ---------- production/aws/after-deploy/verify.mdx | 10 ---------- production/aws/configure/database.mdx | 10 ---------- production/aws/configure/efs.mdx | 13 ------------- production/aws/configure/local.mdx | 14 -------------- production/aws/configure/packages.mdx | 7 ------- production/aws/configure/secrets.mdx | 10 ---------- production/aws/configure/settings.mdx | 17 ----------------- production/aws/deploy/updates.mdx | 16 ---------------- production/aws/manage/ci-cd.mdx | 4 ---- production/aws/manage/monitoring.mdx | 7 ------- production/aws/manage/troubleshooting.mdx | 11 ----------- production/aws/more/code-quality.mdx | 11 ----------- production/aws/more/env-vars.mdx | 10 ---------- 15 files changed, 8 insertions(+), 160 deletions(-) diff --git a/production/aws/after-deploy/connect.mdx b/production/aws/after-deploy/connect.mdx index 275a9a31a..523ed3bd3 100644 --- a/production/aws/after-deploy/connect.mdx +++ b/production/aws/after-deploy/connect.mdx @@ -75,19 +75,17 @@ Should return `HTTP/2 200`. ## Next Steps -Your AgentOS is now deployed and connected. Here's what to do next: - - - Automate deployments + + Create agents with your own tools and prompts. - - CloudWatch logs and alerts + + Slack, GitHub, databases, and 100+ integrations. - - Push code changes + + Load documents, websites, and databases for RAG. - - Common issues + + Deploy to Slack, Discord, WhatsApp, or expose via MCP. diff --git a/production/aws/after-deploy/https.mdx b/production/aws/after-deploy/https.mdx index c2477a6a9..613225c1d 100644 --- a/production/aws/after-deploy/https.mdx +++ b/production/aws/after-deploy/https.mdx @@ -103,13 +103,3 @@ Should return: | Certificate not showing in dropdown | Must be in same region as load balancer (us-east-1) | | HTTPS not working after setup | Run `ag infra patch prd:aws:::listener` again | -## Next Steps - - - - Link to os.agno.com - - - Set up CloudWatch logs - - diff --git a/production/aws/after-deploy/verify.mdx b/production/aws/after-deploy/verify.mdx index a4bc7c5d0..588d2c9e5 100644 --- a/production/aws/after-deploy/verify.mdx +++ b/production/aws/after-deploy/verify.mdx @@ -74,13 +74,3 @@ Expected output: | No logs appearing | Check ECS task started in AWS Console | | Task keeps restarting | See [Troubleshooting](/production/aws/manage/troubleshooting) | -## Next Steps - - - - Required for os.agno.com connection - - - Link to the control plane - - diff --git a/production/aws/configure/database.mdx b/production/aws/configure/database.mdx index 14a495c8a..32eb2bc54 100644 --- a/production/aws/configure/database.mdx +++ b/production/aws/configure/database.mdx @@ -144,13 +144,3 @@ psql -h [RDS_ENDPOINT] -U ai -d ai | RDS not ready | Wait ~5 minutes, check AWS Console | | ECS can't connect | Verify security group allows ECS security group | -## Next Steps - - - - Confirm everything is working - - - Common database issues - - diff --git a/production/aws/configure/efs.mdx b/production/aws/configure/efs.mdx index 1dce902ca..ebd95cf03 100644 --- a/production/aws/configure/efs.mdx +++ b/production/aws/configure/efs.mdx @@ -275,16 +275,3 @@ Enable lifecycle policies to automatically move infrequently accessed files to c -## Next Steps - - - - Confirm deployment works - - - Add SSL certificate - - - CloudWatch logs - - diff --git a/production/aws/configure/local.mdx b/production/aws/configure/local.mdx index 7d1eb460b..96307f270 100644 --- a/production/aws/configure/local.mdx +++ b/production/aws/configure/local.mdx @@ -89,17 +89,3 @@ The `-t` flag filters what to create: | Database errors | Restart: `ag infra down && ag infra up` | | Old image cached | Force rebuild: `ag infra up dev:docker -t image -f` | -## Next Steps - - - - Deploy to AWS - - - Add custom dependencies - - - - -See [Code Quality](/production/aws/more/code-quality) for formatting and validation scripts. - diff --git a/production/aws/configure/packages.mdx b/production/aws/configure/packages.mdx index 8aa5653db..a1c93b653 100644 --- a/production/aws/configure/packages.mdx +++ b/production/aws/configure/packages.mdx @@ -98,10 +98,3 @@ ag infra up dev:docker -t image -f ag infra restart dev:docker -t container ``` -## Next Steps - - - - Deploy your configured AgentOS - - diff --git a/production/aws/configure/secrets.mdx b/production/aws/configure/secrets.mdx index 7b7baaff4..0b980df55 100644 --- a/production/aws/configure/secrets.mdx +++ b/production/aws/configure/secrets.mdx @@ -174,13 +174,3 @@ aws secretsmanager get-secret-value \ -## Next Steps - - - - RDS configuration - - - Persistent storage (optional) - - diff --git a/production/aws/configure/settings.mdx b/production/aws/configure/settings.mdx index 31e5d7083..4c82ea0d4 100644 --- a/production/aws/configure/settings.mdx +++ b/production/aws/configure/settings.mdx @@ -106,20 +106,3 @@ After updating settings, verify they're correct: python -c "from infra.settings import infra_settings; print(infra_settings)" ``` -## Next Steps - - - - API keys and credentials - - - RDS configuration - - - Persistent storage for Pal - - - - -See [Environment Variables Reference](/production/aws/more/env-vars) for a complete list of app configuration options. - diff --git a/production/aws/deploy/updates.mdx b/production/aws/deploy/updates.mdx index 51c5f8e3e..3da321ae1 100644 --- a/production/aws/deploy/updates.mdx +++ b/production/aws/deploy/updates.mdx @@ -160,19 +160,3 @@ ag infra down prd:aws This deletes everything including the database. Back up your data first. -## Next Steps - - - - Confirm everything is working - - - Set up SSL certificate - - - Link to os.agno.com - - - Automate deployments - - diff --git a/production/aws/manage/ci-cd.mdx b/production/aws/manage/ci-cd.mdx index 9c65d5d84..79052774f 100644 --- a/production/aws/manage/ci-cd.mdx +++ b/production/aws/manage/ci-cd.mdx @@ -167,7 +167,3 @@ ag infra patch prd:aws:::service This triggers a new deployment with the latest image. -## Next Steps - -- [Production Deployment](/production/aws/deploy/updates) - Manual deployment steps -- [Monitoring](/production/aws/manage/monitoring) - Watch your deployments diff --git a/production/aws/manage/monitoring.mdx b/production/aws/manage/monitoring.mdx index b85f829d0..97ea05abb 100644 --- a/production/aws/manage/monitoring.mdx +++ b/production/aws/manage/monitoring.mdx @@ -118,10 +118,3 @@ aws cloudwatch put-metric-alarm \ See [AWS SNS documentation](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html) to create a notification topic. -## Next Steps - - - - Solutions for common errors - - diff --git a/production/aws/manage/troubleshooting.mdx b/production/aws/manage/troubleshooting.mdx index bcce8bcc7..57a0cbc7b 100644 --- a/production/aws/manage/troubleshooting.mdx +++ b/production/aws/manage/troubleshooting.mdx @@ -195,14 +195,3 @@ aws ecs execute-command \ --command "zsh" ``` -## Next Steps - - - - Format and validate code - - - Configure app settings - - - diff --git a/production/aws/more/code-quality.mdx b/production/aws/more/code-quality.mdx index dae07ea0f..0aad5baa2 100644 --- a/production/aws/more/code-quality.mdx +++ b/production/aws/more/code-quality.mdx @@ -70,14 +70,3 @@ git commit -m "your message" | Type errors | Fix the types or add `# type: ignore` comment | | Import sorting | Run `ruff check --fix .` to auto-fix | -## Next Steps - - - - Configure app settings - - - Back to AWS overview - - - diff --git a/production/aws/more/env-vars.mdx b/production/aws/more/env-vars.mdx index e1d0f0d0c..6094706ee 100644 --- a/production/aws/more/env-vars.mdx +++ b/production/aws/more/env-vars.mdx @@ -72,14 +72,4 @@ my_var = os.getenv("MY_CUSTOM_VAR", "default_value") api_key = os.environ["OPENAI_API_KEY"] ``` -## Next Steps - - - - Back to AWS overview - - - Deploy your changes - - From 7f11476cb6bf9764ac87a7109fab9bfd52506575 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 16:56:05 -0500 Subject: [PATCH 13/14] fix(aws): use template defaults with custom infra_name note - secrets.mdx: Show default agentos-aws-template-prd values that work out-of-the-box, with note for users who changed infra_name - ci-cd.mdx: Fix broken anchor link to point to getting-started#step-1-aws-setup --- production/aws/configure/secrets.mdx | 5 ++++- production/aws/manage/ci-cd.mdx | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/production/aws/configure/secrets.mdx b/production/aws/configure/secrets.mdx index 0b980df55..734117be9 100644 --- a/production/aws/configure/secrets.mdx +++ b/production/aws/configure/secrets.mdx @@ -132,12 +132,15 @@ prd_db_secret = SecretsManager( After deploying (`ag infra up prd:aws`), verify secrets were created: ```bash -# List your secrets (replace with your infra_name) aws secretsmanager list-secrets \ --query "SecretList[?contains(Name, 'agentos-aws-template-prd')].[Name]" \ --output table ``` + +If you changed `infra_name` in `settings.py`, replace `agentos-aws-template` with your value. + + Expected output: ``` ------------------------------------------- diff --git a/production/aws/manage/ci-cd.mdx b/production/aws/manage/ci-cd.mdx index 79052774f..85262f5af 100644 --- a/production/aws/manage/ci-cd.mdx +++ b/production/aws/manage/ci-cd.mdx @@ -14,7 +14,7 @@ keywords: ["CI/CD", "GitHub Actions", "automation", "continuous integration", "c | ECR + GitHub OIDC | Using ECR, no stored credentials | Higher | -For manual builds, see [Production Deployment](/production/aws/deploy/updates#create-an-ecr-repository). ECR tokens expire after 12 hours. +For manual builds, see [Getting Started - AWS Setup](/production/aws/getting-started#step-1-aws-setup). ECR tokens expire after 12 hours. ## PR Validation From 0b9fae45dea19a8061d178702e500bb9fc313917 Mon Sep 17 00:00:00 2001 From: Mustafa Esoofally Date: Wed, 4 Feb 2026 17:28:36 -0500 Subject: [PATCH 14/14] refactor(aws): consolidate deploy + after-deploy into go-live folder MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rename folders to match sidebar group names: - deploy/ + after-deploy/ → go-live/ This improves codebase navigation by aligning file paths with user-facing sidebar labels. Updated all internal links to use new paths. --- docs.json | 8 ++++---- production/aws/getting-started.mdx | 4 ++-- production/aws/{after-deploy => go-live}/connect.mdx | 2 +- production/aws/{after-deploy => go-live}/https.mdx | 0 production/aws/{deploy => go-live}/updates.mdx | 0 production/aws/{after-deploy => go-live}/verify.mdx | 0 6 files changed, 7 insertions(+), 7 deletions(-) rename production/aws/{after-deploy => go-live}/connect.mdx (98%) rename production/aws/{after-deploy => go-live}/https.mdx (100%) rename production/aws/{deploy => go-live}/updates.mdx (100%) rename production/aws/{after-deploy => go-live}/verify.mdx (100%) diff --git a/docs.json b/docs.json index 419ca5e0b..521035024 100644 --- a/docs.json +++ b/docs.json @@ -2994,10 +2994,10 @@ { "group": "Go Live", "pages": [ - "production/aws/deploy/updates", - "production/aws/after-deploy/verify", - "production/aws/after-deploy/https", - "production/aws/after-deploy/connect" + "production/aws/go-live/updates", + "production/aws/go-live/verify", + "production/aws/go-live/https", + "production/aws/go-live/connect" ] }, { diff --git a/production/aws/getting-started.mdx b/production/aws/getting-started.mdx index f62e7d676..4f094f27a 100644 --- a/production/aws/getting-started.mdx +++ b/production/aws/getting-started.mdx @@ -83,7 +83,7 @@ export OPENAI_API_KEY=sk-*** -[HTTPS](/production/aws/after-deploy/https) is required to connect to os.agno.com. You'll set this up after deployment. +[HTTPS](/production/aws/go-live/https) is required to connect to os.agno.com. You'll set this up after deployment. --- @@ -284,7 +284,7 @@ Should return: `{"status": "ok", "instantiated_at": "..."}` API keys and credentials - + Confirm everything is working diff --git a/production/aws/after-deploy/connect.mdx b/production/aws/go-live/connect.mdx similarity index 98% rename from production/aws/after-deploy/connect.mdx rename to production/aws/go-live/connect.mdx index 523ed3bd3..3b3645c73 100644 --- a/production/aws/after-deploy/connect.mdx +++ b/production/aws/go-live/connect.mdx @@ -18,7 +18,7 @@ Before connecting, ensure: | Certificate is valid | No browser warnings when visiting your domain | -HTTPS is required. If you haven't set it up yet, see [Add HTTPS](/production/aws/after-deploy/https). +HTTPS is required. If you haven't set it up yet, see [Add HTTPS](/production/aws/go-live/https). ## Connect Your AgentOS diff --git a/production/aws/after-deploy/https.mdx b/production/aws/go-live/https.mdx similarity index 100% rename from production/aws/after-deploy/https.mdx rename to production/aws/go-live/https.mdx diff --git a/production/aws/deploy/updates.mdx b/production/aws/go-live/updates.mdx similarity index 100% rename from production/aws/deploy/updates.mdx rename to production/aws/go-live/updates.mdx diff --git a/production/aws/after-deploy/verify.mdx b/production/aws/go-live/verify.mdx similarity index 100% rename from production/aws/after-deploy/verify.mdx rename to production/aws/go-live/verify.mdx