├── .gitignore ├── README.md ├── config ├── nginx │ └── conf │ │ └── default.conf └── odoo │ └── odoo.conf └── docker-compose.yml /.gitignore: -------------------------------------------------------------------------------- 1 | odoo-web-data/* 2 | odoo-db-data/* 3 | .env 4 | docker-compose.override.yml 5 | *.pyc 6 | .vscode/ 7 | README.md 8 | env-sample 9 | include_utils.sh 10 | addons/addons 11 | certbot/* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Odoo ERP, PostgreSQL and Nginx Compose 🔥 🇧🇷 2 | 3 | + Odoo 4 | + PostgreSQL 5 | + Nginx 6 | + Certbot Letsencrypt SSL 7 | + Installations and use simplified ❤ 8 | 9 | ## Odoo ERP 🖥️ 10 | ![project-image](https://user-images.githubusercontent.com/59855397/216739166-c91ef374-50d4-4b9e-bfb4-987954f5f0f2.png) 11 | 12 | 13 | ### Clone this repository 14 | 15 | git clone --recurse-submodules --remote-submodules https://github.com/DanielNery/odoo-docker-compose-nginx-postgresql.git --branch=master 16 | 17 | ### Steps To Live 18 | 19 | # On odoo-docker-compose-nginx-postgresql directory 20 | sudo mkdir ./odoo-web-data && sudo mkdir ./addons && sudo chmod -R 777 ./addons && sudo chmod -R 777 ./odoo-web-data && sudo docker-compose up -d 21 | 22 | # Check container id from odoo 23 | sudo docker ps 24 | 25 | # Copy default addons (Optional) 26 | sudo docker cp :/usr/lib/python3/dist-packages/odoo/addons ./addons 27 | 28 | 29 | ### Commands 30 | 31 | # Check services running on ports of interest 32 | sudo lsof -i -P -n | grep 80 33 | 34 | # Kill process running on port of interest 35 | sudo service apache2 stop 36 | # Containers Up 37 | sudo docker-compose up -d 38 | # Obs: 'd' is from detached 39 | 40 | # Allow permissions to read filestore 41 | sudo chmod 777 ./odoo-web-data 42 | 43 | # Down containers (Alert: This deletes all config your containers) 44 | sudo docker-compose down 45 | 46 | 47 | # See Logs 48 | sudo docker-compose logs --tail=100 -f 49 | 50 | 51 | # Start, Stop and check containers 52 | sudo docker-compose start 53 | sudo docker-compose stop 54 | sudo docker-compose ps 55 | 56 | # Init database with base modules 57 | sudo docker-compose stop odoo && \ 58 | sudo docker-compose run --rm odoo odoo -c /etc/odoo/odoo.conf -i base --stop-after-init && \ 59 | sudo docker-compose restart 60 | 61 | 62 | # Up Odoo updating modules 63 | sudo docker-compose stop odoo && \ 64 | sudo docker-compose run --rm odoo odoo -c /etc/odoo/odoo.conf -u modules_name --stop-after-init && \ 65 | sudo docker-compose restart 66 | 67 | 68 | # Generate database backup 69 | export DATABASE=your_database && sudo docker-compose run --rm -e PGPASSWORD=odoo -e DATABASE=$DATABASE db pg_dump -h db -U odoo $DATABASE > /tmp/db-${DATABASE}-$(date +%Y%m%d%H%M).dump 70 | 71 | 72 | # Restore your database 73 | cat your_file_name.dump | docker exec -i postgresql psql -U odoo -d your_database_name 74 | 75 | 76 | # Security copy 'dumps files' from server to your local machine 77 | scp server_user@link_server:/tmp/db-your_db_name.dump ~/Downloads/db-your_db_name.dump && 78 | scp -r server_user@link_server:/home/ubuntu/projects/your-erp/odoo-web-data/filestore/your_filestore_name ~/Downloads/your_filestore_name 79 | 80 | 81 | # List databases on postgres container 82 | docker exec postgresql psql -U odoo -l 83 | 84 | 85 | # Delete databases on postgres container 86 | docker exec postgresql psql -U odoo drop database your_database_name 87 | 88 | 89 | ### Nginx SSL config example 90 | 91 | server { 92 | listen 443 ssl; 93 | server_name domain.com.br; 94 | 95 | ssl_certificate /etc/letsencrypt/live/domain.com.br/fullchain.pem; 96 | ssl_certificate_key /etc/letsencrypt/live/domain.com.br/privkey.pem; 97 | 98 | location / { 99 | proxy_pass http://odoo:8069; 100 | proxy_redirect off; 101 | proxy_set_header Host $host; 102 | proxy_set_header X-Real-IP $remote_addr; 103 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 104 | proxy_set_header X-Forwarded-Proto $scheme; 105 | 106 | # Configurações adicionais de proxy, se necessário 107 | } 108 | 109 | location ~ /.well-known/acme-challenge/ { 110 | root /var/www/certbot; 111 | } 112 | 113 | error_page 500 502 503 504 /50x.html; 114 | location = /50x.html { 115 | root /usr/share/nginx/html; 116 | } 117 | } 118 | 119 | ## Documentation 📜 120 | 121 | + https://docs.docker.com/ 122 | + https://docs.docker.com/compose/ 123 | + https://www.odoo.com/documentation/14.0/ 124 | + https://nginx.org/en/docs/ 125 | + https://www.postgresql.org/docs/ 126 | 127 | ### Linux Basic Commands 🐧 128 | 129 | ` sudo apt update && sudo apt upgrade -y `
130 | ` sudo apt install docker docker-compose -y `
131 | ` git clone https://github.com/DanielNery/odoo-docker-compose-nginx-postgresql.git `
132 | ` cd odoo-docker-compose-nginx-postgresql `
133 | ` sudo docker-compose up -d `
134 | 135 | ### Windowns or Mac Tutorial 🍎 136 | 137 | + Install Docker Desktop https://www.docker.com/products/docker-desktop/ 138 | 139 | ` git clone https://github.com/DanielNery/odoo-docker-compose-nginx-postgresql.git `
140 | ` cd odoo-docker-compose-nginx-postgresql `
141 | ` docker-compose up -d `
142 | 143 | 144 | ### Update or custom modules 🍺 145 | 146 | `docker-compose stop odoo && sudo docker-compose run --rm odoo odoo -c /etc/odoo/odoo.conf -u your_module 147 | --stop-after-init && docker-compose start odoo`
148 | 149 | ### Contact 📞 150 | 151 | + Linkedin: https://www.linkedin.com/in/danielpontesnery/ 152 | + Email: danielpontesnery@gmail.com 153 | 154 | -------------------------------------------------------------------------------- /config/nginx/conf/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name domain.com.br; 4 | 5 | location / { 6 | proxy_pass http://odoo:8069; 7 | proxy_redirect off; 8 | proxy_set_header Host $host; 9 | proxy_set_header X-Real-IP $remote_addr; 10 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 11 | proxy_set_header X-Forwarded-Proto $scheme; 12 | } 13 | 14 | location ~ /\.well-known/acme-challenge { 15 | allow all; 16 | root /var/www/certbot; 17 | default_type "text/plain"; 18 | try_files $uri =404; 19 | } 20 | 21 | error_page 500 502 503 504 /50x.html; 22 | location = /50x.html { 23 | root /usr/share/nginx/html; 24 | } 25 | } -------------------------------------------------------------------------------- /config/odoo/odoo.conf: -------------------------------------------------------------------------------- 1 | [options] 2 | ; Modules Config 3 | addons_path = /mnt/extra-addons 4 | ; Security Config 5 | admin_passwd = your_master_passwd 6 | csv_internal_sep = , 7 | data_dir = /var/lib/odoo 8 | ; Database config 9 | db_host = db ;Docker reference to postgre database 10 | db_maxconn = 9 11 | db_name = your_database 12 | db_filter = your_database 13 | db_password = odoo 14 | db_port = 5432 15 | db_template = template1 16 | db_user = odoo 17 | ; Server Config 18 | demo = {} 19 | email_from = False 20 | geoip_database = /usr/share/GeoIP/GeoLite2-City.mmdb 21 | limit_memory_hard = 6000000000 22 | limit_memory_soft = 6000000000 23 | limit_request = 8192 24 | limit_time_cpu = 43200 25 | limit_time_real = 86400 26 | limit_time_real_cron = -1 27 | list_db = True 28 | log_db = False 29 | log_db_level = warning 30 | log_handler = :INFO 31 | log_level = info 32 | logfile = None 33 | logrotate = False 34 | longpolling_port = 8072 35 | max_cron_threads = 2 36 | osv_memory_age_limit = 1.0 37 | osv_memory_count_limit = False 38 | pg_path = None 39 | pidfile = None 40 | proxy_mode = True 41 | reportgz = False 42 | server_wide_modules = web 43 | smtp_password = False 44 | smtp_port = 25 45 | smtp_server = localhost 46 | smtp_ssl = False 47 | smtp_user = False 48 | syslog = False 49 | test_commit = False 50 | test_enable = False 51 | test_file = False 52 | test_report_directory = False 53 | translate_modules = ['all'] 54 | unaccent = False 55 | without_demo = True 56 | ;workers = 5 57 | xmlrpc = True 58 | xmlrpc_port = 8069 59 | xmlrpc_interface = 0.0.0.0 60 | wkhtmltopdf_path = /usr/local/bin/wkhtmltopdf -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | odoo: 4 | container_name: odoo 5 | image: odoo:latest 6 | restart: always 7 | volumes: 8 | - ./addons:/mnt/extra-addons/:rw 9 | - ./config/odoo:/etc/odoo/:rw 10 | - ./odoo-web-data:/var/lib/odoo/:rw 11 | ports: 12 | - "8069:8069" 13 | depends_on: 14 | - "db" 15 | networks: 16 | - odoo_network 17 | nginx: 18 | container_name: nginx 19 | image: nginx:latest 20 | restart: unless-stopped 21 | ports: 22 | - 80:80 23 | - 443:443 24 | volumes: 25 | - ./config/nginx/conf:/etc/nginx/conf.d/:rw 26 | - ./certbot/conf:/etc/letsencrypt 27 | - ./certbot/www:/var/www/certbot 28 | depends_on: 29 | - "odoo" 30 | networks: 31 | - odoo_network 32 | certbot: 33 | image: certbot/certbot 34 | volumes: 35 | - ./certbot/conf:/etc/letsencrypt 36 | - ./certbot/www:/var/www/certbot 37 | command: certonly --webroot -w /var/www/certbot --force-renewal --email youremail@email.com -d domain.com.br --agree-tos 38 | depends_on: 39 | - nginx 40 | networks: 41 | - odoo_network 42 | 43 | db: 44 | image: postgres:13 45 | restart: always 46 | container_name: postgresql 47 | environment: 48 | - POSTGRES_PASSWORD=odoo 49 | - POSTGRES_USER=odoo 50 | - POSTGRES_DB=postgres 51 | - PGDATA=/var/lib/postgresql/data/pgdata 52 | ports: 53 | - "127.0.0.1:9432:5432" 54 | volumes: 55 | - ./odoo-db-data:/var/lib/postgresql/data/pgdata 56 | networks: 57 | - odoo_network 58 | logging: 59 | driver: json-file 60 | options: 61 | max-size: "30m" 62 | max-file: "10" 63 | 64 | networks: 65 | odoo_network: 66 | driver: bridge 67 | 68 | volumes: 69 | odoo-web-data: 70 | odoo-db-data: 71 | --------------------------------------------------------------------------------