From 8778a3bbb0fd58c5e4d9a9afd36fc9b475c96ee4 Mon Sep 17 00:00:00 2001 From: Hermes Agent service account Date: Fri, 25 Sep 2026 17:45:11 -0500 Subject: [PATCH] Add Paperclip AI deployment playbook --- ansible/playbooks/deploy_paperclip.yml | 122 +++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 ansible/playbooks/deploy_paperclip.yml diff --git a/ansible/playbooks/deploy_paperclip.yml b/ansible/playbooks/deploy_paperclip.yml new file mode 100644 index 0000000..c138412 --- /dev/null +++ b/ansible/playbooks/deploy_paperclip.yml @@ -0,0 +1,122 @@ +--- +- name: Deploy Paperclip AI via Podman Quadlets + hosts: paperclip_server + become: false + vars: + deploy_dir: "/home/{{ ansible_user }}/paperclip-deploy" + quadlet_dir: "/home/{{ ansible_user }}/.config/containers/systemd" + db_user: "paperclip" + db_password: "paperclip_password_change_me" + db_name: "paperclip" + better_auth_secret: "super_secret_better_auth_key_change_me" + paperclip_public_url: "http://muppet-vision.local:3100" + + tasks: + - name: "Ensure deployment and quadlet directories exist" + file: + path: "{{ item }}" + state: directory + mode: '0755' + loop: + - "{{ deploy_dir }}" + - "{{ quadlet_dir }}" + + - name: "Clone Paperclip repository" + git: + repo: 'https://github.com/paperclipai/paperclip.git' + dest: "{{ deploy_dir }}/source" + version: master + force: yes + + - name: "Build paperclip-local image" + shell: | + podman build -t paperclip-local {{ deploy_dir }}/source + args: + chdir: "{{ deploy_dir }}" + + - name: "Create environment file (paperclip.env)" + copy: + dest: "{{ quadlet_dir }}/paperclip.env" + content: | + POSTGRES_USER={{ db_user }} + POSTGRES_PASSWORD={{ db_password }} + POSTGRES_DB={{ db_name }} + BETTER_AUTH_SECRET={{ better_auth_secret }} + PAPERCLIP_PUBLIC_URL={{ paperclip_public_url }} + mode: '0600' + + - name: "Deploy Quadlet: paperclip.pod" + copy: + dest: "{{ quadlet_dir }}/paperclip.pod" + content: | + [Unit] + Description=Paperclip Pod + + [Pod] + PodName=paperclip + PublishPort=3100:3100 + mode: '0644' + + - name: "Deploy Quadlet: paperclip-db.container" + copy: + dest: "{{ quadlet_dir }}/paperclip-db.container" + content: | + [Unit] + Description=PostgreSQL for Paperclip + + [Container] + Image=docker.io/library/postgres:17-alpine + ContainerName=paperclip-db + Pod=paperclip.pod + Volume=paperclip-pgdata:/var/lib/postgresql/data + EnvironmentFile=%h/.config/containers/systemd/paperclip.env + HealthCmd=pg_isready -U $POSTGRES_USER -d $POSTGRES_DB -h localhost || exit 1 + HealthInterval=15s + HealthTimeout=5s + HealthRetries=5 + + [Service] + Restart=on-failure + TimeoutStartSec=60 + + [Install] + WantedBy=default.target + mode: '0644' + + - name: "Deploy Quadlet: paperclip.container" + copy: + dest: "{{ quadlet_dir }}/paperclip.container" + content: | + [Unit] + Description=Paperclip AI Agent Orchestrator + Requires=paperclip-db.service + After=paperclip-db.service + + [Container] + Image=paperclip-local + ContainerName=paperclip + Pod=paperclip.pod + Volume=%h/.local/share/paperclip:/paperclip:Z + Environment=HOST=0.0.0.0 + Environment=PAPERCLIP_HOME=/paperclip + Environment=PAPERCLIP_DEPLOYMENT_MODE=authenticated + Environment=PAPERCLIP_DEPLOYMENT_EXPOSURE=private + Environment=PAPERCLIP_PUBLIC_URL={{ paperclip_public_url }} + EnvironmentFile=%h/.config/containers/systemd/paperclip.env + + [Service] + Restart=on-failure + TimeoutStartSec=120 + + [Install] + WantedBy=default.target + mode: '0644' + + - name: "Reload systemd daemon" + shell: systemctl --user daemon-reload + + - name: "Start Paperclip services" + systemd: + name: paperclip.service + state: started + scope: user