From 332b1648b7e1f03343a817b07a59327e5de919ed Mon Sep 17 00:00:00 2001 From: Jazys Date: Sun, 27 Aug 2023 22:16:55 +0200 Subject: [PATCH] test to add tooljet --- apps/tooljet/config.json | 27 +++++++ apps/tooljet/docker-compose.yml | 113 +++++++++++++++++++++++++++ apps/tooljet/metadata/description.md | 10 +++ apps/tooljet/metadata/logo.jpg | Bin 0 -> 29217 bytes 4 files changed, 150 insertions(+) create mode 100644 apps/tooljet/config.json create mode 100644 apps/tooljet/docker-compose.yml create mode 100644 apps/tooljet/metadata/description.md create mode 100644 apps/tooljet/metadata/logo.jpg diff --git a/apps/tooljet/config.json b/apps/tooljet/config.json new file mode 100644 index 00000000..8827871c --- /dev/null +++ b/apps/tooljet/config.json @@ -0,0 +1,27 @@ +{ + "$schema": "../schema.json", + "name": "tooljet", + "available": true, + "exposable": true, + "port": 9876, + "id": "tooljet", + "tipi_version": 23, + "version": "0.237.0", + "categories": [ + "automation" + ], + "description": "n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly versatile, enabling you to connect anything to everything.", + "short_desc": "Workflow Automation Tool. Alternative to Zapier", + "author": "n8n.io", + "source": "https://github.com/n8n-io/n8n", + "website": "https://n8n.io/", + "form_fields": [ + { + "type": "random", + "label": "Database password", + "min": 30, + "max": 30, + "env_variable": "DB_PASSWORD" + } + ] +} diff --git a/apps/tooljet/docker-compose.yml b/apps/tooljet/docker-compose.yml new file mode 100644 index 00000000..538d446a --- /dev/null +++ b/apps/tooljet/docker-compose.yml @@ -0,0 +1,113 @@ +version: "3.7" + +services: + n8n: + container_name: n8n + image: n8nio/n8n:0.237.0 + restart: unless-stopped + ports: + - ${APP_PORT}:5678 + volumes: + - ${APP_DATA_DIR}/data/n8n:/home/node/.n8n + command: /bin/sh -c "sleep 5; n8n start" + environment: + - DB-TYPE=postgresdb + - DB_POSTGRESDB_DATABASE=n8n + - DB_POSTGRESDB_HOST=db-n8n + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_USER=tipi + - DB_POSTGRESDB_PASSWORD=tipi + - N8N_EDITOR_BASE_URL=${APP_DOMAIN} + depends_on: + - db-n8n + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.n8n-web-redirect.redirectscheme.scheme: https + traefik.http.services.n8n.loadbalancer.server.port: 5678 + # Web + traefik.http.routers.n8n-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.n8n-insecure.entrypoints: web + traefik.http.routers.n8n-insecure.service: n8n + traefik.http.routers.n8n-insecure.middlewares: n8n-web-redirect + # Websecure + traefik.http.routers.n8n.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.n8n.entrypoints: websecure + traefik.http.routers.n8n.service: n8n + traefik.http.routers.n8n.tls.certresolver: myresolver + # Local domain + traefik.http.routers.n8n-local-insecure.rule: Host(`n8n.${LOCAL_DOMAIN}`) + traefik.http.routers.n8n-local-insecure.entrypoints: web + traefik.http.routers.n8n-local-insecure.service: n8n + traefik.http.routers.n8n-local-insecure.middlewares: n8n-web-redirect + # Local domain secure + traefik.http.routers.n8n-local.rule: Host(`n8n.${LOCAL_DOMAIN}`) + traefik.http.routers.n8n-local.entrypoints: websecure + traefik.http.routers.n8n-local.service: n8n + traefik.http.routers.n8n-local.tls: true + + client: + tty: true + stdin_open: true + image: tooljet/tooljet-client-ce:latest + restart: always + depends_on: + - server + networks: + - tipi_main_network + labels: + # Main + traefik.enable: true + traefik.http.middlewares.tooljet-web-redirect.redirectscheme.scheme: https + traefik.http.services.tooljet.loadbalancer.server.port: 80 + # Web + traefik.http.routers.tooljet-insecure.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.tooljet-insecure.entrypoints: web + traefik.http.routers.tooljet-insecure.service: tooljet + traefik.http.routers.tooljet-insecure.middlewares: tooljet-web-redirect + # Websecure + traefik.http.routers.tooljet.rule: Host(`${APP_DOMAIN}`) + traefik.http.routers.tooljet.entrypoints: websecure + traefik.http.routers.tooljet.service: tooljet + traefik.http.routers.tooljet.tls.certresolver: myresolver + # Local domain + traefik.http.routers.tooljet-local-insecure.rule: Host(`tooljet.${LOCAL_DOMAIN}`) + traefik.http.routers.tooljet-local-insecure.entrypoints: web + traefik.http.routers.tooljet-local-insecure.service: tooljet + traefik.http.routers.tooljet-local-insecure.middlewares: tooljet-web-redirect + # Local domain secure + traefik.http.routers.tooljet-local.rule: Host(`tooljet.${LOCAL_DOMAIN}`) + traefik.http.routers.tooljet-local.entrypoints: websecure + traefik.http.routers.tooljet-local.service: tooljet + traefik.http.routers.tooljet-local.tls: true + command: openresty -g "daemon off;" + + server: + image: tooljet/tooljet-server-ce:latest + tty: true + stdin_open: true + restart: always + networks: + - tipi_main_network + # env_file: .env + environment: + SERVE_CLIENT: "false" + command: npm run start:prod + + db-n8n: + container_name: postgres_tooljet + image: postgres:11 + restart: on-failure + volumes: + - ${APP_DATA_DIR}/data/db:/var/lib/postgresql/data + environment: + - POSTGRES_USER=tipi + - POSTGRES_PASSWORD=${PG_PASS} + - POSTGRES_DB=tooljet + # - POSTGRES_HOST=${PG_HOST} + - PGDATA=/data/postgres + networks: + - tipi_main_network + diff --git a/apps/tooljet/metadata/description.md b/apps/tooljet/metadata/description.md new file mode 100644 index 00000000..a3fccf73 --- /dev/null +++ b/apps/tooljet/metadata/description.md @@ -0,0 +1,10 @@ +## Installation Notes ## + +To enable OAUTH integrations you will need to enable the "expose app" option and configure a URL in Tipi. This setting can be changed at a later date if an integration is identified that needs it. + +## Easily automate tasks across different services. + +n8n is an extendable workflow automation tool. With a fair-code distribution model, n8n will always have visible source code, be available to self-host, and allow you to add your own custom functions, logic and apps. n8n's node-based approach makes it highly +versatile, enabling you to connect anything to everything. + +![Screenshot](https://raw.githubusercontent.com/n8n-io/n8n/master/assets/n8n-screenshot.png) diff --git a/apps/tooljet/metadata/logo.jpg b/apps/tooljet/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5e53b7837d2795a141461cb84fb5d80b2848c2e5 GIT binary patch literal 29217 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 literal 0 HcmV?d00001