Files
esh-pfi-infrastructure/playbooks/deploy-memos.yaml
T
vh 6df5549161 memos: deploy to ana-docker
Stock neosmemo/memos:stable, port 5230, SQLite at
/opt/docker/conf/memos/data/. Joins traefik-net and ships homepage
labels (group=Notes) so it auto-appears on the dashboard via docker
discovery — no edit to configs/homepage/services.yaml needed.

First-run bootstrap is via the UI: visit http://10.250.50.70:5230
and create the Host account through the sign-up form.

Playbook idiom note: docker compose pull lines need the literal
block scalar (|) when the grep pattern contains colons — bare-string
shell value made YAML parse the colon as a mapping separator and
elway choked on first try.
2026-04-29 13:27:12 -07:00

89 lines
2.9 KiB
YAML

# Deploy memos (https://github.com/usememos/memos) — single-container
# self-hosted note server — to ana-docker.
#
# First-boot creates a fresh SQLite DB at /var/opt/memos/memos_prod.db
# inside the container (bind-mounted out to ${MEMOS_DATA_DIR} on the
# host). Visit http://10.250.50.70:5230 immediately after deploy to
# create the Host account.
#
# Usage:
# scripts/elway ana-docker --playbook playbooks/deploy-memos.yaml
#
# Idempotent — safe to rerun.
vars:
compose_dir: /opt/docker/compose/memos
data_dir: /opt/docker/conf/memos/data
host_port: "5230"
steps:
# ── host-side dirs (sudo only on first run) ─────────────────────────
- name: Ensure compose dir exists
shell: mkdir -p {{ compose_dir }}
sudo: true
creates: "{{ compose_dir }}"
- name: Chown compose dir to lkraven
shell: chown -R lkraven:lkraven {{ compose_dir }}
sudo: true
when: "[ \"$(stat -c %U {{ compose_dir }})\" != \"lkraven\" ]"
- name: Ensure data dir exists
shell: mkdir -p {{ data_dir }}
sudo: true
creates: "{{ data_dir }}"
- name: Chown data dir to lkraven
shell: chown -R lkraven:lkraven {{ data_dir }}
sudo: true
when: "[ \"$(stat -c %U {{ data_dir }})\" != \"lkraven\" ]"
# ── deploy compose + env ────────────────────────────────────────────
- name: Upload compose.yaml
upload:
src: stacks/memos/compose.yaml
dest: "{{ compose_dir }}/compose.yaml"
mode: "0644"
- name: Seed .env from template (only if absent)
upload:
src: stacks/memos/.env.example
dest: "{{ compose_dir }}/.env"
mode: "0644"
when: "[ ! -f {{ compose_dir }}/.env ]"
# ── bring up + wait ─────────────────────────────────────────────────
- name: docker compose pull (gets latest stable tag)
shell: |
set -o pipefail
cd {{ compose_dir }} && docker compose pull 2>&1 \
| grep -vE '^(Status|Pulling) |Downloaded'
- name: docker compose up -d
shell: cd {{ compose_dir }} && docker compose up -d
- name: Wait for / to respond
shell: |
for i in $(seq 1 30); do
curl -sf -o /dev/null --max-time 3 http://localhost:{{ host_port }}/ && exit 0
sleep 2
done
exit 1
changed_when: "false"
verify:
- name: / returns 200
shell: curl -sf -o /dev/null http://localhost:{{ host_port }}/
changed_when: "false"
- name: Container is running
shell: docker inspect memos --format '{{.State.Status}}' | grep -q running
changed_when: "false"
- name: Container is on traefik-net (so homepage docker discovery sees it)
shell: docker inspect memos --format '{{json .NetworkSettings.Networks}}' | grep -q traefik-net
changed_when: "false"