Built with Rust · Open Source

Manage Odoo
from your terminal

Create, deploy, backup, and scale Odoo instances with a single command. Designed for production servers running Ubuntu.

~
$ dooservice instance create -n my-erp -V 17.0
Creating instance 'my-erp' (Odoo 17.0)...
✓ PostgreSQL container ready
✓ Odoo container ready
✓ Instance 'my-erp' created
 
$ dooservice instance start my-erp
✓ Instance 'my-erp' started on port 8069
 
$ dooservice proxy init --base-domain erp.io --email a@erp.io
✓ Traefik proxy initialized
✓ SSL certificate issued for *.erp.io
→ my-erp.erp.io is live
 
$ _

Install in seconds

One command to install. Requires Ubuntu 20.04+ and root access. Docker is installed automatically if missing.

Install Specific version
$ curl -fsSL https://dooservice.sh/install.sh | sudo bash
$ DOOSERVICE_VERSION=v0.1.0 curl -fsSL https://dooservice.sh/install.sh | sudo bash
1 Detects your architecture (x86_64 / aarch64)
OS Ubuntu 20.04+ (x86_64 / aarch64)
2 Installs Docker if not present
Docker Auto-installed if missing
3 Downloads the latest binary from GitHub Releases
Access Root or sudo
4 Places dooservice in /usr/local/bin
Disk ~50MB + space for containers

Everything you need to run Odoo

From single instances to multi-server deployments, DooService handles the entire lifecycle.

Instance Management

Create, start, stop, restart, clone, and delete Odoo instances. Each runs in isolated Docker containers with dedicated PostgreSQL.

DockerPostgreSQLIsolation

Addon System

Install addons from GitHub with auto-detection. Pin to tags or commits. Deploy across all instances with one command. CI/CD integration included.

GitHubCI/CDPinning

Reverse Proxy & SSL

Built-in Traefik integration with automatic SSL via Let's Encrypt. Supports Cloudflare, Route53, and DigitalOcean DNS for wildcard certs.

TraefikLet's EncryptWildcard

Backups & Restore

Full, database-only, or filestore-only backups with SHA256 verification. Automatic cleanup of old backups. Restore to any instance.

SHA256ScheduledRestore

Health Monitoring

Real-time container health checks. CPU, memory, and network statistics per instance. Filter by health state across all instances.

CPUMemoryReal-time

Resource Profiles

Predefined resource profiles (starter, professional, enterprise) or custom limits. Control CPU, memory, workers, and disk per instance.

WorkersLimitsProfiles

Your first instance in under a minute

Terminal
# Create an Odoo 17.0 instance
$ dooservice instance create -n my-odoo -V 17.0
 
# Start it
$ dooservice instance start my-odoo
 
# Add a custom addon from GitHub
$ dooservice addon add my-odoo -u https://github.com/user/my-addon -b 17.0
 
# Set up reverse proxy with SSL
$ dooservice proxy init --base-domain example.com --email admin@example.com
 
# Create a backup
$ dooservice backup create my-odoo

Command Reference

Complete documentation for every command. Use dooservice --help or dooservice <command> --help for inline help.

Global Options

These flags apply to all commands.

--db-path <PATH>Path to the database file (env: DOOSERVICE_DB_PATH)
--instances-dir <PATH>Path to instances directory. Default: ~/.dooservice (env: DOOSERVICE_INSTANCES_DIR)
--docker-socket <PATH>Path to Docker socket (env: DOCKER_HOST)
-v, --verboseIncrease verbosity: -v (info), -vv (debug), -vvv (trace)
-q, --quietSuppress all output
-o, --output <FORMAT>Output format: table (default) or json

Create, manage, and monitor Odoo instances. Each instance runs in isolated Docker containers with its own PostgreSQL database.

instance create

Create a new Odoo instance with dedicated containers.

dooservice instance create -n <NAME> [OPTIONS]
-n, --name <NAME>Required. Unique instance name
-V, --version <VERSION>Odoo version. Default: 17.0
-p, --port <PORT>HTTP port. Default: 8069
--db-user <USER>Database user. Default: odoo
--db-password <PASS>Database password. Default: odoo
--no-postgresDon't create a dedicated PostgreSQL container
--no-proxyDon't expose via reverse proxy
--subdomain <SUB>Custom subdomain. Default: instance name
--user <USER>Container user. Default: odoo
--timezone <TZ>Timezone. Default: America/Lima
--language <LANG>Default language. Default: es_PE
--profile <PROFILE>Resource profile (starter, professional, enterprise)
--memory <MB>Memory limit in MB (overrides profile)
--cpu <CORES>CPU cores (e.g., 1.5, overrides profile)
--workers <N>Number of web workers
--disk <MB>Disk quota in MB
--pg-memory <MB>PostgreSQL memory in MB
--pg-cpu <CORES>PostgreSQL CPU cores
--no-db-initSkip automatic database initialization
# Basic instance
$ dooservice instance create -n my-odoo -V 17.0
 
# Production with resource profile
$ dooservice instance create -n production -V 17.0 --profile professional --subdomain erp
 
# Custom resources
$ dooservice instance create -n heavy -V 17.0 --memory 4096 --cpu 4 --workers 8

instance list

List all instances with their status.

dooservice instance list [OPTIONS]
-s, --state <STATE>Filter by state: created, running, stopped, failed
$ dooservice instance list
$ dooservice instance list -s running
$ dooservice instance list -o json

instance show

Show detailed information about an instance.

dooservice instance show <INSTANCE>
$ dooservice instance show my-odoo
$ dooservice instance show my-odoo -o json

instance start / stop / restart

Control the instance lifecycle.

dooservice instance start|stop|restart <INSTANCE>
-f, --force(stop only) Force stop without graceful shutdown
$ dooservice instance start my-odoo
$ dooservice instance stop my-odoo
$ dooservice instance restart my-odoo
$ dooservice instance stop my-odoo --force

instance delete

Delete an instance and optionally its volumes.

dooservice instance delete <INSTANCE> [OPTIONS]
--volumesAlso remove associated Docker volumes
-y, --yesSkip confirmation prompt
$ dooservice instance delete my-odoo
$ dooservice instance delete my-odoo --volumes -y

instance logs

View Odoo container logs.

dooservice instance logs <INSTANCE> [OPTIONS]
-n, --tail <COUNT>Number of lines. Default: 100
$ dooservice instance logs my-odoo
$ dooservice instance logs my-odoo -n 500

instance exec

Execute a command inside the Odoo container.

dooservice instance exec <INSTANCE> -- <COMMAND>
$ dooservice instance exec my-odoo -- ls /mnt/extra-addons
$ dooservice instance exec my-odoo -- odoo scaffold my_module /mnt/extra-addons

instance shell

Open an interactive shell in the Odoo container.

dooservice instance shell <INSTANCE>

instance update

Update instance configuration (instance must be stopped first).

dooservice instance update <INSTANCE> [OPTIONS]
--http-port <PORT>New HTTP port
--db-host <HOST>New database host
--db-port <PORT>New database port
--db-user <USER>New database user
--db-password <PASS>New database password
--db-name <NAME>New database name
--timezone <TZ>New timezone
--postgres-version <VER>New PostgreSQL version (manual migration required)
$ dooservice instance stop my-odoo
$ dooservice instance update my-odoo --http-port 8070 --timezone UTC
$ dooservice instance start my-odoo

instance stats

Show container resource statistics (CPU, memory, network I/O).

dooservice instance stats <INSTANCE>

instance clone

Clone an existing instance with its configuration and optionally data.

dooservice instance clone -s <SOURCE> -n <NAME> [OPTIONS]
-s, --source <SOURCE>Required. Source instance name or ID
-n, --name <NAME>Required. Name for the new instance
--with-dataClone with data (backup + restore)
--no-addonsDon't clone addons
# Clone structure only
$ dooservice instance clone -s production -n staging
 
# Clone with data and addons
$ dooservice instance clone -s production -n staging --with-data

instance update-resources

Update resource limits for an instance.

dooservice instance update-resources <INSTANCE> [OPTIONS]
--profile <PROFILE>New resource profile
--memory <MB>New memory limit for Odoo
--cpu <CORES>New CPU cores for Odoo
--workers <N>New worker count
--disk <MB>New disk quota in MB
--pg-memory <MB>PostgreSQL memory in MB
--pg-cpu <CORES>PostgreSQL CPU cores
--restartRestart immediately to apply changes
$ dooservice instance update-resources my-odoo --memory 4096 --cpu 4 --restart
$ dooservice instance update-resources my-odoo --profile enterprise --restart

Manage Odoo addons from GitHub repositories. Auto-detects repository type and modules. Supports pinning, CI/CD, and multi-instance deploys.

addon add

Add a GitHub addon to an instance. Clones the repository and configures the Odoo addons path.

dooservice addon add <INSTANCE> -u <URL> [OPTIONS]
-u, --url <URL>Required. GitHub repository URL (HTTPS or SSH)
-b, --branch <BRANCH>Branch to use. Default: main
$ dooservice addon add my-odoo -u https://github.com/OCA/web -b 17.0
$ dooservice addon add my-odoo -u git@github.com:user/custom-addon.git -b main

addon list

List all addons, optionally filtered by instance.

dooservice addon list [-i <INSTANCE>]

addon show

Show detailed information about an addon (modules, commit, state).

dooservice addon show <ADDON_ID>

addon update

Pull latest changes for one or all addons.

dooservice addon update <TARGET> [OPTIONS]
TARGETAddon ID, or all to update all addons for an instance
-i, --instance <INSTANCE>Required when target is all
$ dooservice addon update <addon-id>
$ dooservice addon update all -i my-odoo

addon remove

Remove an addon from an instance.

dooservice addon remove <ADDON_ID> -i <INSTANCE>

addon delete

Delete an addon completely.

dooservice addon delete <ADDON_ID> [-y]

addon pin / unpin

Pin an addon to a specific tag or commit, or unpin to follow branch HEAD.

dooservice addon pin <ADDON_ID> --tag <TAG> | --commit <HASH>
$ dooservice addon pin <addon-id> --tag v2.1.0
$ dooservice addon pin <addon-id> --commit a1b2c3d
$ dooservice addon unpin <addon-id>

addon cleanup

Clean up orphan addons (failed or removed state).

dooservice addon cleanup [-y]

addon deploy

Pull latest changes and restart all instances that use the addon. Designed for CI/CD pipelines.

dooservice addon deploy <ADDON> -b <BRANCH>
ADDONAddon name or ID
-b, --branch <BRANCH>Required. Branch (e.g., 19.0, 19.0-dev)
$ dooservice addon deploy my-addon -b 17.0

addon setup-ci

Set up GitHub Actions CI/CD. Generates an SSH deploy key, pushes a workflow file to the repo, and prints the secrets to configure.

dooservice addon setup-ci <ADDON> -b <BRANCH> [-s <SERVER>]
ADDONAddon name or ID
-b, --branch <BRANCH>Required. Branch
-s, --server <SERVER>Server label. Default: system hostname
# Auto-configure CI/CD for production server
$ dooservice addon setup-ci my-addon -b 17.0 -s production
 
# Then configure these GitHub Secrets:
# PRODUCTION_HOST = your-server-ip
# PRODUCTION_USER = root
# PRODUCTION_KEY = (printed SSH private key)

addon remove-ci

Remove the GitHub Actions workflow from an addon repository.

dooservice addon remove-ci <ADDON> [-b <BRANCH>] [-s <SERVER>]
-b, --branch <BRANCH>Branch filter. If omitted, removes from all branches
-s, --server <SERVER>Server label. Default: system hostname
$ dooservice addon remove-ci my-addon -b 17.0 -s production
$ dooservice addon remove-ci my-addon # removes from all branches

Create, restore, verify, and manage backups. Supports full, database-only, and filestore-only backup types.

backup create

Create a backup of an instance.

dooservice backup create <INSTANCE> [OPTIONS]
-t, --type <TYPE>Backup type: full (default), database, filestore
-d, --description <DESC>Optional description
$ dooservice backup create my-odoo
$ dooservice backup create my-odoo -t database -d "Before migration"

backup list

List all backups, optionally filtered by instance.

dooservice backup list [-i <INSTANCE>]

backup show

Show backup details (size, type, checksum, date).

dooservice backup show <BACKUP_ID>

backup restore

Restore a backup to an instance.

dooservice backup restore <INSTANCE> -b <BACKUP_ID> [-y]
$ dooservice backup restore my-odoo -b <backup-id>
$ dooservice backup restore staging -b <backup-id> -y

backup delete

Delete a specific backup.

dooservice backup delete <BACKUP_ID> [-y]

backup cleanup

Delete backups older than a specified number of days.

dooservice backup cleanup [OPTIONS]
--older-than <DAYS>Delete backups older than N days. Default: 30
-i, --instance <INSTANCE>Filter by instance
-y, --yesSkip confirmation
$ dooservice backup cleanup --older-than 7 -y
$ dooservice backup cleanup --older-than 30 -i production

backup verify

Verify a backup's integrity by checking its SHA256 checksum.

dooservice backup verify <BACKUP_ID>

Manage PostgreSQL databases within an instance's container.

db list

List all databases in an instance.

dooservice db list <INSTANCE>

db create

Create a new database.

dooservice db create <INSTANCE> -n <NAME>

db delete

Delete a database.

dooservice db delete <INSTANCE> -n <NAME> [-y]

db duplicate

Duplicate a database within the same instance.

dooservice db duplicate <INSTANCE> --source <DB> --target <DB>
$ dooservice db duplicate my-odoo --source production --target test_copy

Manage the Traefik reverse proxy for automatic HTTPS routing with Let's Encrypt certificates.

proxy init

Initialize the reverse proxy with Traefik. Supports DNS challenge (wildcard certs) and HTTP challenge.

dooservice proxy init --base-domain <DOMAIN> --email <EMAIL> [OPTIONS]
--base-domain <DOMAIN>Required. Base domain (e.g., example.com)
--email <EMAIL>Required. Email for Let's Encrypt
--dns-provider <PROVIDER>DNS provider: cloudflare, route53, digitalocean
--cf-token <TOKEN>Cloudflare API Token
--http-challengeUse HTTP challenge (no wildcard)
--stagingUse Let's Encrypt staging (for testing)
--dashboardEnable Traefik dashboard
--http-port <PORT>HTTP port. Default: 80
--https-port <PORT>HTTPS port. Default: 443
# Cloudflare DNS with wildcard SSL
$ dooservice proxy init --base-domain example.com --email admin@example.com \
--dns-provider cloudflare --cf-token <your-token>
 
# HTTP challenge (simpler, no wildcard)
$ dooservice proxy init --base-domain example.com --email admin@example.com --http-challenge

proxy status / start / stop / restart

Control the proxy container lifecycle and view status.

dooservice proxy status|start|stop|restart

proxy routes

View active proxy routes (domain-to-instance mappings).

dooservice proxy routes

proxy logs

View proxy container logs.

dooservice proxy logs [-n <COUNT>]

proxy destroy

Destroy the proxy, removing the container and network.

dooservice proxy destroy [-y]

Monitor instance health and container status.

health check

Check health of a specific instance.

dooservice health check <INSTANCE> [-d]
-d, --detailsShow detailed component status

health status

Show health status of all instances at a glance.

dooservice health status [-f <STATE>]
-f, --filter <STATE>Filter: healthy, degraded, unhealthy, unknown

Manage resource profiles for instances. Profiles define CPU, memory, workers, and disk limits.

profile list / show

List all profiles or show details of a specific profile.

dooservice profile list [--all]
dooservice profile show <PROFILE>

profile create

Create a custom resource profile.

dooservice profile create -n <NAME> -d <DESC> --memory <MB> --cpu <CORES> [OPTIONS]
-n, --name <NAME>Required. Profile name
-d, --description <DESC>Required. Description
--memory <MB>Required. Memory limit in MB
--cpu <CORES>Required. CPU cores
--workers <N>Web workers (auto-calculated if omitted)
--disk <MB>Disk quota in MB
--pg-memory <MB>PostgreSQL memory
--pg-cpu <CORES>PostgreSQL CPU
--price <CENTS>Monthly price in cents. Default: 0
$ dooservice profile create -n custom-large -d "Large instances" --memory 8192 --cpu 8 --workers 16

profile update / delete / init

Update, delete, or initialize default profiles.

dooservice profile update <PROFILE> [OPTIONS]
dooservice profile delete <PROFILE> [-y]
dooservice profile init

Inspect the internal database for troubleshooting.

debug dump-db / tables / table

Dump database contents or inspect specific tables.

dooservice debug dump-db [--full]
dooservice debug tables
dooservice debug table <NAME>
$ dooservice debug tables
$ dooservice debug table instances
$ dooservice debug dump-db --full