# APEX OS Engineering Standards > **The definitive engineering standards governing all infrastructure, code, databases, APIs, testing, monitoring, and operations within APEX OS.** > All employees producing technical deliverables must adhere to these standards. **Version:** 2.0 **Last Updated:** Phase 7 — CEO Command Center **Classification:** CORE — All technical work must comply **Maintainer:** Engineer (#1) **Cross-references:** [APEX_CONSTITUTION.md](APEX_CONSTITUTION.md) · [TOOL_REGISTRY.md](TOOL_REGISTRY.md) · [EMPLOYEE_HANDBOOK.md](EMPLOYEE_HANDBOOK.md) --- ## Table of Contents - [1. Architecture Principles](#1-architecture-principles) - [2. Docker Standards](#2-docker-standards) - [3. Repository Standards](#3-repository-standards) - [4. Git Workflow](#4-git-workflow) - [5. Database Standards](#5-database-standards) - [6. API Standards](#6-api-standards) - [7. Testing Requirements](#7-testing-requirements) - [8. Logging Standards](#8-logging-standards) - [9. Monitoring Standards](#9-monitoring-standards) - [10. Error Handling](#10-error-handling) - [11. Versioning](#11-versioning) - [12. Documentation Standards](#12-documentation-standards) - [13. Rollback Procedures](#13-rollback-procedures) - [14. Infrastructure Change Process](#14-infrastructure-change-process) - [15. Network Architecture](#15-network-architecture) - [16. Performance Standards](#16-performance-standards) - [17. Security Engineering](#17-security-engineering) - [18. Change History](#18-change-history) --- ## 1. Architecture Principles ### 1.1 Microservices via Docker Every service in APEX OS runs as an isolated Docker container. This provides: - **Reproducibility** — Identical environments from dev to production - **Isolation** — A failing service doesn't take down others - **Scalability** — Services can be independently scaled - **Clean rollback** — Previous image tags can be restored instantly ### 1.2 Single Responsibility Each container serves **one purpose**. A database is a database. A proxy is a proxy. An API is an API. No monolithic containers combining multiple services. ### 1.3 Internal Communication Services communicate via the **Docker network** (`apex_apex-net`). Internal service discovery uses Docker DNS (container names resolve to IPs within the network). ``` Service A ──(apex_apex-net)──► Service B │ └── DNS: apex-postgres:5432 └── DNS: apex-redis:6379 └── DNS: apex-litellm:4000 ``` ### 1.4 External Access All external traffic is routed through **Traefik** reverse proxy: - HTTP (80) → Redirected to HTTPS (443) - HTTPS (443) → Routed to containers via Docker labels - Let's Encrypt certificates auto-renewed - No service directly exposes ports to the internet (except Traefik) ### 1.5 State Management - **Persistent state** stored in PostgreSQL (relational data, vectors, agent state) - **Cache/ephemeral state** stored in Redis (LLM response cache, sessions) - **File state** stored in Docker volumes (Gitea repos, Vaultwarden data, n8n workflows) - **No state in containers** — containers are ephemeral and replaceable ### 1.6 Cost-Driven Design Architecture decisions optimize for cost first, then speed, then quality (Constitution §5, Principle 3): - Local models for routine tasks (Ollama → $0) - Cloud models only when quality demands it (OpenRouter → metered) - Caching for repeated queries (Redis) - Batch operations over individual API calls --- ## 2. Docker Standards ### 2.1 docker-compose.yml Requirements Every service in `docker-compose.yml` must include: ```yaml services: apex-example: image: example/image:version # Pinned version tag container_name: apex-example # apex- prefix required restart: unless-stopped # Auto-restart on failure healthcheck: # Health check required test: ["CMD", "curl", "-f", "http://localhost:PORT/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - apex-net # Internal network labels: - "traefik.enable=true" # If externally accessible - "traefik.http.routers.example.rule=Host(`example.apex.unstuck-path.com`)" - "traefik.http.routers.example.tls.certresolver=letsencrypt" volumes: - example_data:/data # Named volumes for persistence environment: - CONFIG_VAR=${CONFIG_VAR} # From .env file, never hardcoded ``` ### 2.2 Container Naming - **Prefix:** All containers start with `apex-` - **Format:** `apex-{service-name}` (lowercase, hyphenated) - **Examples:** `apex-postgres`, `apex-traefik`, `apex-litellm`, `apex-status-api` ### 2.3 Health Checks **Required** on every container. Health check types: | Type | When to Use | Example | |------|-------------|---------| | HTTP | Service has a web endpoint | `curl -f http://localhost:PORT/health` | | TCP | Service listens on a port | `pg_isready` for PostgreSQL | | CMD | Custom health logic | `redis-cli ping` | ### 2.4 Restart Policy - **Default:** `restart: unless-stopped` - This ensures containers restart after crashes but respect manual stops - Never use `restart: always` (prevents intentional stops) ### 2.5 Resource Awareness - Set memory limits for resource-intensive services: ```yaml deploy: resources: limits: memory: 512M ``` - Monitor resource usage via Prometheus/Grafana - Document expected resource usage in TOOL_REGISTRY.md ### 2.6 Volumes - Use **named volumes** for persistent data: `apex_postgres_data`, `apex_gitea_data` - Use **bind mounts** only when necessary (e.g., configuration files) - Mount as **read-only** (`:ro`) when write access is not needed - Never mount the Docker socket directly unless absolutely required ### 2.7 Networks - All APEX OS containers join `apex_apex-net` (bridge network) - Sandbox testing uses `apex-sandbox` (isolated network) - No containers on the default Docker bridge network ### 2.8 Prohibited Practices - ❌ `--privileged` mode (unless documented exception with justification) - ❌ `--net=host` (breaks isolation) - ❌ Exposing ports directly to `0.0.0.0` (use Traefik) - ❌ Hardcoded credentials in docker-compose.yml - ❌ `latest` tag for critical infrastructure (PostgreSQL, Redis — pin versions) --- ## 3. Repository Standards ### 3.1 Git Hosting All code is hosted on **Gitea** at `git.apex.unstuck-path.com`. ### 3.2 Organization - **Organization:** `engineer/` - **Repository naming:** `kebab-case` (lowercase, hyphen-separated) - **Examples:** `apex-os-docs`, `apex-status-api`, `engineer-workspace` ### 3.3 Repository Requirements Every repository must contain: | File | Purpose | Required | |------|---------|----------| | `README.md` | Project description, setup, usage | ✅ Always | | `.gitignore` | Files to exclude from version control | ✅ Always | | `LICENSE` | Software license (if applicable) | ⚠️ When publishing | | `docker-compose.yml` | Container definition (if deployable service) | ⚠️ When applicable | | `Dockerfile` | Custom image build (if needed) | ⚠️ When applicable | ### 3.4 README Template ```markdown # [Project Name] > [One-line description] ## Overview [2-3 paragraph description of what this project does and why it exists] ## Architecture [How it fits into APEX OS, what it depends on, what depends on it] ## Setup [Step-by-step setup instructions] ## Usage [How to use the project — commands, API endpoints, etc.] ## Configuration [Environment variables, configuration files, etc.] ## Troubleshooting [Common issues and their solutions] ## Related Documentation - [link to related docs] ``` ### 3.5 Employee Workspaces Each employee has a dedicated Gitea workspace: - Format: `engineer/{role-slug}-workspace` - Examples: `engineer/engineer-workspace`, `engineer/research-workspace` - Workspaces contain working files, drafts, research, and deliverables - Deliverables are committed to the appropriate project repo when complete --- ## 4. Git Workflow ### 4.1 Branch Strategy - **`main`** branch is production — always deployable - **Feature branches** for all changes: `feature/{description}` - **Hotfix branches** for urgent fixes: `hotfix/{description}` - **No direct commits to `main`** for critical services ### 4.2 Commit Messages Format: `verb: description` | Verb | Usage | |------|-------| | `feat` | New feature or capability | | `fix` | Bug fix | | `docs` | Documentation update | | `refactor` | Code restructuring without behavior change | | `test` | Adding or updating tests | | `chore` | Maintenance, dependency updates | | `deploy` | Deployment-related changes | | `security` | Security-related changes | **Examples:** ``` feat: add health check endpoint to status API fix: resolve Redis connection timeout in LiteLLM docs: update TOOL_REGISTRY with Langfuse entry refactor: simplify auto-recovery container detection deploy: upgrade Grafana from 10.x to 11.x security: rotate LiteLLM master key ``` ### 4.3 Git Rules - ❌ **No force pushes to `main`** — ever - ❌ **No uncommitted deployments** — commit before deploying - ✅ **Meaningful commit messages** — future you will thank present you - ✅ **Atomic commits** — one logical change per commit - ✅ **Commit early, commit often** — small, focused commits --- ## 5. Database Standards ### 5.1 Primary Database **PostgreSQL 16.x** with `pgvector` extension — hosted in `apex-postgres` container. ### 5.2 Schema Organization | Schema | Purpose | Owner | |--------|---------|-------| | `apex` | Company operational data (tasks, projects, decisions, reflections, etc.) | APEX OS | | `mem0` | Shared knowledge base (embeddings, knowledge entries) | mem0 | | `letta` | Agent framework state (agents, memory, tools) | Letta | ### 5.3 Naming Conventions | Object | Convention | Example | |--------|-----------|---------| | Tables | `snake_case` | `engineer_decisions`, `task_status_changes` | | Columns | `snake_case` | `decision_date`, `created_at` | | Indexes | `idx_{table}_{column}` | `idx_tasks_status`, `idx_decisions_category` | | Primary keys | `id` (SERIAL or UUID) | `id SERIAL PRIMARY KEY` | | Foreign keys | `{referenced_table}_id` | `project_id`, `employee_id` | | Timestamps | `{action}_at` | `created_at`, `updated_at`, `completed_at` | | Booleans | `is_{adjective}` or `has_{noun}` | `is_active`, `has_approval` | ### 5.4 Key Tables (apex schema) | Table | Purpose | Key Columns | |-------|---------|-------------| | `projects` | Project tracking | `id`, `name`, `status`, `created_at` | | `tasks` | Task management | `id`, `project_id`, `assigned_to`, `status`, `priority`, `result` | | `engineer_decisions` | Decision audit log | `id`, `decision_date`, `category`, `decision_summary`, `rationale` | | `reflections` | Post-project reflections | `id`, `project_ref`, `what_worked`, `what_failed`, `improvement_applied` | | `deployments` | Deployment records | `id`, `service_name`, `version`, `deployed_at`, `status` | | `recovery_log` | Auto-recovery actions | `id`, `container_name`, `action`, `success`, `timestamp` | | `employee_registry` | Employee directory | `id`, `employee_number`, `role`, `agent_id`, `status` | | `constitution_violations` | Constitution breaches | `id`, `law_number`, `employee_id`, `description`, `timestamp` | | `performance_metrics` | Employee performance | `id`, `employee_id`, `metric`, `value`, `period` | | `task_status_changes` | Task status audit trail | `id`, `task_id`, `old_status`, `new_status`, `changed_at` | | `token_usage` | LLM token tracking | `id`, `employee_id`, `model`, `tokens`, `cost`, `timestamp` | | `lifecycle_executions` | Engineering lifecycle tracking | `id`, `phase`, `status`, `started_at`, `completed_at` | ### 5.5 pgvector Configuration - **Extension:** `pgvector` enabled in PostgreSQL - **Index type:** HNSW (Hierarchical Navigable Small World) - **Distance metric:** Cosine similarity - **Embedding model:** `nomic-embed-text` (Ollama, 768 dimensions) - **Usage:** mem0 knowledge search, document similarity, semantic matching ```sql -- Example: Creating a vector column with HNSW index ALTER TABLE knowledge ADD COLUMN embedding vector(768); CREATE INDEX idx_knowledge_embedding ON knowledge USING hnsw (embedding vector_cosine_ops); -- Example: Similarity search SELECT *, 1 - (embedding <=> query_vector) AS similarity FROM knowledge ORDER BY embedding <=> query_vector LIMIT 10; ``` ### 5.6 Migration Rules - All schema changes require a **migration script** - Migrations must be **reversible** (include UP and DOWN) - **Backup database before any migration** (Constitution Law 4) - No direct DDL in production without a migration script - Test migrations on a copy of the database first - Log migration in `engineer_decisions` ### 5.7 Database Security - No direct SQL executed in production without a backup - Connection strings stored in `.env` file (permissions `600`) - PostgreSQL credentials in Vaultwarden - No superuser access for application connections - Connection pooling via application-level management --- ## 6. API Standards ### 6.1 Design Principles - **RESTful** endpoints following REST conventions - **JSON** for all request and response bodies - **Consistent** error handling and response format - **Documented** with examples for every endpoint ### 6.2 URL Structure ``` https://{service}.apex.unstuck-path.com/v{version}/{resource} Examples: GET /v1/health GET /v1/containers POST /v1/tasks PUT /v1/tasks/{id} ``` ### 6.3 Health Check Endpoint **Every service must expose a health check endpoint:** ``` GET /health OR GET /v1/health Response (healthy): { "status": "healthy", "service": "apex-status-api", "version": "1.1", "uptime": 86400, "timestamp": "2026-07-02T12:00:00Z" } Response (unhealthy): { "status": "unhealthy", "service": "apex-status-api", "error": "Database connection failed", "timestamp": "2026-07-02T12:00:00Z" } ``` ### 6.4 Authentication | Method | Use Case | |--------|----------| | API Keys | Service-to-service authentication (e.g., LiteLLM master key) | | Bearer Tokens | User-facing APIs with session management | | No Auth | Health check endpoints only | ### 6.5 Rate Limiting - External-facing APIs must implement rate limiting - Default: 100 requests/minute per client - Rate limit headers in response: ``` X-RateLimit-Limit: 100 X-RateLimit-Remaining: 95 X-RateLimit-Reset: 1625000000 ``` ### 6.6 Response Format **Success:** ```json { "success": true, "data": { ... }, "metadata": { "timestamp": "2026-07-02T12:00:00Z", "request_id": "req_abc123" } } ``` **Error:** ```json { "success": false, "error": { "code": "VALIDATION_ERROR", "message": "Human-readable error description", "details": { ... } }, "metadata": { "timestamp": "2026-07-02T12:00:00Z", "request_id": "req_abc123" } } ``` ### 6.7 HTTP Status Codes | Code | Usage | |------|-------| | 200 | Successful GET, PUT, PATCH | | 201 | Successful POST (resource created) | | 204 | Successful DELETE (no content) | | 400 | Bad request (validation error) | | 401 | Unauthorized (missing/invalid auth) | | 403 | Forbidden (insufficient permissions) | | 404 | Resource not found | | 429 | Rate limited | | 500 | Internal server error | | 503 | Service unavailable | --- ## 7. Testing Requirements ### 7.1 Test Types | Type | When Required | Description | |------|---------------|-------------| | **Health Check Verification** | Every deployment | Verify the service responds to health check after deployment | | **Smoke Tests** | Infrastructure changes | Basic end-to-end verification that critical paths work | | **Integration Tests** | New integrations | Verify service-to-service communication works correctly | | **Load Tests** | New services (when applicable) | Verify service handles expected load without degradation | | **Security Tests** | Security changes | Verify credentials, permissions, and access controls | ### 7.2 Post-Deployment Verification After every deployment: 1. ✅ Container starts and reaches `healthy` state 2. ✅ Health check endpoint returns `200` 3. ✅ Service responds to basic requests 4. ✅ Logs show no errors (check Loki) 5. ✅ Metrics appear in Prometheus/Grafana 6. ✅ Monitor for 15 minutes for stability ### 7.3 Regression Verification After infrastructure changes: 1. ✅ All existing containers remain healthy 2. ✅ Traefik routes resolve correctly 3. ✅ Database connections work 4. ✅ LiteLLM proxy routes to all models 5. ✅ Telegram bot responds to test message --- ## 8. Logging Standards ### 8.1 Format **Structured logging in JSON format** is preferred: ```json { "timestamp": "2026-07-02T12:00:00Z", "level": "INFO", "service": "apex-status-api", "message": "Health check completed", "data": { "containers_checked": 20, "healthy": 19, "unhealthy": 1 } } ``` ### 8.2 Log Levels | Level | Usage | When | |-------|-------|------| | `ERROR` | Something failed and requires attention | Service errors, failed operations, unhandled exceptions | | `WARN` | Something unexpected but handled | Retry attempts, degraded performance, deprecated usage | | `INFO` | Normal operations worth recording | Startup, shutdown, deployment, configuration changes | | `DEBUG` | Detailed diagnostic information | Request details, variable states (development only) | ### 8.3 Log Pipeline ``` Container stdout/stderr → Promtail → Loki → Grafana ``` - **Promtail** tails container logs and labels them by container name - **Loki** indexes and stores logs (label-based, not full-text) - **Grafana** provides log exploration, search, and correlation with metrics ### 8.4 Decision-Level Logging Significant operational decisions are logged to `apex.engineer_decisions` (not just container logs): - Infrastructure changes - Tool adoption/retirement - Architecture decisions - Security changes - Incident responses ### 8.5 Prohibited Log Content - ❌ Credentials, API keys, or tokens - ❌ Personally identifiable information (PII) - ❌ Full external API request/response bodies (summaries only) - ❌ Database query results containing sensitive data - ❌ Base64-encoded secrets or encrypted values --- ## 9. Monitoring Standards ### 9.1 Dashboard Requirements - **Grafana Executive Dashboard** (UID: `a5jdct`) — 12-panel overview - Every critical service must have representation in the dashboard - Dashboard accessible at `grafana.apex.unstuck-path.com` ### 9.2 Metrics Collection **Prometheus** scrapes metrics from all instrumented services: | Metric Category | Examples | |-----------------|---------| | Container health | Up/down status, restart count | | Resource usage | CPU %, memory MB, disk I/O | | Application metrics | Request count, latency, error rate | | LLM metrics | Token usage, model routing, cost | | Task metrics | Completion rate, blocked tasks, average duration | ### 9.3 Alerting Rules | Alert | Condition | Action | |-------|-----------|--------| | Container Down | Health check fails 3x | Auto-recovery script restarts | | High Memory | >90% memory usage | Alert in Grafana | | Error Spike | Error rate >10% in 5 min | Alert in Grafana | | Backup Failure | Backup script exits non-zero | Log alert + Telegram notification | | Disk Space | <10% free disk space | Alert in Grafana + Telegram | ### 9.4 Auto-Recovery - **Script:** `/opt/apex/scripts/` (cron, every 5 minutes) - **Logic:** Check container health → restart unhealthy → log to `recovery_log` → escalate after 3 consecutive failures - **Scope:** All `apex-*` containers - **Logging:** All actions logged to `apex.recovery_log` ### 9.5 LLM Observability **Langfuse** provides detailed LLM call tracing: - Request/response pairs for all LLM calls - Token usage breakdown per model - Latency analysis per model/endpoint - Cost tracking per employee - Quality evaluation (when configured) --- ## 10. Error Handling ### 10.1 Principles 1. **Graceful degradation** — When a dependency fails, provide reduced functionality rather than total failure 2. **Retry with exponential backoff** — For transient failures (network, rate limits) 3. **Circuit breaker** — For persistent external service failures 4. **Fallback responses** — For non-critical failures 5. **Error logging with full context** — What failed, why, what was the input ### 10.2 Retry Strategy ``` Attempt 1: Immediate Attempt 2: Wait 1 second Attempt 3: Wait 2 seconds Attempt 4: Wait 4 seconds Attempt 5: Wait 8 seconds After 5 attempts: Log failure, escalate ``` ### 10.3 Circuit Breaker Pattern For external API dependencies: ``` CLOSED (normal) → error threshold exceeded → OPEN (fail fast) OPEN → cool-down period → HALF-OPEN (test request) HALF-OPEN → success → CLOSED | failure → OPEN ``` ### 10.4 Fallback Hierarchy When LiteLLM cloud routing fails: 1. Retry with same model (exponential backoff) 2. Try alternative cloud model (GPT-4o → Claude or vice versa) 3. Fall back to local model (Ollama phi3:mini) with quality warning 4. Log failure and escalate to Engineer --- ## 11. Versioning ### 11.1 Semantic Versioning Custom APEX OS services follow **SemVer** (MAJOR.MINOR.PATCH): | Component | When to Increment | Example | |-----------|-------------------|---------| | MAJOR | Breaking changes (API incompatibility) | 1.0 → 2.0 | | MINOR | New features (backward compatible) | 1.0 → 1.1 | | PATCH | Bug fixes (backward compatible) | 1.0.0 → 1.0.1 | ### 11.2 Docker Image Tags - Custom services: tagged with SemVer (e.g., `apex-status-api:1.1`) - Third-party services: use upstream version tags (e.g., `postgres:16.3`) - **Never use `latest` for critical infrastructure** — pin specific versions - Retain previous image tags for 30 days (rollback capability) ### 11.3 API Versioning - Version via URL path: `/v1/`, `/v2/` - Maintain backward compatibility within a major version - Deprecation notice at least 30 days before removal - Document breaking changes in release notes --- ## 12. Documentation Standards ### 12.1 Required Documentation | Scope | Required Documents | |-------|--------------------| | Every project | `README.md` with setup, usage, and architecture | | Every API | Endpoint documentation with request/response examples | | Every deployment | Entry in `engineer_decisions` with rationale and rollback plan | | Every infrastructure change | Before/after state documented | | Every phase | Formal phase report in `apex-os-docs` | | Every tool adoption | Certification report (see TOOL_REGISTRY.md §5) | | Every troubleshooting resolution | Added to relevant troubleshooting guide | ### 12.2 Architecture Decision Records (ADRs) For significant architecture decisions, create an ADR: ```markdown # ADR-{number}: {Title} **Date:** {date} **Status:** Proposed | Accepted | Deprecated | Superseded ## Context [What is the issue or decision to be made?] ## Decision [What was decided and why?] ## Consequences [What are the implications — positive and negative?] ## Alternatives Considered [What other options were evaluated?] ``` ### 12.3 Troubleshooting Guides Every common issue should have a documented resolution: ```markdown ## Issue: [Description] **Symptoms:** [What the user/operator sees] **Root Cause:** [Why this happens] **Resolution:** 1. [Step 1] 2. [Step 2] **Prevention:** [How to prevent recurrence] ``` --- ## 13. Rollback Procedures ### 13.1 Docker Container Rollback ```bash # 1. Stop the service docker-compose stop apex-example # 2. Update docker-compose.yml to previous version tag # image: example/image:1.0 (was 1.1) # 3. Start with previous version docker-compose up -d apex-example # 4. Verify health docker inspect --format='{{.State.Health.Status}}' apex-example ``` ### 13.2 docker-compose.yml Rollback ```bash # Restore from backup cp docker-compose.yml.backup.{timestamp} docker-compose.yml # Recreate containers docker-compose up -d ``` ### 13.3 Database Rollback ```bash # Restore from daily backup pg_restore -d apex /opt/apex/backups/apex_YYYYMMDD.dump # Or restore full cluster psql -f /opt/apex/backups/full_cluster_YYYYMMDD.sql ``` ### 13.4 Configuration Rollback ```bash # Restore .env from backup cp /opt/apex/backups/.env.backup.{timestamp} /opt/apex/.env # Restart affected services docker-compose up -d ``` ### 13.5 Full System Recovery In case of catastrophic failure: 1. **Provision new VPS** (or reset existing) 2. **Install Docker and Docker Compose** 3. **Restore `/opt/apex/` from offsite backup** 4. **Restore docker-compose.yml and .env** 5. **Pull images:** `docker-compose pull` 6. **Start services:** `docker-compose up -d` 7. **Restore PostgreSQL:** `pg_restore` from backup 8. **Verify all services:** Check health endpoints 9. **Verify DNS:** Ensure `*.apex.unstuck-path.com` resolves 10. **Notify Human CEO** via alternative channel --- ## 14. Infrastructure Change Process Every infrastructure change follows this process: ### 14.1 Pre-Change 1. **Create backup:** ```bash cp docker-compose.yml docker-compose.yml.backup.$(date +%Y%m%d%H%M%S) ``` 2. **Document the change** in `engineer_decisions`: - What is being changed - Why it's being changed - What the expected outcome is - What the rollback plan is 3. **Test in isolation** when possible (sandbox Docker network) 4. **Get approval** for production changes (Constitution Law 6) ### 14.2 During Change 5. **Execute the change** following documented steps 6. **Monitor actively** — watch logs and metrics in real-time 7. **Verify health checks** pass for all affected services ### 14.3 Post-Change 8. **Monitor for 15 minutes** after deployment 9. **Run smoke tests** — verify critical paths work 10. **Update documentation** — TOOL_REGISTRY.md, README, etc. 11. **Log outcome** in `engineer_decisions` 12. **Commit changes** to Gitea ### 14.4 If Change Fails 13. **Execute rollback plan** immediately 14. **Log failure** with root cause analysis 15. **Create reflection** — What went wrong? How to prevent next time? 16. **Escalate** if rollback fails --- ## 15. Network Architecture ### 15.1 Docker Network ``` Network: apex_apex-net (bridge) ┌─────────────────────────────────────────────┐ │ apex_apex-net │ │ │ │ All apex-* containers are members │ │ Internal DNS resolves container names │ │ No external access except via Traefik │ └─────────────────────────────────────────────┘ ``` ### 15.2 Port Mapping | External Port | Service | Notes | |--------------|---------|-------| | 80 | Traefik | HTTP → HTTPS redirect | | 443 | Traefik | HTTPS termination + routing | | (none others) | — | All other ports internal only | ### 15.3 Internal Service Ports | Service | Internal Port | Access Via | |---------|--------------|------------| | PostgreSQL | 5432 | `apex-postgres:5432` | | Redis | 6379 | `apex-redis:6379` | | LiteLLM | 4000 | `apex-litellm:4000` | | Ollama | 11434 | `apex-ollama:11434` | | Letta | 8283 | `apex-letta:8283` | | Gitea | 3000 | `git.apex.unstuck-path.com` | | Grafana | 3000 | `grafana.apex.unstuck-path.com` | | n8n | 5678 | `n8n.apex.unstuck-path.com` | | Langfuse | 3000 | `langfuse.apex.unstuck-path.com` | | Open WebUI | 8080 | `openwebui.apex.unstuck-path.com` | | Vaultwarden | 80 | `vaultwarden.apex.unstuck-path.com` | | Code-Server | 8443 | `code-server.apex.unstuck-path.com` | | Dockge | 5001 | `dockge.apex.unstuck-path.com` | | Socket Proxy | 2375 | `apex-socket-proxy:2375` | | Status API | 3100 | Internal only | | Prometheus | 9090 | Internal only | | Loki | 3100 | Internal only | ### 15.4 DNS Structure All services accessible via subdomains of `apex.unstuck-path.com`: - Wildcard DNS: `*.apex.unstuck-path.com` → `62.72.3.145` - Traefik matches `Host()` rules in container labels - SSL via Let's Encrypt (ACME HTTP-01 challenge) --- ## 16. Performance Standards ### 16.1 Response Time Targets | Category | Target | Measurement | |----------|--------|-------------| | Health check endpoints | < 500ms | Prometheus histogram | | API endpoints | < 2s (p95) | Langfuse / Prometheus | | LLM responses (local) | < 10s | Langfuse | | LLM responses (cloud) | < 30s | Langfuse | | Page load (web UIs) | < 3s | Manual verification | ### 16.2 Availability Targets | Service | Target | Monitoring | |---------|--------|------------| | Core infrastructure (Traefik, PostgreSQL, Redis) | 99.5% uptime | Prometheus + auto-recovery | | AI services (LiteLLM, Ollama, Letta) | 99% uptime | Prometheus + auto-recovery | | Supporting services (Grafana, Gitea, n8n) | 98% uptime | Prometheus | ### 16.3 Resource Limits | Metric | Warning Threshold | Critical Threshold | |--------|-------------------|-------------------| | CPU usage (total) | 70% | 90% | | Memory usage (total) | 75% | 90% | | Disk usage | 80% | 90% | | Container restart count | 3/hour | 5/hour | --- ## 17. Security Engineering ### 17.1 Principle of Least Privilege Every container, service, and agent has the **minimum permissions** required for its function: - Docker Socket Proxy restricts Docker API to read-only queries - Code-Server has access to config/data only (not full `/opt/apex/`) - n8n has no Docker socket access - Employees have role-specific database access ### 17.2 Credential Lifecycle ``` Generate → Store in Vaultwarden → Reference in .env → Pass as env var → Rotate every 60 days ``` ### 17.3 Security Checklist for New Services - [ ] No default credentials - [ ] No privileged container mode - [ ] Non-root user where possible - [ ] Read-only mounts where possible - [ ] No direct Docker socket access (use proxy) - [ ] Health check configured - [ ] Traefik TLS termination (no plain HTTP) - [ ] Credentials in Vaultwarden - [ ] CVE check on image and dependencies --- ## 18. Change History | Date | Version | Author | Changes | |------|---------|--------|---------| | Phase 2 | 0.1 | Engineer (#1) | Initial standards — Docker basics, database schema | | Phase 3 | 0.5 | Engineer (#1) | Added Git workflow, repository standards | | Phase 5 | 1.0 | Engineer (#1) | Added API standards, testing requirements, error handling | | Phase 5.5 | 1.5 | Engineer (#1) | Added monitoring standards, auto-recovery, logging pipeline | | Phase 7 | 2.0 | Engineer (#1) | Full standards formalization. Added network architecture, performance standards, security engineering, rollback procedures, infrastructure change process. Comprehensive coverage of all engineering aspects. | --- > **These standards are not suggestions — they are requirements. Every technical deliverable in APEX OS must comply. When in doubt, err on the side of more documentation, more testing, and more caution.** *Cross-references: [APEX_CONSTITUTION.md](APEX_CONSTITUTION.md) · [TOOL_REGISTRY.md](TOOL_REGISTRY.md) · [EMPLOYEE_HANDBOOK.md](EMPLOYEE_HANDBOOK.md) · [COMPANY_STRUCTURE.md](COMPANY_STRUCTURE.md)*