From 4e04f882e589f719a6efa497d2a08c69a65348ff Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Fri, 25 Apr 2025 12:51:28 +0200 Subject: [PATCH] Optimized espocrm websocket and docker-compose --- group_vars/all/09_ports.yml | 1 + roles/docker-espocrm/tasks/main.yml | 14 +++++- .../templates/docker-compose.yml.j2 | 49 +++++++++++++------ roles/docker-espocrm/templates/env.j2 | 16 ++++-- roles/docker-espocrm/vars/main.yml | 2 +- 5 files changed, 61 insertions(+), 21 deletions(-) diff --git a/group_vars/all/09_ports.yml b/group_vars/all/09_ports.yml index 0f28bfde..18a7bbd1 100644 --- a/group_vars/all/09_ports.yml +++ b/group_vars/all/09_ports.yml @@ -3,6 +3,7 @@ ports: localhost: web_socket: mastodon: 4001 + espocrm: 4002 oauth2_proxy: phpmyadmin: 4181 lam: 4182 diff --git a/roles/docker-espocrm/tasks/main.yml b/roles/docker-espocrm/tasks/main.yml index 82c4deed..2b974b84 100644 --- a/roles/docker-espocrm/tasks/main.yml +++ b/roles/docker-espocrm/tasks/main.yml @@ -1,17 +1,29 @@ +# ./roles/docker-espocrm/tasks/main.yml --- - name: "include docker-central-database" include_role: name: docker-central-database +# -- Nginx reverse proxy and Let's Encrypt certificates (same pattern as the Gitea role) -- +- name: "include role nginx-domain-setup for {{ application_id }}" + include_role: + name: nginx-domain-setup + vars: + domain: "{{ domains[application_id] }}" + http_port: "{{ ports.localhost.http[application_id] }}" + +# -- Copy docker-compose.yml and .env -- - name: "copy docker-compose.yml and env file" include_tasks: copy-docker-compose-and-env.yml +# -- Ensure containers are (re)started after the initial setup -- - name: flush docker service meta: flush_handlers when: applications.espocrm.setup | bool +# -- Run database initialisation or upgrade -- - name: "run database setup / upgrade" command: cmd: "docker compose run --rm web php command.php upgrade" chdir: "{{ docker_compose.directories.instance }}" - when: applications.espocrm.setup | bool \ No newline at end of file + when: applications.espocrm.setup | bool diff --git a/roles/docker-espocrm/templates/docker-compose.yml.j2 b/roles/docker-espocrm/templates/docker-compose.yml.j2 index 6e35ffcd..e39d8af6 100644 --- a/roles/docker-espocrm/templates/docker-compose.yml.j2 +++ b/roles/docker-espocrm/templates/docker-compose.yml.j2 @@ -6,15 +6,20 @@ services: image: espocrm/espocrm:{{ applications.espocrm.version }} {% include 'roles/docker-compose/templates/services/base.yml.j2' %} environment: - - DATABASE_HOST={{ database_host }} - - DATABASE_PORT={{ database_port }} - - DATABASE_NAME={{ database_name }} - - DATABASE_USER={{ database_username }} - - DATABASE_PASSWORD={{ database_password }} - - CRON=disable # cron handled by separate service - command: apache2-foreground + # --- DB connection ---------------------------------------------------- + - ESPOCRM_DATABASE_PLATFORM=Mysql # EspoCRM expects ‘Mysql’ even for MariaDB + - ESPOCRM_DATABASE_HOST={{ database_host }} + - ESPOCRM_DATABASE_PORT={{ database_port }} + - ESPOCRM_DATABASE_NAME={{ database_name }} + - ESPOCRM_DATABASE_USER={{ database_username }} + - ESPOCRM_DATABASE_PASSWORD={{ database_password }} + # --- initial admin & site URL ---------------------------------------- + - ESPOCRM_ADMIN_USERNAME={{ applications[application_id].credentials.admin.username }} + - ESPOCRM_ADMIN_PASSWORD={{ applications[application_id].credentials.admin.password }} + - ESPOCRM_SITE_URL={{ web_protocol }}://{{ domains[application_id] }} + command: "php-fpm" healthcheck: - test: ["CMD", "curl", "-f", "http://localhost/" ] + test: ["CMD", "curl", "-f", "http://localhost/"] ports: - "127.0.0.1:{{ ports.localhost.http[application_id] }}:80" {% include 'templates/docker/container/depends-on-database.yml.j2' %} @@ -22,18 +27,34 @@ services: volumes: - data:/var/www/html - cron: + daemon: # ↔ was “espocrm-daemon” in the example image: espocrm/espocrm:{{ applications.espocrm.version }} - command: /usr/local/bin/cron.sh - restart: unless-stopped +{% include 'roles/docker-compose/templates/services/base.yml.j2' %} + entrypoint: docker-daemon.sh {% include 'templates/docker/container/depends-on-database.yml.j2' %} +{% include 'templates/docker/container/networks.yml.j2' %} volumes: - data:/var/www/html + restart: unless-stopped + + websocket: # ↔ was “espocrm-websocket” in the example + image: espocrm/espocrm:{{ applications.espocrm.version }} +{% include 'roles/docker-compose/templates/services/base.yml.j2' %} + environment: + - ESPOCRM_CONFIG_USE_WEB_SOCKET=true + - ESPOCRM_CONFIG_WEB_SOCKET_URL=ws://{{ domains[application_id] }}/ws + - ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBSCRIBER_DSN=tcp://*:7777 + - ESPOCRM_CONFIG_WEB_SOCKET_ZERO_M_Q_SUBMISSION_DSN=tcp://websocket:7777 + entrypoint: docker-websocket.sh +{% include 'templates/docker/container/depends-on-database.yml.j2' %} {% include 'templates/docker/container/networks.yml.j2' %} - healthcheck: - test: ["CMD", "pgrep", "cron"] + volumes: + - data:/var/www/html + restart: unless-stopped + ports: + - "{{ ports.localhost.websocket[application_id] | default('127.0.0.1:8081') }}:8080" {% include 'templates/docker/compose/volumes.yml.j2' %} data: -{% include 'templates/docker/compose/networks.yml.j2' %} \ No newline at end of file +{% include 'templates/docker/compose/networks.yml.j2' %} diff --git a/roles/docker-espocrm/templates/env.j2 b/roles/docker-espocrm/templates/env.j2 index 5b20513d..5b4d2fbd 100644 --- a/roles/docker-espocrm/templates/env.j2 +++ b/roles/docker-espocrm/templates/env.j2 @@ -1,10 +1,16 @@ # EspoCRM environment # Database connection -DATABASE_HOST={{ database_host }} -DATABASE_PORT={{ database_port }} -DATABASE_NAME={{ database_name }} -DATABASE_USER={{ database_username }} -DATABASE_PASSWORD={{ database_password }} +ESPOCRM_DATABASE_HOST={{ database_host }} +ESPOCRM_DATABASE_PORT={{ database_port }} +ESPOCRM_DATABASE_NAME={{ database_name }} +ESPOCRM_DATABASE_USER={{ database_username }} +ESPOCRM_DATABASE_PASSWORD={{ database_password }} +# Cron toggle +CRON_DISABLED=true + +ESPOCRM_ADMIN_USERNAME: admin +ESPOCRM_ADMIN_PASSWORD: password +ESPOCRM_SITE_URL: "http://localhost:8080" # SMTP settings (example) SMTP_HOST={{ system_email.host }} diff --git a/roles/docker-espocrm/vars/main.yml b/roles/docker-espocrm/vars/main.yml index f5c30caa..9d52dcaf 100644 --- a/roles/docker-espocrm/vars/main.yml +++ b/roles/docker-espocrm/vars/main.yml @@ -2,4 +2,4 @@ application_id: "espocrm" # Password for the espocrm DB user (taken from inventory applications dict) database_password: "{{ applications[application_id].credentials.database.password }}" # EspoCRM uses MySQL/MariaDB -database_type: "mysql" \ No newline at end of file +database_type: "mariadb" \ No newline at end of file