Base ArchitectureΒΆ

Compose 🐳¢

flowchart LR
    none["dsk-base declares no service"]

Swarm 🐝¢

flowchart LR
    none["dsk-base declares no service"]

VolumesΒΆ

flowchart LR
    none["dsk-base declares no volume"]

Condition

Effect

swarm, storage.backend: nfs, no nfs: false, role not pinned

shared over NFS

any one of those missing

node-local

All four conditions must hold, so pinning a role takes every one of its volumes node-local. Only the role’s primary entry counts as pinned here: a placement on any other service pins that service alone and leaves the backing of every volume unchanged. The chain is drawn rather than its result, because that coupling is what makes a placement change move data without saying so.

DependenciesΒΆ

flowchart LR
    subgraph deps [Dependencies]
        dep_user_workstation["user-workstation πŸ’»"]
        dep_web_app_docs["web-app-docs 🐳🐝"]
    end
    subgraph role [dsk-base πŸ’»]
        svc_base["base"]
        svc_workstation["workstation"]
        svc_docs["docs"]
    end
    subgraph dependents [Dependents]
        dpt_dsk_blender["dsk-blender πŸ’»"]
        dpt_dsk_bluray_player["dsk-bluray-player πŸ’»"]
        dpt_dsk_chromium["dsk-chromium πŸ’»"]
        dpt_dsk_code["dsk-code πŸ’»"]
        dpt_dsk_copyq["dsk-copyq πŸ’»"]
        dpt_dsk_docker["dsk-docker πŸ’»"]
        dpt_dsk_dotlinker["dsk-dotlinker πŸ’»"]
        dpt_dsk_firefox["dsk-firefox πŸ’»"]
        dpt_dsk_git["dsk-git πŸ’»"]
        dpt_dsk_gnome["dsk-gnome πŸ’»"]
        dpt_dsk_gnome_caffeine["dsk-gnome-caffeine πŸ’»"]
        dpt_dsk_gnome_extensions["dsk-gnome-extensions πŸ’»"]
        dpt_dsk_gnome_terminal["dsk-gnome-terminal πŸ’»"]
        dpt_dsk_gnt_claude["dsk-gnt-claude πŸ’»"]
        dpt_dsk_gnt_codex["dsk-gnt-codex πŸ’»"]
        dpt_dsk_gnt_cursor["dsk-gnt-cursor πŸ’»"]
        dpt_dsk_gnt_pi["dsk-gnt-pi πŸ’»"]
        dpt_dsk_gnucash["dsk-gnucash πŸ’»"]
        dpt_dsk_jrnl["dsk-jrnl πŸ’»"]
        dpt_dsk_keepassxc["dsk-keepassxc πŸ’»"]
        dpt_dsk_laya["dsk-laya πŸ’»"]
        dpt_dsk_libreoffice["dsk-libreoffice πŸ’»"]
        dpt_dsk_micro["dsk-micro πŸ’»"]
        dpt_dsk_neovim["dsk-neovim πŸ’»"]
        dpt_dsk_nextcloud["dsk-nextcloud πŸ’»"]
        dpt_dsk_obs["dsk-obs πŸ’»"]
        dpt_dsk_qbittorrent["dsk-qbittorrent πŸ’»"]
        dpt_dsk_retroarch["dsk-retroarch πŸ’»"]
        dpt_dsk_spotify["dsk-spotify πŸ’»"]
        dpt_dsk_ssh["dsk-ssh πŸ’»"]
        dpt_dsk_torbrowser["dsk-torbrowser πŸ’»"]
        dpt_dsk_virtualbox["dsk-virtualbox πŸ’»"]
        dpt_dsk_zoom["dsk-zoom πŸ’»"]
    end
    dep_user_workstation -- "1:1" --> svc_workstation
    dep_web_app_docs -. "0..1" .-> svc_docs
    svc_base -- "1:1" --> dpt_dsk_blender
    svc_base -- "1:1" --> dpt_dsk_bluray_player
    svc_base -- "1:1" --> dpt_dsk_chromium
    svc_base -- "1:1" --> dpt_dsk_code
    svc_base -- "1:1" --> dpt_dsk_copyq
    svc_base -- "1:1" --> dpt_dsk_docker
    svc_base -- "1:1" --> dpt_dsk_dotlinker
    svc_base -- "1:1" --> dpt_dsk_firefox
    svc_base -- "1:1" --> dpt_dsk_git
    svc_base -- "1:1" --> dpt_dsk_gnome
    svc_base -- "1:1" --> dpt_dsk_gnome_caffeine
    svc_base -- "1:1" --> dpt_dsk_gnome_extensions
    svc_base -- "1:1" --> dpt_dsk_gnome_terminal
    svc_base -- "1:1" --> dpt_dsk_gnt_claude
    svc_base -- "1:1" --> dpt_dsk_gnt_codex
    svc_base -- "1:1" --> dpt_dsk_gnt_cursor
    svc_base -- "1:1" --> dpt_dsk_gnt_pi
    svc_base -- "1:1" --> dpt_dsk_gnucash
    svc_base -- "1:1" --> dpt_dsk_jrnl
    svc_base -- "1:1" --> dpt_dsk_keepassxc
    svc_base -- "1:1" --> dpt_dsk_laya
    svc_base -- "1:1" --> dpt_dsk_libreoffice
    svc_base -- "1:1" --> dpt_dsk_micro
    svc_base -- "1:1" --> dpt_dsk_neovim
    svc_base -- "1:1" --> dpt_dsk_nextcloud
    svc_base -- "1:1" --> dpt_dsk_obs
    svc_base -- "1:1" --> dpt_dsk_qbittorrent
    svc_base -- "1:1" --> dpt_dsk_retroarch
    svc_base -- "1:1" --> dpt_dsk_spotify
    svc_base -- "1:1" --> dpt_dsk_ssh
    svc_base -- "1:1" --> dpt_dsk_torbrowser
    svc_base -- "1:1" --> dpt_dsk_virtualbox
    svc_base -- "1:1" --> dpt_dsk_zoom

Symbol

Meaning

1:1 solid

fixed relationship

0..1 dashed

conditional, enabled only in matching deployments

0..0 red

declared but turned off in this role

πŸ’»

deploys to the host

🐳

deploys under compose

🐝

deploys under swarm

❌

service explicitly turned off

βš™οΈ

Ansible role dependency from meta/main.yml

Every dependency and dependent is listed; the graph is not truncated.