Add CLAUDE.md for project documentation and remove obsolete workflow files

- Created CLAUDE.md to provide comprehensive guidance on the n8n-install project, including architecture, key files, common commands, and service addition workflow.
- Deleted outdated workflow files: Local_RAG_AI_Agent_n8n_Workflow.json, Create_Google_Doc.json, Get_Postgres_Tables.json, Post_Message_to_Slack.json, and Summarize_Slack_Conversation.json to streamline the repository and remove unused resources.
- Updated final report script to reflect changes in user messaging.
This commit is contained in:
Yury Kossakovsky
2025-11-05 10:22:52 -07:00
parent 0c2b27c2e6
commit 702d50e90b
7 changed files with 198 additions and 1286 deletions

197
CLAUDE.md Normal file
View File

@@ -0,0 +1,197 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
This is **n8n-install**, a Docker Compose-based installer that provides a comprehensive self-hosted environment for n8n workflow automation and numerous AI/automation services. The installer includes an interactive wizard, automated secret generation, and integrated HTTPS via Caddy.
### Core Architecture
- **Profile-based service management**: Services are activated via Docker Compose profiles (e.g., `n8n`, `flowise`, `monitoring`). Profiles are stored in the `.env` file's `COMPOSE_PROFILES` variable.
- **No exposed ports**: Services do NOT publish ports directly. All external HTTPS access is routed through Caddy reverse proxy on ports 80/443.
- **Shared secrets**: Core services (Postgres, Redis/Valkey, Caddy) are always included. Other services are optional and selected during installation.
- **Queue-based n8n**: n8n runs in `queue` mode with Redis, Postgres, and dynamically scaled workers (`N8N_WORKER_COUNT`).
### Key Files
- `docker-compose.yml`: Service definitions with profiles
- `Caddyfile`: Reverse proxy configuration with automatic HTTPS
- `.env`: Generated secrets and configuration (from `.env.example`)
- `scripts/install.sh`: Main installation orchestrator
- `scripts/04_wizard.sh`: Interactive service selection using whiptail
- `scripts/03_generate_secrets.sh`: Secret generation and bcrypt hashing
- `scripts/07_final_report.sh`: Post-install credential summary
## Common Development Commands
### Installation and Updates
```bash
# Full installation (run from project root)
sudo bash ./scripts/install.sh
# Update to latest versions and pull new images
sudo bash ./scripts/update.sh
# Re-run service selection wizard (for adding/removing services)
sudo bash ./scripts/04_wizard.sh
```
### Docker Compose Operations
```bash
# Start all enabled profile services
docker compose -p localai up -d
# View logs for a specific service
docker compose -p localai logs -f --tail=200 <service-name> | cat
# Recreate a single service (e.g., after config changes)
docker compose -p localai up -d --no-deps --force-recreate <service-name>
# Stop all services
docker compose -p localai down
# Remove unused Docker resources
sudo bash ./scripts/docker_cleanup.sh
```
### Development and Testing
```bash
# Regenerate secrets after modifying .env.example
bash ./scripts/03_generate_secrets.sh
# Check current active profiles
grep COMPOSE_PROFILES .env
# View Caddy logs for reverse proxy issues
docker compose -p localai logs -f caddy
# Test n8n worker scaling
# Edit N8N_WORKER_COUNT in .env, then:
docker compose -p localai up -d --scale n8n-worker=<count>
```
## Adding a New Service
Follow this workflow when adding a new optional service (refer to `.cursor/rules/add-new-service.mdc` for complete details):
1. **docker-compose.yml**: Add service with `profiles: ["myservice"]`, `restart: unless-stopped`. Do NOT expose ports.
2. **Caddyfile**: Add reverse proxy block using `{$MYSERVICE_HOSTNAME}`. Consider if basic auth is needed.
3. **.env.example**: Add `MYSERVICE_HOSTNAME=myservice.yourdomain.com` and credentials if using basic auth.
4. **scripts/03_generate_secrets.sh**: Generate passwords and bcrypt hashes. Add to `VARS_TO_GENERATE` map.
5. **scripts/04_wizard.sh**: Add service to `base_services_data` array for wizard selection.
6. **scripts/07_final_report.sh**: Add service URL and credentials output using `is_profile_active "myservice"`.
7. **README.md**: Add one-line description under "What's Included".
**Always ask users if the new service requires Caddy basic auth protection.**
## Important Service Details
### n8n Configuration
- n8n runs in `EXECUTIONS_MODE=queue` with Redis as the queue backend
- Custom JavaScript libraries are pre-installed: `cheerio`, `axios`, `moment`, `lodash` (see `NODE_FUNCTION_ALLOW_EXTERNAL`)
- Workflows can access the host filesystem via `/data/shared` (mapped to `./shared`)
- Worker count is controlled by `N8N_WORKER_COUNT` env var (defaults to 1)
### Caddy Reverse Proxy
- Automatically obtains Let's Encrypt certificates when `LETSENCRYPT_EMAIL` is set
- Hostnames are passed via environment variables (e.g., `N8N_HOSTNAME`, `FLOWISE_HOSTNAME`)
- Basic auth uses bcrypt hashes generated by `scripts/03_generate_secrets.sh` via Caddy's hash command
- Never add `ports:` to services in docker-compose.yml; let Caddy handle all external access
### Secret Generation
The `scripts/03_generate_secrets.sh` script:
- Generates random passwords, JWT secrets, API keys, and encryption keys
- Creates bcrypt password hashes using Caddy's `hash-password` command
- Preserves existing user-provided values in `.env`
- Supports different secret types via `VARS_TO_GENERATE` map: `password:32`, `jwt`, `api_key`, etc.
### Service Profiles
Common profiles:
- `n8n`: n8n workflow automation (includes main app, worker, and import services)
- `flowise`: Flowise AI agent builder
- `monitoring`: Prometheus, Grafana, cAdvisor, node-exporter
- `langfuse`: Langfuse observability (includes ClickHouse, MinIO, worker, web)
- `cpu`, `gpu-nvidia`, `gpu-amd`: Ollama hardware profiles (mutually exclusive)
- `cloudflare-tunnel`: Cloudflare Tunnel for zero-trust access
## Architecture Patterns
### Healthchecks
Services should define healthchecks for proper dependency management:
```yaml
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"]
interval: 30s
timeout: 10s
retries: 5
```
### Service Dependencies
Use `depends_on` with conditions:
```yaml
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
```
### Environment Variable Patterns
- All secrets/passwords end with `_PASSWORD` or `_KEY`
- All hostnames end with `_HOSTNAME`
- Password hashes end with `_PASSWORD_HASH`
- Use `${VAR:-default}` for optional vars with defaults
### Profile Activation Logic
In bash scripts, check if a profile is active:
```bash
if is_profile_active "myservice"; then
# Service-specific logic
fi
```
## Common Issues and Solutions
### Service won't start after adding
1. Ensure profile is added to `COMPOSE_PROFILES` in `.env`
2. Check logs: `docker compose -p localai logs <service>`
3. Verify no port conflicts (no services should publish ports)
4. Ensure healthcheck is properly defined if service has dependencies
### Caddy certificate issues
- DNS must be configured before installation (wildcard A record: `*.yourdomain.com`)
- Check Caddy logs for certificate acquisition errors
- Verify `LETSENCRYPT_EMAIL` is set in `.env`
### Password hash generation fails
- Ensure Caddy container is running: `docker compose -p localai up -d caddy`
- Script uses: `docker exec caddy caddy hash-password --plaintext "$password"`
## File Locations
- Shared files accessible by n8n: `./shared` (mounted as `/data/shared` in n8n)
- n8n storage: Docker volume `n8n_storage`
- Service-specific volumes: Defined in `volumes:` section at top of `docker-compose.yml`
- Installation logs: stdout during script execution
- Service logs: `docker compose -p localai logs <service>`
## Testing Changes
When modifying installer scripts:
1. Test on a clean Ubuntu 24.04 LTS system (minimum 4GB RAM / 2 CPU)
2. Verify all profile combinations work
3. Check that `.env` is properly generated
4. Confirm final report displays correct URLs and credentials
5. Test update script preserves custom configurations

View File

@@ -1,740 +0,0 @@
{
"name": "Local RAG AI Agent",
"nodes": [
{
"parameters": {},
"id": "99b30fd7-b36c-44ba-9daa-408585aaaee9",
"name": "Postgres Chat Memory",
"type": "@n8n/n8n-nodes-langchain.memoryPostgresChat",
"typeVersion": 1.1,
"position": [
1040,
560
],
"credentials": {
"postgres": {
"id": "iN7fO2CgatVwq73z",
"name": "Postgres account"
}
}
},
{
"parameters": {
"model": "llama3.1:latest",
"options": {}
},
"id": "c7632a7c-2661-492e-bd6f-aab994818998",
"name": "Ollama Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOllama",
"typeVersion": 1,
"position": [
920,
560
],
"credentials": {
"ollamaApi": {
"id": "eOwAotC7AUgJlvHM",
"name": "Ollama account"
}
}
},
{
"parameters": {
"model": "llama3.1:latest",
"options": {}
},
"id": "73d773a4-5c72-4af3-a52d-144f0e417823",
"name": "Ollama Model",
"type": "@n8n/n8n-nodes-langchain.lmOllama",
"typeVersion": 1,
"position": [
1960,
500
],
"credentials": {
"ollamaApi": {
"id": "eOwAotC7AUgJlvHM",
"name": "Ollama account"
}
}
},
{
"parameters": {
"name": "documents",
"topK": 3
},
"id": "3f882fa7-c8ed-4531-b236-a34c16c55838",
"name": "Vector Store Tool",
"type": "@n8n/n8n-nodes-langchain.toolVectorStore",
"typeVersion": 1,
"position": [
1740,
340
]
},
{
"parameters": {
"model": "nomic-embed-text:latest"
},
"id": "3a8e3fa0-3997-4bce-985c-975fb5ad4013",
"name": "Embeddings Ollama",
"type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
"typeVersion": 1,
"position": [
1840,
600
],
"credentials": {
"ollamaApi": {
"id": "eOwAotC7AUgJlvHM",
"name": "Ollama account"
}
}
},
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"value": "1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC",
"mode": "list",
"cachedResultName": "Meeting Notes",
"cachedResultUrl": "https://drive.google.com/drive/folders/1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC"
},
"event": "fileCreated",
"options": {}
},
"id": "41fb71dd-236a-48bc-9761-5841d52ca1b3",
"name": "File Created",
"type": "n8n-nodes-base.googleDriveTrigger",
"typeVersion": 1,
"position": [
600,
880
],
"credentials": {
"googleDriveOAuth2Api": {
"id": "vzcL2pD7uQzqDpdK",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"pollTimes": {
"item": [
{
"mode": "everyMinute"
}
]
},
"triggerOn": "specificFolder",
"folderToWatch": {
"__rl": true,
"value": "1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC",
"mode": "list",
"cachedResultName": "Meeting Notes",
"cachedResultUrl": "https://drive.google.com/drive/folders/1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC"
},
"event": "fileUpdated",
"options": {}
},
"id": "7b904686-89ae-4722-9ce5-a9da1b13b1a1",
"name": "File Updated",
"type": "n8n-nodes-base.googleDriveTrigger",
"typeVersion": 1,
"position": [
600,
1100
],
"credentials": {
"googleDriveOAuth2Api": {
"id": "vzcL2pD7uQzqDpdK",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "10646eae-ae46-4327-a4dc-9987c2d76173",
"name": "file_id",
"value": "={{ $json.id }}",
"type": "string"
},
{
"id": "dd0aa081-79e7-4714-8a67-1e898285554c",
"name": "folder_id",
"value": "={{ $json.parents[0] }}",
"type": "string"
}
]
},
"options": {}
},
"id": "87f8bbb0-92c5-4b25-be63-7a9d91fc46f8",
"name": "Set File ID",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
860,
880
]
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "={{ $('Set File ID').item.json.file_id }}",
"mode": "id"
},
"options": {
"googleFileConversion": {
"conversion": {
"docsToFormat": "text/plain"
}
}
}
},
"id": "9f1e08fb-4ef3-4c4d-9473-5a7a1608b8e3",
"name": "Download File",
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
1300,
880
],
"executeOnce": true,
"credentials": {
"googleDriveOAuth2Api": {
"id": "vzcL2pD7uQzqDpdK",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"operation": "text",
"options": {}
},
"id": "7efee822-68ad-4fe2-a616-ba19fd127684",
"name": "Extract Document Text",
"type": "n8n-nodes-base.extractFromFile",
"typeVersion": 1,
"position": [
1540,
880
],
"alwaysOutputData": true
},
{
"parameters": {
"options": {
"metadata": {
"metadataValues": [
{
"name": "file_id",
"value": "={{ $('Set File ID').item.json.file_id }}"
},
{
"name": "folder_id",
"value": "={{ $('Set File ID').item.json.folder_id }}"
}
]
}
}
},
"id": "da4c8b29-4944-43c4-9df3-e380366c594a",
"name": "Default Data Loader",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"typeVersion": 1,
"position": [
1860,
1100
]
},
{
"parameters": {
"chunkSize": 100,
"options": {}
},
"id": "d11c39b9-3fa7-4d5d-838f-da0d258c67c5",
"name": "Recursive Character Text Splitter",
"type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
"typeVersion": 1,
"position": [
1860,
1320
]
},
{
"parameters": {
"model": "nomic-embed-text:latest"
},
"id": "8a04559c-dfe8-479f-8998-a2e9bc994a0a",
"name": "Embeddings Ollama1",
"type": "@n8n/n8n-nodes-langchain.embeddingsOllama",
"typeVersion": 1,
"position": [
1700,
1100
],
"credentials": {
"ollamaApi": {
"id": "eOwAotC7AUgJlvHM",
"name": "Ollama account"
}
}
},
{
"parameters": {
"content": "## Local RAG AI Agent with Chat Interface",
"height": 527.3027193303974,
"width": 969.0343804425795
},
"id": "a18773ae-1eb3-46b8-91cf-4184c66cf14f",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
560,
220
]
},
{
"parameters": {
"content": "## Agent Tools for Local RAG",
"height": 528.85546469693,
"width": 583.4552380860637,
"color": 4
},
"id": "fa010a11-3dda-4bd5-b261-463a3a6b88d9",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
1540,
220
]
},
{
"parameters": {
"content": "## Workflow to Create Local Knowledgebase from Google Drive Folder",
"height": 705.2695614889159,
"width": 1568.9362829025763,
"color": 5
},
"id": "f29e6cc7-015e-47cb-a4fd-fecd6ffb0d24",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
560,
760
]
},
{
"parameters": {
"options": {}
},
"id": "5da52326-dfbd-4350-919c-843461f58913",
"name": "When chat message received",
"type": "@n8n/n8n-nodes-langchain.chatTrigger",
"typeVersion": 1.1,
"position": [
620,
340
],
"webhookId": "4b3b1838-d6b3-447e-9d79-d0931eddb9f8"
},
{
"parameters": {
"qdrantCollection": {
"__rl": true,
"value": "documents",
"mode": "list",
"cachedResultName": "documents"
},
"options": {}
},
"id": "355370e0-2174-4e5b-830b-dd0f123b2e40",
"name": "Qdrant Vector Store",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"typeVersion": 1,
"position": [
1560,
480
],
"credentials": {
"qdrantApi": {
"id": "VOnegFP8eijBkbNO",
"name": "QdrantApi account"
}
}
},
{
"parameters": {
"code": {
"execute": {
"code": "const { QdrantVectorStore } = require(\"@langchain/qdrant\");\nconst { OllamaEmbeddings } = require(\"@langchain/community/embeddings/ollama\");\n\nconst embeddings = new OllamaEmbeddings({\n model: \"nomic-embed-text\",\n baseUrl: \"http://ollama:11434\"\n});\n\nconst vectorStore = await QdrantVectorStore.fromExistingCollection(\n embeddings,\n {\n url: \"http://qdrant:6333\",\n collectionName: \"documents\",\n }\n);\n\nconst fileIdToDelete = this.getInputData()[0].json.file_id;\n\nconst filter = {\n must: [\n {\n key: \"metadata.file_id\",\n match: {\n value: fileIdToDelete,\n },\n },\n ],\n }\n\n// const results = await vectorStore.similaritySearch(\"this\", 10, filter);\n// const idsToDelete = results.map((doc) => doc.id);\n\n// NOT IMPLEMENTED!\n// await vectorStore.delete({ ids: idsToDelete });\n\nvectorStore.client.delete(\"documents\", {\n filter\n});\n\nreturn [ {json: { file_id: fileIdToDelete } } ];\n"
}
},
"inputs": {
"input": [
{
"type": "main",
"required": true
}
]
},
"outputs": {
"output": [
{
"type": "main"
}
]
}
},
"id": "b93bd001-0c4d-42fe-939a-eb441f354917",
"name": "Clear Old Vectors",
"type": "@n8n/n8n-nodes-langchain.code",
"typeVersion": 1,
"position": [
1080,
880
],
"alwaysOutputData": false
},
{
"parameters": {
"mode": "insert",
"qdrantCollection": {
"__rl": true,
"value": "documents",
"mode": "list",
"cachedResultName": "documents"
},
"options": {}
},
"id": "97ec4618-c0ea-445b-9406-5d41784d7836",
"name": "Qdrant Vector Store Insert",
"type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
"typeVersion": 1,
"position": [
1760,
880
],
"credentials": {
"qdrantApi": {
"id": "VOnegFP8eijBkbNO",
"name": "QdrantApi account"
}
}
},
{
"parameters": {
"options": {}
},
"id": "e537544a-37d5-4b00-b5ff-bc71f041f4bb",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1340,
340
]
},
{
"parameters": {
"httpMethod": "POST",
"path": "invoke_n8n_agent",
"responseMode": "responseNode",
"options": {}
},
"id": "2b8cd01f-30a8-4aab-b0dd-56d2b658f059",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
620,
520
],
"webhookId": "4a839da9-b8a2-45f8-bcaf-c484f9a5912d"
},
{
"parameters": {
"options": {}
},
"id": "c9dfe906-178b-4375-8bda-f9290f35f222",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.6,
"position": [
1000,
340
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "75ebfdef-c8e2-4c3e-b716-1479d0cc2a73",
"name": "chatInput",
"value": "={{ $json?.chatInput || $json.body.chatInput }}",
"type": "string"
},
{
"id": "59b7a20f-0626-4861-93e2-015d430c266e",
"name": "sessionId",
"value": "={{ $json?.sessionId || $json.body.sessionId}}",
"type": "string"
}
]
},
"options": {}
},
"id": "8f974a15-aa2f-4525-8278-ad58ad296076",
"name": "Edit Fields",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
820,
340
]
}
],
"pinData": {},
"connections": {
"Postgres Chat Memory": {
"ai_memory": [
[
{
"node": "AI Agent",
"type": "ai_memory",
"index": 0
}
]
]
},
"Ollama Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Ollama Model": {
"ai_languageModel": [
[
{
"node": "Vector Store Tool",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Embeddings Ollama": {
"ai_embedding": [
[
{
"node": "Qdrant Vector Store",
"type": "ai_embedding",
"index": 0
}
]
]
},
"File Created": {
"main": [
[
{
"node": "Set File ID",
"type": "main",
"index": 0
}
]
]
},
"File Updated": {
"main": [
[
{
"node": "Set File ID",
"type": "main",
"index": 0
}
]
]
},
"Set File ID": {
"main": [
[
{
"node": "Clear Old Vectors",
"type": "main",
"index": 0
}
]
]
},
"Download File": {
"main": [
[
{
"node": "Extract Document Text",
"type": "main",
"index": 0
}
]
]
},
"Extract Document Text": {
"main": [
[
{
"node": "Qdrant Vector Store Insert",
"type": "main",
"index": 0
}
]
]
},
"Default Data Loader": {
"ai_document": [
[
{
"node": "Qdrant Vector Store Insert",
"type": "ai_document",
"index": 0
}
]
]
},
"Recursive Character Text Splitter": {
"ai_textSplitter": [
[
{
"node": "Default Data Loader",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"Embeddings Ollama1": {
"ai_embedding": [
[
{
"node": "Qdrant Vector Store Insert",
"type": "ai_embedding",
"index": 0
}
]
]
},
"When chat message received": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"Qdrant Vector Store": {
"ai_vectorStore": [
[
{
"node": "Vector Store Tool",
"type": "ai_vectorStore",
"index": 0
}
]
]
},
"Clear Old Vectors": {
"main": [
[
{
"node": "Download File",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Edit Fields",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Edit Fields": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Vector Store Tool": {
"ai_tool": [
[
{
"node": "AI Agent",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "19f9691c-4682-4704-81f2-33fdec9d0be2",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "f722e3e1e81e942a38faa434ad0aee8699371bbff9f883b9d5c59a7c726605af"
},
"id": "vTN9y2dLXqTiDfPT",
"tags": []
}

View File

@@ -1,114 +0,0 @@
{
"name": "Create Google Doc",
"nodes": [
{
"parameters": {
"operation": "createFromText",
"content": "={{ $json.body.document_text }}",
"name": "={{ $json.body.document_title }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"folderId": {
"__rl": true,
"value": "1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC",
"mode": "list",
"cachedResultName": "Meeting Notes",
"cachedResultUrl": "https://drive.google.com/drive/folders/1914m3M7kRzkd5RJqAfzRY9EBcJrKemZC"
},
"options": {
"convertToGoogleDocument": true
}
},
"id": "abb2ee3f-7dd0-4d6e-96f0-6cc91eb64a5e",
"name": "Google Drive",
"type": "n8n-nodes-base.googleDrive",
"typeVersion": 3,
"position": [
1040,
360
],
"credentials": {
"googleDriveOAuth2Api": {
"id": "cfNochbuJikPwwl2",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"options": {}
},
"id": "9904e7b7-c9f6-49b5-ab72-6b199c6e2f46",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1260,
360
]
},
{
"parameters": {
"httpMethod": "POST",
"path": "d8db9fa3-04fe-43c8-9acf-e1912463477f",
"authentication": "headerAuth",
"responseMode": "responseNode",
"options": {}
},
"id": "7e761bed-99f6-4a8a-959b-d1b3542b6071",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
820,
360
],
"webhookId": "d8db9fa3-04fe-43c8-9acf-e1912463477f",
"credentials": {
"httpHeaderAuth": {
"id": "PGr0hc0kn43Di1sz",
"name": "testauth"
}
}
}
],
"pinData": {},
"connections": {
"Google Drive": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Google Drive",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "c1f66b1c-c7dc-48ba-9197-6a0e3ac3e8f4",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "620f0d7e3114cb344761d7d45a21ef2a32096f91d8696e7057756042e1999e2c"
},
"id": "LYrReDbpmqK3eX2P",
"tags": []
}

View File

@@ -1,130 +0,0 @@
{
"name": "Get Postgres Tables",
"nodes": [
{
"parameters": {
"options": {}
},
"id": "74a8e48c-c13f-450c-835e-1702d87f894c",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
880,
60
]
},
{
"parameters": {
"operation": "executeQuery",
"query": "SELECT table_name \nFROM information_schema.tables\nWHERE table_schema = 'public'\n AND table_type = 'BASE TABLE'\nORDER BY table_name;",
"options": {}
},
"id": "2cd15801-ea79-4a53-b1be-c0470429966a",
"name": "Postgres",
"type": "n8n-nodes-base.postgres",
"typeVersion": 2.5,
"position": [
400,
60
],
"credentials": {
"postgres": {
"id": "AXJoQJaFRsoL9Qk8",
"name": "Postgres account"
}
}
},
{
"parameters": {
"fieldsToSummarize": {
"values": [
{
"aggregation": "concatenate",
"field": "table_name"
}
]
},
"options": {}
},
"id": "8b66e814-e553-451c-818a-fc93699b341c",
"name": "Summarize",
"type": "n8n-nodes-base.summarize",
"typeVersion": 1,
"position": [
640,
60
]
},
{
"parameters": {
"path": "d8db9fa3-04fe-43c8-9acf-e1912463477f",
"authentication": "headerAuth",
"responseMode": "responseNode",
"options": {}
},
"id": "3eb54a82-034c-4f3f-aa99-3b6aeb744ce2",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
180,
60
],
"webhookId": "d8db9fa3-04fe-43c8-9acf-e1912463477f",
"credentials": {
"httpHeaderAuth": {
"id": "upxO7NGaOTeIP4XU",
"name": "testauth"
}
}
}
],
"pinData": {},
"connections": {
"Postgres": {
"main": [
[
{
"node": "Summarize",
"type": "main",
"index": 0
}
]
]
},
"Summarize": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Postgres",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "bd8d96b6-53e1-4cb9-8ee7-0c8be9b86dc9",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "73cb7a3e883df514bb47e8d1b34526d30e2abb8f56cd99f10d5948a1e11b25aa"
},
"id": "t15NIcuhUMXOE8DM",
"tags": []
}

View File

@@ -1,108 +0,0 @@
{
"name": "Post Message to Slack",
"nodes": [
{
"parameters": {
"authentication": "oAuth2",
"select": "channel",
"channelId": {
"__rl": true,
"value": "C083QQBQTAM",
"mode": "list",
"cachedResultName": "flowise-n8n"
},
"text": "={{ $json.body.message }}",
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"id": "4882859e-bf35-475b-9fd2-a068ac4fc602",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1040,
360
],
"credentials": {
"slackOAuth2Api": {
"id": "XtpcBxLD5axuhMm8",
"name": "Slack account"
}
}
},
{
"parameters": {
"options": {}
},
"id": "a9e7aa8a-04ba-4dc6-8a14-f2c435df4ad8",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1260,
360
]
},
{
"parameters": {
"httpMethod": "POST",
"path": "f17f77e5-51dc-4589-8b51-4c8adc23c3c0",
"authentication": "headerAuth",
"responseMode": "responseNode",
"options": {}
},
"id": "db4d3557-e423-43e9-8f0c-b4309f304567",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
820,
360
],
"webhookId": "f17f77e5-51dc-4589-8b51-4c8adc23c3c0",
"credentials": {
"httpHeaderAuth": {
"id": "PGr0hc0kn43Di1sz",
"name": "testauth"
}
}
}
],
"pinData": {},
"connections": {
"Slack": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Slack",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "74bd88b9-5eb7-4a1a-8bc3-be2636a3639c",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "620f0d7e3114cb344761d7d45a21ef2a32096f91d8696e7057756042e1999e2c"
},
"id": "dBTFcNDVqjuQ619T",
"tags": []
}

View File

@@ -1,193 +0,0 @@
{
"name": "Summarize Slack Conversation",
"nodes": [
{
"parameters": {
"authentication": "oAuth2",
"resource": "channel",
"operation": "history",
"channelId": {
"__rl": true,
"value": "C083QQBQTAM",
"mode": "list",
"cachedResultName": "flowise-n8n"
},
"limit": 10,
"filters": {}
},
"id": "d572a7b3-311e-4864-a604-11d679ecc855",
"name": "Slack",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1040,
360
],
"credentials": {
"slackOAuth2Api": {
"id": "XtpcBxLD5axuhMm8",
"name": "Slack account"
}
}
},
{
"parameters": {
"options": {}
},
"id": "c30ce367-cb19-4ef9-b8e7-0e03982960f6",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.1,
"position": [
1840,
360
]
},
{
"parameters": {
"fieldsToAggregate": {
"fieldToAggregate": [
{
"fieldToAggregate": "text"
}
]
},
"options": {}
},
"id": "fdb91643-0f0f-4ad5-b333-2294029f0ae7",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
1260,
360
]
},
{
"parameters": {
"model": "gpt-4o-mini",
"options": {}
},
"id": "bf2c887e-bb34-44fc-89ea-fad409db0317",
"name": "OpenAI Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1,
"position": [
1480,
580
],
"credentials": {
"openAiApi": {
"id": "JJjD91oisPv9cs01",
"name": "OpenAi account"
}
}
},
{
"parameters": {
"promptType": "define",
"text": "=Summarize the following conversation, outputting just the summary and nothing else - no preabmle or explanation. \n\nKeep in mind the latest message is the first in the list: \n\n{{ $json.text }}"
},
"id": "90984360-3628-494d-a077-08ec69fd88e5",
"name": "Basic LLM Chain",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"typeVersion": 1.4,
"position": [
1480,
360
]
},
{
"parameters": {
"path": "66a5755c-5030-4a6b-9b5e-2e09a21456d6",
"authentication": "headerAuth",
"responseMode": "responseNode",
"options": {}
},
"id": "930860ba-d339-4668-a13c-4e2277308161",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"typeVersion": 2,
"position": [
820,
360
],
"webhookId": "66a5755c-5030-4a6b-9b5e-2e09a21456d6",
"credentials": {
"httpHeaderAuth": {
"id": "PGr0hc0kn43Di1sz",
"name": "testauth"
}
}
}
],
"pinData": {},
"connections": {
"Slack": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Basic LLM Chain",
"type": "main",
"index": 0
}
]
]
},
"OpenAI Chat Model": {
"ai_languageModel": [
[
{
"node": "Basic LLM Chain",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Basic LLM Chain": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Webhook": {
"main": [
[
{
"node": "Slack",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "039f8fd7-6a15-4070-81ae-1f2851183c86",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "620f0d7e3114cb344761d7d45a21ef2a32096f91d8696e7057756042e1999e2c"
},
"id": "vchuPxsgQU32o0v1",
"tags": []
}

View File

@@ -412,5 +412,5 @@ echo "3. Configure services as needed (e.g., first-run setup for n8n)."
echo
echo "======================================================================"
echo
log_info "Thank you for using this installer setup!"
log_info "Thank you for using this repository!"
echo