From 8b855d7ee41b8e767b016372fa5cfba4d1863f80 Mon Sep 17 00:00:00 2001 From: sashagoncharov19 <0976053529@ukr.net> Date: Fri, 20 Sep 2024 21:57:46 +0000 Subject: [PATCH] feat: added erpnext template --- apps/dokploy/public/templates/erpnext.png | Bin 0 -> 6396 bytes .../templates/erpnext/docker-compose.yml | 211 ++++++++++++++++++ apps/dokploy/templates/erpnext/index.ts | 22 ++ apps/dokploy/templates/templates.ts | 14 ++ 4 files changed, 247 insertions(+) create mode 100644 apps/dokploy/public/templates/erpnext.png create mode 100644 apps/dokploy/templates/erpnext/docker-compose.yml create mode 100644 apps/dokploy/templates/erpnext/index.ts diff --git a/apps/dokploy/public/templates/erpnext.png b/apps/dokploy/public/templates/erpnext.png new file mode 100644 index 0000000000000000000000000000000000000000..c826955172ca1d98fb9b18d76cbaa39eccd91c82 GIT binary patch literal 6396 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 KMNUMnLSTY}Lm3bN literal 0 HcmV?d00001 diff --git a/apps/dokploy/templates/erpnext/docker-compose.yml b/apps/dokploy/templates/erpnext/docker-compose.yml new file mode 100644 index 000000000..d3aa92a14 --- /dev/null +++ b/apps/dokploy/templates/erpnext/docker-compose.yml @@ -0,0 +1,211 @@ +services: + backend: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: on-failure + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + + configurator: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: none + entrypoint: + - bash + - -c + # add redis_socketio for backward compatibility + command: + - > + ls -1 apps > sites/apps.txt; + bench set-config -g db_host $$DB_HOST; + bench set-config -gp db_port $$DB_PORT; + bench set-config -g redis_cache "redis://$$REDIS_CACHE"; + bench set-config -g redis_queue "redis://$$REDIS_QUEUE"; + bench set-config -g redis_socketio "redis://$$REDIS_QUEUE"; + bench set-config -gp socketio_port $$SOCKETIO_PORT; + environment: + DB_HOST: db + DB_PORT: "3306" + REDIS_CACHE: redis-cache:6379 + REDIS_QUEUE: redis-queue:6379 + SOCKETIO_PORT: "9000" + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + + create-site: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: none + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + entrypoint: + - bash + - -c + command: + - > + wait-for-it -t 120 db:3306; + wait-for-it -t 120 redis-cache:6379; + wait-for-it -t 120 redis-queue:6379; + export start=`date +%s`; + until [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_cache // empty"` ]] && \ + [[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".redis_queue // empty"` ]]; + do + echo "Waiting for sites/common_site_config.json to be created"; + sleep 5; + if (( `date +%s`-start > 120 )); then + echo "could not find sites/common_site_config.json with required keys"; + exit 1 + fi + done; + echo "sites/common_site_config.json found"; + bench new-site --no-mariadb-socket --admin-password=admin --db-root-password=admin --install-app erpnext --set-default frontend; + + db: + image: mariadb:10.6 + healthcheck: + test: mysqladmin ping -h localhost --password=admin + interval: 1s + retries: 15 + deploy: + restart_policy: + condition: on-failure + command: + - --character-set-server=utf8mb4 + - --collation-server=utf8mb4_unicode_ci + - --skip-character-set-client-handshake + - --skip-innodb-read-only-compressed # Temporary fix for MariaDB 10.6 + environment: + MYSQL_ROOT_PASSWORD: admin + networks: + - dokploy-network + volumes: + - db-data:/var/lib/mysql + + frontend: + image: frappe/erpnext:v15.35.1 + depends_on: + - websocket + deploy: + restart_policy: + condition: on-failure + command: + - nginx-entrypoint.sh + environment: + BACKEND: backend:8000 + FRAPPE_SITE_NAME_HEADER: frontend + SOCKETIO: websocket:9000 + UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1 + UPSTREAM_REAL_IP_HEADER: X-Forwarded-For + UPSTREAM_REAL_IP_RECURSIVE: "off" + PROXY_READ_TIMEOUT: 120 + CLIENT_MAX_BODY_SIZE: 50m + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + ports: + - "8080:8080" + + queue-long: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: on-failure + command: + - bench + - worker + - --queue + - long,default,short + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + + queue-short: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: on-failure + command: + - bench + - worker + - --queue + - short,default + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + + redis-queue: + image: redis:6.2-alpine + deploy: + restart_policy: + condition: on-failure + networks: + - dokploy-network + volumes: + - redis-queue-data:/data + + redis-cache: + image: redis:6.2-alpine + deploy: + restart_policy: + condition: on-failure + networks: + - dokploy-network + volumes: + - redis-cache-data:/data + + scheduler: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: on-failure + command: + - bench + - schedule + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + + websocket: + image: frappe/erpnext:v15.35.1 + deploy: + restart_policy: + condition: on-failure + command: + - node + - /home/frappe/frappe-bench/apps/frappe/socketio.js + networks: + - dokploy-network + volumes: + - sites:/home/frappe/frappe-bench/sites + - logs:/home/frappe/frappe-bench/logs + +volumes: + db-data: + redis-queue-data: + redis-cache-data: + sites: + logs: +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/apps/dokploy/templates/erpnext/index.ts b/apps/dokploy/templates/erpnext/index.ts new file mode 100644 index 000000000..2165c46eb --- /dev/null +++ b/apps/dokploy/templates/erpnext/index.ts @@ -0,0 +1,22 @@ +import { + type DomainSchema, + type Schema, + type Template, + generateRandomDomain, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainDomain = generateRandomDomain(schema); + + const domains: DomainSchema[] = [ + { + host: mainDomain, + port: 8080, + serviceName: "frontend", + }, + ]; + + return { + domains, + }; +} diff --git a/apps/dokploy/templates/templates.ts b/apps/dokploy/templates/templates.ts index cca2eb765..e3508d1b1 100644 --- a/apps/dokploy/templates/templates.ts +++ b/apps/dokploy/templates/templates.ts @@ -512,4 +512,18 @@ export const templates: TemplateData[] = [ tags: ["self-hosted", "email"], load: () => import("./mailserver/index").then((m) => m.generate), }, + { + id: "erpnext", + name: "ERPNext", + version: "15.35.1", + description: "Free and Open Source Enterprise Resource Planning (ERP) ", + logo: "erpnext.png", + links: { + github: "https://github.com/frappe/erpnext", + website: "https://erpnext.com/", + docs: "https://sashagoncharov19.github.io/dokploy-template-docs/erpnext", + }, + tags: ["self-hosted", "open-source", "analytics"], + load: () => import("./erpnext/index").then((m) => m.generate), + }, ];