aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2026-07-13 15:35:38 +0300
committerJan Tuomi <jan@jantuomi.fi>2026-07-13 15:35:38 +0300
commitada58b1aebd3d92fb258b8d728de619748887ff5 (patch)
tree83db7481ca2f91ac14ed3e831e7bb36769df432a
parent67d5b193ad7ca4c496d3e701e7db88fb8b200d00 (diff)
thelounge prod fixes
-rw-r--r--roles/jail/tasks/jail_setup.yml163
-rw-r--r--roles/jails/03_irc_thelounge/defaults/main.yml6
2 files changed, 104 insertions, 65 deletions
diff --git a/roles/jail/tasks/jail_setup.yml b/roles/jail/tasks/jail_setup.yml
index 86e28c2..3602b6e 100644
--- a/roles/jail/tasks/jail_setup.yml
+++ b/roles/jail/tasks/jail_setup.yml
@@ -1,9 +1,29 @@
-- name: "Check for existing data before ZFS volume creation for {{ jail_name }}"
+# Host-side setup (runs on the jail host via SSH)
+- name: "Check if {{ jail_name }} container exists"
+ shell: "zfs list -o name | grep -Fxq 'zroot/jails/containers/{{ jail_name }}'"
+ failed_when: false
+ changed_when: false
+ register: jail_exists
+ delegate_to: "{{ jail_delegate_host }}"
+
+- name: "Check {{ jail_name }} userland version"
+ shell: "zfs get -H -o value origin zroot/jails/containers/{{ jail_name }}"
+ register: jail_origin
+ changed_when: false
+ when: jail_exists.rc == 0
+ delegate_to: "{{ jail_delegate_host }}"
+
+# ZFS volume migration
+- name: "Check ZFS volume state for {{ jail_name }}"
shell: |
- zfs list {{ item.name }} >/dev/null 2>&1 && echo "exists" || \
- ([ -d "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" ] && \
- [ "$(ls -A /usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }})" ] && \
- echo "migrate" || echo "empty")
+ if zfs list {{ item.name }} >/dev/null 2>&1; then
+ echo "exists"
+ elif [ -d "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}" ] && \
+ [ "$(ls -A /usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }})" ]; then
+ echo "migrate"
+ else
+ echo "empty"
+ fi
loop: "{{ zfs | default([]) }}"
loop_control:
label: "{{ item.name }}"
@@ -25,95 +45,72 @@
{% endfor %}
This will:
- 1. Stop the jail
- 2. Move existing data to .migrate
- 3. Create ZFS volumes
- 4. Copy data into the volumes
+ 1. Create ZFS volumes (staged)
+ 2. Stop the jail
+ 3. Copy existing data into the volumes
════════════════════════════════════════════════════════════════
Press Enter to continue or Ctrl+C to abort
when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0
-- name: "Stop {{ jail_name }} jail for volume migration"
- shell: "service jail stop {{ jail_name }} || true"
- when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0
- delegate_to: "{{ jail_delegate_host }}"
-
-- name: "Move existing data aside for {{ jail_name }}"
- shell: |
- mv "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}" \
- "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}.migrate"
- loop: "{{ _zfs_volume_state.results | default([]) }}"
- loop_control:
- label: "{{ item.item.name }}"
- when: item.stdout == "migrate"
- delegate_to: "{{ jail_delegate_host }}"
-
-- name: "Create ZFS volumes for {{ jail_name }}"
+- name: "Create new ZFS volumes (staged) for {{ jail_name }}"
community.general.zfs:
- name: "{{ item.name }}"
+ name: "{{ item.item.name }}"
state: present
extra_zfs_properties:
- mountpoint: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}"
- loop: "{{ zfs | default([]) }}"
+ mountpoint: "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}"
+ loop: "{{ _zfs_volume_state.results | default([]) }}"
loop_control:
- label: "{{ item.name }}"
+ label: "{{ item.item.name }}"
+ when: item.stdout == "migrate"
delegate_to: "{{ jail_delegate_host }}"
-- name: "Create mount points for ZFS volumes in {{ jail_name }}"
+- name: "Create staging mount points for {{ jail_name }}"
file:
- path: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}"
+ path: "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}"
state: directory
- owner: "{{ item.owner | default('root') }}"
- group: "{{ item.group | default('wheel') }}"
- mode: "{{ item.mode | default('0755') }}"
- loop: "{{ zfs | default([]) }}"
+ loop: "{{ _zfs_volume_state.results | default([]) }}"
loop_control:
- label: "{{ item.mountpoint }}"
+ label: "{{ item.item.name }}"
+ when: item.stdout == "migrate"
delegate_to: "{{ jail_delegate_host }}"
-- name: "Mount ZFS volumes for {{ jail_name }}"
- shell: "zfs mount {{ item.name }} || true"
- loop: "{{ zfs | default([]) }}"
+- name: "Mount staged volumes for {{ jail_name }}"
+ shell: "zfs mount {{ item.item.name }} || true"
+ loop: "{{ _zfs_volume_state.results | default([]) }}"
loop_control:
- label: "{{ item.name }}"
+ label: "{{ item.item.name }}"
+ when: item.stdout == "migrate"
changed_when: false
delegate_to: "{{ jail_delegate_host }}"
-- name: "Restore migrated data into ZFS volumes for {{ jail_name }}"
+- name: "Stop {{ jail_name }} jail for volume migration"
+ shell: "service jail stop {{ jail_name }} || true"
+ when: (_zfs_volume_state.results | default([]) | selectattr('stdout', 'equalto', 'migrate') | list | length) > 0
+ delegate_to: "{{ jail_delegate_host }}"
+
+- name: "Copy data into staged volumes for {{ jail_name }}"
shell: |
- cp -a "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}.migrate/." \
- "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}/"
+ cp -a "/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}/." \
+ "/usr/local/jails/volumes/.staging/{{ jail_name }}{{ item.item.mountpoint }}/"
loop: "{{ _zfs_volume_state.results | default([]) }}"
loop_control:
label: "{{ item.item.name }}"
when: item.stdout == "migrate"
delegate_to: "{{ jail_delegate_host }}"
-- name: "Note: .migrate directories left as backup for {{ jail_name }}"
- debug:
- msg: "Data migrated from {{ item.item.mountpoint }}.migrate — verify and remove manually"
+- name: "Set final mountpoint on migrated volumes for {{ jail_name }}"
+ shell: |
+ zfs unmount {{ item.item.name }} || true
+ zfs set mountpoint="/usr/local/jails/containers/{{ jail_name }}{{ item.item.mountpoint }}" {{ item.item.name }}
loop: "{{ _zfs_volume_state.results | default([]) }}"
loop_control:
label: "{{ item.item.name }}"
when: item.stdout == "migrate"
-
-# Host-side setup (runs on the jail host via SSH)
-- name: "Check if {{ jail_name }} container exists"
- shell: "zfs list -o name | grep -Fxq 'zroot/jails/containers/{{ jail_name }}'"
- failed_when: false
- changed_when: false
- register: jail_exists
delegate_to: "{{ jail_delegate_host }}"
-- name: "Check {{ jail_name }} userland version"
- shell: "zfs get -H -o value origin zroot/jails/containers/{{ jail_name }}"
- register: jail_origin
- changed_when: false
- when: jail_exists.rc == 0
- delegate_to: "{{ jail_delegate_host }}"
-
-- name: "*** MIGRATION REQUIRED: {{ jail_name }} ***"
+# Userland migration
+- name: "*** USERLAND MIGRATION REQUIRED: {{ jail_name }} ***"
pause:
prompt: |
@@ -132,14 +129,23 @@
Press Enter to continue or Ctrl+C to abort
when:
- jail_exists.rc == 0
+ - jail_origin.stdout is defined
- "userland + '@base' not in jail_origin.stdout"
+- name: "Stop {{ jail_name }} jail for userland migration"
+ shell: "service jail stop {{ jail_name }} || true"
+ when:
+ - jail_exists.rc == 0
+ - jail_origin.stdout is defined
+ - "userland + '@base' not in jail_origin.stdout"
+ delegate_to: "{{ jail_delegate_host }}"
+
- name: "Migrate {{ jail_name }} to {{ userland }}"
shell: |
- service jail stop {{ jail_name }} || true
zfs rename zroot/jails/containers/{{ jail_name }} zroot/jails/containers/{{ jail_name }}.old.$(date +%s)
when:
- jail_exists.rc == 0
+ - jail_origin.stdout is defined
- "userland + '@base' not in jail_origin.stdout"
delegate_to: "{{ jail_delegate_host }}"
@@ -148,6 +154,39 @@
when: jail_exists.rc != 0 or (jail_origin.stdout is defined and userland + '@base' not in jail_origin.stdout)
delegate_to: "{{ jail_delegate_host }}"
+# ZFS volume setup (for all volumes — existing, migrated, and new)
+- name: "Ensure ZFS volumes exist for {{ jail_name }}"
+ community.general.zfs:
+ name: "{{ item.name }}"
+ state: present
+ extra_zfs_properties:
+ mountpoint: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}"
+ loop: "{{ zfs | default([]) }}"
+ loop_control:
+ label: "{{ item.name }}"
+ delegate_to: "{{ jail_delegate_host }}"
+
+- name: "Create mount points for ZFS volumes in {{ jail_name }}"
+ file:
+ path: "/usr/local/jails/containers/{{ jail_name }}{{ item.mountpoint }}"
+ state: directory
+ owner: "{{ item.owner | default('root') }}"
+ group: "{{ item.group | default('wheel') }}"
+ mode: "{{ item.mode | default('0755') }}"
+ loop: "{{ zfs | default([]) }}"
+ loop_control:
+ label: "{{ item.mountpoint }}"
+ delegate_to: "{{ jail_delegate_host }}"
+
+- name: "Mount ZFS volumes for {{ jail_name }}"
+ shell: "zfs mount {{ item.name }} || true"
+ loop: "{{ zfs | default([]) }}"
+ loop_control:
+ label: "{{ item.name }}"
+ changed_when: false
+ delegate_to: "{{ jail_delegate_host }}"
+
+# Container setup
- name: "Create directories for {{ jail_name }}"
file:
path: "/usr/local/jails/containers/{{ jail_name }}{{ item }}"
diff --git a/roles/jails/03_irc_thelounge/defaults/main.yml b/roles/jails/03_irc_thelounge/defaults/main.yml
index c596a31..858df0e 100644
--- a/roles/jails/03_irc_thelounge/defaults/main.yml
+++ b/roles/jails/03_irc_thelounge/defaults/main.yml
@@ -5,9 +5,9 @@ zfs:
mountpoint: /var/db/thelounge
pkg:
- - npm
- - git
- - yarn-node22
+ - pcre2
+ - npm-node24
+ - yarn-node24
- git
files: