diff --git a/.env b/.env new file mode 100644 index 0000000000000000000000000000000000000000..3c87ab5b6326b3bb7a983a6acc7db09addc16d98 --- /dev/null +++ b/.env @@ -0,0 +1,14 @@ +# N8N data +POSTGRES_USER=changeUser +POSTGRES_PASSWORD=changePassword +POSTGRES_DB=n8n + +POSTGRES_NON_ROOT_USER=changeUser +POSTGRES_NON_ROOT_PASSWORD=changePassword + +N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom + +# ChatGate data +POSTGRES_USER_CHAT=test +POSTGRES_PASSWORD_CHAT=test +POSTGRES_DB_CHAT=chatgate diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..1a50242312738fff6c6b8e6f642760de730c6b4a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +ARG NODE_VERSION=18 +FROM n8nio/base:${NODE_VERSION} + +ARG N8N_VERSION +RUN if [ -z "$N8N_VERSION" ] ; then echo "The N8N_VERSION argument is missing!" ; exit 1; fi + +ENV N8N_VERSION=${N8N_VERSION} +ENV N8N_RELEASE_TYPE=stable +RUN set -eux; \ + npm install typescript -g && \ + npm install -g --omit=dev n8n@${N8N_VERSION} --ignore-scripts && \ + npm rebuild --prefix=/usr/local/lib/node_modules/n8n sqlite3 && \ + npm install gulp && \ + npm install -g gulp-cli && \ + npm install n8n-workflow && \ + rm -rf /usr/local/lib/node_modules/n8n/node_modules/@n8n/chat && \ + rm -rf /usr/local/lib/node_modules/n8n/node_modules/n8n-design-system && \ + rm -rf /usr/local/lib/node_modules/n8n/node_modules/n8n-editor-ui/node_modules && \ + find /usr/local/lib/node_modules/n8n -type f -name "*.ts" -o -name "*.js.map" -o -name "*.vue" | xargs rm -f && \ + rm -rf /root/.npm + +COPY docker-entrypoint.sh / +RUN chmod +x /docker-entrypoint.sh + +RUN \ + mkdir .n8n && \ + chown node:node .n8n + +RUN cd ./.n8n && \ + mkdir custom && \ + cd custom && \ + git clone https://github.com/pvpender/n8n-nodes-zulip-real-time && \ + npm --prefix ./n8n-nodes-zulip-real-time i && \ + npm --prefix ./n8n-nodes-zulip-real-time run build && \ + git clone https://github.com/bergi9/n8n-nodes-telegram-polling && \ + npm --prefix ./n8n-nodes-telegram-polling i && \ + npm --prefix ./n8n-nodes-telegram-polling run build + + +ENV SHELL /bin/sh +USER root +ENTRYPOINT ["tini", "--", "/docker-entrypoint.sh"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index fbdfa5b7933e3ee95d5c56af334b7f9ac4727153..e9ad576e1fae08f1147278539b6b75fda0bf858f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,10 +1,65 @@ version: "3.9" services: postgres: - image: postgres:13.3 + image: postgres:16 + #restart: always environment: - POSTGRES_DB: "test" - POSTGRES_USER: "user" - POSTGRES_PASSWORD: "password" + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} + - POSTGRES_NON_ROOT_USER=${POSTGRES_NON_ROOT_USER} + - POSTGRES_NON_ROOT_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} + expose: + - "5434" + ports: + - "5434:5432" + volumes: + - postgres_data:/var/lib/postgresql/data:rw + - ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh + healthcheck: + test: ['CMD-SHELL', 'pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}'] + interval: 5s + timeout: 5s + retries: 10 + + postgresChatGate: + image: postgres:16 + #restart: always + environment: + - POSTGRES_USER=${POSTGRES_USER_CHAT} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD_CHAT} + - POSTGRES_DB=${POSTGRES_DB_CHAT} ports: - "5432:5432" + volumes: + - chat_gate_data:/var/lib/postgresql/data:rw + - ./postgres:/docker-entrypoint-initdb.d + + n8n: + build: + context: . + args: + - N8N_VERSION=1.34.1 + #restart: always + environment: + - DB_TYPE=postgresdb + - DB_POSTGRESDB_HOST=postgres + - DB_POSTGRESDB_PORT=5432 + - DB_POSTGRESDB_DATABASE=${POSTGRES_DB} + - DB_POSTGRESDB_USER=${POSTGRES_NON_ROOT_USER} + - DB_POSTGRESDB_PASSWORD=${POSTGRES_NON_ROOT_PASSWORD} + - N8N_CUSTOM_EXTENSIONS=${N8N_CUSTOM_EXTENSIONS} + ports: + - 5678:5678 + links: + - postgres + volumes: + - n8n_data:/home/node/.n8n + depends_on: + postgres: + condition: service_healthy + +volumes: + postgres_data: + n8n_data: + chat_gate_data: diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh new file mode 100644 index 0000000000000000000000000000000000000000..6d7148f0d1c081b6e2a213489ff77d620ca2859a --- /dev/null +++ b/docker-entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +if [ "$#" -gt 0 ]; then + # Got started with arguments + exec n8n "$@" +else + # Got started without arguments + exec n8n +fi \ No newline at end of file diff --git a/init-data.sh b/init-data.sh new file mode 100644 index 0000000000000000000000000000000000000000..7f2e3821aefb2d64f553f735dfa3eb154d01a215 --- /dev/null +++ b/init-data.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e; + + +if [ -n "${POSTGRES_NON_ROOT_USER:-}" ] && [ -n "${POSTGRES_NON_ROOT_PASSWORD:-}" ]; then + psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + CREATE USER ${POSTGRES_NON_ROOT_USER} WITH PASSWORD '${POSTGRES_NON_ROOT_PASSWORD}'; + GRANT ALL PRIVILEGES ON DATABASE ${POSTGRES_DB} TO ${POSTGRES_NON_ROOT_USER}; + GRANT CREATE ON SCHEMA public TO ${POSTGRES_NON_ROOT_USER}; + EOSQL +else + echo "SETUP INFO: No Environment variables given!" +fi \ No newline at end of file diff --git a/postgres/tables.sql b/postgres/tables.sql new file mode 100644 index 0000000000000000000000000000000000000000..f7ff85e22dab7bcb04f09d3635c041ff60cbcb25 --- /dev/null +++ b/postgres/tables.sql @@ -0,0 +1,35 @@ +CREATE TABLE users ( + tg_id BIGINT PRIMARY KEY , + zulip_id int, + email VARCHAR(64), + name VARCHAR(120) +); + +CREATE TABLE states ( + id BIGINT PRIMARY KEY , + state int4 NOT NULL +); + +CREATE TABLE IF NOT EXISTS last_message( + id int PRIMARY KEY, + last_id int +); + +CREATE TABLE states_zulip( + id int PRIMARY KEY , + state int4 NOT NULL +); + +CREATE TABLE forwarding_zulip( + id int , + channel_name VARCHAR(120), + channel_id int , + topic_name VARCHAR(120) +); + +CREATE TABLE forwarding_channels( + zulip_channel_id int, + zulip_topic_name VARCHAR(120), + telegram_chat_id bigint, + mode VARCHAR(8) +);