web-app-espocrm: add resource limits, init/stop settings and cleanups

- Added CPU, memory and PID limits for espocrm, daemon and websocket services
- Enabled init process and graceful stop (SIGTERM, 30s) in docker-compose
- Adjusted env template (removed forced True/default flags)
- Introduced entity_name/ESPOCRM_SERVICE in vars for service naming
- Minor cleanup of get_app_conf defaults

Ref: https://chatgpt.com/share/68d937ce-9c34-800f-9136-54baed9c91c7
This commit is contained in:
2025-09-28 15:50:28 +02:00
parent fc59c64273
commit a9097a3ec3
4 changed files with 48 additions and 20 deletions

View File

@@ -33,8 +33,22 @@ docker:
database:
enabled: true
espocrm:
image: "espocrm/espocrm"
version: "latest"
name: "espocrm"
image: "espocrm/espocrm"
version: "latest"
name: "espocrm"
cpus: 1.5
mem_reservation: 1.2g
mem_limit: 2g
pids_limit: 768
daemon:
cpus: 0.5
mem_reservation: 0.25g
mem_limit: 0.5g
pids_limit: 384
websocket:
cpus: 0.5
mem_reservation: 0.25g
mem_limit: 0.5g
pids_limit: 384
volumes:
data: espocrm_data

View File

@@ -1,7 +1,12 @@
{% include 'roles/docker-compose/templates/base.yml.j2' %}
web:
{% set service_name = ESPOCRM_SERVICE %}
{{ service_name }}:
container_name: {{ ESPOCRM_CONTAINER }}
image: "{{ ESPOCRM_IMAGE }}:{{ ESPOCRM_VERSION }}"
init: true
stop_signal: SIGTERM
stop_grace_period: 30s
{% include 'roles/docker-container/templates/base.yml.j2' %}
{% include 'roles/docker-container/templates/healthcheck/curl.yml.j2' %}
ports:
@@ -11,21 +16,27 @@
volumes:
- data:/var/www/html
daemon:
{% set service_name = 'daemon' %}
{{ service_name }}:
image: "{{ ESPOCRM_IMAGE }}:{{ ESPOCRM_VERSION }}"
restart: {{ DOCKER_RESTART_POLICY }}
logging:
driver: journald
container_name: {{ ESPOCRM_CONTAINER }}_{{ service_name }}
init: true
stop_signal: SIGTERM
stop_grace_period: 30s
{% include 'roles/docker-container/templates/base.yml.j2' %}
entrypoint: docker-daemon.sh
{% include 'roles/docker-container/templates/networks.yml.j2' %}
volumes:
- data:/var/www/html
websocket:
{% set service_name = 'websocket' %}
{{ service_name }}:
image: "{{ ESPOCRM_IMAGE }}:{{ ESPOCRM_VERSION }}"
restart: {{ DOCKER_RESTART_POLICY }}
logging:
driver: journald
container_name: {{ ESPOCRM_CONTAINER }}_{{ service_name }}
init: true
stop_signal: SIGTERM
stop_grace_period: 30s
{% include 'roles/docker-container/templates/base.yml.j2' %}
environment:
- ESPOCRM_CONFIG_USE_WEB_SOCKET=true
- ESPOCRM_CONFIG_WEB_SOCKET_URL={{ WEBSOCKET_PROTOCOL }}://{{ domains | get_domain(application_id) }}/ws

View File

@@ -20,7 +20,7 @@ CRON_DISABLED=true
# Initial admin account
# ------------------------------------------------
ESPOCRM_ADMIN_USERNAME={{ applications | get_app_conf(application_id, 'users.administrator.username') }}
ESPOCRM_ADMIN_PASSWORD={{ applications | get_app_conf(application_id, 'credentials.administrator_password', True) }}
ESPOCRM_ADMIN_PASSWORD={{ applications | get_app_conf(application_id, 'credentials.administrator_password') }}
# Public base URL of the EspoCRM instance
ESPOCRM_SITE_URL={{ ESPOCRM_URL }}
@@ -54,14 +54,14 @@ ESPOCRM_CONFIG_SMTP_SECURITY={{ "TLS" if SYSTEM_EMAIL.START_TLS else "SSL"}}
ESPOCRM_CONFIG_SMTP_AUTH=true
ESPOCRM_CONFIG_SMTP_USERNAME={{ users['contact'].email }}
ESPOCRM_CONFIG_SMTP_PASSWORD={{ users['contact'].mailu_token }}
ESPOCRM_CONFIG_OUTBOUND_EMAIL_FROM_NAME={{ applications | get_app_conf(application_id, 'email.from_name', True)}}
ESPOCRM_CONFIG_OUTBOUND_EMAIL_FROM_NAME={{ applications | get_app_conf(application_id, 'email.from_name')}}
ESPOCRM_CONFIG_OUTBOUND_EMAIL_FROM_ADDRESS={{ users['contact'].email }}
# ------------------------------------------------
# LDAP settings (optional)
# Applied only if the feature flag is true
# ------------------------------------------------
{% if applications | get_app_conf(application_id, 'features.ldap', False) %}
{% if applications | get_app_conf(application_id, 'features.ldap') %}
ESPOCRM_CONFIG_AUTHENTICATION_METHOD=Ldap
ESPOCRM_CONFIG_LDAP_HOST={{ LDAP.SERVER.DOMAIN }}
ESPOCRM_CONFIG_LDAP_PORT={{ LDAP.SERVER.PORT }}

View File

@@ -1,5 +1,6 @@
# General
application_id: "web-app-espocrm"
entity_name: "{{ application_id | get_entity_name }}"
# Database
database_type: "mariadb"
@@ -11,11 +12,13 @@ client_max_body_size: "100m"
vhost_flavour: "ws_generic"
# Espocrm
ESPOCRM_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.version', True) }}"
ESPOCRM_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.image', True) }}"
ESPOCRM_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.name', True) }}"
ESPOCRM_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data', True) }}"
ESPOCRM_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.version') }}"
ESPOCRM_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.image') }}"
ESPOCRM_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.espocrm.name') }}"
ESPOCRM_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') }}"
ESPOCRM_SERVICE: "{{ entity_name }}"
ESPOCRM_CONFIG_FILE_PRIVATE: "/var/www/html/data/config-internal.php"
ESPOCRM_URL: "{{ domains | get_url(application_id, WEB_PROTOCOL) }}"
ESPOCRM_OIDC_ENABLED: "{{ applications | get_app_conf(application_id, 'features.oidc', False) }}"
ESPOCRM_OIDC_ENABLED: "{{ applications | get_app_conf(application_id, 'features.oidc') }}"
ESPOCRM_USER: "www-data"