Compare commits

..

15 Commits

Author SHA1 Message Date
julienfastre 0dcd51b601 adapt role: the image should not be run as root, but with user with id 82. 2026-05-15 15:15:24 +02:00
julienfastre 8ccb88503a Update messenger consumer shell command for preserved environment variables
Replaced `su` with `su -p` in `compose.yaml` to ensure the environment variables of the parent shell are preserved when running the messenger consumer.
2026-04-18 01:00:36 +02:00
julienfastre 3f99ea7fcd Add support for supplementary environment values in Chill configuration
Introduced `supplementary_environment_values` in Chill defaults and updated `env_file.env` template to dynamically inject custom environment variables. Added placeholder `docker_secrets` for future secrets management.
2026-03-13 12:58:11 +01:00
julienfastre 9904b9a038 Separate deprecation logs into a dedicated handler and adjust console log level to error 2026-01-27 16:21:58 +01:00
julienfastre 93c4534204 Make proxy IP configuration dynamic and expand RabbitMQ settings
Added a new `proxy_ips` variable for flexible proxy IP configuration in Chill defaults and updated framework template. Enhanced RabbitMQ integration with a conditional `rabbitmq_install` option.
2026-01-27 16:21:52 +01:00
julienfastre 43a8ccff28 Make RabbitMQ integration optional in Chill configuration
Introduced a new `rabbitmq_install` variable to conditionally enable RabbitMQ components in `compose.yaml`, `messenger.yaml`, and `env_file.env`. Updated related Ansible tasks to respect this variable.
2026-01-27 16:21:34 +01:00
julienfastre 38a3d44897 Update monolog configuration to use dynamic log prefix and add error log handler
Revised `monolog.yaml` to replace static `log_prefix` with `chill_environment` variable and added a new `errors_log` handler. Expanded exclusion channels in default handler to include `deprecation`.
2026-01-23 08:56:47 +01:00
julienfastre 92ca7f27ab Add optional port exposure for chill service in compose.yaml 2026-01-20 17:07:42 +01:00
julienfastre 655d0cfbcf Disable expose_port for chill configuration in defaults/main.yml 2026-01-20 17:07:13 +01:00
julienfastre 64d0a63e68 handle traefik_install variables, and set default values for each chill configuration 2026-01-20 16:33:32 +01:00
julienfastre f545970f05 Make Traefik installation optional via traefik_install variable 2026-01-19 17:55:29 +01:00
julienfastre 4b9e3a08e3 Update logrotate paths for chill logs
Adjusted logrotate configuration to use `/var/log/chill/*` paths instead of `/var/log/apt/*` for privacy and notifier logs, ensuring correct log management.
2025-10-27 17:01:07 +01:00
julienfastre c550ca6f85 Update chill-send-sms timer configuration
Refined `chill-send-sms@.timer` to adjust OnCalendar format, add `Persistent=true`, and align `WantedBy` with `timers.target` for improved scheduling and reliability.
2025-10-27 16:48:15 +01:00
julienfastre e1cb23a9a6 Add chill-send-sms systemd service and timer
Introduced new systemd `chill-send-sms@.service` and `chill-send-sms@.timer` to schedule and execute SMS sending feature. Updated Ansible tasks to manage these units.
2025-10-27 16:29:25 +01:00
julienfastre 789a3229e5 Update monolog configuration and extend logrotate for notifier logs
Revised `monolog.yaml` to add a new "notifier" channel, updated handlers, and adjusted log settings. Extended logrotate configuration to include rotation rules for notifier logs, ensuring proper log management.
2025-10-27 15:55:46 +01:00
12 changed files with 217 additions and 92 deletions
+47
View File
@@ -9,3 +9,50 @@ chill_image_redis: "redis"
chill_image_rabbitmq: "rabbitmq:3-management-alpine"
chill_image_relatorio: "registry.gitlab.com/champs-libres/public/relatorio-tornado/app:latest"
traefik_image_traefik: "traefik:v3.2"
# to install or not traefik as front-end
traefik_install: true
docker_secrets: []
# default chill config for each environment
default_chill:
chill_environment: main_env
add_postgres: false
chill_image_tag: v0.0.1-beta
host: 'devpms.samusocial.be'
tls_config: self_signed
expose_port: false # can be false, or the port number
# use rabbitmq as message broker. If not in use, it will be replaced by doctrine
rabbitmq_install: true
proxy_ips:
# 127.0.0.1 is always added
- 192.168.0.0/16
- 10.0.0.0/8
- 172.16.0.0/12
chill_config:
# supplementary environment values to set in the in the env file
supplementary_environment_values: {}
trusted_hosts: 'devpms.samusocial.be '
database_host: '172.17.17.71'
database_port: '5432'
database_name: 'chilldev'
database_user: 'chilldev'
database_version: '15'
# database_password:
mailer_user: ''
mailer_host: 'smtp.example.com'
mailer_port: '25'
notification_host: 'https://devpms.samusocial.be '
notification_from_email: 'devpms@samusocial.be'
# app_secret:
# admin_password:
mailer_dsn: 'null://null'
mailer_url: 'null://null'
# jwt_passphrase:
# jwt_secret_key: '1234'
# jwt_public_key: '1234'
rabbitmq_user: 'chilldev'
# rabbitmq_password:
editor_server: 'https://collabora.champs-libres.be'
ovhcloud_dsn: 'null://null'
+17 -16
View File
@@ -1,10 +1,10 @@
- name: Debug task
ansible.builtin.debug:
var: item
- name: Merge defaults with item
ansible.builtin.set_fact:
chill: "{{ default_chill | combine(item, recursive=True) }}"
- name: Create directories to store compose project
ansible.builtin.file:
path: "{{ install_dir }}/{{ item['chill_environment'] }}"
path: "{{ install_dir }}/{{ chill['chill_environment'] }}"
state: directory
mode: '0755'
owner: "{{ as_user }}"
@@ -12,44 +12,45 @@
- name: Add compose.yml file
ansible.builtin.template:
src: compose.yaml
dest: "{{ install_dir }}/{{ item['chill_environment'] }}/compose.yaml"
dest: "{{ install_dir }}/{{ chill['chill_environment'] }}/compose.yaml"
owner: "{{ as_user }}"
mode: '0444'
- name: Add application environment file
ansible.builtin.template:
src: env_file.env
dest: "{{ install_dir }}/{{ item['chill_environment'] }}/env_file.env"
dest: "{{ install_dir }}/{{ chill['chill_environment'] }}/env_file.env"
owner: "{{ as_user }}"
mode: '0400'
- name: Add postgresql environment file if need
ansible.builtin.template:
src: postgres.env
dest: "{{ install_dir }}/{{ item['chill_environment'] }}/postgres.env"
dest: "{{ install_dir }}/{{ chill['chill_environment'] }}/postgres.env"
owner: "{{ as_user }}"
mode: '0400'
- name: Add rabbitmq environment file
ansible.builtin.template:
src: rabbitmq.env
dest: "{{ install_dir }}/{{ item['chill_environment'] }}/rabbitmq.env"
dest: "{{ install_dir }}/{{ chill['chill_environment'] }}/rabbitmq.env"
owner: "{{ as_user }}"
mode: '0400'
when: chill.rabbitmq_install
- name: Create directory for storing configuration
ansible.builtin.file:
path: "{{ install_dir }}/{{ item['chill_environment'] }}/config/prod"
path: "{{ install_dir }}/{{ chill['chill_environment'] }}/config/prod"
state: directory
owner: "{{ as_user }}"
mode: '0400'
owner: "82"
mode: '0500'
- name: Copy configuration files
ansible.builtin.template:
src: "config/prod/{{ file }}"
dest: "{{ install_dir }}/{{ item['chill_environment'] }}/config/prod/{{ file }}"
owner: "{{ as_user }}"
mode: '0444'
dest: "{{ install_dir }}/{{ chill['chill_environment'] }}/config/prod/{{ file }}"
owner: "82"
mode: '0400'
loop:
- lexik_jwt_authentication.yaml
- messenger.yaml
@@ -61,7 +62,7 @@
- name: Create directory for storing data
ansible.builtin.file:
path: "{{ doc_storage_dir }}/{{ item['chill_environment'] }}"
path: "{{ doc_storage_dir }}/{{ chill['chill_environment'] }}"
owner: "82"
group: "82"
mode: '0766'
@@ -71,6 +72,6 @@
#
# - name: Ensure systemd timer for cronjob is up
# ansible.builtin.systemd_service:
# name: "chill-cronjob@{{ item['chill_environment'] }}.timer"
# name: "chill-cronjob@{{ chill['chill_environment'] }}.timer"
# state: restarted
# enabled: true
+4 -4
View File
@@ -1,18 +1,18 @@
- name: Create directory for storing certificates
ansible.builtin.file:
path: "/var/traefik/certs/chill/{{ item['chill_environment'] }}"
path: "/var/traefik/certs/chill/{{ chill['chill_environment'] }}"
state: directory
owner: "{{ as_user }}"
mode: '0400'
- name: Create private key
community.crypto.openssl_privatekey:
path: "/var/traefik/certs/chill/{{ item['chill_environment'] }}/key.pem"
path: "/var/traefik/certs/chill/{{ chill['chill_environment'] }}/key.pem"
- name: Create self signed certificate
community.crypto.x509_certificate:
privatekey_path: "/var/traefik/certs/chill/{{ item['chill_environment'] }}/key.pem"
path: "/var/traefik/certs/chill/{{ item['chill_environment'] }}/cert.pem"
privatekey_path: "/var/traefik/certs/chill/{{ chill['chill_environment'] }}/key.pem"
path: "/var/traefik/certs/chill/{{ chill['chill_environment'] }}/cert.pem"
provider: selfsigned
+3 -4
View File
@@ -13,10 +13,6 @@
docker_install_compose_plugin: true
docker_add_repo: true
- name: Print all available facts
ansible.builtin.debug:
var: ansible_facts
- name: Authenticate against private docker registry
community.docker.docker_login:
registry_url: "{{ registry_url }}"
@@ -60,6 +56,7 @@
- name: Install traefik
ansible.builtin.include_tasks: traefik.yml
when: traefik_install
- name: Install systemd services
ansible.builtin.template:
@@ -72,6 +69,8 @@
loop:
- chill-cronjob@.service
- chill-cronjob@.timer
- chill-send-sms@.service
- chill-send-sms@.timer
loop_control:
loop_var: file
+37 -15
View File
@@ -2,42 +2,58 @@
services:
frontend:
image: {{ registry_url }}/{{ registry_project }}/{{ chill_image_nginx_name }}:{{ item.chill_image_tag }}
image: {{ registry_url }}/{{ registry_project }}/{{ chill_image_nginx_name }}:{{ chill.chill_image_tag }}
links:
- app:php
{% if traefik_install %}
labels:
- "traefik.enable=true"
- "traefik.docker.network=traefik"
- "traefik.http.routers.frontend-{{ item.chill_environment }}.rule=Host(`{{ item.host }}`)"
- "traefik.http.routers.frontend-{{ item.chill_environment }}.entrypoints=websecure"
{%+ if item.tls_config == 'self_signed' +%}
- "traefik.http.routers.frontend-{{ item.chill_environment }}.tls=true"
- "traefik.http.routers.frontend-{{ chill.chill_environment }}.rule=Host(`{{ chill.host }}`)"
- "traefik.http.routers.frontend-{{ chill.chill_environment }}.entrypoints=websecure"
{%+ if chill.tls_config == 'self_signed' +%}
- "traefik.http.routers.frontend-{{ chill.chill_environment }}.tls=true"
{%+ endif +%}
{%+ if item.expose_port is not false +%}
- "traefik.http.routers.frontend-exp-{{ item.chill_environment }}.rule=PathPrefix(`/`)"
- "traefik.http.routers.frontend-exp-{{ item.chill_environment }}.entrypoints=chill{{ item.chill_environment }}"
{%+ if item.tls_config == 'self_signed' +%}
- "traefik.http.routers.frontend-exp-{{ item.chill_environment }}.tls=true"
{%+ if chill.expose_port is not false +%}
- "traefik.http.routers.frontend-exp-{{ chill.chill_environment }}.rule=PathPrefix(`/`)"
- "traefik.http.routers.frontend-exp-{{ chill.chill_environment }}.entrypoints=chill{{ chill.chill_environment }}"
{%+ if chill.tls_config == 'self_signed' +%}
- "traefik.http.routers.frontend-exp-{{ chill.chill_environment }}.tls=true"
{%+ endif +%}
{%+ endif +%}
{% endif %}
{% if chill.expose_port is not false +%}
ports:
- "{{ chill.expose_port }}:80"
{%+ endif %}
networks:
{% if traefik_install %}
- traefik
{% endif %}
- default
restart: always
app: &defaultApp
image: {{ registry_url }}/{{ registry_project }}/{{ chill_image_php_name }}:{{ item.chill_image_tag }}
image: {{ registry_url }}/{{ registry_project }}/{{ chill_image_php_name }}:{{ chill.chill_image_tag }}
env_file:
- env_file.env
volumes:
- './config/prod:/var/www/app/config/packages/prod:ro'
- '/var/log/chill:/var/www/app/var/log:rw'
- '{{ doc_storage_dir }}/{{ item['chill_environment'] }}:/var/storage:rw'
- '{{ doc_storage_dir }}/{{ chill['chill_environment'] }}:/var/storage:rw'
links:
- redis
- relatorio
{% if chill.rabbitmq_install +%}
- rabbitmq
{% if item.add_postgres -%}
{%+ endif %}
{% if chill.add_postgres -%}
- database
{%- endif %}
@@ -57,7 +73,7 @@ services:
sleep 3 && bin/console cache:clear &&
while ! [ -f /tmp/kill_me ];
do
su -s /bin/bash -c 'php -d memory_limit=2G bin/console messenger:consume priority async --limit=20 --time-limit=600 -v' "www-data";
php -d memory_limit=2G bin/console messenger:consume priority async --limit=40 --time-limit=600 -v;
done;
pre_stop:
- command:
@@ -71,7 +87,7 @@ services:
command: ["bin/console", "chill:cron-job:execute", "-v"]
restart: "no"
{% if item.add_postgres %}
{% if chill.add_postgres %}
database:
image: "{{ database_image }}"
@@ -123,6 +139,7 @@ services:
# rabbitmq:
# condition: service_healthy
{% if chill.rabbitmq_install +%}
rabbitmq:
image: "{{ chill_image_rabbitmq }}"
env_file:
@@ -135,8 +152,13 @@ services:
networks:
- default
restart: always
{% endif %}
networks:
{% if traefik_install %}
traefik:
external: true
{% endif %}
default:
+4
View File
@@ -1,7 +1,11 @@
# this file is managed by ansible. Do not edit it by hand
framework:
{% if traefik_install +%}
trusted_proxies: '127.0.0.1,REMOTE_ADDR{% for ip in traefik_trusted_ips|default([]) %},{{ ip }}{% endfor %}'
{%+ else %}
trusted_proxies: '127.0.0.1,{% for ip in chill.proxy_ips %}{{ ip }}{% if not loop.last %},{% endif %}{% endfor %}'
{%+ endif %}
trusted_headers: ['x-forwarded-for', 'x-forwarded-host', 'x-forwarded-proto', 'x-forwarded-port']
parameters:
+6 -1
View File
@@ -2,6 +2,7 @@
framework:
messenger:
transports:
{% if chill.rabbitmq_install +%}
async:
dsn: '%env(RABBITMQ_URL)%/async'
options:
@@ -12,5 +13,9 @@ framework:
async: ~
auto_setup: true
priority: '%env(RABBITMQ_URL)%/priority'
{% else +%}
async: 'doctrine://default'
priority: 'doctrine://default'
{% endif +%}
failed: 'doctrine://default?queue_name=failed'
sync: 'sync://'
sync: 'sync://'
+38 -17
View File
@@ -1,20 +1,41 @@
# this file is managed by ansible. Do not edit it by hand
#
# NOTE: the ansible-role-chill will also configure a rule for logrotate, so,
# we do not need to configure log rotation here
#
parameters:
log_prefix: {{ item.chill_environment }}
log_prefix: '{{ chill.chill_environment }}'
monolog:
handlers:
default_log:
type: stream
path: "%kernel.logs_dir%/privacy-%log_prefix%.log"
level: info
channels: ['chill']
chill_log:
type: stream
path: "%kernel.logs_dir%/default-%log_prefix%.log"
level: info
channels: ['!event', '!doctrine', '!console', '!chill']
console:
type: console
process_psr_3_messages: false
channels: ['!event', '!doctrine', '!console']
bubble: false
# make a "notifier" channel available
channels: ['notifier']
handlers:
notifier_log:
type: stream
path: "%kernel.logs_dir%/notifier-%log_prefix%.log"
level: info
channels: [ 'notifier' ]
errors_log:
type: stream
path: "%kernel.logs_dir%/error-%log_prefix%.log"
level: error
privacy_log:
type: stream
path: "%kernel.logs_dir%/privacy-%log_prefix%.log"
level: info
channels: [ 'chill' ]
default_log:
type: stream
path: "%kernel.logs_dir%/default-%log_prefix%.log"
level: info
channels: [ '!event', '!doctrine', '!console', '!chill', '!deprecation']
deprecation_log:
type: 'null'
channels: [ 'deprecation' ]
console:
type: console
process_psr_3_messages: false
level: error
channels: [ '!event', '!doctrine', '!console', '!deprecation']
bubble: true
+33 -27
View File
@@ -8,39 +8,45 @@ REDIS_PORT=6379
REDIS_URL=redis://redis:6379
RELATORIO_HOST=relatorio
RELATORIO_PORT=8888
TRUSTED_HOSTS={{ item.chill_config.trusted_hosts }}
DATABASE_HOST={{ item.chill_config.database_host }}
DATABASE_PORT={{ item.chill_config.database_port }}
DATABASE_NAME={{ item.chill_config.database_name }}
DATABASE_USER={{ item.chill_config.database_user }}
DATABASE_VERSION={{ item.chill_config.database_version }}
TRUSTED_HOSTS={{ chill.chill_config.trusted_hosts }}
DATABASE_HOST={{ chill.chill_config.database_host }}
DATABASE_PORT={{ chill.chill_config.database_port }}
DATABASE_NAME={{ chill.chill_config.database_name }}
DATABASE_USER={{ chill.chill_config.database_user }}
DATABASE_VERSION={{ chill.chill_config.database_version }}
LOCALE=fr
MAILER_PROTOCOL=smtp
MAILER_USER={{ item.chill_config.mailer_user }}
MAILER_HOST={{ item.chill_config.mailer_host }}
MAILER_PORT={{ item.chill_config.mailer_port }}
NOTIFICATION_HOST={{ item.chill_config.notification_host }}
NOTIFICATION_FROM_EMAIL={{ item.chill_config.notification_from_email }}
MAILER_USER={{ chill.chill_config.mailer_user }}
MAILER_HOST={{ chill.chill_config.mailer_host }}
MAILER_PORT={{ chill.chill_config.mailer_port }}
NOTIFICATION_HOST={{ chill.chill_config.notification_host }}
NOTIFICATION_FROM_EMAIL={{ chill.chill_config.notification_from_email }}
ASYNC_UPLOAD_TEMP_URL_BASE_PATH=
ASYNC_UPLOAD_TEMP_URL_CONTAINER=
ASYNC_UPLOAD_TEMP_URL_KEY=
DEFAULT_CARRIER_CODE=FR
APP_SECRET={{ item.chill_config.app_secret }}
ADMIN_PASSWORD={{ item.chill_config.admin_password }}
{% if item.chill_config.admin_password_1 is defined -%}
ADMIN_PASSWORD_1={{ item.chill_config.admin_password_1 }}
APP_SECRET={{ chill.chill_config.app_secret }}
ADMIN_PASSWORD={{ chill.chill_config.admin_password }}
{% if chill.chill_config.admin_password_1 is defined -%}
ADMIN_PASSWORD_1={{ chill.chill_config.admin_password_1 }}
{% endif -%}
{% if item.chill_config.admin_password_2 is defined -%}
ADMIN_PASSWORD_2={{ item.chill_config.admin_password_2 }}
{% if chill.chill_config.admin_password_2 is defined -%}
ADMIN_PASSWORD_2={{ chill.chill_config.admin_password_2 }}
{% endif -%}
{% if item.chill_config.admin_password_3 is defined -%}
ADMIN_PASSWORD_3={{ item.chill_config.admin_password_3 }}
{% if chill.chill_config.admin_password_3 is defined -%}
ADMIN_PASSWORD_3={{ chill.chill_config.admin_password_3 }}
{% endif -%}
MAILER_DSN={{ item.chill_config.mailer_dsn }}
MAILER_URL={{ item.chill_config.mailer_url }}
JWT_PASSPHRASE={{ item.chill_config.jwt_passphrase }}
JWT_SECRET_KEY={{ item.chill_config.jwt_secret_key }}
JWT_PUBLIC_KEY={{ item.chill_config.jwt_public_key }}
RABBITMQ_URL=amqp://{{ item.chill_config.rabbitmq_user }}:{{ item.chill_config.rabbitmq_password }}@rabbitmq/%2f
DATABASE_URL=postgres://{{ item.chill_config.database_user }}:{{ item.chill_config.database_password }}@{% if item.add_postgres %}database:5432{% else %}{{ item.chill_config.database_host }}{% endif %}/{{ item.chill_config.database_name }}?sslmode=prefer&charset=utf8&serverVersion={{ item.chill_config.database_version }}
EDITOR_SERVER={{ item.chill_config.editor_server }}
MAILER_DSN={{ chill.chill_config.mailer_dsn }}
MAILER_URL={{ chill.chill_config.mailer_url }}
JWT_PASSPHRASE={{ chill.chill_config.jwt_passphrase }}
JWT_SECRET_KEY={{ chill.chill_config.jwt_secret_key }}
JWT_PUBLIC_KEY={{ chill.chill_config.jwt_public_key }}
{% if chill.rabbitmq_install %}
RABBITMQ_URL=amqp://{{ chill.chill_config.rabbitmq_user }}:{{ chill.chill_config.rabbitmq_password }}@rabbitmq/%2f
{% endif %}
DATABASE_URL=postgres://{{ chill.chill_config.database_user }}:{{ chill.chill_config.database_password }}@{% if chill.add_postgres %}database:5432{% else %}{{ chill.chill_config.database_host }}{% endif %}/{{ chill.chill_config.database_name }}?sslmode=prefer&charset=utf8&serverVersion={{ chill.chill_config.database_version }}
EDITOR_SERVER={{ chill.chill_config.editor_server }}
OVHCLOUD_DSN={{ chill.chill_config.ovhcloud_dsn }}
{% for k, v in chill.chill_config.supplementary_environment_values.items() %}
{{ k }}="{{ v }}"
{% endfor %}
+8 -8
View File
@@ -1,17 +1,17 @@
/var/log/chill/default-*.log {
/var/log/chill/*.log {
su php-fpm php-fpm
rotate 90
daily
compress
missingok
notifempty
copytruncate
rotate 90
}
/var/log/apt/privacy-*.log {
su php-fpm php-fpm
/var/log/chill/privacy-*.log {
rotate 180
daily
compress
missingok
notifempty
}
/var/log/chill/notifier-*.log {
rotate 800
}
@@ -0,0 +1,9 @@
[Unit]
Description=Execute send-short-messages for chill with environment %i
[Service]
User={{ as_user }}
ExecStart=/usr/bin/docker compose --file {{ install_dir }}/%i/compose.yaml run cron bin/console chill:calendar:send-short-messages
Type=simple
# execute maximum 30 minutes
RuntimeMaxSec=1800
+11
View File
@@ -0,0 +1,11 @@
[Unit]
Description=Run chill send-sms hourly 7:0018:00 at minute 0
[Timer]
Unit=chill-send-sms@%i.service
OnCalendar=*-*-* 7..18:00:00
Persistent=true
RandomizedDelaySec=60
[Install]
WantedBy=timers.target