--- - 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