From 029a82de06e1cf80b490a9ee97744d23e7bfcea1 Mon Sep 17 00:00:00 2001 From: "martin.fencl" Date: Tue, 1 Sep 2026 09:04:33 +0200 Subject: [PATCH] feat: add Glance service and configuration files for deployment --- docker-compose/docker-compose-glance.yml | 22 ++++++ files/glance/glance.yml | 88 ++++++++++++++++++++++++ update_glance.yml | 88 ++++++++++++++++++++++++ 3 files changed, 198 insertions(+) create mode 100644 docker-compose/docker-compose-glance.yml create mode 100644 files/glance/glance.yml create mode 100644 update_glance.yml diff --git a/docker-compose/docker-compose-glance.yml b/docker-compose/docker-compose-glance.yml new file mode 100644 index 0000000..25a595f --- /dev/null +++ b/docker-compose/docker-compose-glance.yml @@ -0,0 +1,22 @@ +# docker-compose-glance.yml + +services: + glance: + container_name: glance + image: glanceapp/glance:latest + restart: unless-stopped + volumes: + # Relative to project_src (~/.ansible-compose), so no username is hardcoded. + # The playbook creates this directory and uploads glance.yml into it. + # The image entrypoint is /app/glance --config /app/config/glance.yml, + # so the file must be named exactly glance.yml. + - ./glance/config:/app/config + environment: + # Used by the calendar widget and by relative timestamps + - TZ=Europe/Prague + # Optional: raises the GitHub API limit for the releases widget. + # Referenced from glance.yml as ${GITHUB_TOKEN}; inject it as a + # Semaphore secret instead of committing it here. + # - GITHUB_TOKEN=${GITHUB_TOKEN} + ports: + - '9445:8080' diff --git a/files/glance/glance.yml b/files/glance/glance.yml new file mode 100644 index 0000000..4675936 --- /dev/null +++ b/files/glance/glance.yml @@ -0,0 +1,88 @@ +# glance.yml - source of truth lives in git, deployed by update_glance.yml + +pages: + - name: Home + # Optionally, if you only have a single page you can hide the desktop navigation for a cleaner look + # hide-desktop-navigation: true + columns: + - size: small + widgets: + - type: calendar + first-day-of-week: monday + + - type: rss + limit: 10 + collapse-after: 3 + cache: 12h + feeds: + - url: https://www.root.cz/rss/clanky/ + title: root clanky + limit: 6 + - url: https://www.root.cz/rss/zpravicky/ + title: root zpravy + limit: 6 + + - type: twitch-channels + channels: + - theprimeagen + - j_blow + - piratesoftware + - cohhcarnage + - christitustech + - EJ_SA + + - size: full + widgets: + - type: group + widgets: + - type: hacker-news + - type: lobsters + + - type: videos + channels: + - UCXuqSBlHAE6Xw-yeJA0Tunw # Linus Tech Tips + - UCR-DXc1voovS8nhAvccRZhg # Jeff Geerling + - UCsBjURrPoezykLs9EqgamOA # Fireship + - UCBJycsmduvYEL83R_U4JriQ # Marques Brownlee + - UCHnyfMqiRRG1u-2MsSQLbXA # Veritasium + + - type: group + widgets: + - type: reddit + subreddit: technology + show-thumbnails: true + - type: reddit + subreddit: selfhosted + show-thumbnails: true + + - size: small + widgets: + - type: weather + location: Ceske Budejovice, Czechia + units: metric # alternatively "imperial" + hour-format: 24h # alternatively "12h" + # Optionally hide the location from being displayed in the widget + # hide-location: true + + - type: markets + markets: + - symbol: SPY + name: S&P 500 + - symbol: BTC-USD + name: Bitcoin + - symbol: BTC-EUR + name: Bitcoin + - symbol: CZK=X + name: USD/CZK + + - type: releases + cache: 1d + # Without authentication the GitHub API allows up to 60 requests per hour. + # Uncomment and pass GITHUB_TOKEN in as an environment variable to raise it. + # token: ${GITHUB_TOKEN} + repositories: + - trezor/trezor-firmware + - glanceapp/glance + - go-gitea/gitea + - immich-app/immich + - syncthing/syncthing diff --git a/update_glance.yml b/update_glance.yml new file mode 100644 index 0000000..2774fb9 --- /dev/null +++ b/update_glance.yml @@ -0,0 +1,88 @@ +# update_glance.yml + +- name: Update Glance + hosts: pve2_vm + gather_facts: false + + vars: + # Compose sync (controller -> target) + compose_local_dir: "{{ playbook_dir }}/docker-compose" + compose_remote_base: "/home/{{ ansible_user }}/.ansible-compose" + + # Glance settings + glance_project: glance + glance_compose_filename: "docker-compose-glance.yml" + glance_service: glance + glance_port: 9445 + + # Config delivery (git -> controller -> target). + # Must match the ./glance/config volume in the compose file. + glance_config_local: "{{ playbook_dir }}/files/glance/glance.yml" + glance_config_remote_dir: "{{ compose_remote_base }}/glance/config" + + tasks: + - name: Ensure remote compose directory exists + ansible.builtin.file: + path: "{{ compose_remote_base }}" + state: directory + mode: "0755" + + - name: Ensure Glance config directory exists + ansible.builtin.file: + path: "{{ glance_config_remote_dir }}" + state: directory + mode: "0755" + + - name: Upload Glance compose file to remote host + ansible.builtin.copy: + src: "{{ compose_local_dir }}/{{ glance_compose_filename }}" + dest: "{{ compose_remote_base }}/{{ glance_compose_filename }}" + mode: "0644" + + - name: Upload Glance configuration + ansible.builtin.copy: + src: "{{ glance_config_local }}" + dest: "{{ glance_config_remote_dir }}/glance.yml" + mode: "0644" + + - name: Pull latest Glance image + community.docker.docker_compose_v2: + project_name: "{{ glance_project }}" + project_src: "{{ compose_remote_base }}" + files: + - "{{ glance_compose_filename }}" + pull: always + + - name: Recreate Glance service + community.docker.docker_compose_v2: + project_name: "{{ glance_project }}" + project_src: "{{ compose_remote_base }}" + files: + - "{{ glance_compose_filename }}" + services: + - "{{ glance_service }}" + state: present + recreate: always + + - name: Wait for Glance port + ansible.builtin.wait_for: + host: 127.0.0.1 + port: "{{ glance_port }}" + timeout: 60 + + - name: Check Glance HTTP endpoint + ansible.builtin.uri: + url: "http://127.0.0.1:{{ glance_port }}/" + status_code: 200 + register: glance_http + retries: 30 + delay: 3 + until: glance_http.status == 200 + changed_when: false + + - name: Show Glance container logs on failed startup + ansible.builtin.command: + cmd: "docker logs --tail 50 glance" + register: glance_logs + changed_when: false + when: glance_http is failed \ No newline at end of file