Procházet zdrojové kódy

:wrench: add systemd support for container

Jeremy Zheng před 1 rokem
rodič
revize
67dfd81fce

+ 4 - 0
deploy/README.md

@@ -87,3 +87,7 @@ php ./migrations/20211126220400-pali_sent_index-upgrade.php
 ```bash
 /public/app/upgrade/upgrade_pali_toc.php
 ```
+
+## Documents
+
+- [Configure a container to start automatically as a systemd service](https://www.redhat.com/en/blog/container-systemd-persist-reboot)

+ 2 - 0
deploy/group_vars/all.yml

@@ -10,3 +10,5 @@ app_postgresql_version: "16"
 app_open_search_version: "2.19.1"
 app_php_version: "8.1"
 app_php_memory_limit: "128M"
+app_container_prefix: "mint"
+app_consumer_loop_limit_ai_translate: 128

+ 34 - 9
deploy/mint.yml

@@ -38,17 +38,35 @@
         state: restarted
         name: postgresql
 
-- name: Setup mint background workers
+- name: Start mint background workers
   hosts:
     - task
-  roles:
-    - mint-workers
+  tasks:
+    - name: Start worker service
+      ansible.builtin.systemd_service:
+        name: "{{ app_container_prefix }}-{{ app_domain }}-worker-mq-{{ item }}"
+        enabled: true
+        state: restarted
+        scope: user
+      loop:
+        - discussion
+        - pr
+        - progress
+        - wbw.analyses
+        - export.pali.chapter
+        - export.article
+        - ai.translate
 
-- name: Setup mint php-fpm
+- name: Start mint php-fpm
   hosts:
     - fpm
-  roles:
-    - mint-php-fpm
+  tasks:
+    - name: Start fpm service
+      ansible.builtin.systemd_service:
+        name: "{{ app_container_prefix }}-{{ app_domain }}-fpm-{{ app_php_fpm_port }}"
+        enabled: true
+        state: restarted
+        scope: user
 
 - name: Setup nginx
   hosts:
@@ -56,8 +74,15 @@
   roles:
     - mint-nginx
 
-- name: Setup single-node worker
+- name: Start single-node worker
   hosts:
     - fort
-  roles:
-    - mint-fort
+  tasks:
+    - name: Start schedule run service
+      ansible.builtin.systemd_service:
+        name: "{{ app_container_prefix }}-{{ app_domain }}-worker-{{ item }}"
+        enabled: true
+        state: restarted
+        scope: user
+      loop:
+        - schedule-run

+ 0 - 27
deploy/roles/mint-fort/tasks/main.yml

@@ -1,27 +0,0 @@
-- name: Upload script for schedule-run
-  ansible.builtin.template:
-    src: schedule-run.sh.j2
-    dest: "{{ app_deploy_target }}/scripts/worker-schedule-run.sh"
-    mode: "0555"
-
-- name: Stop schedule-run
-  containers.podman.podman_container:
-    name: "{{ app_domain }}-worker-schedule-run"
-    state: absent
-
-- name: Start schedule-run
-  containers.podman.podman_container:
-    name: "{{ app_domain }}-worker-schedule-run"
-    image: "{{ app_mint_image_name }}"
-    command: "{{ app_deploy_target }}/scripts/worker-schedule-run.sh"
-    volumes:
-      - "{{ app_deploy_target }}:{{ app_deploy_target }}:z"
-    workdir: "{{ app_deploy_target }}"
-    # auto_remove: true
-    # generate_systemd:
-    #   path: "{{ app_deploy_target | dirname }}/systemd"
-    #   container_prefix: mint
-    #   names: true
-    #   restart_policy: always
-    #   stop_timeout: 120
-# TODO timer

+ 21 - 0
deploy/roles/mint-v2.1/tasks/laravel.yml

@@ -32,6 +32,27 @@
     workdir: "{{ app_deploy_target }}"
     # auto_remove: true
 
+- name: Setup background worker
+  ansible.builtin.include_tasks: workers.yml
+  vars:
+    zone_name: mq
+  loop:
+    - discussion
+    - pr
+    - progress
+    - wbw.analyses
+    - export.pali.chapter
+    - export.article
+    - ai.translate
+  loop_control:
+    loop_var: worker_name
+
+- name: Setup schedule run worker
+  ansible.builtin.include_tasks: workers.yml
+  vars:
+    zone_name: schedule
+    worker_name: run
+
 - name: Create a current link
   ansible.builtin.file:
     src: "{{ app_deploy_target }}"

+ 8 - 0
deploy/roles/mint-v2.1/tasks/main.yml

@@ -27,7 +27,15 @@
 - name: Setup laravel
   ansible.builtin.import_tasks: laravel.yml
 
+- name: Setup php-fpm
+  ansible.builtin.import_tasks: php-fpm.yml
+
 - name: Force systemd to reread configs
   become: true
   ansible.builtin.systemd:
     daemon_reload: true
+
+- name: Force systemd to reread configs(user)
+  ansible.builtin.systemd:
+    daemon_reload: true
+    scope: user

+ 10 - 2
deploy/roles/mint-php-fpm/tasks/main.yml → deploy/roles/mint-v2.1/tasks/php-fpm.yml

@@ -1,6 +1,6 @@
 - name: Upload php-fpm.sh
   ansible.builtin.template:
-    src: launch.sh.j2
+    src: containers/php-fpm.sh.j2
     dest: "{{ app_deploy_target }}/scripts/php-fpm.sh"
     mode: "0555"
 
@@ -9,7 +9,7 @@
     name: "{{ app_domain }}-fpm-{{ app_php_fpm_port }}"
     state: absent
 
-- name: Start php-fpm worker
+- name: Create php-fpm worker
   containers.podman.podman_container:
     name: "{{ app_domain }}-fpm-{{ app_php_fpm_port }}"
     image: "{{ app_mint_image_name }}"
@@ -20,3 +20,11 @@
       - "{{ app_deploy_target }}:{{ app_deploy_target }}:z"
     workdir: "{{ app_deploy_target }}"
     # auto_remove: true
+    state: present
+    generate_systemd:
+      path: "{{ ansible_env.HOME }}/.config/systemd/user"
+      container_prefix: "{{ app_container_prefix }}"
+      new: true
+      names: true
+      restart_policy: always
+      stop_timeout: 120

+ 10 - 2
deploy/roles/mint-workers/tasks/worker.yml → deploy/roles/mint-v2.1/tasks/workers.yml

@@ -1,6 +1,6 @@
 - name: Upload script for worker-{{ zone_name }}-{{ worker_name }}
   ansible.builtin.template:
-    src: worker.sh.j2
+    src: containers/worker.sh.j2
     dest: "{{ app_deploy_target }}/scripts/worker-{{ zone_name }}-{{ worker_name }}.sh"
     mode: "0555"
 
@@ -9,7 +9,7 @@
     name: "{{ app_domain }}-worker-{{ zone_name }}-{{ worker_name }}"
     state: absent
 
-- name: Start {{ zone_name }}-{{ worker_name }}
+- name: Create {{ zone_name }}-{{ worker_name }}
   containers.podman.podman_container:
     name: "{{ app_domain }}-worker-{{ zone_name }}-{{ worker_name }}"
     image: "{{ app_mint_image_name }}"
@@ -17,4 +17,12 @@
     volumes:
       - "{{ app_deploy_target }}:{{ app_deploy_target }}:z"
     workdir: "{{ app_deploy_target }}"
+    state: present
     # auto_remove: true
+    generate_systemd:
+      path: "{{ ansible_env.HOME }}/.config/systemd/user"
+      container_prefix: "{{ app_container_prefix }}"
+      new: true
+      names: true
+      restart_policy: always
+      stop_timeout: 120

+ 0 - 0
deploy/roles/mint-php-fpm/templates/launch.sh.j2 → deploy/roles/mint-v2.1/templates/containers/php-fpm.sh.j2


+ 3 - 5
deploy/roles/mint-fort/templates/schedule-run.sh.j2 → deploy/roles/mint-v2.1/templates/containers/worker.sh.j2

@@ -9,8 +9,6 @@ source "$NVM_DIR/nvm.sh"
 
 cd $WORK_DIR/api-v8/
 
-while true
-do
-    php -d memory_limit={{ app_php_memory_limit }} artisan schedule:run || true
-    sleep 60
-done
+php -d memory_limit={{ app_php_memory_limit }} artisan {{ zone_name }}:{{ worker_name }}
+
+exit 0

+ 2 - 0
deploy/roles/mint-v2.1/templates/v2/env.j2

@@ -93,3 +93,5 @@ FTP_HOST="{{ app_ftp_host }}"
 
 APP_ICP_CODE="{{ app_icp_code }}"
 APP_MPS_CODE="{{ app_mps_code }}"
+
+MQ_LOOP_LIMIT_AI_TRANSLATE="{{ app_consumer_loop_limit_ai_translate }}"

+ 0 - 14
deploy/roles/mint-workers/tasks/main.yml

@@ -1,14 +0,0 @@
-- name: Setup background worker
-  ansible.builtin.include_tasks: worker.yml
-  vars:
-    zone_name: mq
-  loop:
-    - discussion
-    - pr
-    - progress
-    - wbw.analyses
-    - export.pali.chapter
-    - export.article
-    - ai.translate
-  loop_control:
-    loop_var: worker_name

+ 0 - 20
deploy/roles/mint-workers/templates/worker.sh.j2

@@ -1,20 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export WORK_DIR="{{ app_deploy_target }}"
-
-export NVM_DIR="$HOME/.nvm"
-source "$NVM_DIR/nvm.sh"
-
-cd $WORK_DIR/api-v8/
-
-# php -d memory_limit={{ app_php_memory_limit }} artisan {{ zone_name }}:{{ worker_name }}
-
-while true
-do
-    php -d memory_limit={{ app_php_memory_limit }} artisan {{ zone_name }}:{{ worker_name }} || true
-    sleep 10
-done
-
-exit 0