From 1ac560e4824fb830310797a2b6f7eae5482111fc Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 17 Jun 2026 13:59:37 +0800 Subject: [PATCH] feat(ai-workspace): add backup/restore/migration role and playbook --- roles/vhosts/ai-workspace/defaults/main.yml | 11 +++++ roles/vhosts/ai-workspace/meta/main.yml | 7 +++ roles/vhosts/ai-workspace/tasks/migrate.yml | 48 +++++++++++++++++++++ setup-ai-workspace-migration.yml | 11 +++++ 4 files changed, 77 insertions(+) create mode 100644 roles/vhosts/ai-workspace/defaults/main.yml create mode 100644 roles/vhosts/ai-workspace/meta/main.yml create mode 100644 roles/vhosts/ai-workspace/tasks/migrate.yml create mode 100644 setup-ai-workspace-migration.yml diff --git a/roles/vhosts/ai-workspace/defaults/main.yml b/roles/vhosts/ai-workspace/defaults/main.yml new file mode 100644 index 0000000..066eb17 --- /dev/null +++ b/roles/vhosts/ai-workspace/defaults/main.yml @@ -0,0 +1,11 @@ +--- +# Backup/Restore/Migration Defaults +migrate_source_host: "{{ ansible_host | default('localhost') }}" +migrate_source_user: "ubuntu" +migrate_litellm_db: "litellm" +migrate_litellm_db_user: "litellm" +migrate_litellm_db_host: "127.0.0.1" + +# Migration paths +openclaw_data_dir: "~/.openclaw" +xworkspace_state_dir: "~/.local/state/xworkspace" diff --git a/roles/vhosts/ai-workspace/meta/main.yml b/roles/vhosts/ai-workspace/meta/main.yml new file mode 100644 index 0000000..ff4da01 --- /dev/null +++ b/roles/vhosts/ai-workspace/meta/main.yml @@ -0,0 +1,7 @@ +--- +dependencies: + - role: roles/agent_skills + - role: roles/vhosts/gateway_openclaw + - role: roles/vhosts/xworkmate_bridge + - role: roles/vhosts/acp_server_hermes + - role: roles/vhosts/qmd diff --git a/roles/vhosts/ai-workspace/tasks/migrate.yml b/roles/vhosts/ai-workspace/tasks/migrate.yml new file mode 100644 index 0000000..9eff32a --- /dev/null +++ b/roles/vhosts/ai-workspace/tasks/migrate.yml @@ -0,0 +1,48 @@ +--- +- name: Ensure local data directories exist + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: '0755' + loop: + - "{{ openclaw_data_dir }}/plugin-skills" + - "{{ openclaw_data_dir }}/skill-workshop" + - "{{ openclaw_data_dir }}/agents/main/sessions" + +- name: Sync skills and plugins + ansible.posix.synchronize: + src: "{{ migrate_source_user }}@{{ migrate_source_host }}:{{ item }}" + dest: "{{ item | dirname }}/" + mode: pull + archive: yes + checksum: yes + use_ssh_args: yes + loop: + - "{{ openclaw_data_dir }}/plugin-skills/" + - "{{ openclaw_data_dir }}/skill-workshop/" + +- name: Sync temporary sessions + ansible.posix.synchronize: + src: "{{ migrate_source_user }}@{{ migrate_source_host }}:{{ openclaw_data_dir }}/agents/main/sessions/" + dest: "{{ openclaw_data_dir }}/agents/main/sessions/" + mode: pull + archive: yes + checksum: yes + use_ssh_args: yes + +- name: Migrate QMD memory (merge) + ansible.builtin.command: > + qmd sync --host {{ migrate_source_user }}@{{ migrate_source_host }} + --remote-qmd-user {{ migrate_source_user }} --update --embed + register: qmd_sync_result + changed_when: "'Sync completed' in qmd_sync_result.stdout or qmd_sync_result.rc == 0" + ignore_errors: yes + +- name: Migrate LiteLLM database + ansible.builtin.shell: > + ssh -o StrictHostKeyChecking=no {{ migrate_source_user }}@{{ migrate_source_host }} + "pg_dump -U {{ migrate_litellm_db_user }} -h {{ migrate_litellm_db_host }} -Fc {{ migrate_litellm_db }}" | + pg_restore -U {{ migrate_litellm_db_user }} -h {{ migrate_litellm_db_host }} -d {{ migrate_litellm_db }} -1 --clean + register: pg_migrate_result + changed_when: pg_migrate_result.rc == 0 + ignore_errors: yes diff --git a/setup-ai-workspace-migration.yml b/setup-ai-workspace-migration.yml new file mode 100644 index 0000000..26c925e --- /dev/null +++ b/setup-ai-workspace-migration.yml @@ -0,0 +1,11 @@ +--- +- name: Migrate AI Workspace Data + hosts: localhost + connection: local + become: no + gather_facts: false + tasks: + - name: Run AI Workspace Migration Tasks + ansible.builtin.include_role: + name: roles/vhosts/ai-workspace + tasks_from: migrate.yml