From d624053a37faea4aecc304e3c8af531f15fa6e99 Mon Sep 17 00:00:00 2001 From: Ben Word Date: Sat, 4 Apr 2026 10:52:19 -0500 Subject: [PATCH] Separate Litestream into its own systemd service MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Litestream's -exec wrapper prevents the Go binary from receiving socket file descriptors, blocking future socket activation for zero-downtime deploys. Running Litestream as an independent service also gives cleaner restart semantics — app deploys no longer restart replication unnecessarily. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../roles/wppackages/handlers/main.yml | 5 ++++ .../ansible/roles/wppackages/tasks/main.yml | 28 ++++++++++++++++++- .../templates/litestream.service.j2 | 16 +++++++++++ .../templates/wppackages.service.j2 | 5 ++-- 4 files changed, 51 insertions(+), 3 deletions(-) create mode 100644 deploy/ansible/roles/wppackages/templates/litestream.service.j2 diff --git a/deploy/ansible/roles/wppackages/handlers/main.yml b/deploy/ansible/roles/wppackages/handlers/main.yml index f958815..f0454bf 100644 --- a/deploy/ansible/roles/wppackages/handlers/main.yml +++ b/deploy/ansible/roles/wppackages/handlers/main.yml @@ -3,6 +3,11 @@ systemd: daemon_reload: yes +- name: Restart litestream + service: + name: litestream + state: restarted + - name: Restart wppackages service: name: wppackages diff --git a/deploy/ansible/roles/wppackages/tasks/main.yml b/deploy/ansible/roles/wppackages/tasks/main.yml index 51a855e..4591f0b 100644 --- a/deploy/ansible/roles/wppackages/tasks/main.yml +++ b/deploy/ansible/roles/wppackages/tasks/main.yml @@ -7,12 +7,30 @@ group: www-data mode: "0640" +- name: Stop and disable legacy wppackages socket unit + service: + name: wppackages.socket + state: stopped + enabled: no + failed_when: false + - name: Remove legacy wppackages socket unit file: path: /etc/systemd/system/wppackages.socket state: absent notify: Reload systemd +- name: Deploy litestream service + template: + src: litestream.service.j2 + dest: /etc/systemd/system/litestream.service + owner: root + group: root + mode: "0644" + notify: + - Reload systemd + - Restart litestream + - name: Deploy wppackages service template: src: wppackages.service.j2 @@ -20,7 +38,9 @@ owner: root group: root mode: "0644" - notify: Reload systemd + notify: + - Reload systemd + - Restart wppackages - name: Deploy pipeline timer template: @@ -140,6 +160,12 @@ - name: Flush handlers meta: flush_handlers +- name: Enable and start litestream service + service: + name: litestream + state: started + enabled: yes + - name: Enable and start wppackages service service: name: wppackages diff --git a/deploy/ansible/roles/wppackages/templates/litestream.service.j2 b/deploy/ansible/roles/wppackages/templates/litestream.service.j2 new file mode 100644 index 0000000..9434a5f --- /dev/null +++ b/deploy/ansible/roles/wppackages/templates/litestream.service.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=Litestream replication for WP Packages +After=network.target +Before=wppackages.service + +[Service] +Type=simple +User=deploy +Group=www-data +ExecStart=/usr/bin/litestream replicate -config {{ app_root }}/shared/litestream.yml +Restart=always +RestartSec=1s +EnvironmentFile={{ app_root }}/shared/.env + +[Install] +WantedBy=multi-user.target diff --git a/deploy/ansible/roles/wppackages/templates/wppackages.service.j2 b/deploy/ansible/roles/wppackages/templates/wppackages.service.j2 index 771dac0..8fa8cbf 100644 --- a/deploy/ansible/roles/wppackages/templates/wppackages.service.j2 +++ b/deploy/ansible/roles/wppackages/templates/wppackages.service.j2 @@ -1,13 +1,14 @@ [Unit] Description=WP Packages -After=network.target +After=network.target litestream.service +Requires=litestream.service [Service] Type=simple User=deploy Group=www-data WorkingDirectory={{ app_root }}/current -ExecStart=/usr/bin/litestream replicate -config {{ app_root }}/shared/litestream.yml -exec "{{ app_root }}/current/{{ go_binary_name }} serve --db {{ db_path }}" +ExecStart={{ app_root }}/current/{{ go_binary_name }} serve --db {{ db_path }} Restart=always RestartSec=1s StandardOutput=append:{{ app_root }}/shared/storage/logs/wppackages.log