feat: Add paperclip-docker Ansible role for RTX 3090

Deploy Paperclip AI with PostgreSQL, nginx reverse proxy, and Cloudflare
SSL/TLS on illuminations.wdw-labs.cloud. Configured for local_trusted
mode (LAN-only, no auth) with host networking and auto-generated secrets.

Stack: PostgreSQL 16 + Paperclip + nginx + certbot
Hostname: muppet-vision.wdw-labs.cloud
vLLM endpoint: localhost:8000 (DeepSeek-R1-32B Q4)
This commit is contained in:
rblundon committed 2026-09-27 16:47:04 -05:00
1 parent 8778a3bbb0
commit f701ad823f
13 files changed
+1093 -124

No files matched your search

-122
View File
@@ -1,122 +0,0 @@
---
- 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
@@ -0,0 +1,72 @@
---
- name: Deploy Paperclip stack with nginx and certbot
hosts: illuminations
become: true
vars_files:
- "{{ playbook_dir }}/../group_vars/all/vars"
- "{{ playbook_dir }}/../group_vars/all/vault"
roles:
- docker-host
- paperclip-docker
post_tasks:
- name: Verify Paperclip stack is running
community.docker.docker_container_info:
name: "{{ item }}"
register: container_status
loop:
- paperclip
- paperclip-nginx
- paperclip-certbot
failed_when: container_status.containers | length == 0
changed_when: false
- name: Verify Docker is available
command: docker --version
register: docker_version
changed_when: false
- name: Show Docker version
debug:
msg: "Docker version: {{ docker_version.stdout }}"
- name: Verify docker-compose plugin is available
command: docker compose version
register: compose_version
changed_when: false
ignore_errors: true
- name: Show docker-compose version
debug:
msg: "Docker Compose version: {{ compose_version.stdout | default('docker-compose plugin not found') }}"
- name: Display deployment summary
debug:
msg: |
Paperclip stack deployed successfully!
Access points:
- HTTPS: https://{{ paperclip_domain }}
- HTTP (redirects to HTTPS): http://{{ paperclip_domain }}
Services:
- Paperclip: {{ paperclip_host }}:{{ paperclip_port }}
- nginx (reverse proxy): 0.0.0.0:443 / 0.0.0.0:80
- certbot: Running certificate renewal checks
Data location:
- {{ paperclip_base_path }}/data
Certificates:
- {{ paperclip_certs_dir }}/live/{{ paperclip_domain }}/
vLLM endpoint:
- {{ vllm_endpoint }}
Next steps:
1. Verify DNS resolution for {{ paperclip_domain }}
2. Visit https://{{ paperclip_domain }} to access Paperclip
3. Configure Paperclip with OpenCode adapter (should auto-detect vLLM at {{ vllm_endpoint }})
4. Set up Hermes Gateway on Mac Studio
5. Configure agents and skills