Deploy Environment
Feature ID: ENV-003
Category: Environments
Required Permission: project.environments.deploy
API Endpoint: POST /api/v1/projects/{project_id}/environments/{env_id}/deploy
Overview
Deploy an Odoo environment to your server by creating Docker containers, setting up the database, cloning Git repositories, and configuring networking. Deployment is an asynchronous background process that typically completes in 2-5 minutes.
Use this feature to:
- Deploy a newly created environment for the first time
- Redeploy after configuration changes (resources, branches, settings)
- Update code after Git pushes (manual or auto-deploy)
- Apply addon repository changes
- Recover from errors by redeploying
What happens during deployment:
- Docker containers created on target server (PostgreSQL + Odoo)
- Git repositories cloned to server
- Odoo Docker image pulled
- Database initialized or connected to existing DB
- Traefik routing configured for domain access
- Health check validates deployment success
Prerequisites
Required Configuration
- Server Assigned: Environment must have
vm_idset (target server) - Server Status: Server must be
RUNNING(not offline or provisioning) - Git Repository (optional): Project with Git connection for auto-cloning
- No Concurrent Deployments: Cannot deploy if another deployment is in progress
Resource Requirements
- Available Server Capacity: Server must have sufficient CPU, RAM, disk for environment
- Organization Quota: Must not exceed quota limits
- Network Access: Server must allow Docker Hub access for image pulling
- Ports Available: Environment's port (default 8069) must be available on server
Permissions
- Permission:
project.environments.deploy(Project Admin or Org Owner) - Server Access: Backend must have SSH credentials for target server
How to Deploy an Environment
Method 1: Deploy from Environment Page (Recommended)
- Navigate to Dashboard → Projects → Select project
- Click Environments tab
- Find the environment you want to deploy
- Click Deploy button (looks like rocket icon)
- Button states:
- Deploy (blue) - Ready to deploy
- Deploying (gray, spinner) - Deployment in progress
- Redeploy (yellow) - Already deployed, redeploy to apply changes
- Button states:
Deployment Progress Modal Opens:
- Shows real-time progress (16 steps)
- Step-by-step status updates
- Logs displayed for each step
- Auto-refreshes every 2 seconds
- Estimated time: 2-5 minutes
Method 2: Deploy from Environment Detail Page
- Navigate to environment detail page at
/environments/ENV_ID/edit - Click Overview tab
- In the main status card, click Deploy button
- Deployment Progress modal opens (same as Method 1)
Method 3: Deploy After Creating Environment
After creating a new environment:
- Success modal appears: "Environment created successfully"
- Dialog: "Deploy Now?"
- Click Deploy Now to start deployment immediately
- Click Deploy Later to deploy manually later
- If Deploy Now, deployment starts and Progress modal opens
Method 4: Auto-Deploy (Automatic)
If auto_deploy is enabled on the environment:
- Developer pushes code to the configured
git_branch - Git webhook triggers OEC.SH
- Deployment starts automatically
- Notification sent to project members
- View progress in Deployments tab
Deployment Steps (16 Steps)
Each deployment goes through exactly 16 steps. Progress is tracked in real-time.
Step 1: Initializing (1-3 seconds)
What happens: Load deployment configuration from database
- Fetch environment details (CPU, RAM, disk, port)
- Load project info (Odoo version, Git repo URL, branch)
- Load server info (IP, SSH credentials)
- Validate configuration completeness
Success Indicator: "Configuration loaded successfully"
Step 2: Connecting (1-2 seconds)
What happens: Establish SSH connection to target server
- Create SSH session using
paramikolibrary - Authenticate with SSH key or password
- Test connectivity with simple command
Success Indicator: "Connected to server SERVER_IP" Potential Error: "Failed to connect - server offline or firewall blocking"
Step 3: Creating Network (1 second)
What happens: Create isolated Docker network for environment
- Network name:
paasportal_net_ENVIRONMENT_ID - Ensures containers can communicate
- Isolated from other environments
Command: docker network create paasportal_net_ENV_ID
Success Indicator: "Docker network created"
Step 4: Configuring DNS (2-5 seconds)
What happens: Create DNS A record pointing to server
- Uses Cloudflare API or configured DNS provider
- Record:
SUBDOMAIN.apps.oec.sh→ Server IP - TTL: 300 seconds (5 minutes)
Success Indicator: "DNS record created for SUBDOMAIN" Note: If custom domain configured, DNS must be set manually
Step 5: Creating Database (5-10 seconds)
What happens: Start PostgreSQL container
- Container Name:
ENVIRONMENT_ID_db - Image:
postgres:15-alpine - Database Name:
ENVIRONMENT_ID(UUID) - User:
odoo - Password: Auto-generated secure password
- Volume:
paasportal_pgdata_ENV_ID(persistent storage) - Network: Attached to
paasportal_net_ENV_ID - Memory Limit: 512 MB (or configured postgres_ram_mb)
- CPU Limit: 0.3 cores (or configured postgres_cpu_cores)
Command:
docker run -d --name {env-id}_db \
--network paasportal_net_{env-id} \
-e POSTGRES_DB={env-id} \
-e POSTGRES_USER=odoo \
-e POSTGRES_PASSWORD={generated-password} \
-v paasportal_pgdata_{env-id}:/var/lib/postgresql/data \
--memory 512m \
--cpus 0.3 \
postgres:15-alpineHealth Check: Waits up to 60 seconds for PostgreSQL to accept connections Success Indicator: "PostgreSQL container started and healthy"
Step 6: Cloning Platform Repos (5-15 seconds)
What happens: Clone platform-level addon repositories
- Location:
/opt/paasportal/ENV_ID/addons/platform/ - These are global addons provided by OEC.SH
- Consolidates
apt.txtandrequirements.txtfiles
Success Indicator: "Cloned COUNT platform repositories"
Step 7: Cloning Organization Repos (5-15 seconds)
What happens: Clone organization-specific addon repositories
- Location:
/opt/paasportal/ENV_ID/addons/org/ - Custom addons shared across all org projects
- Example: Custom theme, common integrations
Success Indicator: "Cloned COUNT organization repositories"
Step 8: Cloning Project Repository (10-30 seconds)
What happens: Clone primary project Git repository
- Location:
/opt/paasportal/ENV_ID/addons/project/ - Uses configured
git_repo_urlandgit_branch - Authenticates with Git OAuth token for private repos
- Checks out specific branch
Command:
git clone -b GIT_BRANCH GIT_REPO_URL /opt/paasportal/ENV_ID/addons/project/Success Indicator: "Cloned project repository: REPO_NAME (branch: BRANCH_NAME)" Potential Error: "Git authentication failed" or "Branch not found"
Step 9: Cloning Additional Repos (5-20 seconds)
What happens: Clone any additional configured addon repositories
- Location:
/opt/paasportal/ENV_ID/addons/additional/ - Multi-repo support for complex projects
- Each repo can have different branch
Success Indicator: "Cloned COUNT additional repositories"
Step 10: Pulling Image (30-120 seconds, or less than 5s if cached)
What happens: Download Odoo Docker image from Docker Hub
- Image:
odoo:{version}(e.g.,odoo:17.0,odoo:18.0) - First time: Full download (~500-800 MB)
- Subsequent deploys: Uses cached image (less than 5 seconds)
Command:
docker pull odoo:{version}Progress Indicator: Shows pull progress with percentage Success Indicator: "Odoo Docker image pulled successfully" Timeout: 600 seconds (10 minutes) for slow connections
Step 11: Generating Config (1-2 seconds)
What happens: Create Odoo configuration file (odoo.conf)
- Location:
/opt/paasportal/ENV_ID/odoo.conf - Configures database connection
- Sets addons paths (all cloned repos)
- Applies custom Odoo configuration from environment settings
- Generates admin password
Configuration Includes:
[options]
db_host = ENV_ID_db
db_port = 5432
db_user = odoo
db_password = GENERATED_PASSWORD
db_name = ENV_ID
addons_path = /mnt/extra-addons/platform,/mnt/extra-addons/org,/mnt/extra-addons/project,/mnt/extra-addons/additional,/usr/lib/python3/dist-packages/odoo/addons
admin_passwd = GENERATED_ADMIN_PASSWORD
workers = 4
max_cron_threads = 2
limit_memory_hard = 2684354560
limit_memory_soft = 2147483648
log_level = infoSuccess Indicator: "Odoo configuration generated"
Step 12: Starting Container (5-15 seconds)
What happens: Create and start Odoo application container
- Container Name:
ENVIRONMENT_ID_odoo - Image:
odoo:VERSION - Port:
PORT:8069(default 8069) - WebSocket Port (Odoo 18+):
WS_PORT:8072 - Network: Attached to
paasportal_net_ENV_ID - Volume Mounts:
/opt/paasportal/ENV_ID/→/mnt/extra-addons(addons)paasportal_odoo_data_ENV_ID→/var/lib/odoo(filestore)
- Environment Variables:
ODOO_RC=/mnt/extra-addons/odoo.conf- Custom environment variables from settings
- Resource Limits:
- Memory: Configured
ram_mb - postgres_ram_mb - CPU: Configured
cpu_cores - postgres_cpu_cores
- Memory: Configured
- Traefik Labels: For domain routing
Command:
docker run -d --name ENV_ID_odoo \
--network paasportal_net_ENV_ID \
-p PORT:8069 \
-e ODOO_RC=/mnt/extra-addons/odoo.conf \
-v /opt/paasportal/ENV_ID/:/mnt/extra-addons \
-v paasportal_odoo_data_ENV_ID:/var/lib/odoo \
--memory RAM_MINUS_POSTGRES m \
--cpus CPU_MINUS_POSTGRES \
-l traefik.enable=true \
-l traefik.http.routers.ENV_ID.rule=Host(`DOMAIN`) \
odoo:VERSIONSuccess Indicator: "Odoo container started"
Step 13: Installing Dependencies (10-30 seconds)
What happens: Install system and Python dependencies
- Runs
apt-get installfrom consolidatedapt.txt(all repos) - Runs
pip install -r requirements.txtfrom consolidated file - Executed inside running Odoo container
Commands:
# Inside container
apt-get update && apt-get install -y $(cat /mnt/extra-addons/apt.txt | xargs)
pip install -r /mnt/extra-addons/requirements.txtSuccess Indicator: "Dependencies installed successfully" Potential Error: "Failed to install package X" (check requirements format)
Step 14: Initializing Database (10-60 seconds)
What happens: Initialize Odoo database or connect to existing
- For new databases: Run
odoo-bin -d DB_NAME -i base --stop-after-init- Installs
basemodule - Creates default admin user
- Sets up initial database schema
- Installs
- For migrated databases: Skips init if
migration_restore_completedis true- Prevents data loss on redeployment
- Connects to existing database only
Command (new database):
docker exec ENV_ID_odoo odoo-bin -d ENV_ID -i base --stop-after-initSuccess Indicator: "Database initialized successfully" Duration: Varies based on modules to install (10-60 seconds)
Step 15: Configuring Traefik (2-3 seconds)
What happens: Update Traefik routing configuration
- Adds Traefik labels to Odoo container
- Configures domain routing rules
- Sets up HTTPS/SSL if enabled
- Enables WebSocket routing (Odoo 18+)
Traefik Labels:
traefik.enable: true
traefik.http.routers.ENV_ID.rule: Host(`DOMAIN`)
traefik.http.routers.ENV_ID.entrypoints: websecure
traefik.http.routers.ENV_ID.tls.certresolver: letsencrypt
traefik.http.services.ENV_ID.loadbalancer.server.port: 8069Success Indicator: "Traefik routing configured"
Step 16: Health Check (2-30 seconds)
What happens: Validate deployment by checking Odoo availability
- Sends HTTP request to
http://localhost:PORT/web/ - Retries up to 30 times (1 second interval)
- Validates HTTP 200 response
Command:
curl -f http://localhost:PORT/web/Success Indicator: "Health check passed - Odoo is responding" Potential Error: "Health check failed - Odoo not responding after 30 seconds"
Final Step: Deployment Complete
What happens: Update environment and deployment records
- Environment status:
PENDING→RUNNING - Deployment status:
DEPLOYING→SUCCESS - Record container IDs and names
- Update
last_deployed_attimestamp - Send success notification
Total Duration: 2-5 minutes (typical)
Deployment Progress Tracking
Real-Time Progress Display
The Deployment Progress modal shows:
Header:
- Deployment ID
- Status badge (Deploying / Success / Failed)
- Start time
- Duration (elapsed time)
Progress Bar:
- Overall percentage (0-100%)
- Formula:
(completed_steps / 16) * 100 - Updates every 2 seconds
Step List (16 steps): Each step shows:
- Step number (1-16)
- Step name (e.g., "Pulling Image")
- Status icon:
- ⏳ Pending (gray, waiting)
- 🔄 In Progress (blue, spinner)
- ✅ Completed (green, checkmark)
- ❌ Failed (red, X)
- Description
- Logs (expandable)
Logs Section (per step):
- Timestamp
- Log level (INFO, WARNING, ERROR)
- Message
- Auto-scrolls to latest entry
Progress API
Frontend polls: GET /api/v1/deployments/DEPLOYMENT_ID/progress
Response:
{
"deployment_id": "uuid",
"status": "deploying",
"progress_percent": 45,
"current_step": "pulling_image",
"steps": [
{
"id": "initializing",
"name": "Initializing",
"status": "completed",
"logs": [
{
"timestamp": "2024-12-11T10:30:05Z",
"level": "info",
"message": "Configuration loaded successfully"
}
]
},
{
"id": "connecting",
"name": "Connecting",
"status": "completed",
"logs": [...]
},
{
"id": "pulling_image",
"name": "Pulling Image",
"status": "in_progress",
"logs": [
{
"timestamp": "2024-12-11T10:31:20Z",
"level": "info",
"message": "Pulling odoo:17.0... 45% complete"
}
]
}
],
"started_at": "2024-12-11T10:30:00Z",
"completed_at": null,
"duration_seconds": 85.5,
"error_message": null
}Polling Interval: Every 2 seconds
Stops When: Status is success or failed
Visual Feedback
During Deployment
- Deploy Button: Changes to gray with spinner, text: "Deploying..."
- Deployment Progress Modal: Opens automatically
- Progress Bar: Animates from 0% to 100%
- Step Indicators: Update in real-time (pending → in progress → completed)
- Logs: Append continuously as new messages arrive
- Duration Timer: Shows elapsed time (updates every second)
Upon Success
- Status Badge: Changes to green "SUCCESS"
- Progress Bar: Full (100%)
- All Steps: Green checkmarks
- Success Message: "Deployment completed successfully in DURATION"
- Environment URL: Becomes clickable link
- Toast Notification: "Environment deployed successfully" (green)
- Deploy Button: Changes to yellow "Redeploy" (for next time)
Upon Failure
- Status Badge: Changes to red "FAILED"
- Progress Bar: Stops at last completed step percentage
- Failed Step: Shows red X icon
- Error Message: Displayed in red banner with details
- Error Logs: Highlighted in red in logs section
- Actions Available:
- Retry button (try deployment again)
- View Full Logs link (detailed error info)
- Toast Notification: "Deployment failed - ERROR_MESSAGE" (red)
Common Errors and Solutions
Problem: "Server not found or offline"
Symptoms:
- Deployment fails at Step 2: Connecting
- Error: "Failed to connect to server"
Causes:
- Server is offline or in provisioning state
- SSH connection blocked by firewall
- SSH credentials invalid or expired
Solution:
- Navigate to Settings → Servers
- Find the target server
- Check Status column:
- If Offline: Restart server, wait for status to become Running
- If Provisioning: Wait for provisioning to complete
- Click Test Connection button
- If test fails:
- Verify server IP address is correct
- Check firewall allows SSH (port 22) from OEC.SH
- Verify SSH credentials are valid
- Retry deployment
Problem: "Git repository not found"
Symptoms:
- Deployment fails at Step 8: Cloning Project Repository
- Error: "Repository not accessible" or "Authentication failed"
Causes:
- Git repository URL is incorrect
- Repository is private and no OAuth token configured
- Branch doesn't exist
- Git connection expired
Solution:
- Navigate to Settings → Git Connections
- Verify Git connection status (should be green "Connected")
- If disconnected:
- Click Reconnect button
- Re-authorize OEC.SH with GitHub/GitLab/Bitbucket
- Navigate to environment → Settings → Repositories tab
- Verify Git Branch exists in repository
- If branch recently created, refresh Git connection:
- Go to Settings → Git Connections
- Click Sync to fetch latest branches
- Retry deployment
Problem: "Docker image pull timeout"
Symptoms:
- Deployment fails at Step 10: Pulling Image
- Error: "Timeout pulling odoo image"
- Progress stuck at image download
Causes:
- Slow internet connection on server
- Docker Hub rate limiting
- Network firewall blocking Docker Hub
Solution:
- Wait and Retry:
- Docker Hub can be slow during peak hours
- Retry deployment after 5-10 minutes
- Check Server Network:
- SSH into server
- Test:
curl https://hub.docker.com - If fails: Firewall or network issue
- Use Cached Image:
- If image was previously pulled, deploy should succeed
- Cached images skip download (completes in less than 5 seconds)
- Contact Support:
- If issue persists, check Docker Hub status
- May need to configure private registry
Problem: "Database initialization failed"
Symptoms:
- Deployment fails at Step 14: Initializing Database
- Error: "Failed to initialize Odoo database"
Causes:
- PostgreSQL container not healthy
- Insufficient disk space
- Custom module has syntax errors
- Required Python dependencies missing
Solution:
- Check PostgreSQL Health:
- Go to environment detail page
- Check container logs (PostgreSQL container)
- Look for errors like "out of disk space"
- Free Up Disk Space (if needed):
- Navigate to Settings → Servers
- Check server disk usage
- Stop unused environments
- Or scale up server disk
- Check Custom Module Syntax:
- Review recent Git commits
- Look for Python syntax errors in
__init__.pyor__manifest__.py - Fix errors and push to Git
- Retry deployment
- Verify Dependencies:
- Check
requirements.txtin your repository - Ensure all packages are valid and available on PyPI
- Test locally:
pip install -r requirements.txt
- Check
- Retry deployment
Problem: "Health check failed"
Symptoms:
- Deployment fails at Step 16: Health Check
- Error: "Odoo not responding after 30 seconds"
- All previous steps completed successfully
Causes:
- Odoo crashed during startup
- Port conflict (another service using the port)
- Insufficient memory (Odoo killed by OOM)
- Module dependency errors
Solution:
- Check Odoo Container Logs:
- Go to environment detail page → Logs tab
- Select "Odoo Container" from dropdown
- Look for errors:
MemoryError→ Increase RAM allocationModuleNotFoundError→ Missing Python dependencyDatabaseError→ Database connection issue
- Verify Port Availability:
- SSH into server
- Check:
sudo lsof -i :PORT - If port in use: Change environment port in settings
- Increase Memory (if OOM):
- Environment → Settings → Server Resources tab
- Increase RAM to at least 2 GB (4 GB recommended)
- Save changes
- Retry deployment
- Check Module Dependencies:
- Review
__manifest__.pyin custom modules - Ensure all
dependsmodules exist - Fix dependencies and push to Git
- Retry deployment
- Review
Redeployment
When to Redeploy
Redeploy is required after these changes:
- Resource Scaling: CPU, RAM, or disk changes
- Server Reassignment: Moving to different server
- Git Branch Change: Switching branches
- Addon Repository Changes: Adding or removing addon repos
- Odoo Configuration Updates: Changes to odoo.conf parameters
- PostgreSQL Optimization: Enabling/disabling PGTune or PgBouncer
- Custom Domain: DNS or SSL configuration updates
- Environment Variables: Docker environment variable changes
How to Redeploy
- Navigate to environment page
- Click Redeploy button (yellow button, replaces "Deploy")
- Confirmation Dialog appears:
- "This will restart the environment. Active sessions will be disconnected."
- Force Redeploy checkbox (optional):
- Enabled: Redeploys even if status is already "Running"
- Disabled: Only redeploys if changes detected
- Click Confirm Redeploy
- Deployment Progress modal opens (same as initial deployment)
Downtime: 2-5 minutes (containers are recreated)
Note: Database is preserved unless explicitly destroyed.
Auto-Deploy
Enable Auto-Deploy
Automatically redeploy when code is pushed to Git:
- Navigate to environment → Settings → Repositories tab
- Toggle Auto-Deploy to ON
- Click Save Changes
What happens:
- OEC.SH creates webhook in Git repository
- On push to
git_branch, webhook triggers - Deployment starts automatically
- Notification sent to project members
Recommendation:
- ✅ Enable: Development environments (fast iteration)
- ⚠️ Consider: Staging environments (automated testing)
- ❌ Disable: Production environments (manual control)
Disable Auto-Deploy
- Navigate to environment → Settings → Repositories tab
- Toggle Auto-Deploy to OFF
- Click Save Changes
Manual Deployments Only: Push to Git will not trigger deployment.
API Reference
Deploy Environment Endpoint
POST /api/v1/projects/{project_id}/environments/{env_id}/deploy
Content-Type: application/json
Authorization: Bearer {jwt_token}Path Parameters:
project_id(UUID, required) - The project UUIDenv_id(UUID, required) - The environment UUID
Query Parameters:
force(boolean, optional, default: false) - Force redeploy even if already runningforce_restore(boolean, optional, default: false) - Force re-restore migration backup (requires confirmation)
Request Body: None
Response (202 Accepted):
{
"deployment_id": "deployment-uuid",
"environment_id": "env-uuid",
"status": "pending",
"trigger": "manual",
"started_at": "2024-12-11T10:30:00Z",
"message": "Deployment started successfully"
}Error Responses:
| Status | Error Code | Description |
|---|---|---|
| 400 | DEPLOYMENT_IN_PROGRESS | Another deployment is already running |
| 400 | NO_SERVER_ASSIGNED | Environment doesn't have vm_id set |
| 400 | SERVER_OFFLINE | Target server is not in RUNNING status |
| 403 | PERMISSION_DENIED | Missing project.environments.deploy permission |
| 404 | ENVIRONMENT_NOT_FOUND | Environment doesn't exist |
Get Deployment Progress
GET /api/v1/deployments/{deployment_id}/progress
Authorization: Bearer {jwt_token}Response (200 OK):
{
"deployment_id": "uuid",
"status": "deploying|success|failed",
"progress_percent": 45,
"current_step": "pulling_image",
"steps": [...],
"started_at": "2024-12-11T10:30:00Z",
"completed_at": null,
"duration_seconds": 85.5,
"error_message": null
}Full API Documentation: See Deployment API Reference
Related Features
- Create Environment - Set up a new environment
- Edit Environment - Modify configuration before deploying
- View Deployment Logs - Monitor deployment in detail
- Retry Failed Deployment - Retry after failures
- Stop Environment - Stop running containers
- Start Environment - Start stopped containers
- Destroy Environment - Remove all containers and data
Best Practices
Pre-Deployment Checklist
Before deploying, verify:
- ✅ Server is in RUNNING status
- ✅ Server has sufficient capacity (CPU, RAM, disk)
- ✅ Organization quota available
- ✅ Git branch exists (if using Git integration)
- ✅ Custom domain DNS configured (if using custom domain)
- ✅ No concurrent deployments in progress
Development Workflow
Recommended Flow:
- Create environment (staging or development)
- Deploy with default settings
- Test functionality
- Make configuration changes as needed
- Redeploy to apply changes
- Once stable, clone to production
Production Deployment
Best Practices:
- Deploy during low-traffic hours (minimize disruption)
- Test in staging first (validate changes work)
- Disable auto-deploy (manual control)
- Monitor deployment logs (catch errors early)
- Create backup before redeploying (safety net)
- Notify users of planned downtime
Error Recovery
If deployment fails:
- Read Error Message: Understand what went wrong
- Check Logs: Review detailed logs for step that failed
- Fix Root Cause: Address the underlying issue
- Retry Deployment: Use Retry button or redeploy
- Contact Support: If issue persists, get help
Deployment Performance
Typical Durations
| Scenario | Duration | Notes |
|---|---|---|
| First Deployment | 3-5 minutes | Full image pull + database init |
| Redeployment (cached image) | 2-3 minutes | Image cached, database exists |
| Auto-Deploy (code change) | 2-3 minutes | Same as redeploy |
| Large Repositories | 4-6 minutes | Multiple repos with many dependencies |
| Slow Network | 5-10 minutes | Slow Docker image download |
Performance Optimization
To speed up deployments:
- Use Cached Images: Don't change Odoo version frequently
- Minimize Dependencies: Keep
requirements.txtlean - Small Repositories: Avoid large binary files in Git
- Fast Network: Ensure server has good internet connection
- SSD Storage: Use SSDs for Docker volumes (faster I/O)
Next Steps
After successful deployment:
- Access your environment - Click the environment URL
- Login to Odoo - Use auto-generated admin credentials
- Configure Odoo - Install modules, set up users
- Create backup - See Create Manual Backup
- Monitor performance - Check Monitoring tab for metrics
- View logs - See View Deployment Logs
Last Updated: December 11, 2025 Applies to: OEC.SH v2.0+ Related Sprint: Sprint 2E41 - Documentation System