From 2eaa2e9c5eac4a3530e2342640078ee4e4663723 Mon Sep 17 00:00:00 2001 From: jdelpilar Date: Mon, 27 Jul 2026 20:40:42 -0700 Subject: [PATCH] 21 feat add new silverbullet role (#23) ### Description This PR adds a new silvetbullet role that configures and starts the silverbullet container Changes - Creates required silverbullet `space` directory - creates silverbullet `.container` file - starts new and updated `.container` files ### Related Issue Closes #21 ### Testing Done - [x] [e.g., Ran local unit tests] - [x] [e.g., Verified service starts under Podman] - [x] [e.g., Manual check of configuration file output] ### Checklist - [x] My code follows the project's style guidelines. - [x] I have performed a self-review of my own code. - [x] I have updated the documentation (if necessary). --------- Co-authored-by: Jordan Del Pilar Reviewed-on: https://git.delpilar.net/jdelpilar/johto-infra/pulls/23 --- inventory.yaml | 5 +- roles/silverbullet_server/README.md | 84 +++++++++++++++++++ roles/silverbullet_server/defaults/main.yaml | 14 ++++ roles/silverbullet_server/handlers/main.yaml | 6 ++ roles/silverbullet_server/tasks/main.yaml | 24 ++++++ .../templates/silverbullet.container.j2 | 50 +++++++++++ site.yaml | 8 ++ 7 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 roles/silverbullet_server/README.md create mode 100644 roles/silverbullet_server/defaults/main.yaml create mode 100644 roles/silverbullet_server/handlers/main.yaml create mode 100644 roles/silverbullet_server/tasks/main.yaml create mode 100644 roles/silverbullet_server/templates/silverbullet.container.j2 diff --git a/inventory.yaml b/inventory.yaml index 0c53b87..74f5e63 100644 --- a/inventory.yaml +++ b/inventory.yaml @@ -34,4 +34,7 @@ all: new-bark: ntfy_servers: hosts: - new-bark: \ No newline at end of file + new-bark: + silverbullet_servers: + hosts: + new-bark: diff --git a/roles/silverbullet_server/README.md b/roles/silverbullet_server/README.md new file mode 100644 index 0000000..39eb473 --- /dev/null +++ b/roles/silverbullet_server/README.md @@ -0,0 +1,84 @@ +# Role: SilverBullet Server +Sets up and deploys SilverBullet container +For more information about SilverBullet check out [their website](https://silverbullet.md/) + +## Tags +- silverbullet +- docs + +## Required Variables +Below is an annotated breakdown of the required variables and their structure for this role + +> [!WARNING] +> Any variable marked `# !SENSITIVE` **should not** be stored in plain text under any circumstance + +### SilverBullet Info +Defines settings for the SilverBullet Server. +Most of these variables are optional, and have predefined defaults in the role itself, however it is possible to define custom variables in `host_vars` files. +Any variable marked as optional has a default value defined in `defaults/main.yaml` for this role + +```yaml +# (optional): Name of the silverbullet container +# This name is also the name of the service created by the quadlet file, +# as well as the name of the .container file +# default: silverbullet +# format: snake_case +silverbullet_name: + +# (optional): Image of the silverbullet container +# This can be any image from any register that podman supports +# default: ghcr.io/silverbulletmd/silverbullet:latest +# format: URL +silverbullet_image: + +# (optional): Port of the silverbullet webui +# this is used for traefik labels to allow for access to the webui +# the default value is defined by the silverbullet container itself. For information on changing it, view the documentation for your image +# default: 3000 +# format: int +silverbullet_port: + +# (optional): Username of the silverbullet user +# this is the default user created for silverbullet +# note, this value has a default, but it is highly recommended to change it via `host_vars` +# default: jdelpilar +# format: username +silverbullet_user: + +# (optional): password for the above created user +# note, this value has a default, but it is highly recommended to change it via `host_vars` +# !SENSITIVE +# default: generated password +# format: password +silverbullet_pass: + +# (optional): url of the silverbullet instance +# this is used to set the url in traefik +# default: silverbullet.delpilar.net +# format: url +silverbullet_url: +``` + +## Templates + +### silverbullet.container.j2 +This template creates a `.container` file for silverbullet +By default this template supports the following additional variables not listed above. +- silver_bullet_volumes: used to define additional mounted volumes + - format: : +- silver_bullet_env: used to define additional environment variables used by the container + - format: dict(:) + +## Execution +> [!NOTE] +> This role restarts any containers where the `.container` file is changed. As such, please ensure that all work is saved and all users are made aware of any potential downtime. + +To run this role without running any other roles, please use this command +```bash +ansible-playbook site.yaml --tags silverbullet +``` + +To run all roles with the `docs` tag at once, please use this command +```bash +ansible-playbook site.yaml --tags docs +``` diff --git a/roles/silverbullet_server/defaults/main.yaml b/roles/silverbullet_server/defaults/main.yaml new file mode 100644 index 0000000..b2a9f34 --- /dev/null +++ b/roles/silverbullet_server/defaults/main.yaml @@ -0,0 +1,14 @@ +--- +silverbullet_name: silverbullet +silverbullet_image: ghcr.io/silverbulletmd/silverbullet:latest +silverbullet_port: 3000 +silverbullet_user: jdelpilar +silverbullet_pass: !vault | + $ANSIBLE_VAULT;1.1;AES256 + 37643331363732343135383232666363326464313534316264316261613161333633306239336365 + 3430613632323734616233303336363331646364303530660a373639323639656664336236303837 + 35613464313563303565666638643463326431616665613837353264346132636133396636383232 + 6430343764626363310a323033333662656532386131663734613436663665356164396662613636 + 38383863313064313563306439653434646533353363373338306633393562373235 +silverbullet_enable_traefik: true +silverbullet_url: silverbullet.delpilar.net diff --git a/roles/silverbullet_server/handlers/main.yaml b/roles/silverbullet_server/handlers/main.yaml new file mode 100644 index 0000000..4f3b877 --- /dev/null +++ b/roles/silverbullet_server/handlers/main.yaml @@ -0,0 +1,6 @@ +- name: Restart changed Silverbullet Services + ansible.builtin.systemd: + name: "{{ silverbullet_name }}" + state: restarted + scope: user + daemon_reload: true diff --git a/roles/silverbullet_server/tasks/main.yaml b/roles/silverbullet_server/tasks/main.yaml new file mode 100644 index 0000000..962df90 --- /dev/null +++ b/roles/silverbullet_server/tasks/main.yaml @@ -0,0 +1,24 @@ +--- +- name: Create SilverBullet Directory + ansible.builtin.file: + path: "{{ podman_config_base_dir }}/{{ silverbullet_name }}/space" + state: directory + mode: "0755" + +- name: Create SilverBullet Quadlet + ansible.builtin.template: + src: silverbullet.container.j2 + dest: "{{ podman_quadlet_base_dir }}/services/{{ silverbullet_name }}.container" + owner: "{{ ansible_user }}" + mode: "644" + notify: Restart changed Silverbullet Services + +- name: Flush Handlers + ansible.builtin.meta: flush_handlers + +- name: Start SilverBullet + ansible.builtin.systemd: + name: "{{ silverbullet_name }}" + state: started + scope: user + daemon_reload: true diff --git a/roles/silverbullet_server/templates/silverbullet.container.j2 b/roles/silverbullet_server/templates/silverbullet.container.j2 new file mode 100644 index 0000000..932bed6 --- /dev/null +++ b/roles/silverbullet_server/templates/silverbullet.container.j2 @@ -0,0 +1,50 @@ +# {{ ansible_managed }} +[Unit] +After=network-online.target + +StartLimitBurst=10 +StartLimitIntervalSec=120 + +[Container] +ContainerName={{ silverbullet_name }} +Image={{ silverbullet_image }} + +Network=services-net +PublishPort={{ silverbullet_port }}:3000 + +AutoUpdate=registry + +Label=category=management +Label=owner={{ container_owner | default('jdelpilar') }} + +{% if silverbullet_enable_traefik %} +Label=traefik.enable=true +Label=traefik.http.routers.{{ silverbullet_name }}.rule=Host(`{{ silverbullet_url | default(silverbullet_name + "." + base_domain, true) }}`) +Label=traefik.http.routers.{{ silverbullet_name }}.entrypoints={{ traefik_entrypoint | default('websecure', true) }} +Label=traefik.http.routers.{{ silverbullet_name }}.tls.certresolver={{ traefik_resolver | default('cloudflare', true) }} +Label=traefik.http.services.{{ silverbullet_name }}.loadbalancer.server.port={{ silverbullet_port | default(3000, true) }} +Label=traefik.docker.network=services-net +Label=traefik.http.routers.{{ silverbullet_name }}.tls=true +{% endif %} + +Volume={{ podman_config_base_dir }}/{{ silverbullet_name }}/space:/space +{% if silverbullet_volumes is defined %} +{% for volume in silverbullet_volumes %} +Volume={{ volume }} +{% endfor %} +{% endif %} + +Environment=TZ={{ timezone | default('America/Los_Angeles') }} +Environment=SB_USER={{ silverbullet_user }}:{{ silverbullet_pass }} +{% if silverbullet_env is defined %} +{% for key, value in silverbullet_env.items() | sort %} +Environment={{ key }}={{ value }} +{% endfor %} +{% endif %} + +[Service] +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=default.target diff --git a/site.yaml b/site.yaml index 2385154..caf4de6 100644 --- a/site.yaml +++ b/site.yaml @@ -44,3 +44,11 @@ tags: - ntfy - comms + +- name: SilverBullet Setup + hosts: silverbullet_servers + roles: + - silverbullet_server + tags: + - silverbullet + - docs