Переглянути джерело

Merge branch 'development' of github.com:visuddhinanda/mint into development

visuddhinanda 1 рік тому
батько
коміт
2753af94d2
66 змінених файлів з 1124 додано та 341 видалено
  1. 1 0
      .gitignore
  2. 16 16
      api-v8/app/Http/Api/Mq.php
  3. 1 0
      dashboard-v4/dashboard/.gitignore
  4. 1 1
      dashboard-v4/docker/README.md
  5. 1 1
      dashboard-v4/docker/spring/README.md
  6. 1 1
      dashboard-v4/docker/spring/build.sh
  7. 3 0
      deploy/.gitignore
  8. 5 0
      deploy/README.md
  9. 1 6
      deploy/ec2.yml
  10. 7 4
      deploy/group_vars/all.yml
  11. 86 0
      deploy/mint.yml
  12. 32 0
      deploy/roles/mint-dashboard-v4-build/tasks/main.yml
  13. 21 0
      deploy/roles/mint-nginx/tasks/main.yml
  14. 7 0
      deploy/roles/mint-nginx/templates/fpm.conf.j2
  15. 58 0
      deploy/roles/mint-nginx/templates/nginx.conf.j2
  16. 6 0
      deploy/roles/mint-v2.0/tasks/antd-v4.yml
  17. 23 0
      deploy/roles/mint-v2.0/tasks/lily.yml
  18. 67 0
      deploy/roles/mint-v2.0/tasks/main.yml
  19. 17 0
      deploy/roles/mint-v2.0/tasks/morus.yml
  20. 76 0
      deploy/roles/mint-v2.0/tasks/queue-workers.yml
  21. 37 0
      deploy/roles/mint-v2.0/tasks/tulip.yml
  22. 1 0
      deploy/roles/mint-v2.0/templates/lily/config.toml.j2
  23. 15 0
      deploy/roles/mint-v2.0/templates/lily/services/server.service.j2
  24. 15 0
      deploy/roles/mint-v2.0/templates/lily/services/worker.service.j2
  25. 15 0
      deploy/roles/mint-v2.0/templates/morus.service.j2
  26. 15 0
      deploy/roles/mint-v2.0/templates/queue-worker.service.j2
  27. 9 0
      deploy/roles/mint-v2.0/templates/scheduler.service.j2
  28. 13 0
      deploy/roles/mint-v2.0/templates/tulip/config.php.j2
  29. 1 0
      deploy/roles/mint-v2.0/templates/tulip/db/env.j2
  30. 15 0
      deploy/roles/mint-v2.0/templates/tulip/service.conf.j2
  31. 60 0
      deploy/roles/mint-v2.1/tasks/laravel.yml
  32. 38 0
      deploy/roles/mint-v2.1/tasks/main.yml
  33. 30 0
      deploy/roles/mint-v2.1/tasks/php-fpm.yml
  34. 11 0
      deploy/roles/mint-v2.1/tasks/schedule-run.yml
  35. 29 0
      deploy/roles/mint-v2.1/tasks/workers.yml
  36. 5 0
      deploy/roles/mint-v2.1/templates/containers/php-fpm.sh.j2
  37. 10 0
      deploy/roles/mint-v2.1/templates/containers/schedule-run.timer.j2
  38. 3 0
      deploy/roles/mint-v2.1/templates/containers/shell.sh.j2
  39. 37 0
      deploy/roles/mint-v2.1/templates/containers/vendors.sh.j2
  40. 14 0
      deploy/roles/mint-v2.1/templates/containers/worker.sh.j2
  41. 18 0
      deploy/roles/mint-v2.1/templates/v1/config.js.j2
  42. 67 0
      deploy/roles/mint-v2.1/templates/v1/config.php.j2
  43. 97 0
      deploy/roles/mint-v2.1/templates/v2/env.j2
  44. 0 0
      deploy/roles/opensearch/tasks/main.yml
  45. 0 0
      deploy/roles/opensearch/templates/server.service.j2
  46. 5 0
      deploy/roles/os/tasks/init.yml
  47. 4 0
      deploy/roles/ubuntu/tasks/main.yml
  48. 0 0
      deploy/tsearch_data/pali.stop
  49. 0 0
      deploy/tsearch_data/pali.syn
  50. 2 1
      docker/README.md
  51. 48 0
      docker/alpine/Dockerfile
  52. 16 0
      docker/alpine/build.sh
  53. 1 1
      docker/alpine/start.sh
  54. 0 161
      docker/jammy/Dockerfile
  55. 0 15
      docker/jammy/build.sh
  56. 20 6
      docker/mint/Dockerfile
  57. 15 1
      docker/mint/README.md
  58. 12 5
      docker/mint/build.sh
  59. 0 17
      docker/mint/launch.sh
  60. 0 6
      docker/mint/start.sh
  61. 13 10
      docker/spring/Dockerfile
  62. 1 1
      docker/spring/README.md
  63. 1 1
      docker/spring/build.sh
  64. 1 1
      docker/spring/start.sh
  65. 0 13
      scripts/.env.dashboard-v4
  66. 0 73
      scripts/build.sh

+ 1 - 0
.gitignore

@@ -1,2 +1,3 @@
 /tmp/
+/.ansible/
 /.vscode/launch.json

+ 16 - 16
api-v8/app/Http/Api/Mq.php

@@ -121,14 +121,19 @@ class Mq
             if ($callback !== null) {
                 try {
                     $result = $callback(json_decode($message->body));
-                    if (\App\Tools\Tools::isStop()) {
-                        Log::debug('mq worker: .stop file exist. cancel the consumer.');
-                        $message->getChannel()->basic_cancel($message->getConsumerTag());
-                    }
+            $message->ack();
+            Log::debug(
+                'mq done',
+                [
+                    'message_id' => $message->get('message_id')
+                ]
+            );
                     if ($result !== 0) {
                         throw new \Exception('task error');
                     }
                 } catch (\Exception $e) {
+			$message->nack();
+
                     // push to issues
                     Log::error('mq worker exception', ['exception' => $e]);
                     $channelName = 'issues';
@@ -145,15 +150,13 @@ class Mq
                     $channelIssues->basic_publish($msg, '', $channelName);
                     $channelIssues->close();
                 }
+
+                    if (\App\Tools\Tools::isStop()) {
+                        Log::debug('mq worker: .stop file exist. cancel the consumer.');
+                        $message->getChannel()->basic_cancel($message->getConsumerTag());
+                    }
             }
 
-            $message->ack();
-            Log::debug(
-                'mq done',
-                [
-                    'message_id' => $message->get('message_id')
-                ]
-            );
 
             //exit
             foreach (config('mint.mq.loop_limit') as $key => $value) {
@@ -202,15 +205,12 @@ class Mq
         register_shutdown_function($shutdown, $channel, $connection);
 
         $timeout = 15;
-        $deadline = time() + $timeout;
         // Loop as long as the channel has callbacks registered
         while ($channel->is_consuming()) {
             try {
-                $channel->wait(null, false, $deadline - time());
-            } catch (\Throwable $th) {
-                //throw $th;
+                $channel->wait(null, false, $timeout);
+            } catch (\AMQPTimeoutException $e) {
             }
-            // do something else
         }
     }
 }

+ 1 - 0
dashboard-v4/dashboard/.gitignore

@@ -3,6 +3,7 @@
 
 # production
 /build/
+/dist-*/
 
 # misc
 .env

+ 1 - 1
dashboard-v4/docker/README.md

@@ -11,7 +11,7 @@ sudo apt install crun podman buildah
   podman system reset # clean
   podman images # show images
   podman ps -a # show containers
-  podman load -i tmp/palm-CODE-TIMESTAMP.tar # import image
+  podman load -i tmp/CODE-TIMESTAMP.tar # import image
   ```
 
 - Envoy build

+ 1 - 1
dashboard-v4/docker/spring/README.md

@@ -11,7 +11,7 @@
 
   ```bash
   $ cd ~/workspace
-  $ ./saturn-xiv/palm/docker/spring/start.sh
+  $ ./iapt-platform/mint/docker/spring/start.sh
   > supervisord -c /etc/supervisor/supervisord.conf
   # init redis cluster
   > /etc/redis/clusters-init.sh

+ 1 - 1
dashboard-v4/docker/spring/build.sh

@@ -3,7 +3,7 @@
 set -e
 
 export VERSION=$(date "+%4Y%m%d%H%M%S")
-export CODE="palm-spring"
+export CODE="-spring"
 
 buildah pull ubuntu:latest
 buildah bud --layers -t $CODE .

+ 3 - 0
deploy/.gitignore

@@ -1,4 +1,7 @@
 /clients/
+/python/
+/shared/
 /tmp/
 /roles/mint/files/dashboard/
 *.log
+*.xz

+ 5 - 0
deploy/README.md

@@ -23,6 +23,7 @@ peony -i clients/CLUSTER ping.yml
 peony -i clients/CLUSTER ec2.yml
 # setup redis cluster nodes
 peony -i clients/CLUSTER redis.yml -l redis
+peony -i clients/CLUSTER mint.yml --extra-vars "mint_version=xxx"
 ```
 
 ## System image
@@ -86,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)

+ 1 - 6
deploy/ec2.yml

@@ -1,10 +1,5 @@
 - name: Testing ssh connections
-  hosts:
-    - web
-    - db
-    - fpm
-    - task
-    - logging
+  hosts: all,!localhost
   roles:
     - os
     - ubuntu

+ 7 - 4
deploy/group_vars/all.yml

@@ -2,10 +2,13 @@ ansible_user: "deploy"
 ansible_python_interpreter: /usr/bin/python3
 ansible_ssh_private_key_file: "{{ inventory_dir }}/.ssh/id_ed25519"
 
-app_deploy_target: "/var/www/{{ inventory_hostname }}"
+app_deploy_target: "/srv/{{ app_domain }}/mint-{{ mint_version }}"
 app_downloads: "{{ ansible_env.HOME }}/downloads"
 
 app_dashboard_base_path: "/pcd"
-app_postgresql_version: "15"
-open_search_version: "2.17.0"
-open_search_arch: "arm64"
+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

+ 86 - 0
deploy/mint.yml

@@ -0,0 +1,86 @@
+- name: Build frontend v4
+  hosts: 127.0.0.1
+  roles:
+    - mint-dashboard-v4-build
+
+- name: Setup mint repo
+  hosts:
+    - web
+    - fpm
+    - task
+    - fort
+  roles:
+    - mint-v2.1
+
+- name: Setup postgresql pali t-search
+  hosts:
+    - db
+  tasks:
+    - name: Upload pali.stop
+      become: true
+      ansible.builtin.copy:
+        dest: "/usr/share/postgresql/{{ app_postgresql_version }}/tsearch_data/"
+        src: "{{ playbook_dir }}/tsearch_data/pali.stop"
+        owner: root
+        group: root
+        mode: "0444"
+    - name: Upload pali.syn
+      become: true
+      ansible.builtin.copy:
+        dest: "/usr/share/postgresql/{{ app_postgresql_version }}/tsearch_data/"
+        src: "{{ playbook_dir }}/tsearch_data/pali.syn"
+        owner: root
+        group: root
+        mode: "0444"
+    - name: Restart postgresql server
+      become: true
+      ansible.builtin.systemd:
+        state: restarted
+        name: postgresql
+
+- name: Start mint background workers
+  hosts:
+    - task
+  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: Start mint php-fpm
+  hosts:
+    - 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:
+    - web
+  roles:
+    - mint-nginx
+
+- name: Start single-node worker
+  hosts:
+    - fort
+  tasks:
+    - name: Enable schedule run timer
+      ansible.builtin.systemd_service:
+        name: "{{ app_domain }}-scheduler.timer"
+        state: restarted
+        enabled: true
+        scope: user

+ 32 - 0
deploy/roles/mint-dashboard-v4-build/tasks/main.yml

@@ -0,0 +1,32 @@
+- name: Git checkout repo
+  ansible.builtin.git:
+    repo: "https://github.com/iapt-platform/mint.git"
+    dest: "{{ playbook_dir }}/tmp/mint"
+    version: "{{ mint_version }}"
+
+- name: Extract dashboard node_modules
+  ansible.builtin.unarchive:
+    src: dashboard-20241201115354.tar.xz
+    dest: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard"
+    creates: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard/node_modules"
+
+- name: Build dashboard dist
+  ansible.builtin.shell: yarn build
+  args:
+    chdir: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard"
+    creates: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard/dist-{{ mint_version }}"
+  environment:
+    BUILD_PATH: "dist-{{ mint_version }}"
+    NODE_OPTIONS: "--max_old_space_size=4096"
+    PUBLIC_URL: "{{ app_dashboard_base_path }}"
+    REACT_APP_DEFAULT_LOCALE: "zh-Hans"
+    REACT_APP_LANGUAGES: "en-US,zh-Hans,zh-Hant"
+    REACT_APP_ENABLE_LOCAL_TOKEN: "true"
+    REACT_APP_TOKEN_KEY: "token.20250320"
+    REACT_APP_DOCUMENTS_SERVER: "{{ app_documents_server }}"
+    REACT_APP_RPC_SERVER: "{{ app_grpc_web_server }}"
+    REACT_APP_ASSETS_SERVER: "{{ app_assets_server }}"
+    REACT_APP_API_SERVER: "https://{{ app_domain }}"
+    REACT_APP_ICP_CODE: "{{ app_icp_code }}"
+    REACT_APP_MPS_CODE: "{{ app_mps_code }}"
+    REACT_APP_QUESTIONNAIRE_LINK: "{{ app_questionnaire_link }}"

+ 21 - 0
deploy/roles/mint-nginx/tasks/main.yml

@@ -0,0 +1,21 @@
+- name: Create nginx logs folder
+  become: true
+  ansible.builtin.file:
+    path: "{{ app_deploy_target | dirname }}/logs"
+    state: directory
+    owner: www-data
+    mode: "0755"
+
+- name: Upload nginx-fpm.sh
+  become: true
+  ansible.builtin.template:
+    src: fpm.conf.j2
+    dest: /etc/nginx/sites-enabled/{{ app_domain }}-fpm.conf
+    mode: "0644"
+
+- name: Upload nginx.conf
+  become: true
+  ansible.builtin.template:
+    src: nginx.conf.j2
+    dest: /etc/nginx/sites-enabled/{{ app_domain }}.conf
+    mode: "0644"

+ 7 - 0
deploy/roles/mint-nginx/templates/fpm.conf.j2

@@ -0,0 +1,7 @@
+upstream php_fpm_{{ app_php_fpm_port }} {
+   least_conn;
+
+   # server 192.168.0.11:{{ app_php_fpm_port }} weight=10;   
+
+   server 127.0.0.1:{{ app_php_fpm_port }} backup;
+}

+ 58 - 0
deploy/roles/mint-nginx/templates/nginx.conf.j2

@@ -0,0 +1,58 @@
+# https://laravel.com/docs/12.x/deployment#nginx
+
+server {
+    listen 80;
+    server_name {{ app_domain }};
+    root {{ app_deploy_target | dirname }}/current/api-v8/public;
+ 
+    add_header X-Frame-Options "SAMEORIGIN";
+    add_header X-Content-Type-Options "nosniff";
+ 
+    index index.php index.html;
+ 
+    charset utf-8;
+    gzip_comp_level 9;
+    gzip_min_length 1k;
+    gzip_types text/plain text/css application/xml application/javascript;
+    gzip_vary on;
+    client_max_body_size 512M;
+
+    access_log {{ app_deploy_target | dirname }}/logs/access.log;
+    error_log {{ app_deploy_target | dirname }}/logs/error.log warn;
+    # access_log syslog:server=unix:/dev/log,tag={{ app_domain }},nohostname,severity=info combined;
+    # error_log  syslog:server=unix:/dev/log,tag={{ app_domain }},nohostname,severity=error;
+
+    location {{ app_dashboard_base_path }}/ {
+            alias {{ app_deploy_target | dirname }}/current/dashboard-v4/dashboard/dist/;
+            try_files $uri $uri/ {{ app_dashboard_base_path }}/index.html;
+
+            location ~* \.(css|js|png|jpg|jpeg|gif|gz|svg|mp4|ogg|ogv|webm|htc|xml|woff)$ {
+            access_log off;
+            expires max;
+        }
+    }
+ 
+    location / {
+        try_files $uri $uri/ /index.php?$query_string;
+    }
+ 
+    location = /favicon.ico { access_log off; log_not_found off; }
+    location = /robots.txt  { access_log off; log_not_found off; }
+ 
+    error_page 404 /index.php;
+ 
+    location ~ \.php$ {
+        fastcgi_pass php_fpm_{{ app_php_fpm_port }};
+        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
+        # for nginx v1.18
+        # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+        include fastcgi_params;
+        fastcgi_hide_header X-Powered-By;
+    }
+ 
+    location ~ /\.(?!well-known).* {
+        deny all;
+    }
+    
+}
+

+ 6 - 0
deploy/roles/mint-v2.0/tasks/antd-v4.yml

@@ -0,0 +1,6 @@
+- name: Upload dashboard
+  ansible.builtin.copy:
+    src: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard/dist-{{ mint_version }}"
+    dest: "{{ app_deploy_target }}/dashboard"
+    mode: "0755"
+    creates: "{{ app_deploy_target }}/dashboard"

+ 23 - 0
deploy/roles/mint-v2.0/tasks/lily.yml

@@ -0,0 +1,23 @@
+- name: upload lily config.toml
+  template:
+    src: v2/lily/config.toml.j2
+    dest: "{{ app_deploy_root }}/agile/rpc/lily/config.toml"
+    mode: "0644"
+
+- name: upload lily rpc server service
+  become: true
+  template:
+    src: v2/lily/services/server.service.j2
+    dest: /usr/lib/systemd/system/rpc.lily.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+
+- name: upload lily rpc worker service
+  become: true
+  template:
+    src: v2/lily/services/worker.service.j2
+    dest: /usr/lib/systemd/system/worker.lily.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"

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

@@ -0,0 +1,67 @@
+- name: Install dbmate
+  become: true
+  ansible.builtin.get_url:
+    url: "https://github.com/amacneil/dbmate/releases/latest/download/dbmate-linux-{{ app_dbmate_arch }}"
+    dest: /usr/local/bin/dbmate
+    mode: "0555"
+    creates: /usr/local/bin/dbmate
+
+- name: Create the deployment folder
+  become: true
+  ansible.builtin.file:
+    path: "{{ app_deploy_target }}"
+    state: directory
+    owner: "{{ ansible_user }}"
+    mode: "0755"
+
+- name: Create the logs folder
+  become: true
+  ansible.builtin.file:
+    path: "{{ app_deploy_target }}/logs"
+    state: directory
+    owner: "www-data"
+    group: "www-data"
+    mode: "0755"
+
+- name: Unarchive repo
+  ansible.builtin.unarchive:
+    src: https://github.com/iapt-platform/mint/archive/{{ mint_version }}.zip
+    dest: "{{ app_deploy_target }}/mint"
+    remote_src: true
+    creates: "{{ app_deploy_target }}/mint"
+
+- name: Setup dashboard
+  ansible.builtin.import_tasks: antd-v4.yml
+- name: Setup systemd services
+  ansible.builtin.import_tasks: systemd.yml
+
+# https://laravel.com/docs/10.x/scheduling#running-the-scheduler
+- name: Upload scheduler service
+  become: true
+  ansible.builtin.template:
+    src: v2/scheduler.service.j2
+    dest: /usr/lib/systemd/system/scheduler.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+
+# https://wiki.archlinux.org/title/Systemd/Timers
+- name: Upload scheduler timer
+  become: true
+  ansible.builtin.template:
+    src: v2/scheduler.timer.j2
+    dest: /usr/lib/systemd/system/scheduler.{{ app_domain }}.timer
+    owner: root
+    group: root
+    mode: "0644"
+
+- name: Setup laravel queue workers
+  ansible.builtin.import_tasks: queue-workers.yml
+- name: Setup morus service
+  ansible.builtin.import_tasks: morus.yml
+
+- name: Setup lily service
+  ansible.builtin.import_tasks: lily.yml
+
+- name: Setup tulip service
+  ansible.builtin.import_tasks: tulip.yml

+ 17 - 0
deploy/roles/mint-v2.0/tasks/morus.yml

@@ -0,0 +1,17 @@
+- name: auto-loader optimization for morus
+  ansible.builtin.command:
+    argv:
+      - /usr/bin/composer
+      - install
+      - --optimize-autoloader
+      - --no-dev
+    chdir: "{{ app_deploy_target }}/dashboard-v4/rpc/morus/morus"
+
+- name: Upload morus rpc service
+  become: true
+  ansible.builtin.template:
+    src: v2/morus.service.j2
+    dest: /usr/lib/systemd/system/morus.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"

+ 76 - 0
deploy/roles/mint-v2.0/tasks/queue-workers.yml

@@ -0,0 +1,76 @@
+- name: upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "discussion"
+
+- name: upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "pr"
+
+- name: Upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "progress"
+
+- name: Upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "wbw.analyses"
+
+- name: upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "export.pali.chapter"
+
+- name: Upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "export.article"
+
+- name: Upload {{ name }} worker service
+  become: true
+  template:
+    src: v2/queue-worker.service.j2
+    dest: /usr/lib/systemd/system/{{ name }}.worker.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"
+  vars:
+    name: "ai.translate"

+ 37 - 0
deploy/roles/mint-v2.0/tasks/tulip.yml

@@ -0,0 +1,37 @@
+- name: auto-loader optimization for tulip
+  ansible.builtin.command:
+    argv:
+      - /usr/bin/composer
+      - update
+      - --optimize-autoloader
+      - --no-dev
+    chdir: "{{ app_deploy_target }}/dashboard-v4/rpc/tulip/tulip"
+
+- name: upload tulip db/.env
+  template:
+    src: v2/tulip/db/env.j2
+    dest: "{{ app_deploy_target }}/dashboard-v4/rpc/tulip/tulip/db/.env"
+    mode: "0644"
+
+- name: upload tulip config.php
+  template:
+    src: v2/tulip/config.php.j2
+    dest: "{{ app_deploy_target }}/dashboard-v4/rpc/tulip/tulip/config.php"
+    mode: "0644"
+
+- name: Setup tmp folder
+  become: true
+  ansible.builtin.file:
+    path: "{{ app_deploy_root }}/dashboard-v4/rpc/tulip/tulip/tmp"
+    state: directory
+    owner: "www-data"
+    group: "www-data"
+
+- name: Upload tulip rpc service
+  become: true
+  template:
+    src: v2/tulip/service.conf.j2
+    dest: /usr/lib/systemd/system/tulip.{{ app_domain }}.service
+    owner: root
+    group: root
+    mode: "0644"

+ 1 - 0
deploy/roles/mint-v2.0/templates/lily/config.toml.j2

@@ -0,0 +1 @@
+port = {{ app_lily_listen_port }}

+ 15 - 0
deploy/roles/mint-v2.0/templates/lily/services/server.service.j2

@@ -0,0 +1,15 @@
+[Unit]
+Description=Mint lily rpc service for {{ app_domain }}
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/bin/bash lily.sh -d -c config.toml
+WorkingDirectory={{ app_deploy_target }}/dashboard-v4/rpc/lily
+User=www-data
+Group=www-data
+Restart=always
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target

+ 15 - 0
deploy/roles/mint-v2.0/templates/lily/services/worker.service.j2

@@ -0,0 +1,15 @@
+[Unit]
+Description=Mint lily worker service for {{ app_domain }}
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/bin/bash lily.sh -d -c config.toml --worker {{ queue }}
+WorkingDirectory={{ app_deploy_target }}/dashboard-v4/rpc/lily
+User=www-data
+Group=www-data
+Restart=always
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target

+ 15 - 0
deploy/roles/mint-v2.0/templates/morus.service.j2

@@ -0,0 +1,15 @@
+[Unit]
+Description=Mint morus rpc service for {{ app_domain }}
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/php server.php -p {{ app_morus_listen_port }}
+WorkingDirectory={{ app_deploy_target }}/dashboard-v4/rpc/morus/morus
+User=www-data
+Group=www-data
+Restart=always
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target

+ 15 - 0
deploy/roles/mint-v2.0/templates/queue-worker.service.j2

@@ -0,0 +1,15 @@
+[Unit]
+Description=Mint {{ name }} worker for {{ app_domain }}
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/php artisan mq:{{ name }}
+WorkingDirectory={{ app_deploy_target }}
+User=www-data
+Group=www-data
+Restart=always
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target

+ 9 - 0
deploy/roles/mint-v2.0/templates/scheduler.service.j2

@@ -0,0 +1,9 @@
+[Unit]
+Description=Mint scheduler for {{ app_domain }}
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/php artisan schedule:run
+WorkingDirectory={{ app_deploy_target }}
+User=www-data
+Group=www-data

+ 13 - 0
deploy/roles/mint-v2.0/templates/tulip/config.php.j2

@@ -0,0 +1,13 @@
+<?php
+
+define("Config", [
+    'port' => {{ app_tulip_listen_port }},
+    "database" => [
+        "driver" => "pgsql",
+        "host" => "{{ app_tulip_db_host }}",
+        "port" => {{ app_tulip_db_port }},
+        "name" => "{{ app_tulip_db_name }}",
+        "user" => "{{ app_tulip_db_user }}",
+        "password" => "{{ app_tulip_db_password }}",
+    ],
+]);

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

@@ -0,0 +1 @@
+DATABASE_URL="postgres://{{ app_tulip_db_user }}:{{ app_tulip_db_password }}@{{ app_tulip_db_host}}:{{ app_tulip_db_port }}/{{ app_tulip_db_name }}?sslmode=disable"

+ 15 - 0
deploy/roles/mint-v2.0/templates/tulip/service.conf.j2

@@ -0,0 +1,15 @@
+[Unit]
+Description=Mint tulip rpc service for {{ app_domain }}
+After=network.target
+
+[Service]
+Type=simple
+ExecStart=/usr/bin/php server.php
+WorkingDirectory={{ app_deploy_target }}/dashboard-v4/rpc/tulip/tulip
+User=www-data
+Group=www-data
+Restart=always
+RestartSec=30s
+
+[Install]
+WantedBy=multi-user.target

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

@@ -0,0 +1,60 @@
+- name: Upload .env(v2)
+  ansible.builtin.template:
+    src: v2/env.j2
+    dest: "{{ app_deploy_target }}/api-v8/.env"
+    mode: "0444"
+
+- name: Upload config.php(v1)
+  ansible.builtin.template:
+    src: v1/config.php.j2
+    dest: "{{ app_deploy_target }}/api-v8/public/app/config.php"
+    mode: "0444"
+
+- name: Upload config.js(v1)
+  ansible.builtin.template:
+    src: v1/config.js.j2
+    dest: "{{ app_deploy_target }}/api-v8/public/app/config.js"
+    mode: "0444"
+
+- name: Upload vendors.sh
+  ansible.builtin.template:
+    src: containers/vendors.sh.j2
+    dest: "{{ app_deploy_target }}/scripts/vendors.sh"
+    mode: "0555"
+
+- name: Initialize vendors and configuration
+  containers.podman.podman_container:
+    name: "{{ app_domain }}-initialize"
+    image: "{{ app_mint_image_name }}"
+    command: "{{ app_deploy_target }}/scripts/vendors.sh"
+    volumes:
+      - "{{ app_deploy_target }}:{{ app_deploy_target }}:z"
+    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
+  ansible.builtin.import_tasks: schedule-run.yml
+
+- name: Setup php-fpm
+  ansible.builtin.import_tasks: php-fpm.yml
+
+- name: Create a current link
+  ansible.builtin.file:
+    src: "{{ app_deploy_target }}"
+    dest: "{{ app_deploy_target | dirname }}/current"
+    state: link

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

@@ -0,0 +1,38 @@
+- name: Create www folder
+  become: true
+  ansible.builtin.file:
+    path: "{{ app_deploy_target | dirname }}"
+    state: directory
+    owner: "{{ ansible_user }}"
+    mode: "0755"
+
+- name: Download source code
+  ansible.builtin.unarchive:
+    src: https://github.com/iapt-platform/mint/archive/{{ mint_version }}.zip
+    dest: "{{ app_deploy_target | dirname }}"
+    remote_src: true
+    creates: "{{ app_deploy_target }}"
+
+- name: Upload dashboard-v4 dist
+  ansible.posix.synchronize:
+    src: "{{ playbook_dir }}/tmp/mint/dashboard-v4/dashboard/dist-{{ mint_version }}/"
+    dest: "{{ app_deploy_target }}/dashboard-v4/dashboard/dist/"
+
+- name: Upload docker shell script
+  ansible.builtin.template:
+    src: containers/shell.sh.j2
+    dest: "{{ app_deploy_target }}/scripts/shell.sh"
+    mode: "0555"
+
+- name: Setup laravel
+  ansible.builtin.import_tasks: laravel.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

+ 30 - 0
deploy/roles/mint-v2.1/tasks/php-fpm.yml

@@ -0,0 +1,30 @@
+- name: Upload php-fpm.sh
+  ansible.builtin.template:
+    src: containers/php-fpm.sh.j2
+    dest: "{{ app_deploy_target }}/scripts/php-fpm.sh"
+    mode: "0555"
+
+- name: Stop php-fpm worker
+  containers.podman.podman_container:
+    name: "{{ app_domain }}-fpm-{{ app_php_fpm_port }}"
+    state: absent
+
+- name: Create php-fpm worker
+  containers.podman.podman_container:
+    name: "{{ app_domain }}-fpm-{{ app_php_fpm_port }}"
+    image: "{{ app_mint_image_name }}"
+    command: "{{ app_deploy_target }}/scripts/php-fpm.sh"
+    ports:
+      - "0.0.0.0:{{ app_php_fpm_port }}:9000/tcp"
+    volumes:
+      - "{{ 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

+ 11 - 0
deploy/roles/mint-v2.1/tasks/schedule-run.yml

@@ -0,0 +1,11 @@
+- name: Setup schedule run worker service
+  ansible.builtin.include_tasks: workers.yml
+  vars:
+    zone_name: schedule
+    worker_name: run
+
+- name: Setup schedule run worker timer
+  ansible.builtin.template:
+    src: containers/schedule-run.timer.j2
+    dest: "{{ ansible_env.HOME }}/.config/systemd/user/{{ app_domain }}-scheduler.timer"
+    mode: "0644"

+ 29 - 0
deploy/roles/mint-v2.1/tasks/workers.yml

@@ -0,0 +1,29 @@
+- name: Upload script for worker-{{ zone_name }}-{{ worker_name }}
+  ansible.builtin.template:
+    src: containers/worker.sh.j2
+    dest: "{{ app_deploy_target }}/scripts/worker-{{ zone_name }}-{{ worker_name }}.sh"
+    mode: "0555"
+
+- name: Stop {{ zone_name }}-{{ worker_name }}
+  containers.podman.podman_container:
+    name: "{{ app_domain }}-worker-{{ zone_name }}-{{ worker_name }}"
+    state: absent
+
+- name: Create {{ zone_name }}-{{ worker_name }}
+  containers.podman.podman_container:
+    name: "{{ app_domain }}-worker-{{ zone_name }}-{{ worker_name }}"
+    image: "{{ app_mint_image_name }}"
+    command: "{{ app_deploy_target }}/scripts/worker-{{ zone_name }}-{{ worker_name }}.sh"
+    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
+      restart_sec: 30
+      stop_timeout: 20

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

@@ -0,0 +1,5 @@
+#!/bin/sh
+
+sed -i 's/^listen = .*/listen = 9000/g' /etc/php/{{ app_php_version }}/fpm/pool.d/www.conf
+
+/usr/sbin/php-fpm{{ app_php_version }} --nodaemonize --fpm-config /etc/php/{{ app_php_version }}/fpm/php-fpm.conf

+ 10 - 0
deploy/roles/mint-v2.1/templates/containers/schedule-run.timer.j2

@@ -0,0 +1,10 @@
+[Unit]
+Description=Runs Mint {{ app_domain }} scheduler every minute
+
+[Timer]
+OnBootSec=15minutes
+OnUnitActiveSec=1minute
+Unit={{ app_container_prefix }}-{{ app_domain }}-worker-schedule-run.service
+
+[Install]
+WantedBy=timers.target

+ 3 - 0
deploy/roles/mint-v2.1/templates/containers/shell.sh.j2

@@ -0,0 +1,3 @@
+#!/bin/sh
+
+podman run --rm -it --events-backend=file --hostname=mint --network host -w {{ app_deploy_target }} -v {{ app_deploy_target }}:{{ app_deploy_target }}:z {{ app_mint_image_name }} /bin/bash -l

+ 37 - 0
deploy/roles/mint-v2.1/templates/containers/vendors.sh.j2

@@ -0,0 +1,37 @@
+#!/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/
+echo "install v2 laravel vendors"
+composer update --optimize-autoloader --no-dev
+echo "install v2 nodejs packages"
+npm install --omit=dev
+
+cd $WORK_DIR/api-v8/public/
+echo "install v1 vendors"
+composer update --optimize-autoloader --no-dev
+echo "install v1 nodejs packages"
+npm install --omit=dev
+
+cd $WORK_DIR/api-v8/
+echo "caching configuration "
+php artisan config:cache
+echo "caching events"
+php artisan event:cache
+echo "caching routes"
+php artisan route:cache
+echo "caching views"
+php artisan view:cache
+
+echo "check file permissions"
+cd $WORK_DIR/api-v8/
+chown -R www-data:www-data bootstrap/cache storage
+
+echo 'done.'
+exit 0

+ 14 - 0
deploy/roles/mint-v2.1/templates/containers/worker.sh.j2

@@ -0,0 +1,14 @@
+#!/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 }}
+
+exit 0

+ 18 - 0
deploy/roles/mint-v2.1/templates/v1/config.js.j2

@@ -0,0 +1,18 @@
+var ICP_CODE = "{{ app_icp_code }}"
+var GRPC_WEB_SERVER = "{{ app_grpc_web_server }}";
+var DOCUMENTS_SERVER = "{{ app_documents_server }}";
+var REACT_APP_QUESTIONNAIRE_LINK = "{{ app_questionnaire_link }}";
+var DASHBOARD_BASE_PATH = "{{ app_dashboard_base_path }}";
+
+/*
+  |---------------
+  |网站资源文件,非用户的图片,音频,视频
+  |---------------
+  |对应/public/tmp/ 目录 开发线可以设置为 http://127.0.0.1:8000/tmp
+  |所有文件存储在 https://drive.google.com/drive/folders/1-4dn4juD-0-lsKndDui2W9nT9wcS_Y33?usp=sharing
+  |开发线可自行下载放到/public/tmp/
+  |或直接引用离您最近的assets server
+  |------------------------
+*/
+
+var ASSETS_SERVER = "{{ app_assets_server }}";

+ 67 - 0
deploy/roles/mint-v2.1/templates/v1/config.php.j2

@@ -0,0 +1,67 @@
+<?php
+
+#域名设置
+define("GRPC_WEB_SERVER","{{ app_grpc_web_server}}");
+define("ASSETS_SERVER","{{ app_assets_server }}");
+define("DOCUMENTS_SERVER","{{ app_documents_server }}");
+define('APP_KEY','{{ app_secret_key }}');
+define('APP_ENV','{{ app_env }}');
+define('CORS_ALLOWED_ORIGINS', '{{ app_cors_allowed_origins }}');
+define('DASHBOARD_BASE_PATH', "{{ app_dashboard_base_path }}");
+
+/*
+电子邮件设置
+PHPMailer
+*/
+define("Email", [
+                                 "Host"=>"{{ app_smtp_host }}",//Set the SMTP server to send through
+                                 "SMTPAuth"=>true,//Enable SMTP authentication
+                                 "Username"=>'{{ app_smtp_user }}',//SMTP username
+                                 "Password"=>'{{ app_smtp_password }}',//SMTP password
+                                 "Port"=>{{ app_smtp_port }},//TCP port to connect to 465; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
+                                 "From"=>"{{ app_smtp_user }}",
+                                 "Sender"=>"webmaster"
+                                 ]);
+
+/*
+数据库设置
+*/
+define("Database",[
+        "type"=>"pgsql",
+        "server"=>"{{ app_postgresql_host }}",
+        "port"=>{{ app_postgresql_port }},
+        "name"=>"{{ app_postgresql_dbname }}",
+        "sslmode" => "disable",
+        "user" => "{{ app_postgresql_user }}",
+        "password" => "{{ app_postgresql_password }}"
+]);
+
+
+/*
+Redis 设置,
+*/
+define("Redis",[        
+        "host" => "{{ app_redis_host }}",
+        "port" => {{ app_redis_port }},
+        "password" => "",
+        "prefix"=>"{{ app_domain }}://v1/"
+]);
+
+
+# 雪花id
+define("SnowFlake",[
+        "DatacenterId"=>{{ app_snowflake_data_center_id }},
+        "WorkerId"=>{{ app_snowflake_worker_id }}
+]);
+
+#目录设置,不能更改
+require_once __DIR__."/config.dir.php";
+
+/*
+数据表
+*/
+#表设置,此行不能更改
+require_once __DIR__."/config.table.php";
+
+
+?>

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

@@ -0,0 +1,97 @@
+BASE_DIR="{{ app_deploy_target }}/.env.global"
+CACHE_DIR="${BASE_DIR}/cache"
+TMP_DIR="${BASE_DIR}/tmp"
+
+APP_NAME="wikipali"
+APP_ENV={{ app_env }}
+APP_KEY={{ app_secret_key }}
+APP_DEBUG=false
+APP_URL="https://{{ app_domain }}"
+
+LOG_CHANNEL=daily
+LOG_DEPRECATIONS_CHANNEL=null
+LOG_LEVEL=debug
+
+DB_CONNECTION=pgsql
+DB_HOST={{ app_postgresql_host }}
+DB_PORT={{ app_postgresql_port }}
+DB_DATABASE={{ app_postgresql_dbname }}
+DB_USERNAME={{ app_postgresql_user }}
+DB_PASSWORD="{{ app_postgresql_password }}"
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=redis
+FILESYSTEM_DRIVER=s3
+QUEUE_CONNECTION=sync
+SESSION_DRIVER=cookie
+SESSION_LIFETIME=120
+
+AWS_ACCESS_KEY_ID={{ app_aws_access_key }}
+AWS_SECRET_ACCESS_KEY={{ app_aws_secret_key }}
+AWS_DEFAULT_REGION={{ app_aws_region }}
+AWS_BUCKET=assets
+AWS_URL=
+AWS_ENDPOINT=https://{{ app_aws_endpoint_domain }}
+
+REDIS_HOST={{ app_redis_host }}
+REDIS_PORT={{ app_redis_port }}
+REDIS_PASSWORD=
+REDIS_DB=0
+REDIS_PREFIX="{{ app_domain }}://v20250323/"
+
+REDIS_CACHE_HOST={{ app_redis_cache_host }}
+REDIS_CACHE_PORT={{ app_redis_cache_port }}
+REDIS_CACHE_PASSWORD=
+REDIS_CACHE_DB={{ app_redis_cache_db }}
+REDIS_CACHE_PREFIX="{{ app_domain }}://v20250323/"
+
+
+MAIL_MAILER=smtp
+MAIL_HOST={{ app_smtp_host }}
+MAIL_PORT={{ app_smtp_port }}
+MAIL_USERNAME="{{ app_smtp_user }}"
+MAIL_PASSWORD="{{ app_smtp_password }}"
+MAIL_ENCRYPTION=ssl
+MAIL_FROM_ADDRESS="{{ app_smtp_user }}"
+MAIL_FROM_NAME="wikipali"
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+DASHBOARD_BASE_PATH="{{ app_dashboard_base_path }}"
+ASSETS_SERVER="{{ app_assets_server }}"
+GRPC_WEB_SERVER="{{ app_grpc_web_server }}"
+DOCUMENTS_SERVER="{{ app_documents_server }}"
+CORS_ALLOWED_ORIGINS="{{ app_cors_allowed_origins }}"
+
+MORUS_GRPC_HOST="{{ app_morus_grpc_host }}"
+MORUS_GRPC_PORT="{{ app_morus_listen_port }}"
+LILY_GRPC_HOST="{{ app_lily_grpc_host }}"
+LILY_GRPC_PORT="{{ app_lily_listen_port }}"
+TULIP_GRPC_HOST="{{ app_tulip_grpc_host }}"
+TULIP_GRPC_PORT="{{ app_tulip_listen_port }}"
+
+SNOWFLAKE_DATA_CENTER_ID={{ app_snowflake_data_center_id }}
+SNOWFLAKE_WORKER_ID={{ app_snowflake_worker_id }}
+
+RABBITMQ_HOST="{{ app_rabbitmq_host }}"
+RABBITMQ_PORT={{ app_rabbitmq_port }}
+RABBITMQ_VIRTUAL_HOST="{{ app_rabbitmq_virtual_host }}"
+RABBITMQ_USER="{{ app_rabbitmq_user }}"
+RABBITMQ_PASSWORD="{{ app_rabbitmq_password }}"
+
+CDN_URLS={{ app_cdn_urls }}
+ATTACHMENTS_TEMPORARY_BUCKET_NAME={{ app_attachments_bucket_name }}-t
+ATTACHMENTS_PERMANTENT_BUCKET_NAME={{ app_attachments_bucket_name }}-p
+
+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 - 0
deploy/roles/open-search/tasks/main.yml → deploy/roles/opensearch/tasks/main.yml


+ 0 - 0
deploy/roles/open-search/templates/server.service.j2 → deploy/roles/opensearch/templates/server.service.j2


+ 5 - 0
deploy/roles/os/tasks/init.yml

@@ -12,3 +12,8 @@
   ansible.builtin.file:
     path: "{{ ansible_env.HOME }}/local/"
     state: directory
+
+- name: Create tmp folder
+  ansible.builtin.file:
+    path: "{{ ansible_env.HOME }}/tmp/"
+    state: directory

+ 4 - 0
deploy/roles/ubuntu/tasks/main.yml

@@ -59,6 +59,10 @@
       - certbot
       - python3-certbot-nginx
       - build-essential
+      - ninja-build
+      - bison
+      - flex
+      - mold
       - pkg-config
       - cmake
       - libssl-dev

+ 0 - 0
dashboard-v4/rpc/tulip/tulip/dictionary/pali.stop → deploy/tsearch_data/pali.stop


+ 0 - 0
dashboard-v4/rpc/tulip/tulip/dictionary/pali.syn → deploy/tsearch_data/pali.syn


+ 2 - 1
docker/README.md

@@ -20,5 +20,6 @@ podman image prune # removes all dangling images
 podman system reset # clean
 podman images # show images
 podman ps -a # show containers
-podman load -i tmp/mint-CODE-TIMESTAMP.tar.xz # import image
+# https://docs.podman.io/en/stable/markdown/podman.1.html#tmpdir-path
+TMPDIR=$HOME/tmp podman load -i images/mint-CODE-TIMESTAMP.tar.xz # import image
 ```

+ 48 - 0
docker/alpine/Dockerfile

@@ -0,0 +1,48 @@
+FROM alpine:latest
+LABEL maintainer="Jeremy Zheng"
+
+RUN apk update
+RUN apk upgrade
+
+RUN apk add vim wget curl bash zsh pwgen openssl git tmux rsync \
+    tar zip unzip bzip2 bzip3 xz \
+    inetutils-telnet bind-tools \
+    openssh-client sshpass \
+    build-base cmake pkgconf \
+    nodejs npm yarn \
+    openjdk21 gradle maven \
+    python3 py3-pip python3-dev \
+    openssl-dev
+
+RUN mkdir -p $HOME/downloads $HOME/local $HOME/tmp
+
+# https://github.com/ohmyzsh/ohmyzsh
+RUN git clone https://github.com/ohmyzsh/ohmyzsh.git $HOME/.oh-my-zsh
+RUN cp $HOME/.oh-my-zsh/templates/zshrc.zsh-template $HOME/.zshrc
+RUN echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.profile
+RUN echo 'source $HOME/.profile' >> $HOME/.zshrc
+
+RUN git config --global core.quotepath false
+RUN git config --global http.version HTTP/1.1
+RUN git config --global pull.rebase false
+RUN echo 'set-option -g history-limit 102400' > $HOME/.tmux.conf
+RUN echo 'set-option -g default-shell "/bin/zsh"' >> $HOME/.tmux.conf
+
+# https://pip.pypa.io/en/stable/installation/
+RUN sh -c ". $HOME/.profile \
+    && python3 -m venv $HOME/local/python3 \
+    && . $HOME/local/python3/bin/activate \
+    && pip install --upgrade pip \
+    && pip install ansible paramiko \
+    && pip install bypy"
+RUN echo 'export ANSIBLE_HOST_KEY_CHECKING=False' >> $HOME/.profile
+RUN echo 'alias peony="ANSIBLE_LOG_PATH=$HOME/tmp/$(date +%Y%m%d%H%M%S).log ansible-playbook"' >> $HOME/.profile
+RUN echo 'source $HOME/local/python3/bin/activate' >> $HOME/.zshrc
+
+RUN echo "$(date -u +%4Y%m%d%H%M%S)" | tee /VERSION
+
+VOLUME /workspace
+WORKDIR /workspace
+
+CMD ["/bin/zsh", "-l"]
+

+ 16 - 0
docker/alpine/build.sh

@@ -0,0 +1,16 @@
+#!/bin/bash
+
+set -e
+
+export VERSION=$(date "+%4Y%m%d%H%M%S")
+export CODE="mint-alpine"
+export TAR="$CODE-$(uname -m)"
+
+podman pull alpine:latest
+podman build -t $CODE .
+podman save --format=oci-archive -o $TAR.tar $CODE
+md5sum $TAR.tar >$TAR.md5
+
+echo "done($TAR.tar)."
+
+exit 0

+ 1 - 1
docker/jammy/start.sh → docker/alpine/start.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 
-export CODE="palm-jammy"
+export CODE="mint-alpine"
 export NAME="$CODE-$USER"
 
 if podman container exists $NAME; then

+ 0 - 161
docker/jammy/Dockerfile

@@ -1,161 +0,0 @@
-FROM ubuntu:jammy
-LABEL maintainer="Jeremy Zheng"
-
-ENV DEBIAN_FRONTEND noninteractive
-
-RUN apt update
-RUN apt install -y lsb-release apt-utils \
-    debian-keyring debian-archive-keyring apt-transport-https software-properties-common curl wget gnupg
-# https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
-ENV AMD64_GCC_VERSION 13
-ENV GCC_VERSION 12
-RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
-RUN echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs) main restricted universe multiverse" > /etc/apt/sources.list
-RUN echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse" >> /etc/apt/sources.list
-RUN echo "deb [arch=amd64] http://archive.ubuntu.com/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse" >> /etc/apt/sources.list
-# https://apt.llvm.org/
-ENV CLANG_VERSION 18
-RUN echo "deb [arch=amd64] http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${CLANG_VERSION} main" > /etc/apt/sources.list.d/llvm.list
-RUN wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
-# https://wiki.debian.org/ToolChain/Cross
-RUN dpkg --add-architecture armhf
-RUN dpkg --add-architecture arm64
-RUN dpkg --add-architecture riscv64
-RUN echo "deb [arch=armhf,arm64,riscv64] http://ports.ubuntu.com/ $(lsb_release -cs) main restricted universe multiverse" >> /etc/apt/sources.list
-RUN echo "deb [arch=armhf,arm64,riscv64] http://ports.ubuntu.com/ $(lsb_release -cs)-security main restricted universe multiverse" >> /etc/apt/sources.list
-RUN echo "deb [arch=armhf,arm64,riscv64] http://ports.ubuntu.com/ $(lsb_release -cs)-updates main restricted universe multiverse" >> /etc/apt/sources.list
-RUN apt update
-RUN apt -y upgrade
-
-RUN apt -y install zsh git locales locales-all \
-    vim tzdata zip unzip tree tmux \
-    build-essential g++-${GCC_VERSION} libstdc++-${GCC_VERSION}-dev \
-    g++-${AMD64_GCC_VERSION} libstdc++-${AMD64_GCC_VERSION}-dev \
-    crossbuild-essential-arm64 g++-${GCC_VERSION}-aarch64-linux-gnu libstdc++-${GCC_VERSION}-dev:arm64 \
-    crossbuild-essential-armhf g++-${GCC_VERSION}-arm-linux-gnueabihf libstdc++-${GCC_VERSION}-dev:armhf \
-    crossbuild-essential-riscv64 g++-${GCC_VERSION}-riscv64-linux-gnu libstdc++-${GCC_VERSION}-dev:riscv64 \
-    clang-${CLANG_VERSION} clangd-${CLANG_VERSION} clang-tools-${CLANG_VERSION} clang-format-${CLANG_VERSION} clang-tidy-${CLANG_VERSION} lldb-${CLANG_VERSION} lld-${CLANG_VERSION} \
-    cmake pkg-config libtool automake autoconf autoconf-archive binutils cpio mold \
-    debhelper bison flex ninja-build \
-    erlang elixir \
-    python3-full python3-dev
-
-RUN update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/clang clang /usr/bin/clang-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/clang-tidy clang-tidy /usr/bin/clang-tidy-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/lldb lldb /usr/bin/lldb-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/lld lld /usr/bin/lld-${CLANG_VERSION} 100 \
-    && update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${AMD64_GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-${AMD64_GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/aarch64-linux-gnu-gcc aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-gcc-${GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/aarch64-linux-gnu-g++ aarch64-linux-gnu-g++ /usr/bin/aarch64-linux-gnu-g++-${GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-${GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-${GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/riscv64-linux-gnu-gcc riscv64-linux-gnu-gcc /usr/bin/riscv64-linux-gnu-gcc-${GCC_VERSION} 100 \
-    && update-alternatives --install /usr/bin/riscv64-linux-gnu-g++ riscv64-linux-gnu-g++ /usr/bin/riscv64-linux-gnu-g++-${GCC_VERSION} 100
-
-RUN apt -y autoremove
-RUN apt -y clean
-
-RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
-RUN locale-gen
-RUN update-locale LANG=en_US.UTF-8
-RUN update-alternatives --set editor /usr/bin/vim.basic
-
-RUN mkdir -p $HOME/downloads $HOME/build $HOME/local $HOME/tmp
-
-# https://github.com/ohmyzsh/ohmyzsh
-RUN git clone https://github.com/ohmyzsh/ohmyzsh.git $HOME/.oh-my-zsh
-RUN cp $HOME/.oh-my-zsh/templates/zshrc.zsh-template $HOME/.zshrc
-RUN echo 'export LANG=en_US.UTF-8' >> $HOME/.zshrc
-RUN echo 'export LC_ALL=en_US.UTF-8' >> $HOME/.zshrc
-RUN echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.zshrc
-
-RUN git config --global core.quotepath false \
-    && git config --global http.version HTTP/1.1 \
-    && git config --global pull.rebase false \
-    && git config --global url."https://".insteadOf git://
-RUN echo 'set-option -g history-limit 102400' > $HOME/.tmux.conf \
-    && echo 'set-option -g default-shell "/bin/zsh"' >> $HOME/.tmux.conf
-
-# https://musl.cc/
-RUN wget -q -P $HOME/downloads https://more.musl.cc/x86_64-linux-musl/x86_64-linux-musl-cross.tgz \
-    && tar xf $HOME/downloads/x86_64-linux-musl-cross.tgz -C $HOME/local \
-    && echo 'export PATH=$HOME/local/x86_64-linux-musl-cross/bin:$PATH' >> $HOME/.zshrc
-RUN wget -q -P $HOME/downloads https://more.musl.cc/x86_64-linux-musl/armv7l-linux-musleabihf-cross.tgz \
-    && tar xf $HOME/downloads/armv7l-linux-musleabihf-cross.tgz -C $HOME/local \
-    && echo 'export PATH=$HOME/local/armv7l-linux-musleabihf-cross/bin:$PATH' >> $HOME/.zshrc
-RUN wget -q -P $HOME/downloads https://more.musl.cc/x86_64-linux-musl/aarch64-linux-musl-cross.tgz \
-    && tar xf $HOME/downloads/aarch64-linux-musl-cross.tgz -C $HOME/local \
-    && echo 'export PATH=$HOME/local/aarch64-linux-musl-cross/bin:$PATH' >> $HOME/.zshrc
-RUN wget -q -P $HOME/downloads https://more.musl.cc/x86_64-linux-musl/riscv64-linux-musl-cross.tgz \
-    && tar xf $HOME/downloads/riscv64-linux-musl-cross.tgz -C $HOME/local \
-    && echo 'export PATH=$HOME/local/riscv64-linux-musl-cross/bin:$PATH' >> $HOME/.zshrc
-
-# https://github.com/nvm-sh/nvm
-ENV NVM_VERSION "v0.40.1"
-RUN git clone -b ${NVM_VERSION} https://github.com/nvm-sh/nvm.git $HOME/.nvm
-RUN echo 'export NVM_DIR="$HOME/.nvm"' >> $HOME/.zshrc
-RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $HOME/.zshrc
-RUN echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> $HOME/.zshrc
-RUN zsh -c "source $HOME/.zshrc \
-    && nvm install --lts"
-
-ENV JDK_VERSION "23-open"
-# https://docs.gradle.org/current/userguide/compatibility.html
-RUN curl -s "https://get.sdkman.io" | bash
-RUN sed -i -e 's/sdkman_auto_answer=false/sdkman_auto_answer=true/g' $HOME/.sdkman/etc/config
-RUN zsh -c "source $HOME/.zshrc \
-    && sdk install java ${JDK_VERSION} \
-    && sdk install maven \
-    && sdk install gradle"
-
-# https://go.dev/doc/install
-ENV GO_VERSION "1.23.4"
-RUN wget -q -P $HOME/downloads https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
-RUN tar xf $HOME/downloads/go${GO_VERSION}.linux-amd64.tar.gz -C $HOME/local
-RUN echo 'export PATH=$HOME/local/go/bin:$PATH' >> $HOME/.zshrc \
-    && echo 'export GOPATH=$HOME/go' >> $HOME/.zshrc \
-    && echo 'export PATH="$(go env GOPATH)/bin:$PATH"' >> $HOME/.zshrc
-
-# https://grpc.io/docs/languages/go/quickstart/
-RUN zsh -c "source $HOME/.zshrc \
-    && go install google.golang.org/protobuf/cmd/protoc-gen-go@latest \
-    && go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest"
-
-# https://www.rust-lang.org/tools/install
-RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
-RUN zsh -c "source $HOME/.cargo/env \
-    && rustup target add x86_64-unknown-linux-musl \
-    && rustup target add armv7-unknown-linux-gnueabihf \
-    && rustup target add aarch64-unknown-linux-gnu \
-    && rustup target add aarch64-unknown-linux-musl \
-    && rustup target add riscv64gc-unknown-linux-gnu"
-
-# https://github.com/microsoft/vcpkg
-RUN git clone https://github.com/microsoft/vcpkg.git $HOME/local/vcpkg
-RUN $HOME/local/vcpkg/bootstrap-vcpkg.sh \
-    && echo 'export VCPKG_DISABLE_METRICS=1' >> $HOME/.zshrc
-
-# https://github.com/grpc/grpc
-ENV GRPC_VERSION "v1.68.2"
-RUN git clone --recurse-submodules -b $GRPC_VERSION https://github.com/grpc/grpc.git $HOME/downloads/grpc
-RUN apt install -y libssl-dev
-RUN zsh -c "source $HOME/.zshrc \
-    && mkdir -pv $HOME/build/grpc \
-    && cd $HOME/build/grpc \
-    && cmake -DCMAKE_BUILD_TYPE=Release \
-    -DgRPC_INSTALL=ON \
-    -DgRPC_SSL_PROVIDER=package \
-    -DgRPC_BUILD_TESTS=OFF \
-    -DCMAKE_INSTALL_PREFIX=$HOME/.local $HOME/downloads/grpc \
-    && make -j $(nproc --ignore=2) \
-    && make install"
-
-RUN echo "$(date -u +%4Y%m%d%H%M%S)" | tee /VERSION
-
-VOLUME /workspace
-WORKDIR /workspace
-
-CMD ["/bin/zsh", "-l"]

+ 0 - 15
docker/jammy/build.sh

@@ -1,15 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export VERSION=$(date "+%4Y%m%d%H%M%S")
-export CODE="palm-jammy"
-
-podman pull ubuntu:jammy
-podman build -t $CODE .
-podman save --format=oci-archive -o $CODE-$VERSION.tar $CODE
-md5sum $CODE-$VERSION.tar >$CODE-$VERSION.md5
-
-echo "done($CODE-$VERSION.tar)."
-
-exit 0

+ 20 - 6
docker/mint/Dockerfile

@@ -2,11 +2,18 @@ FROM ubuntu:latest
 LABEL maintainer="Jeremy Zheng"
 
 ENV DEBIAN_FRONTEND noninteractive
+ARG PHP_VERSION=8.4
 
 RUN apt update
+RUN apt -y install lsb-release apt-utils \
+    debian-keyring debian-archive-keyring apt-transport-https software-properties-common curl wget gnupg
+RUN add-apt-repository -y ppa:ondrej/php
 RUN apt -y upgrade
-RUN apt -y install git vim locales locales-all tzdata build-essential wget curl \
-    composer php-cli php-fpm php-xml php-imap php-intl php-mbstring php-bcmath php-bz2 php-zip php-curl php-gd php-imagick php-pgsql php-mysql php-sqlite3 php-redis php-amqp \
+RUN apt -y install git vim locales locales-all tzdata build-essential \
+    php${PHP_VERSION}-cli php${PHP_VERSION}-fpm \
+    php${PHP_VERSION}-xml php${PHP_VERSION}-imap php${PHP_VERSION}-intl php${PHP_VERSION}-mbstring php${PHP_VERSION}-bcmath \
+    php${PHP_VERSION}-bz2 php${PHP_VERSION}-zip php${PHP_VERSION}-curl php${PHP_VERSION}-gd php${PHP_VERSION}-imagick \
+    php${PHP_VERSION}-pgsql php${PHP_VERSION}-mysql php${PHP_VERSION}-sqlite3 php${PHP_VERSION}-redis php${PHP_VERSION}-amqp \
     fonts-dejavu-extra fonts-opensymbol fonts-lxgw-wenkai fonts-smiley-sans \
     fonts-noto-extra fonts-noto-cjk-extra fonts-noto-color-emoji \
     fonts-arphic-ukai fonts-arphic-uming \
@@ -17,6 +24,7 @@ RUN apt -y install git vim locales locales-all tzdata build-essential wget curl
     fonts-mikachan \
     fonts-tibetan-machine fonts-ddc-uchen fonts-monlam fonts-sambhota-tsugring fonts-sambhota-yigchung \
     imagemagick ffmpeg graphviz pandoc texlive-full \
+    python3-full python3-dev \
     libssl-dev libpq-dev libmysqlclient-dev
 RUN apt -y autoremove
 RUN apt -y clean
@@ -26,18 +34,24 @@ RUN locale-gen
 RUN update-locale LANG=en_US.UTF-8
 RUN update-alternatives --set editor /usr/bin/vim.basic
 
+RUN mkdir -p $HOME/downloads $HOME/build $HOME/local $HOME/tmp
+
+# https://getcomposer.org/doc/00-intro.md#installation-linux-unix-macos
+RUN wget -q -O $HOME/downloads/composer https://getcomposer.org/installer
+RUN cd $HOME/downloads && php${PHP_VERSION} composer && cp composer.phar /usr/local/bin/composer
+
 # https://github.com/nvm-sh/nvm
-ENV NVM_VERSION "v0.40.1"
+ENV NVM_VERSION "v0.40.2"
 RUN git clone -b ${NVM_VERSION} https://github.com/nvm-sh/nvm.git $HOME/.nvm
 RUN echo 'export NVM_DIR="$HOME/.nvm"' >> $HOME/.bashrc
 RUN echo '[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"' >> $HOME/.bashrc
 RUN echo '[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"' >> $HOME/.bashrc
 RUN bash -i -c "nvm install --lts"
+RUN bash -i -c "npm install -g yarn"
 
-ADD launch.sh /mint.sh
 RUN echo "$(date -u +%4Y%m%d%H%M%S)" | tee /VERSION
 
-VOLUME /workspace
-WORKDIR /workspace
+VOLUME /srv
+WORKDIR /srv
 
 CMD ["/bin/bash", "-l"]

+ 15 - 1
docker/mint/README.md

@@ -1,5 +1,19 @@
 # USAGE
 
+## Usage
+
 ```bash
-./start.sh fpm
+cd ~/workspace/mint/docker
+./build.sh PHP_VERSION
 ```
+
+- Laravel & PHP compatibility
+
+| Laravel | PHP       | Security Fixes Until |
+| ------- | --------- | -------------------- |
+| 8       | 7.3 - 8.1 | Jan, 2023            |
+| 12      | 8.2 - 8.4 | Feb, 2027            |
+
+## Documents
+
+- [Laravel Release Notes](https://laravel.com/docs/releases)

+ 12 - 5
docker/mint/build.sh

@@ -2,14 +2,21 @@
 
 set -e
 
+# https://laravel.com/docs/master/releases
+if [ "$#" -ne 1 ]; then
+    echo "USAGE: $0 PHP_VERSION"
+    exit 1
+fi
+
 export VERSION=$(date "+%4Y%m%d%H%M%S")
-export CODE="mint-$(uname -m)"
+export CODE="mint-php$1-$(uname -m)"
+export TAR="$CODE-$VERSION"
 
 podman pull ubuntu:latest
-podman build -t $CODE .
-podman save --format=oci-archive -o $CODE-$VERSION.tar $CODE
-md5sum $CODE-$VERSION.tar >$CODE-$VERSION.md5
+podman build --build-arg PHP_VERSION=$1 -t $CODE .
+podman save --format=oci-archive -o $TAR.tar $CODE
+md5sum $TAR.tar >$TAR.md5
 
-echo "done($CODE-$VERSION.tar)."
+echo "done($TAR.tar)."
 
 exit 0

+ 0 - 17
docker/mint/launch.sh

@@ -1,17 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export USAGE="USAGE: $0 fpm"
-
-if [ "$#" -ne 1 ]; then
-    echo $USAGE
-    exit 1
-fi
-
-if [ "$1" == "fpm" ]; then
-    echo "start fpm server"
-else
-    echo $USAGE
-    exit 1
-fi

+ 0 - 6
docker/mint/start.sh

@@ -1,6 +0,0 @@
-#!/bin/bash
-
-export CODE="mint"
-export NAME="$CODE-$USER"
-
-podman run --rm -it --events-backend=file --hostname=mint --network host -v $PWD:/workspace:z $CODE

+ 13 - 10
docker/spring/Dockerfile

@@ -43,7 +43,7 @@ RUN curl -L -o $HOME/downloads/pkl https://github.com/apple/pkl/releases/downloa
 
 
 # https://github.com/envoyproxy/envoy
-ENV ENVOY_VERSION "1.32.3"
+ENV ENVOY_VERSION "1.33.0"
 RUN wget -q -O $HOME/downloads/envoy https://github.com/envoyproxy/envoy/releases/download/v${ENVOY_VERSION}/envoy-${ENVOY_VERSION}-linux-x86_64 \
     && sudo cp $HOME/downloads/envoy /usr/local/bin/ \
     && sudo chmod +x /usr/local/bin/envoy
@@ -123,7 +123,7 @@ RUN echo 'export ANSIBLE_HOST_KEY_CHECKING=False' >> $HOME/.zshrc \
 
 # https://github.com/rbenv/rbenv
 # https://github.com/rbenv/ruby-build/tree/master/share/ruby-build
-ENV RUBY_VERSION "3.3.6"
+ENV RUBY_VERSION "3.4.1"
 RUN git clone https://github.com/rbenv/rbenv.git $HOME/.rbenv \
     && git clone https://github.com/rbenv/ruby-build.git $HOME/.rbenv/plugins/ruby-build \
     && git clone https://github.com/rbenv/rbenv-vars.git $HOME/.rbenv/plugins/rbenv-vars 
@@ -135,7 +135,7 @@ RUN zsh -c "source $HOME/.zshrc \
     && gem install bundler"
 
 # https://go.dev/doc/install
-ENV GO_VERSION "1.23.4"
+ENV GO_VERSION "1.23.5"
 RUN wget -q -P $HOME/downloads https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
 RUN tar xf $HOME/downloads/go${GO_VERSION}.linux-amd64.tar.gz -C $HOME/local
 RUN echo 'export PATH=$HOME/local/go/bin:$PATH' >> $HOME/.zshrc \
@@ -149,8 +149,8 @@ RUN zsh -c "source $HOME/.zshrc \
 
 # https://github.com/sdkman/sdkman-cli
 # https://docs.gradle.org/current/userguide/compatibility.html
-ENV JDK_VERSION "23-open"
-ENV GRADLE_VERSION "8.11.1"
+ENV JDK_VERSION "23.0.1-open"
+ENV GRADLE_VERSION "8.12.1"
 ENV THRIFT_JAVA_VERSION "19.0.2-open"
 ENV THRIFT_GRADLE_VERSION "7.6.4"
 RUN curl -s "https://get.sdkman.io" | bash
@@ -200,17 +200,20 @@ RUN zsh -c "source $HOME/.zshrc \
     && cargo install mdbook"
 
 # https://www.swift.org/download/#releases
-ENV SWIFT_VERSION "6.0.2"
+ENV SWIFT_VERSION "6.0.3"
 RUN wget -q -P $HOME/downloads https://download.swift.org/swift-${SWIFT_VERSION}-release/ubuntu2404/swift-${SWIFT_VERSION}-RELEASE/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04.tar.gz \
     && tar xf $HOME/downloads/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04.tar.gz -C $HOME/local \
     && echo "export PATH=\$HOME/local/swift-${SWIFT_VERSION}-RELEASE-ubuntu24.04/bin:\$PATH" >> $HOME/.zshrc
 
+
+# https://xmake.io/#/guide/installation?id=via-curl
+RUN curl -fsSL https://xmake.io/shget.text | bash
+
 # https://github.com/microsoft/vcpkg
 RUN git clone https://github.com/microsoft/vcpkg.git $HOME/local/vcpkg
 RUN $HOME/local/vcpkg/bootstrap-vcpkg.sh \
     && echo 'export VCPKG_DISABLE_METRICS=1' >> $HOME/.zshrc
 
-
 # https://opensearch.org/downloads.html#opensearch
 ENV OPENSEARCH_VERSION "2.18.0"
 RUN wget -q -P $HOME/downloads \
@@ -219,7 +222,7 @@ RUN tar xf $HOME/downloads/opensearch-${OPENSEARCH_VERSION}-linux-x64.tar.gz -C
     && sudo mv $HOME/tmp/opensearch-${OPENSEARCH_VERSION} /opt/opensearch
 
 # https://github.com/grpc/grpc
-ENV GRPC_VERSION "v1.68.2"
+ENV GRPC_VERSION "v1.70.0"
 RUN git clone --recurse-submodules -b $GRPC_VERSION https://github.com/grpc/grpc.git $HOME/downloads/grpc
 # ENV PROTOBUF_VERSION "v3.21.8"
 # RUN cd $HOME/downloads/grpc/third_party/protobuf \
@@ -252,7 +255,7 @@ RUN mkdir -p $HOME/build/protobuf-javascript \
 
 # https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/
 # https://github.com/grpc/grpc-java
-ENV GRPC_JAVA_PLUGIN_VERSION "1.68.2"
+ENV GRPC_JAVA_PLUGIN_VERSION "1.70.1"
 RUN wget -q -O $HOME/.local/bin/grpc_java_plugin \
     https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/${GRPC_JAVA_PLUGIN_VERSION}/protoc-gen-grpc-java-${GRPC_JAVA_PLUGIN_VERSION}-linux-x86_64.exe
 RUN chmod +x $HOME/.local/bin/grpc_java_plugin
@@ -271,7 +274,7 @@ RUN zsh -c "source $HOME/.zshrc \
     go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest"
 
 # https://github.com/google/flatbuffers
-ENV FLATBUFFERS_VERSION "v24.3.25"
+ENV FLATBUFFERS_VERSION "v25.2.10"
 RUN git clone -b $FLATBUFFERS_VERSION https://github.com/google/flatbuffers.git $HOME/downloads/flatbuffers
 RUN zsh -c "source $HOME/.zshrc \
     && mkdir -pv $HOME/build/flatbuffers \

+ 1 - 1
docker/spring/README.md

@@ -11,7 +11,7 @@
 
   ```bash
   $ cd ~/workspace
-  $ ./saturn-xiv/palm/docker/spring/start.sh
+  $ ./iapt-platform/mint/docker/spring/start.sh
   > sudo supervisord -c /etc/supervisor/supervisord.conf
   # init redis cluster
   > sudo /etc/redis/clusters-init.sh

+ 1 - 1
docker/spring/build.sh

@@ -3,7 +3,7 @@
 set -e
 
 export VERSION=$(date "+%4Y%m%d%H%M%S")
-export CODE="palm-spring"
+export CODE="mint-spring"
 
 podman pull archlinux:latest
 podman build -t $CODE .

+ 1 - 1
docker/spring/start.sh

@@ -1,6 +1,6 @@
 #!/bin/bash
 
-export CODE="palm-spring"
+export CODE="mint-spring"
 export NAME="$CODE-$USER"
 
 if podman container exists $NAME; then

+ 0 - 13
scripts/.env.dashboard-v4

@@ -1,13 +0,0 @@
-export NODE_OPTIONS: "--max_old_space_size=4096"
-export PUBLIC_URL: "{{ app_dashboard_base_path }}"
-export REACT_APP_DEFAULT_LOCALE: "zh-Hans"
-export REACT_APP_LANGUAGES: "en-US,zh-Hans,zh-Hant"
-export REACT_APP_ENABLE_LOCAL_TOKEN: "true"
-export REACT_APP_TOKEN_KEY: "token.yyyyMMdd"
-export REACT_APP_DOCUMENTS_SERVER: "{{ app_documents_server }}"
-export REACT_APP_RPC_SERVER: "{{ app_grpc_web_server }}"
-export REACT_APP_ASSETS_SERVER: "{{ app_assets_server }}"
-export REACT_APP_API_SERVER: "https://{{ app_domain }}"
-export REACT_APP_ICP_CODE: "{{ app_icp_code }}"
-export REACT_APP_MPS_CODE: "{{ app_mps_code }}"
-export REACT_APP_QUESTIONNAIRE_LINK: "{{ app_questionnaire_link }}"

+ 0 - 73
scripts/build.sh

@@ -1,73 +0,0 @@
-#!/bin/bash
-
-set -e
-
-export WORKSPACE=$PWD
-export PACKAGE_NAME="mint-$1"
-
-function build_dashboard_v4() {
-    local react_node_modules="dashboard-$1.tar.xz"
-    if [ ! -f $WORKSPACE/downloads/$react_node_modules ]; then
-        echo "couldn't find $react_node_modules_tar"
-        exit 1
-    fi
-
-    cd $WORKSPACE/$PACKAGE_NAME/dashboard-v4/dashboard/
-    echo "uncompress node_modules for dashboard-v4"
-    tar xf $WORKSPACE/downloads/$react_node_modules
-    yarn build
-
-    cp -r build $WORKSPACE/$PACKAGE_NAME-dist/dashboard
-}
-
-# -----------------------------------------------------------------------------
-if [ "$#" -ne 2 ]; then
-    echo "USAGE: $0 FULL_GIT_COMMIT_ID ENV_ID"
-    exit 1
-fi
-
-if [ ! -f $WORKSPACE/downloads/$1.zip ]; then
-    echo "download $1.zip from github"
-    mkdir -p $WORKSPACE/downloads
-    wget -q -P $WORKSPACE/downloads https://github.com/iapt-platform/mint/archive/$1.zip
-fi
-
-if [ ! -f $WORKSPACE/$2.env ]; then
-    echo "couldn't find config file $2.env"
-    exit 1
-fi
-
-source $WORKSPACE/$2.env
-
-# -----------------------------------------------------------------------------
-
-if [ -d $WORKSPACE/$PACKAGE_NAME ]; then
-    echo "remove $PACKAGE_NAME folder"
-    rm -r $WORKSPACE/$PACKAGE_NAME
-fi
-echo "uncompress $1.zip"
-unzip -d $WORKSPACE -q $WORKSPACE/downloads/$1.zip
-
-# -----------------------------------------------------------------------------
-
-if [ -d $WORKSPACE/$PACKAGE_NAME-dist ]; then
-    rm -r $WORKSPACE/$PACKAGE_NAME-dist
-fi
-
-mkdir -p $WORKSPACE/$PACKAGE_NAME-dist
-
-build_dashboard_v4 "20241106153131"
-
-cd $WORKSPACE
-cp -r $PACKAGE_NAME/api-v8 $PACKAGE_NAME-dist/htdocs
-
-if [ -f $PACKAGE_NAME.tar.xz ]; then
-    rm $PACKAGE_NAME.tar.xz
-fi
-XZ_OPT=-e9 tar -C $PACKAGE_NAME-dist -jcf $PACKAGE_NAME.tar.xz dashboard htdocs
-md5sum $PACKAGE_NAME.tar.xz >$PACKAGE_NAME.md5
-
-# -----------------------------------------------------------------------------
-
-echo "done($PACKAGE_NAME.tar.xz)."
-exit 0