diff --git a/blueprints/paperclip/README.md b/blueprints/paperclip/README.md new file mode 100644 index 00000000..2ccae853 --- /dev/null +++ b/blueprints/paperclip/README.md @@ -0,0 +1,15 @@ +# Paperclip + +Paperclip is an open-source control plane for managing teams of AI agents, goals, budgets, tickets, and recurring work. + +This Dokploy template includes: + +- Paperclip web/API service using the official GHCR image +- PostgreSQL 17 database with health check +- Generated `BETTER_AUTH_SECRET` +- Generated database password +- Persistent `/paperclip` storage for instance data +- Public URL configured from the Dokploy domain +- Dokploy domain routing to Paperclip on port 3100 + +After deployment, check the Paperclip container logs for first-run setup or invite information. \ No newline at end of file diff --git a/blueprints/paperclip/docker-compose.yml b/blueprints/paperclip/docker-compose.yml new file mode 100644 index 00000000..5c1ce7bf --- /dev/null +++ b/blueprints/paperclip/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3.8" + +services: + postgres: + image: postgres:17-alpine + restart: unless-stopped + environment: + POSTGRES_USER: paperclip + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: paperclip + healthcheck: + test: ["CMD-SHELL", "pg_isready -U paperclip -d paperclip"] + interval: 10s + timeout: 5s + retries: 10 + volumes: + - postgres-data:/var/lib/postgresql/data + + paperclip: + image: ghcr.io/paperclipai/paperclip:latest + restart: unless-stopped + depends_on: + postgres: + condition: service_healthy + environment: + HOST: 0.0.0.0 + PORT: "3100" + SERVE_UI: "true" + DATABASE_URL: ${DATABASE_URL} + BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} + PAPERCLIP_HOME: /paperclip + PAPERCLIP_INSTANCE_ID: default + PAPERCLIP_CONFIG: /paperclip/instances/default/config.json + PAPERCLIP_DEPLOYMENT_MODE: ${PAPERCLIP_DEPLOYMENT_MODE} + PAPERCLIP_DEPLOYMENT_EXPOSURE: ${PAPERCLIP_DEPLOYMENT_EXPOSURE} + PAPERCLIP_PUBLIC_URL: ${PAPERCLIP_PUBLIC_URL} + expose: + - "3100" + volumes: + - paperclip-data:/paperclip + +volumes: + postgres-data: {} + paperclip-data: {} \ No newline at end of file diff --git a/blueprints/paperclip/logo.svg b/blueprints/paperclip/logo.svg new file mode 100644 index 00000000..44a8f649 --- /dev/null +++ b/blueprints/paperclip/logo.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/blueprints/paperclip/template.toml b/blueprints/paperclip/template.toml new file mode 100644 index 00000000..6a79e07c --- /dev/null +++ b/blueprints/paperclip/template.toml @@ -0,0 +1,20 @@ +[variables] +main_domain = "${domain}" +postgres_password = "${password:32}" +better_auth_secret = "${password:64}" + +[config] +env = [ + "POSTGRES_PASSWORD=${postgres_password}", + "DATABASE_URL=postgres://paperclip:${postgres_password}@postgres:5432/paperclip", + "BETTER_AUTH_SECRET=${better_auth_secret}", + "PAPERCLIP_DEPLOYMENT_MODE=authenticated", + "PAPERCLIP_DEPLOYMENT_EXPOSURE=private", + "PAPERCLIP_PUBLIC_URL=https://${main_domain}" +] +mounts = [] + +[[config.domains]] +serviceName = "paperclip" +port = 3100 +host = "${main_domain}" \ No newline at end of file diff --git a/meta.json b/meta.json index 86705cb4..a3fdfc39 100644 --- a/meta.json +++ b/meta.json @@ -5129,6 +5129,24 @@ "open-source" ] }, + { + "id": "paperclip", + "name": "Paperclip", + "version": "latest", + "description": "Paperclip is an open-source control plane for managing teams of AI agents, goals, budgets, tickets, and recurring work.", + "logo": "logo.svg", + "links": { + "github": "https://github.com/paperclipai/paperclip", + "website": "https://paperclip.ing/", + "docs": "https://docs.paperclip.ing/" + }, + "tags": [ + "ai", + "agents", + "automation", + "self-hosted" + ] + }, { "id": "parseable", "name": "Parseable",