From 32f35a6ca0d4f41daa77719c22c276bd3b3ee566 Mon Sep 17 00:00:00 2001 From: Yuki <60097976+binaryYuki@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:25:28 +0800 Subject: [PATCH 1/7] Update traefik-setup.ts --- server/setup/traefik-setup.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index 4fc383ac..692be4ce 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -1,4 +1,4 @@ -import { existsSync, mkdirSync, writeFileSync } from "node:fs"; +import { existsSync, mkdirSync, writeFileSync, chmodSync } from "node:fs"; import path from "node:path"; import type { CreateServiceOptions } from "dockerode"; import { dump } from "js-yaml"; @@ -184,6 +184,9 @@ export const createDefaultTraefikConfig = () => { const yamlStr = dump(configObject); mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); writeFileSync(mainConfig, yamlStr, "utf8"); + + const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; + chmodSync(acmeJsonPath, '600'); }; export const createDefaultMiddlewares = () => { From 087e2c81ccde63c7f374ca39b243b9a2c61a2264 Mon Sep 17 00:00:00 2001 From: Yuki <60097976+binaryYuki@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:34:18 +0800 Subject: [PATCH 2/7] accept suggestion by coderabbit Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- server/setup/traefik-setup.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index 692be4ce..3b07d518 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -186,7 +186,11 @@ export const createDefaultTraefikConfig = () => { writeFileSync(mainConfig, yamlStr, "utf8"); const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; - chmodSync(acmeJsonPath, '600'); + if (existsSync(acmeJsonPath)) { + chmodSync(acmeJsonPath, '600'); + } else { + console.error(`File not found: ${acmeJsonPath}`); + } }; export const createDefaultMiddlewares = () => { From e72add74c380f851ac0a7565cec3e8db3be064d3 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Thu, 25 Jul 2024 01:02:10 -0600 Subject: [PATCH 3/7] fix(templates): change path of volumes to be in files folder to prevent delete the volumes --- templates/appsmith/docker-compose.yml | 26 +++++++++++++------------- templates/directus/docker-compose.yml | 6 +++--- templates/listmonk/docker-compose.yml | 13 +++++++++---- templates/odoo/docker-compose.yml | 7 +++---- templates/plausible/docker-compose.yml | 8 ++++---- 5 files changed, 32 insertions(+), 28 deletions(-) diff --git a/templates/appsmith/docker-compose.yml b/templates/appsmith/docker-compose.yml index 4fbdc341..ad07a709 100644 --- a/templates/appsmith/docker-compose.yml +++ b/templates/appsmith/docker-compose.yml @@ -1,18 +1,18 @@ version: "3.8" services: - appsmith: - image: index.docker.io/appsmith/appsmith-ee:v1.29 - networks: - - dokploy-network - ports: - - ${APP_SMITH_PORT} - labels: - - "traefik.enable=true" - - "traefik.http.routers.${HASH}.rule=Host(`${APP_SMITH_HOST}`)" - - "traefik.http.services.${HASH}.loadbalancer.server.port=${APP_SMITH_PORT}" - volumes: - - ./stacks:/appsmith-stacks + appsmith: + image: index.docker.io/appsmith/appsmith-ee:v1.29 + networks: + - dokploy-network + ports: + - ${APP_SMITH_PORT} + labels: + - "traefik.enable=true" + - "traefik.http.routers.${HASH}.rule=Host(`${APP_SMITH_HOST}`)" + - "traefik.http.services.${HASH}.loadbalancer.server.port=${APP_SMITH_PORT}" + volumes: + - ../files/stacks:/appsmith-stacks networks: dokploy-network: - external: true \ No newline at end of file + external: true diff --git a/templates/directus/docker-compose.yml b/templates/directus/docker-compose.yml index c022e0b3..08a5db45 100644 --- a/templates/directus/docker-compose.yml +++ b/templates/directus/docker-compose.yml @@ -23,8 +23,8 @@ services: ports: - 8055 volumes: - - ./uploads:/directus/uploads - - ./extensions:/directus/extensions + - ../files/uploads:/directus/uploads + - ../files/extensions:/directus/extensions depends_on: - cache - database @@ -53,4 +53,4 @@ networks: dokploy-network: external: true volumes: - directus: \ No newline at end of file + directus: diff --git a/templates/listmonk/docker-compose.yml b/templates/listmonk/docker-compose.yml index e17b7657..beabf447 100644 --- a/templates/listmonk/docker-compose.yml +++ b/templates/listmonk/docker-compose.yml @@ -23,10 +23,15 @@ services: networks: - dokploy-network volumes: - - ./config.toml:/listmonk/config.toml + - ../files/config.toml:/listmonk/config.toml depends_on: - db - command: [sh, -c, "sleep 3 && ./listmonk --install --idempotent --yes --config config.toml"] + command: + [ + sh, + -c, + "sleep 3 && ./listmonk --install --idempotent --yes --config config.toml", + ] app: restart: unless-stopped @@ -41,7 +46,7 @@ services: - db - setup volumes: - - ./config.toml:/listmonk/config.toml + - ../files/config.toml:/listmonk/config.toml labels: - "traefik.enable=true" - "traefik.http.routers.${HASH}.rule=Host(`${LISTMONK_HOST}`)" @@ -50,7 +55,7 @@ services: volumes: listmonk-data: driver: local - + networks: dokploy-network: external: true diff --git a/templates/odoo/docker-compose.yml b/templates/odoo/docker-compose.yml index 8538bc72..e6e2a724 100644 --- a/templates/odoo/docker-compose.yml +++ b/templates/odoo/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3.8' +version: "3.8" services: web: image: odoo:16.0 @@ -18,8 +18,8 @@ services: - "traefik.http.services.${HASH}.loadbalancer.server.port=${ODOO_PORT}" volumes: - odoo-web-data:/var/lib/odoo - - ./config:/etc/odoo - - ./addons:/mnt/extra-addons + - ../files/config:/etc/odoo + - ../files/addons:/mnt/extra-addons db: image: postgres:13 @@ -36,7 +36,6 @@ volumes: odoo-web-data: odoo-db-data: - networks: dokploy-network: external: true diff --git a/templates/plausible/docker-compose.yml b/templates/plausible/docker-compose.yml index cc4c41e2..350cd87c 100644 --- a/templates/plausible/docker-compose.yml +++ b/templates/plausible/docker-compose.yml @@ -18,8 +18,8 @@ services: volumes: - event-data:/var/lib/clickhouse - event-logs:/var/log/clickhouse-server - - ./clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro - - ./clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro + - ../files/clickhouse/clickhouse-config.xml:/etc/clickhouse-server/config.d/logging.xml:ro + - ../files/clickhouse/clickhouse-user-config.xml:/etc/clickhouse-server/users.d/logging.xml:ro ulimits: nofile: soft: 262144 @@ -50,7 +50,7 @@ volumes: driver: local event-logs: driver: local - + networks: dokploy-network: - external: true \ No newline at end of file + external: true From 54c7572447a46e720c30034567f5958106953c0b Mon Sep 17 00:00:00 2001 From: Yuki <60097976+binaryYuki@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:18:59 +0800 Subject: [PATCH 4/7] check if exist Check if the file already exist, if yes modify its mode --- server/setup/traefik-setup.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index 3b07d518..b6f5867a 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -90,6 +90,13 @@ export const createDefaultServerTraefikConfig = () => { console.log("Default traefik config already exists"); return; } + + const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; + if (existsSync(acmeJsonPath)) { + chmodSync(acmeJsonPath, '600'); + } else { + console.error(`File not found: ${acmeJsonPath}`); + } const appName = "dokploy"; const serviceURLDefault = `http://${appName}:${process.env.PORT || 3000}`; @@ -184,13 +191,6 @@ export const createDefaultTraefikConfig = () => { const yamlStr = dump(configObject); mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); writeFileSync(mainConfig, yamlStr, "utf8"); - - const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; - if (existsSync(acmeJsonPath)) { - chmodSync(acmeJsonPath, '600'); - } else { - console.error(`File not found: ${acmeJsonPath}`); - } }; export const createDefaultMiddlewares = () => { From ef689f06d6309e30f4afbbfd80b51d8ef0d6c709 Mon Sep 17 00:00:00 2001 From: Yuki <60097976+binaryYuki@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:25:04 +0800 Subject: [PATCH 5/7] Update traefik-setup.ts --- server/setup/traefik-setup.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index b6f5867a..7a5fee4f 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -86,17 +86,18 @@ export const initializeTraefik = async () => { export const createDefaultServerTraefikConfig = () => { const configFilePath = path.join(DYNAMIC_TRAEFIK_PATH, "dokploy.yml"); - if (existsSync(configFilePath)) { - console.log("Default traefik config already exists"); - return; - } + const acmeJsonPath = path.join(DYNAMIC_TRAEFIK_PATH, "acme.json"); - const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; if (existsSync(acmeJsonPath)) { chmodSync(acmeJsonPath, '600'); } else { console.error(`File not found: ${acmeJsonPath}`); } + + if (existsSync(configFilePath)) { + console.log("Default traefik config already exists"); + return; + } const appName = "dokploy"; const serviceURLDefault = `http://${appName}:${process.env.PORT || 3000}`; @@ -191,6 +192,12 @@ export const createDefaultTraefikConfig = () => { const yamlStr = dump(configObject); mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); writeFileSync(mainConfig, yamlStr, "utf8"); + const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; + if (existsSync(acmeJsonPath)) { + chmodSync(acmeJsonPath, '600'); + } else { + console.error(`File not found: ${acmeJsonPath}, func createDefaultTraefikConfig`); + } }; export const createDefaultMiddlewares = () => { From 1519a715350062201500b319f05e912acea76b9b Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Thu, 25 Jul 2024 01:49:41 -0600 Subject: [PATCH 6/7] refactor(script): make ipv4 first and format the url when is ipv6 #258 --- docker/prod.sh | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/docker/prod.sh b/docker/prod.sh index 4dc23da2..2b833340 100644 --- a/docker/prod.sh +++ b/docker/prod.sh @@ -30,11 +30,6 @@ if ss -tulnp | grep ':443 ' >/dev/null; then exit 1 fi - - - - - command_exists() { command -v "$@" > /dev/null 2>&1 } @@ -46,7 +41,25 @@ else fi docker swarm leave --force 2>/dev/null -docker swarm init; + +get_ip() { + # Try to get IPv4 + local ipv4=$(curl -4s https://ifconfig.io 2>/dev/null) + + if [ -n "$ipv4" ]; then + echo "$ipv4" + else + # Try to get IPv6 + local ipv6=$(curl -6s https://ifconfig.io 2>/dev/null) + if [ -n "$ipv6" ]; then + echo "$ipv6" + fi + fi +} + +advertise_addr=$(get_ip) + +docker swarm init --advertise-addr $advertise_addr echo "Swarm initialized" @@ -71,19 +84,28 @@ docker service create \ --publish published=3000,target=3000,mode=host \ --update-parallelism 1 \ --update-order stop-first \ + --constraint 'node.role == manager' \ dokploy/dokploy:latest - -public_ip=$(hostname -I | awk '{print $1}') - GREEN="\033[0;32m" YELLOW="\033[1;33m" BLUE="\033[0;34m" NC="\033[0m" # No Color +format_ip_for_url() { + local ip="$1" + if echo "$ip" | grep -q ':'; then + # IPv6 + echo "[${ip}]" + else + # IPv4 + echo "${ip}" + fi +} +formatted_addr=$(format_ip_for_url "$advertise_addr") echo "" printf "${GREEN}Congratulations, Dokploy is installed!${NC}\n" printf "${BLUE}Wait 15 seconds for the server to start${NC}\n" -printf "${YELLOW}Please go to http://${public_ip}:3000${NC}\n\n" +printf "${YELLOW}Please go to http://${formatted_addr}:3000${NC}\n\n" echo "" From 9a4b474cdc3aba50c1fd71fc6d18f4e60802a674 Mon Sep 17 00:00:00 2001 From: Mauricio Siu <47042324+Siumauricio@users.noreply.github.com> Date: Thu, 25 Jul 2024 02:04:54 -0600 Subject: [PATCH 7/7] refactor(traefik-setup): change order of chmodsync --- server/setup/traefik-setup.ts | 26 +++++++++----------------- 1 file changed, 9 insertions(+), 17 deletions(-) diff --git a/server/setup/traefik-setup.ts b/server/setup/traefik-setup.ts index 7a5fee4f..e9f27860 100644 --- a/server/setup/traefik-setup.ts +++ b/server/setup/traefik-setup.ts @@ -1,4 +1,4 @@ -import { existsSync, mkdirSync, writeFileSync, chmodSync } from "node:fs"; +import { chmodSync, existsSync, mkdirSync, writeFileSync } from "node:fs"; import path from "node:path"; import type { CreateServiceOptions } from "dockerode"; import { dump } from "js-yaml"; @@ -86,17 +86,10 @@ export const initializeTraefik = async () => { export const createDefaultServerTraefikConfig = () => { const configFilePath = path.join(DYNAMIC_TRAEFIK_PATH, "dokploy.yml"); - const acmeJsonPath = path.join(DYNAMIC_TRAEFIK_PATH, "acme.json"); - - if (existsSync(acmeJsonPath)) { - chmodSync(acmeJsonPath, '600'); - } else { - console.error(`File not found: ${acmeJsonPath}`); - } - + if (existsSync(configFilePath)) { - console.log("Default traefik config already exists"); - return; + console.log("Default traefik config already exists"); + return; } const appName = "dokploy"; @@ -133,6 +126,11 @@ export const createDefaultServerTraefikConfig = () => { export const createDefaultTraefikConfig = () => { const mainConfig = path.join(MAIN_TRAEFIK_PATH, "traefik.yml"); + const acmeJsonPath = path.join(DYNAMIC_TRAEFIK_PATH, "acme.json"); + + if (existsSync(acmeJsonPath)) { + chmodSync(acmeJsonPath, "600"); + } if (existsSync(mainConfig)) { console.log("Main config already exists"); return; @@ -192,12 +190,6 @@ export const createDefaultTraefikConfig = () => { const yamlStr = dump(configObject); mkdirSync(MAIN_TRAEFIK_PATH, { recursive: true }); writeFileSync(mainConfig, yamlStr, "utf8"); - const acmeJsonPath = "/etc/dokploy/traefik/dynamic/acme.json"; - if (existsSync(acmeJsonPath)) { - chmodSync(acmeJsonPath, '600'); - } else { - console.error(`File not found: ${acmeJsonPath}, func createDefaultTraefikConfig`); - } }; export const createDefaultMiddlewares = () => {