- name: Deploy Memos on memos-box hosts: memos become: yes vars_files: - ./memos_vars.yml vars: memos_subdomain: "{{ subdomains.memos }}" memos_domain: "{{ memos_subdomain }}.{{ root_domain }}" tasks: - name: Ensure required packages are installed apt: name: - wget - tar state: present update_cache: true - name: Create memos system user user: name: "{{ memos_user }}" system: yes shell: /bin/false home: "{{ memos_data_dir }}" create_home: no comment: "Memos Service" - name: Create memos data directory file: path: "{{ memos_data_dir }}" state: directory owner: "{{ memos_user }}" group: "{{ memos_user }}" mode: '0750' - name: Create memos config directory file: path: "{{ memos_config_dir }}" state: directory owner: root group: root mode: '0755' - name: Download memos binary archive get_url: url: "{{ memos_url }}" dest: "/tmp/memos.tar.gz" mode: '0644' - name: Extract memos binary unarchive: src: "/tmp/memos.tar.gz" dest: "/tmp" remote_src: yes - name: Move memos binary to /usr/local/bin copy: src: "/tmp/memos" dest: "{{ memos_bin_path }}" remote_src: yes mode: '0755' owner: root group: root - name: Create memos environment file copy: dest: "{{ memos_config_dir }}/memos.env" content: | MEMOS_MODE=prod MEMOS_ADDR=0.0.0.0 MEMOS_PORT={{ memos_port }} MEMOS_DATA={{ memos_data_dir }} MEMOS_DRIVER=sqlite owner: root group: root mode: '0644' notify: Restart memos - name: Create memos systemd service copy: dest: /etc/systemd/system/memos.service content: | [Unit] Description=Memos - A privacy-first, lightweight note-taking service After=network.target [Service] Type=simple User={{ memos_user }} Group={{ memos_user }} WorkingDirectory={{ memos_data_dir }} EnvironmentFile={{ memos_config_dir }}/memos.env ExecStart={{ memos_bin_path }} Restart=always RestartSec=3 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target owner: root group: root mode: '0644' notify: Restart memos - name: Reload systemd daemon systemd: daemon_reload: yes - name: Enable and start memos service systemd: name: memos enabled: yes state: started - name: Wait for memos to be ready uri: url: "http://127.0.0.1:{{ memos_port }}/healthz" method: GET status_code: 200 register: memos_health retries: 10 delay: 3 until: memos_health.status == 200 - name: Display memos status debug: msg: "Memos is running on port {{ memos_port }}. Access via Tailscale at http://{{ memos_tailscale_hostname }}:{{ memos_port }}" handlers: - name: Restart memos systemd: name: memos state: restarted - name: Configure Caddy reverse proxy for Memos on the edge host (via Tailscale) hosts: edge become: yes vars_files: - ./memos_vars.yml vars: memos_subdomain: "{{ subdomains.memos }}" memos_domain: "{{ memos_subdomain }}.{{ root_domain }}" tasks: - name: Publish Memos through Caddy (via Tailscale) ansible.builtin.include_role: name: caddy_site vars: caddy_site_name: memos caddy_site_domain: "{{ memos_domain }}" caddy_site_upstream: "{{ memos_tailscale_hostname }}:{{ memos_port }}" caddy_site_resolvers: "100.100.100.100"