---
- name: "π Check if host-specific config.yaml exists in {{ DASHBOARD_CONFIG_INV_PATH }}"
stat:
path: "{{ DASHBOARD_CONFIG_INV_PATH }}"
delegate_to: localhost
become: false
register: config_file
- name: π Load menu categories
include_vars:
file: "menu_categories.yml"
- name: π§© Load docker cards
set_fact:
portfolio_cards: "{{ lookup('docker_cards', 'roles') }}"
- name: π Probe Simple Icons reachability per card slug (on the stack host)
uri_probe_batch:
urls: "{{ DASHBOARD_SIMPLEICONS_PROBE_URLS }}"
method: HEAD
status_codes: [200, 404]
attempts: 3
delay: 2
timeout: "{{ lookup('timeout', 10) | int }}"
validate_certs: false
follow_redirects: safe
workers: 16
register: dashboard_simpleicons_probe
delegate_to: "{{ STACK_HOST }}"
run_once: true
when: DASHBOARD_SIMPLEICONS_ENABLED | bool
changed_when: false
- name: "π Render one Dashboard config per network"
include_tasks: _instance_config.yml
loop: "{{ DASHBOARD_INSTANCES }}"
loop_control:
loop_var: dashboard_instance
vars:
domain: "{{ DASHBOARD_INSTANCE_DOMAIN }}"
- name: β³ Wait for branding assets this deployment serves
when: DASHBOARD_ASSET_ENABLED | bool
block:
- name: π§© Load rendered dashboard config before first compose start
slurp:
src: "{{ DASHBOARD_CONFIG_YML_DEST }}"
register: dashboard_rendered_config_raw
vars:
domain: "{{ lookup('domain', DASHBOARD_APPLICATION_ID) }}"
- name: π Collect branding asset URLs served by the shared file service
set_fact:
dashboard_branding_asset_urls: >-
{{
[
(
dashboard_platform_logo_source
if dashboard_platform_logo_source.startswith(dashboard_asset_url_base)
else ''
),
(
dashboard_platform_favicon_source
if dashboard_platform_favicon_source.startswith(dashboard_asset_url_base)
else ''
),
(
dashboard_company_logo_source
if dashboard_company_logo_source.startswith(dashboard_asset_url_base)
else ''
)
]
| select('string')
| reject('equalto', '')
| unique
| list
}}
vars:
dashboard_rendered_config: "{{ dashboard_rendered_config_raw.content | b64decode | from_yaml }}"
dashboard_asset_url_base: "{{ lookup('config', 'web-svc-asset', 'services.asset.url') }}"
dashboard_platform_logo_source: "{{ ((dashboard_rendered_config.get('platform') or {}).get('logo') or {}).get('source', '') }}"
dashboard_platform_favicon_source: "{{ ((dashboard_rendered_config.get('platform') or {}).get('favicon') or {}).get('source', '') }}"
dashboard_company_logo_source: "{{ ((dashboard_rendered_config.get('company') or {}).get('logo') or {}).get('source', '') }}"
changed_when: false
- name: β³ Wait for dashboard branding assets before first compose start
uri_retry:
url: "{{ item }}"
status_code: 200
validate_certs: false
register: dashboard_branding_asset_http
retries: 60
delay: 5
until: dashboard_branding_asset_http.status == 200
loop: "{{ dashboard_branding_asset_urls }}"
loop_control:
label: "{{ item }}"
delegate_to: "{{ STACK_HOST }}"
run_once: true
- name: "πΏ Flush compose handlers"
meta: flush_handlers
- name: "β
Ensure Simple Icons is reachable and refresh dashboard cards"
when: DASHBOARD_SIMPLEICONS_ENABLED | bool
block:
- name: β
Ensure shared Simple Icons service is loaded before refresh
include_tasks: utils/load/app.yml
vars:
load_app_id: web-svc-simpleicons
- name: πΏ Flush handlers after loading shared Simple Icons service
meta: flush_handlers
- name: π Refresh dashboard cards after Simple Icons becomes reachable
include_tasks: "03_simpleicons_refresh.yml"
- name: β³ Wait for every Dashboard instance (so all logos can download during init)
uri_retry:
url: "http://{{ DOCKER_REACH_HOST }}:{{ lookup('config', DASHBOARD_APPLICATION_ID, 'services.dashboard.ports.local.' ~ ('http' | labelled(dashboard_instance.label,
'_'))) }}/"
status_code: 200
register: dashboard_http
retries: 60
delay: 5
until: dashboard_http.status == 200
loop: "{{ DASHBOARD_INSTANCES }}"
loop_control:
loop_var: dashboard_instance
label: "{{ dashboard_instance.network }}"
delegate_to: "{{ STACK_HOST }}"
run_once: true