Runbooks
Common operational procedures for the odoo platform.
Deployment
Deploy to Production
# 1. Ensure all CI gates pass on main
gh run list --workflow "ci-odoo.yml" --repo jgtolentino/odoo
# 2. SSH to production server
ssh root@<PRODUCTION_IP>
# 3. Pull latest changes
cd /opt/odoo/repo
git pull origin main
# 4. Rebuild and restart containers
docker compose build --no-cache
docker compose down && docker compose up -d
# 5. Verify health
curl -s http://localhost:8069/web/health
Deploy IPAI Modules
# Run deployment script
./scripts/deploy-odoo-modules.sh
# Or manually update specific module
docker compose exec odoo-core odoo -d odoo_core -u ipai_finance_ppm --stop-after-init
# Verify module status
docker compose exec odoo-core odoo shell -d odoo_core <<< "print(env['ir.module.module'].search([('name','=','ipai_finance_ppm')]).state)"
Backup & Restore
Database Backup
# Create backup
docker compose exec postgres pg_dump -U odoo odoo_core > backup_$(date +%Y%m%d_%H%M%S).sql
# Compressed backup
docker compose exec postgres pg_dump -U odoo odoo_core | gzip > backup_$(date +%Y%m%d_%H%M%S).sql.gz
Database Restore
# Stop Odoo first
docker compose stop odoo-core
# Drop existing database
docker compose exec postgres dropdb -U odoo odoo_core
# Create fresh database
docker compose exec postgres createdb -U odoo odoo_core
# Restore backup
cat backup.sql | docker compose exec -T postgres psql -U odoo odoo_core
# Start Odoo
docker compose start odoo-core
Filestore Backup
# Backup filestore
tar -czf filestore_$(date +%Y%m%d_%H%M%S).tar.gz /var/lib/odoo/.local/share/Odoo/filestore/
# Restore filestore
tar -xzf filestore_backup.tar.gz -C /var/lib/odoo/.local/share/Odoo/filestore/
Troubleshooting
Odoo Won't Start
# Check logs
docker compose logs -f odoo-core
# Check database connection
docker compose exec postgres psql -U odoo -c "SELECT 1"
# Check disk space
df -h
# Check memory
free -h
Module Installation Failed
# Check Odoo logs for errors
docker compose logs odoo-core | grep -i error
# Try with verbose logging
docker compose exec odoo-core odoo -d odoo_core -i module_name --log-level=debug --stop-after-init
Database Connection Issues
# Check PostgreSQL status
docker compose ps postgres
docker compose logs postgres
# Test connection
docker compose exec postgres pg_isready -U odoo
# Restart PostgreSQL
docker compose restart postgres
Permission Errors (SCSS)
# Fix addon permissions
./scripts/verify-addon-permissions.sh
# Or manually
ssh root@<SERVER_IP>
cd /opt/odoo/repo/addons
chown -R 100:101 ipai ipai_theme_tbwa*
chmod -R 755 ipai ipai_theme_tbwa*
docker restart odoo-prod
Maintenance
Clear Browser Cache
Instruct users to:
1. Hard refresh: Ctrl+Shift+R (Windows/Linux) or Cmd+Shift+R (Mac)
2. Clear browser cache for the Odoo domain
Clear Odoo Assets Cache
# Clear assets
docker compose exec odoo-core odoo shell -d odoo_core << 'EOF'
env['ir.attachment'].search([('res_model', '=', 'ir.ui.view'), ('type', '=', 'binary')]).unlink()
env.cr.commit()
EOF
# Restart Odoo
docker compose restart odoo-core
Update OCA Modules
# Update OCA submodules
git submodule update --remote --merge
# Commit changes
git add addons/oca
git commit -m "chore(oca): update OCA modules"
git push
Monitoring
Health Checks
# Basic health
curl -s -o /dev/null -w "%{http_code}" http://localhost:8069/web/health
# Database status
docker compose exec postgres psql -U odoo -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database"
# Container status
docker compose ps
Log Analysis
# Recent errors
docker compose logs --since 1h odoo-core | grep -i error
# Access patterns
docker compose logs --since 1h odoo-core | grep "HTTP/1" | awk '{print $1}' | sort | uniq -c | sort -rn
# Slow queries
docker compose exec postgres psql -U odoo -c "SELECT query, calls, mean_time FROM pg_stat_statements ORDER BY mean_time DESC LIMIT 10"
Emergency Procedures
Rollback Deployment
# Identify previous working commit
git log --oneline -10
# Checkout previous version
git checkout <PREVIOUS_SHA>
# Rebuild and restart
docker compose build --no-cache
docker compose down && docker compose up -d
Database Point-in-Time Recovery
# If using continuous archiving, restore to specific time
# (Requires WAL archiving to be configured)
# Stop Odoo
docker compose stop odoo-core
# Restore from base backup + WAL
# ... (depends on backup configuration)
# Start Odoo
docker compose start odoo-core
Contact Information
- On-Call: Check PagerDuty rotation
- Slack: #odoo-ops
- Escalation: @tech-leads