From 9aed30136dd00ab8bc94e01b66ddee13c6823977 Mon Sep 17 00:00:00 2001 From: "martin.fencl" Date: Tue, 3 Feb 2026 18:32:15 +0100 Subject: [PATCH] . --- docker-compose/docker-compose-semaphore.yml | 26 ++++ old/update_semaphore.yml | 65 ++++++++++ update_semaphore.yml | 126 +++++++++++--------- 3 files changed, 163 insertions(+), 54 deletions(-) create mode 100644 docker-compose/docker-compose-semaphore.yml create mode 100644 old/update_semaphore.yml diff --git a/docker-compose/docker-compose-semaphore.yml b/docker-compose/docker-compose-semaphore.yml new file mode 100644 index 0000000..9d2a84b --- /dev/null +++ b/docker-compose/docker-compose-semaphore.yml @@ -0,0 +1,26 @@ +version: "3.8" + +services: + semaphore: + image: semaphoreui/semaphore:latest + user: "0:0" + ports: + - "3000:3000" + + environment: + SEMAPHORE_DB_DIALECT: bolt + SEMAPHORE_DB_PATH: /etc/semaphore/semaphore.db.bolt # full path to file! + SEMAPHORE_TMP_PATH: /var/lib/semaphore/projects + SEMAPHORE_ADMIN: admin + SEMAPHORE_ADMIN_NAME: admin + SEMAPHORE_ADMIN_EMAIL: admin@localhost + SEMAPHORE_ADMIN_PASSWORD: changeme + SEMAPHORE_ACCESS_KEY_ENCRYPTION: "rZffGjw4BGlwoM+66fStJ4Pg+ivLc5ghtty3yoscltY=" + + volumes: + - /data/compose/semaphore/db:/etc/semaphore + - /data/compose/semaphore/projects:/var/lib/semaphore/projects + - /data/compose/semaphore/backups:/opt/mikrotik_backups/ + - /data/compose/semaphore/ansible.cfg:/etc/ansible.cfg:ro # mount as file, ne do /etc/ansible/ansible.cfg + + restart: unless-stopped diff --git a/old/update_semaphore.yml b/old/update_semaphore.yml new file mode 100644 index 0000000..2158231 --- /dev/null +++ b/old/update_semaphore.yml @@ -0,0 +1,65 @@ +# update_semaphore.yml + +- name: Update Semaphore on VM via Proxmox + hosts: linux_servers + gather_facts: false + become: true + become_user: root + become_method: sudo + + vars: + # --- Connection to VM (provided by Semaphore env vars) --- + vm_ip: "{{ lookup('env', 'VM_IP') }}" # IP vm-portainer + vm_user: "{{ lookup('env', 'VM_USER') }}" + vm_pass: "{{ lookup('env', 'VM_PASS') }}" + use_sudo: false + + # --- Debug mode (controlled via Semaphore variable) --- + DEBUG: "{{ lookup('env', 'DEBUG') | default(0) | int }}" + + # --- Semaphore specifics --- + semaphore_project: "semaphore" + semaphore_compose_file: "/data/compose/semaphore/docker-compose.yml" + semaphore_service: "semaphore" + + tasks: + - name: Ensure sshpass is installed (for password-based SSH) # English comments + ansible.builtin.apt: + name: sshpass + state: present + update_cache: yes + + - name: Run Semaphore self-update on VM in background (nohup) + ansible.builtin.command: + argv: + - sshpass + - -e + - ssh + - -o + - StrictHostKeyChecking=no + - -o + - ConnectTimeout=15 + - "{{ vm_user }}@{{ vm_ip }}" + - bash + - -lc + - | + nohup bash -c ' + unalias docker 2>/dev/null || true + DOCKER_CLI_HINTS=0 docker compose \ + -p {{ semaphore_project }} \ + -f {{ semaphore_compose_file }} \ + up -d --no-deps --force-recreate --pull always {{ semaphore_service }} + ' >/dev/null 2>&1 & + environment: + SSHPASS: "{{ vm_pass }}" + register: semaphore_update + changed_when: false + no_log: "{{ DEBUG == 0 }}" + + - name: Show result of Semaphore self-update (debug) + ansible.builtin.debug: + msg: | + RC: {{ semaphore_update.rc }} + STDOUT: {{ (semaphore_update.stdout | default('')).strip() }} + STDERR: {{ (semaphore_update.stderr | default('')).strip() }} + when: DEBUG == 1 diff --git a/update_semaphore.yml b/update_semaphore.yml index 2158231..f5f62ad 100644 --- a/update_semaphore.yml +++ b/update_semaphore.yml @@ -1,65 +1,83 @@ # update_semaphore.yml -- name: Update Semaphore on VM via Proxmox - hosts: linux_servers +- name: Update Semaphore + hosts: pve2_vm gather_facts: false - become: true - become_user: root - become_method: sudo vars: - # --- Connection to VM (provided by Semaphore env vars) --- - vm_ip: "{{ lookup('env', 'VM_IP') }}" # IP vm-portainer - vm_user: "{{ lookup('env', 'VM_USER') }}" - vm_pass: "{{ lookup('env', 'VM_PASS') }}" - use_sudo: false + # Compose sync (controller -> target) + compose_local_dir: "{{ playbook_dir }}/docker-compose" + compose_remote_base: "/home/{{ ansible_user }}/.ansible-compose" + compose_remote_dir: "{{ compose_remote_base }}/docker-compose" + compose_remote_archive: "{{ compose_remote_base }}/docker-compose.tar.gz" - # --- Debug mode (controlled via Semaphore variable) --- - DEBUG: "{{ lookup('env', 'DEBUG') | default(0) | int }}" - - # --- Semaphore specifics --- - semaphore_project: "semaphore" - semaphore_compose_file: "/data/compose/semaphore/docker-compose.yml" - semaphore_service: "semaphore" + # Semaphore settings + semaphore_project: semaphore + semaphore_compose_filename: "docker-compose-semaphore.yml" + semaphore_port: 3000 tasks: - - name: Ensure sshpass is installed (for password-based SSH) # English comments - ansible.builtin.apt: - name: sshpass + - name: Ensure remote base directory exists + ansible.builtin.file: + path: "{{ compose_remote_base }}" + state: directory + mode: "0755" + + - name: Create local archive of docker-compose directory (controller) + ansible.builtin.archive: + path: "{{ compose_local_dir }}/" + dest: "/tmp/docker-compose.tar.gz" + format: gz + delegate_to: localhost + run_once: true + + - name: Upload archive to remote host + ansible.builtin.copy: + src: "/tmp/docker-compose.tar.gz" + dest: "{{ compose_remote_archive }}" + mode: "0644" + + - name: Recreate remote compose directory + ansible.builtin.file: + path: "{{ compose_remote_dir }}" + state: absent + + - name: Ensure remote compose directory exists + ansible.builtin.file: + path: "{{ compose_remote_dir }}" + state: directory + mode: "0755" + + - name: Extract archive on remote host + ansible.builtin.unarchive: + src: "{{ compose_remote_archive }}" + dest: "{{ compose_remote_dir }}" + remote_src: true + + - name: Pull latest Semaphore image(s) + community.docker.docker_compose_v2: + project_name: "{{ semaphore_project }}" + project_src: "{{ compose_remote_dir }}" + files: + - "{{ semaphore_compose_filename }}" + pull: always + + - name: Recreate Semaphore stack + community.docker.docker_compose_v2: + project_name: "{{ semaphore_project }}" + project_src: "{{ compose_remote_dir }}" + files: + - "{{ semaphore_compose_filename }}" state: present - update_cache: yes + recreate: always - - name: Run Semaphore self-update on VM in background (nohup) - ansible.builtin.command: - argv: - - sshpass - - -e - - ssh - - -o - - StrictHostKeyChecking=no - - -o - - ConnectTimeout=15 - - "{{ vm_user }}@{{ vm_ip }}" - - bash - - -lc - - | - nohup bash -c ' - unalias docker 2>/dev/null || true - DOCKER_CLI_HINTS=0 docker compose \ - -p {{ semaphore_project }} \ - -f {{ semaphore_compose_file }} \ - up -d --no-deps --force-recreate --pull always {{ semaphore_service }} - ' >/dev/null 2>&1 & - environment: - SSHPASS: "{{ vm_pass }}" - register: semaphore_update - changed_when: false - no_log: "{{ DEBUG == 0 }}" + - name: Wait for Semaphore port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ semaphore_port }}" + timeout: 120 - - name: Show result of Semaphore self-update (debug) - ansible.builtin.debug: - msg: | - RC: {{ semaphore_update.rc }} - STDOUT: {{ (semaphore_update.stdout | default('')).strip() }} - STDERR: {{ (semaphore_update.stderr | default('')).strip() }} - when: DEBUG == 1 + - name: Check Semaphore HTTP endpoint + ansible.builtin.uri: + url: "http://127.0.0.1:{{ semaphore_port }}/" + status_code: 200