diff --git a/components/dashboard/compose/general/stop-compose.tsx b/components/dashboard/compose/general/stop-compose.tsx index deafd17c7..029cce113 100644 --- a/components/dashboard/compose/general/stop-compose.tsx +++ b/components/dashboard/compose/general/stop-compose.tsx @@ -62,11 +62,11 @@ export const StopCompose = ({ composeId }: Props) => { toast.success("Compose rebuild succesfully"); }) .catch(() => { - toast.error("Error to rebuild the compose"); + toast.error("Error to stop the compose"); }); }) .catch(() => { - toast.error("Error to rebuild the compose"); + toast.error("Error to stop the compose"); }); }} > diff --git a/package.json b/package.json index 6745af92b..816665865 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "dokploy", "version": "v0.2.5", "private": true, - "license": "AGPL-3.0-only", + "license": "Apache-2.0", "type": "module", "scripts": { "build": "npm run build-server && npm run build-next", @@ -19,7 +19,7 @@ "migration:drop": "drizzle-kit drop --config ./server/db/drizzle.config.ts", "db:push": "drizzle-kit --config ./server/db/drizzle.config.ts", "db:truncate": "tsx -r dotenv/config ./server/db/reset.ts", - "db:studio": "drizzle-kit studio", + "db:studio": "drizzle-kit studio --config ./server/db/drizzle.config.ts", "lint": "biome lint", "db:seed": "tsx -r dotenv/config ./server/db/seed.ts", "db:clean": "tsx -r dotenv/config ./server/db/reset.ts", diff --git a/public/templates/appsmith.png b/public/templates/appsmith.png new file mode 100644 index 000000000..02b0e15a9 Binary files /dev/null and b/public/templates/appsmith.png differ diff --git a/public/templates/baserow.webp b/public/templates/baserow.webp new file mode 100644 index 000000000..3e825f7a5 Binary files /dev/null and b/public/templates/baserow.webp differ diff --git a/public/templates/directus.jpg b/public/templates/directus.jpg new file mode 100644 index 000000000..a6f550627 Binary files /dev/null and b/public/templates/directus.jpg differ diff --git a/public/templates/excalidraw.jpg b/public/templates/excalidraw.jpg new file mode 100644 index 000000000..5c92a30c7 Binary files /dev/null and b/public/templates/excalidraw.jpg differ diff --git a/public/templates/ghost.jpeg b/public/templates/ghost.jpeg new file mode 100644 index 000000000..9bfefe838 Binary files /dev/null and b/public/templates/ghost.jpeg differ diff --git a/public/templates/grafana.svg b/public/templates/grafana.svg new file mode 100644 index 000000000..54be1e2f1 --- /dev/null +++ b/public/templates/grafana.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + diff --git a/public/templates/meilisearch.png b/public/templates/meilisearch.png new file mode 100644 index 000000000..7bbb458fa Binary files /dev/null and b/public/templates/meilisearch.png differ diff --git a/public/templates/metabase.png b/public/templates/metabase.png new file mode 100644 index 000000000..189e5a33a Binary files /dev/null and b/public/templates/metabase.png differ diff --git a/public/templates/minio.png b/public/templates/minio.png new file mode 100644 index 000000000..38f6ff9f0 Binary files /dev/null and b/public/templates/minio.png differ diff --git a/public/templates/n8n.png b/public/templates/n8n.png new file mode 100644 index 000000000..0e9a607e2 Binary files /dev/null and b/public/templates/n8n.png differ diff --git a/public/templates/odoo.png b/public/templates/odoo.png new file mode 100644 index 000000000..5b5988999 Binary files /dev/null and b/public/templates/odoo.png differ diff --git a/public/templates/phpmyadmin.png b/public/templates/phpmyadmin.png new file mode 100644 index 000000000..56e18d850 Binary files /dev/null and b/public/templates/phpmyadmin.png differ diff --git a/public/templates/rocketchat.png b/public/templates/rocketchat.png new file mode 100644 index 000000000..5d42c70f8 Binary files /dev/null and b/public/templates/rocketchat.png differ diff --git a/public/templates/uptime-kuma.png b/public/templates/uptime-kuma.png new file mode 100644 index 000000000..c5ea28c53 Binary files /dev/null and b/public/templates/uptime-kuma.png differ diff --git a/public/templates/wordpress.png b/public/templates/wordpress.png new file mode 100644 index 000000000..693cb9026 Binary files /dev/null and b/public/templates/wordpress.png differ diff --git a/templates/appsmith/docker-compose.yml b/templates/appsmith/docker-compose.yml new file mode 100644 index 000000000..4fbdc3418 --- /dev/null +++ b/templates/appsmith/docker-compose.yml @@ -0,0 +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 + +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/appsmith/index.ts b/templates/appsmith/index.ts new file mode 100644 index 000000000..246679b0c --- /dev/null +++ b/templates/appsmith/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `APP_SMITH_HOST=${randomDomain}`, + "APP_SMITH_PORT=80", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/baserow/docker-compose.yml b/templates/baserow/docker-compose.yml new file mode 100644 index 000000000..ffb3e8ad8 --- /dev/null +++ b/templates/baserow/docker-compose.yml @@ -0,0 +1,22 @@ +version: "3.8" +services: + baserow: + image: baserow/baserow:1.25.2 + networks: + - dokploy-network + environment: + BASEROW_PUBLIC_URL: "http://${BASEROW_HOST}" + ports: + - ${BASEROW_PORT} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${BASEROW_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${BASEROW_PORT} + volumes: + - baserow_data:/baserow/data +volumes: + baserow_data: + +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/baserow/index.ts b/templates/baserow/index.ts new file mode 100644 index 000000000..40966881a --- /dev/null +++ b/templates/baserow/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `BASEROW_HOST=${randomDomain}`, + "BASEROW_PORT=80", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/directus/docker-compose.yml b/templates/directus/docker-compose.yml new file mode 100644 index 000000000..c022e0b38 --- /dev/null +++ b/templates/directus/docker-compose.yml @@ -0,0 +1,56 @@ +version: "3.8" +services: + database: + image: postgis/postgis:13-master + volumes: + - directus:/var/lib/postgresql/data + networks: + - dokploy-network + environment: + POSTGRES_USER: "directus" + POSTGRES_PASSWORD: "directus" + POSTGRES_DB: "directus" + + cache: + image: redis:6 + networks: + - dokploy-network + + directus: + image: directus/directus:10.12.1 + networks: + - dokploy-network + ports: + - 8055 + volumes: + - ./uploads:/directus/uploads + - ./extensions:/directus/extensions + depends_on: + - cache + - database + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${DIRECTUS_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${DIRECTUS_PORT} + environment: + SECRET: "replace-with-secure-random-value" + + DB_CLIENT: "pg" + DB_HOST: "database" + DB_PORT: "5432" + DB_DATABASE: "directus" + DB_USER: "directus" + DB_PASSWORD: "directus" + + CACHE_ENABLED: "true" + CACHE_AUTO_PURGE: "true" + CACHE_STORE: "redis" + REDIS: "redis://cache:6379" + + ADMIN_EMAIL: "admin@example.com" + ADMIN_PASSWORD: "d1r3ctu5" +networks: + dokploy-network: + external: true +volumes: + directus: \ No newline at end of file diff --git a/templates/directus/index.ts b/templates/directus/index.ts new file mode 100644 index 000000000..1a4feb102 --- /dev/null +++ b/templates/directus/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `DIRECTUS_HOST=${randomDomain}`, + "DIRECTUS_PORT=8055", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/excalidraw/docker-compose.yml b/templates/excalidraw/docker-compose.yml new file mode 100644 index 000000000..58920b393 --- /dev/null +++ b/templates/excalidraw/docker-compose.yml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + excalidraw: + networks: + - dokploy-network + image: excalidraw/excalidraw:latest + ports: + - ${EXCALIDRAW_PORT} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${EXCALIDRAW_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${EXCALIDRAW_PORT} + +networks: + dokploy-network: + external: true diff --git a/templates/excalidraw/index.ts b/templates/excalidraw/index.ts new file mode 100644 index 000000000..e22d7abb4 --- /dev/null +++ b/templates/excalidraw/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `EXCALIDRAW_HOST=${randomDomain}`, + "EXCALIDRAW_PORT=80", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/ghost/docker-compose.yml b/templates/ghost/docker-compose.yml new file mode 100644 index 000000000..a507b887e --- /dev/null +++ b/templates/ghost/docker-compose.yml @@ -0,0 +1,41 @@ +version: "3.8" +services: + + ghost: + image: ghost:5-alpine + restart: always + networks: + - dokploy-network + ports: + - ${GHOST_PORT} + environment: + database__client: mysql + database__connection__host: db + database__connection__user: root + database__connection__password: example + database__connection__database: ghost + url: http://${GHOST_HOST} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${GHOST_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${GHOST_PORT} + volumes: + - ghost:/var/lib/ghost/content + + db: + image: mysql:8.0 + restart: always + networks: + - dokploy-network + environment: + MYSQL_ROOT_PASSWORD: example + volumes: + - db:/var/lib/mysql + +volumes: + ghost: + db: + +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/ghost/index.ts b/templates/ghost/index.ts new file mode 100644 index 000000000..6eadb9d09 --- /dev/null +++ b/templates/ghost/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `GHOST_HOST=${randomDomain}`, + "GHOST_PORT=2368", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/grafana/docker-compose.yml b/templates/grafana/docker-compose.yml new file mode 100644 index 000000000..a0555f9fe --- /dev/null +++ b/templates/grafana/docker-compose.yml @@ -0,0 +1,20 @@ +version: "3.8" +services: + grafana: + networks: + - dokploy-network + image: grafana/grafana-enterprise:9.5.20 + restart: unless-stopped + ports: + - ${GRAFANA_PORT} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${GRAFANA_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${GRAFANA_PORT} + volumes: + - grafana-storage:/var/lib/grafana +networks: + dokploy-network: + external: true +volumes: + grafana-storage: {} \ No newline at end of file diff --git a/templates/grafana/index.ts b/templates/grafana/index.ts new file mode 100644 index 000000000..5587e0bcd --- /dev/null +++ b/templates/grafana/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `GRAFANA_HOST=${randomDomain}`, + "GRAFANA_PORT=3000", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/meilisearch/docker-compose.yml b/templates/meilisearch/docker-compose.yml new file mode 100644 index 000000000..3ce8f2124 --- /dev/null +++ b/templates/meilisearch/docker-compose.yml @@ -0,0 +1,25 @@ +version: '3.8' + +services: + meilisearch: + networks: + - dokploy-network + image: getmeili/meilisearch:v1.8.3 + ports: + - ${MEILISEARCH_PORT} + volumes: + - meili_data:/meili_data + environment: + MEILI_MASTER_KEY: ${MEILI_MASTER_KEY} + MEILI_ENV: ${MEILI_ENV} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${MEILISEARCH_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${MEILISEARCH_PORT} + +volumes: + meili_data: + driver: local +networks: + dokploy-network: + external: true diff --git a/templates/meilisearch/index.ts b/templates/meilisearch/index.ts new file mode 100644 index 000000000..84fca4db7 --- /dev/null +++ b/templates/meilisearch/index.ts @@ -0,0 +1,24 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, + generateBase64, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const masterKey = generateBase64(32); + const envs = [ + `MEILISEARCH_HOST=${randomDomain}`, + "MEILISEARCH_PORT=7700", + "MEILI_ENV=development", + `MEILI_MASTER_KEY=${masterKey}`, + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/metabase/docker-compose.yml b/templates/metabase/docker-compose.yml new file mode 100644 index 000000000..3eee3344d --- /dev/null +++ b/templates/metabase/docker-compose.yml @@ -0,0 +1,38 @@ +version: "3.8" +services: + metabase: + image: metabase/metabase:v0.50.8 + volumes: + - /dev/urandom:/dev/random:ro + ports: + - ${METABASE_PORT} + environment: + MB_DB_TYPE: postgres + MB_DB_DBNAME: metabaseappdb + MB_DB_PORT: 5432 + MB_DB_USER: metabase + MB_DB_PASS: mysecretpassword + MB_DB_HOST: postgres + networks: + - dokploy-network + healthcheck: + test: curl --fail -I http://localhost:3000/api/health || exit 1 + interval: 15s + timeout: 5s + retries: 5 + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${METABASE_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${METABASE_PORT} + postgres: + image: postgres:14 + environment: + POSTGRES_USER: metabase + POSTGRES_DB: metabaseappdb + POSTGRES_PASSWORD: mysecretpassword + networks: + - dokploy-network + +networks: + dokploy-network: + external: true diff --git a/templates/metabase/index.ts b/templates/metabase/index.ts new file mode 100644 index 000000000..7ad5b98e3 --- /dev/null +++ b/templates/metabase/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `METABASE_HOST=${randomDomain}`, + "METABASE_PORT=3000", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/minio/docker-compose.yml b/templates/minio/docker-compose.yml new file mode 100644 index 000000000..25701ea89 --- /dev/null +++ b/templates/minio/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.8' +services: + minio: + image: minio/minio + ports: + - ${MINIO_API_PORT} + - ${MINIO_DASHBOARD_PORT} + volumes: + - minio-data:/data + environment: + - MINIO_ROOT_USER=minioadmin + - MINIO_ROOT_PASSWORD=minioadmin123 + command: server /data --console-address ":9001" + networks: + - dokploy-network + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.service=${HASH} + - traefik.http.routers.${HASH}.rule=Host(`${MINIO_DASHBOARD_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${MINIO_DASHBOARD_PORT} + # API router and service + - traefik.http.routers.${HASH}-api.service=${HASH}-api + - traefik.http.routers.${HASH}-api.rule=Host(`${MINIO_API_HOST}`) + - traefik.http.services.${HASH}-api.loadbalancer.server.port=${MINIO_API_PORT} + +volumes: + minio-data: + +networks: + dokploy-network: + external: true diff --git a/templates/minio/index.ts b/templates/minio/index.ts new file mode 100644 index 000000000..aa45c6696 --- /dev/null +++ b/templates/minio/index.ts @@ -0,0 +1,23 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const apiDomain = generateRandomDomain(schema); + const envs = [ + `MINIO_DASHBOARD_HOST=${randomDomain}`, + "MINIO_DASHBOARD_PORT=9001", + `MINIO_API_HOST=${apiDomain}`, + "MINIO_API_PORT=9000", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/n8n/docker-compose.yml b/templates/n8n/docker-compose.yml new file mode 100644 index 000000000..c26804dae --- /dev/null +++ b/templates/n8n/docker-compose.yml @@ -0,0 +1,29 @@ +version: "3.8" +services: + n8n: + image: docker.n8n.io/n8nio/n8n:1.48.1 + restart: always + networks: + - dokploy-network + ports: + - ${N8N_PORT} + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${N8N_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${N8N_PORT} + environment: + - N8N_HOST=${N8N_HOST} + - N8N_PORT=5678 + - N8N_PROTOCOL=http + - NODE_ENV=production + - WEBHOOK_URL=https://${N8N_HOST}/ + - GENERIC_TIMEZONE=${GENERIC_TIMEZONE} + - N8N_SECURE_COOKIE=false + volumes: + - n8n_data:/home/node/.n8n + +volumes: + n8n_data: +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/n8n/index.ts b/templates/n8n/index.ts new file mode 100644 index 000000000..5cc23b4ba --- /dev/null +++ b/templates/n8n/index.ts @@ -0,0 +1,21 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `N8N_HOST=${randomDomain}`, + "N8N_PORT=5678", + `HASH=${mainServiceHash}`, + "GENERIC_TIMEZONE=Europe/Berlin", + ]; + + return { + envs, + }; +} diff --git a/templates/odoo/docker-compose.yml b/templates/odoo/docker-compose.yml new file mode 100644 index 000000000..8538bc728 --- /dev/null +++ b/templates/odoo/docker-compose.yml @@ -0,0 +1,42 @@ +version: '3.8' +services: + web: + image: odoo:16.0 + networks: + - dokploy-network + depends_on: + - db + ports: + - ${ODOO_PORT} + environment: + - HOST=db + - USER=odoo + - PASSWORD=odoo + labels: + - "traefik.enable=true" + - "traefik.http.routers.${HASH}.rule=Host(`${ODOO_HOST}`)" + - "traefik.http.services.${HASH}.loadbalancer.server.port=${ODOO_PORT}" + volumes: + - odoo-web-data:/var/lib/odoo + - ./config:/etc/odoo + - ./addons:/mnt/extra-addons + + db: + image: postgres:13 + networks: + - dokploy-network + environment: + - POSTGRES_DB=postgres + - POSTGRES_USER=odoo + - POSTGRES_PASSWORD=odoo + volumes: + - odoo-db-data:/var/lib/postgresql/data + +volumes: + odoo-web-data: + odoo-db-data: + + +networks: + dokploy-network: + external: true diff --git a/templates/odoo/index.ts b/templates/odoo/index.ts new file mode 100644 index 000000000..539b7a0c0 --- /dev/null +++ b/templates/odoo/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `ODOO_HOST=${randomDomain}`, + "ODOO_PORT=8069", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/phpmyadmin/docker-compose.yml b/templates/phpmyadmin/docker-compose.yml new file mode 100644 index 000000000..c6743a580 --- /dev/null +++ b/templates/phpmyadmin/docker-compose.yml @@ -0,0 +1,40 @@ +version: '3.8' + +services: + db: + image: mysql:5.7 + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + MYSQL_DATABASE: tu_base_de_datos + MYSQL_USER: ${MYSQL_USER} + MYSQL_PASSWORD: ${MYSQL_PASSWORD} + volumes: + - db_data:/var/lib/mysql + networks: + - dokploy-network + + phpmyadmin: + image: phpmyadmin/phpmyadmin:5.2.1 + environment: + PMA_HOST: db + PMA_USER: ${MYSQL_USER} + PMA_PASSWORD: ${MYSQL_PASSWORD} + PMA_ARBITRARY: 1 + ports: + - ${PHPMYADMIN_PORT} + depends_on: + - db + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${PHPMYADMIN_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${PHPMYADMIN_PORT} + networks: + - dokploy-network + +volumes: + db_data: + driver: local + +networks: + dokploy-network: + external: true diff --git a/templates/phpmyadmin/index.ts b/templates/phpmyadmin/index.ts new file mode 100644 index 000000000..24e546ce3 --- /dev/null +++ b/templates/phpmyadmin/index.ts @@ -0,0 +1,27 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, + generatePassword, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const rootPassword = generatePassword(32); + const password = generatePassword(32); + const envs = [ + `PHPMYADMIN_HOST=${randomDomain}`, + "PHPMYADMIN_PORT=80", + `HASH=${mainServiceHash}`, + `MYSQL_ROOT_PASSWORD=${rootPassword}`, + "MYSQL_DATABASE=mysql", + "MYSQL_USER=phpmyadmin", + `MYSQL_PASSWORD=${password}`, + ]; + + return { + envs, + }; +} diff --git a/templates/plausible/docker-compose.yml b/templates/plausible/docker-compose.yml index 9dea594b5..cc4c41e29 100644 --- a/templates/plausible/docker-compose.yml +++ b/templates/plausible/docker-compose.yml @@ -1,7 +1,6 @@ +version: "3.8" services: plausible_db: - # Plausible v2.1.0 was tested against PostgreSQL versions 15 and 16 - # https://github.com/plausible/analytics/blob/v2.1.0/.github/workflows/elixir.yml#L21-L32 image: postgres:16-alpine restart: always networks: diff --git a/templates/pocketbase/docker-compose.yml b/templates/pocketbase/docker-compose.yml index a09975bbb..7570dd585 100644 --- a/templates/pocketbase/docker-compose.yml +++ b/templates/pocketbase/docker-compose.yml @@ -1,4 +1,4 @@ -version: "3.7" +version: "3.8" services: pocketbase: image: spectado/pocketbase:0.22.12 diff --git a/templates/pocketbase/index.ts b/templates/pocketbase/index.ts index a38ec3124..11eb62b30 100644 --- a/templates/pocketbase/index.ts +++ b/templates/pocketbase/index.ts @@ -5,7 +5,6 @@ import { type Schema, } from "../utils"; -// https://pocketbase.io/docs/ export function generate(schema: Schema): Template { const mainServiceHash = generateHash(schema.projectName); const randomDomain = generateRandomDomain(schema); diff --git a/templates/rocketchat/docker-compose.yml b/templates/rocketchat/docker-compose.yml new file mode 100644 index 000000000..78056b9a7 --- /dev/null +++ b/templates/rocketchat/docker-compose.yml @@ -0,0 +1,48 @@ +version: "3.8" +services: + rocketchat: + image: registry.rocket.chat/rocketchat/rocket.chat:6.9.2 + restart: always + environment: + MONGO_URL: "mongodb://mongodb:27017/rocketchat?replicaSet=rs0" + MONGO_OPLOG_URL: "mongodb://mongodb:27017/local?replicaSet=rs0" + ROOT_URL: ${ROOT_URL:-http://${ROCKETCHAT_HOST}:${ROCKETCHAT_PORT}} + PORT: ${ROCKETCHAT_PORT} + DEPLOY_METHOD: docker + DEPLOY_PLATFORM: + REG_TOKEN: + depends_on: + - mongodb + ports: + - ${ROCKETCHAT_PORT} + networks: + - dokploy-network + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${ROCKETCHAT_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${ROCKETCHAT_PORT} + + mongodb: + image: docker.io/bitnami/mongodb:5.0 + restart: always + volumes: + - mongodb_data:/bitnami/mongodb + environment: + MONGODB_REPLICA_SET_MODE: primary + MONGODB_REPLICA_SET_NAME: rs0 + MONGODB_PORT_NUMBER: 27017 + MONGODB_INITIAL_PRIMARY_HOST: mongodb + MONGODB_INITIAL_PRIMARY_PORT_NUMBER: 27017 + MONGODB_ADVERTISED_HOSTNAME: mongodb + MONGODB_ENABLE_JOURNAL: true + ALLOW_EMPTY_PASSWORD: yes + networks: + - dokploy-network + +volumes: + mongodb_data: { driver: local } + + +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/rocketchat/index.ts b/templates/rocketchat/index.ts new file mode 100644 index 000000000..4946864c3 --- /dev/null +++ b/templates/rocketchat/index.ts @@ -0,0 +1,21 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + + const envs = [ + `ROCKETCHAT_HOST=${randomDomain}`, + "ROCKETCHAT_PORT=3000", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/templates.ts b/templates/templates.ts index fff7315a6..85fb8a945 100644 --- a/templates/templates.ts +++ b/templates/templates.ts @@ -47,7 +47,157 @@ export const templates: TemplateData[] = [ tags: ["scheduling", "booking"], load: () => import("./calcom/index").then((m) => m.generate), }, - { + { + id: "grafana", + name: "Grafana", + version: "9.5.20", + description: + "Grafana is an open source platform for data visualization and monitoring.", + logo: "grafana.svg", + links: { + github: "https://github.com/grafana/grafana", + website: "https://grafana.com/", + docs: "https://grafana.com/docs/", + }, + tags: ["monitoring"], + load: () => import("./grafana/index").then((m) => m.generate), + }, + { + id: "directus", + name: "Directus", + version: "10.12.1", + description: + "Directus is an open source headless CMS that provides an API-first solution for building custom backends.", + logo: "directus.jpg", + links: { + github: "https://github.com/directus/directus", + website: "https://directus.io/", + docs: "https://docs.directus.io/", + }, + tags: ["cms"], + load: () => import("./directus/index").then((m) => m.generate), + }, + { + id: "baserow", + name: "Baserow", + version: "1.25.2", + description: + "Baserow is an open source database management tool that allows you to create and manage databases.", + logo: "baserow.webp", + links: { + github: "https://github.com/Baserow/baserow", + website: "https://baserow.io/", + docs: "https://baserow.io/docs/index", + }, + tags: ["database"], + load: () => import("./baserow/index").then((m) => m.generate), + }, + { + id: "ghost", + name: "Ghost", + version: "5.0.0", + description: + "Ghost is a free and open source, professional publishing platform built on a modern Node.js technology stack.", + logo: "ghost.jpeg", + links: { + github: "https://github.com/TryGhost/Ghost", + website: "https://ghost.org/", + docs: "https://ghost.org/docs/", + }, + tags: ["cms"], + load: () => import("./ghost/index").then((m) => m.generate), + }, + { + id: "uptime-kuma", + name: "Uptime Kuma", + version: "1.21.4", + description: + "Uptime Kuma is a free and open source monitoring tool that allows you to monitor your websites and applications.", + logo: "uptime-kuma.png", + links: { + github: "https://github.com/louislam/uptime-kuma", + website: "https://uptime.kuma.pet/", + docs: "https://github.com/louislam/uptime-kuma/wiki", + }, + tags: ["monitoring"], + load: () => import("./uptime-kuma/index").then((m) => m.generate), + }, + { + id: "n8n", + name: "n8n", + version: "1.48.1", + description: + "n8n is an open source low-code platform for automating workflows and integrations.", + logo: "n8n.png", + links: { + github: "https://github.com/n8n-io/n8n", + website: "https://n8n.io/", + docs: "https://docs.n8n.io/", + }, + tags: ["automation"], + load: () => import("./n8n/index").then((m) => m.generate), + }, + { + id: "wordpress", + name: "Wordpress", + version: "5.8.3", + description: + "Wordpress is a free and open source content management system (CMS) for publishing and managing websites.", + logo: "wordpress.png", + links: { + github: "https://github.com/WordPress/WordPress", + website: "https://wordpress.org/", + docs: "https://wordpress.org/documentation/", + }, + tags: ["cms"], + load: () => import("./wordpress/index").then((m) => m.generate), + }, + { + id: "odoo", + name: "Odoo", + version: "16.0", + description: + "Odoo is a free and open source business management software that helps you manage your company's operations.", + logo: "odoo.png", + links: { + github: "https://github.com/odoo/odoo", + website: "https://odoo.com/", + docs: "https://www.odoo.com/documentation/", + }, + tags: ["cms"], + load: () => import("./odoo/index").then((m) => m.generate), + }, + { + id: "appsmith", + name: "Appsmith", + version: "v1.29", + description: + "Appsmith is a free and open source platform for building internal tools and applications.", + logo: "appsmith.png", + links: { + github: "https://github.com/appsmithorg/appsmith", + website: "https://appsmith.com/", + docs: "https://docs.appsmith.com/", + }, + tags: ["cms"], + load: () => import("./appsmith/index").then((m) => m.generate), + }, + { + id: "excalidraw", + name: "Excalidraw", + version: "latest", + description: + "Excalidraw is a free and open source online diagramming tool that lets you easily create and share beautiful diagrams.", + logo: "excalidraw.jpg", + links: { + github: "https://github.com/excalidraw/excalidraw", + website: "https://excalidraw.com/", + docs: "https://docs.excalidraw.com/", + }, + tags: ["drawing"], + load: () => import("./excalidraw/index").then((m) => m.generate), + }, + { id: "documenso", name: "Documenso", version: "v1.5.6", @@ -76,7 +226,82 @@ export const templates: TemplateData[] = [ docs: "https://docs.nocodb.com/", }, logo: "nocodb.png", - tags: ["database", "spreadsheet", "low-code", 'nocode'], + tags: ["database", "spreadsheet", "low-code", "nocode"], load: () => import("./nocodb/index").then((m) => m.generate), }, + { + id: "meilisearch", + name: "Meilisearch", + version: "v1.8.3", + description: + "Meilisearch is a free and open-source search engine that allows you to easily add search functionality to your web applications.", + logo: "meilisearch.png", + links: { + github: "https://github.com/meilisearch/meilisearch", + website: "https://www.meilisearch.com/", + docs: "https://docs.meilisearch.com/", + }, + tags: ["search"], + load: () => import("./meilisearch/index").then((m) => m.generate), + }, + { + id: "phpmyadmin", + name: "Phpmyadmin", + version: "5.2.1", + description: + "Phpmyadmin is a free and open-source web interface for MySQL and MariaDB that allows you to manage your databases.", + logo: "phpmyadmin.png", + links: { + github: "https://github.com/phpmyadmin/phpmyadmin", + website: "https://www.phpmyadmin.net/", + docs: "https://www.phpmyadmin.net/docs/", + }, + tags: ["database"], + load: () => import("./phpmyadmin/index").then((m) => m.generate), + }, + { + id: "rocketchat", + name: "Rocketchat", + version: "6.9.2", + description: + "Rocket.Chat is a free and open-source web chat platform that allows you to build and manage your own chat applications.", + logo: "rocketchat.png", + links: { + github: "https://github.com/RocketChat/Rocket.Chat", + website: "https://rocket.chat/", + docs: "https://rocket.chat/docs/", + }, + tags: ["chat"], + load: () => import("./rocketchat/index").then((m) => m.generate), + }, + { + id: "minio", + name: "Minio", + description: + "Minio is an open source object storage server compatible with Amazon S3 cloud storage service.", + logo: "minio.png", + version: "latest", + links: { + github: "https://github.com/minio/minio", + website: "https://minio.io/", + docs: "https://docs.minio.io/", + }, + tags: ["storage"], + load: () => import("./minio/index").then((m) => m.generate), + }, + { + id: "metabase", + name: "Metabase", + version: "v0.50.8", + description: + "Metabase is an open source business intelligence tool that allows you to ask questions and visualize data.", + logo: "metabase.png", + links: { + github: "https://github.com/metabase/metabase", + website: "https://www.metabase.com/", + docs: "https://www.metabase.com/docs/", + }, + tags: ["database", "dashboard"], + load: () => import("./metabase/index").then((m) => m.generate), + }, ]; diff --git a/templates/uptime-kuma/docker-compose.yml b/templates/uptime-kuma/docker-compose.yml new file mode 100644 index 000000000..2e2109a85 --- /dev/null +++ b/templates/uptime-kuma/docker-compose.yml @@ -0,0 +1,21 @@ +version: "3.8" +services: + uptime-kuma: + networks: + - dokploy-network + image: louislam/uptime-kuma:1 + restart: always + ports: + - ${UPTIME_KUMA_PORT} + volumes: + - uptime-kuma-data:/app/data + labels: + - traefik.enable=true + - traefik.http.routers.${HASH}.rule=Host(`${UPTIME_KUMA_HOST}`) + - traefik.http.services.${HASH}.loadbalancer.server.port=${UPTIME_KUMA_PORT} + +volumes: + uptime-kuma-data: +networks: + dokploy-network: + external: true \ No newline at end of file diff --git a/templates/uptime-kuma/index.ts b/templates/uptime-kuma/index.ts new file mode 100644 index 000000000..84004ac8e --- /dev/null +++ b/templates/uptime-kuma/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `UPTIME_KUMA_HOST=${randomDomain}`, + "UPTIME_KUMA_PORT=3001", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +} diff --git a/templates/wordpress/docker-compose.yml b/templates/wordpress/docker-compose.yml new file mode 100644 index 000000000..e1e99e6be --- /dev/null +++ b/templates/wordpress/docker-compose.yml @@ -0,0 +1,39 @@ +version: '3.8' +services: + wordpress: + image: wordpress:5.8.3 + networks: + - dokploy-network + ports: + - ${WORDPRESS_PORT} + environment: + WORDPRESS_DB_HOST: db + WORDPRESS_DB_USER: exampleuser + WORDPRESS_DB_PASSWORD: examplepass + WORDPRESS_DB_NAME: exampledb + labels: + - "traefik.enable=true" + - "traefik.http.routers.${HASH}.rule=Host(`${WORDPRESS_HOST}`)" + - "traefik.http.services.${HASH}.loadbalancer.server.port=${WORDPRESS_PORT}" + volumes: + - wordpress_data:/var/www/html + + db: + image: mysql:5.7.34 + networks: + - dokploy-network + environment: + MYSQL_DATABASE: exampledb + MYSQL_USER: exampleuser + MYSQL_PASSWORD: examplepass + MYSQL_ROOT_PASSWORD: rootpass + volumes: + - db_data:/var/lib/mysql + +volumes: + wordpress_data: + db_data: + +networks: + dokploy-network: + external: true diff --git a/templates/wordpress/index.ts b/templates/wordpress/index.ts new file mode 100644 index 000000000..8fb62e1e0 --- /dev/null +++ b/templates/wordpress/index.ts @@ -0,0 +1,20 @@ +import { + generateHash, + generateRandomDomain, + type Template, + type Schema, +} from "../utils"; + +export function generate(schema: Schema): Template { + const mainServiceHash = generateHash(schema.projectName); + const randomDomain = generateRandomDomain(schema); + const envs = [ + `WORDPRESS_HOST=${randomDomain}`, + "WORDPRESS_PORT=80", + `HASH=${mainServiceHash}`, + ]; + + return { + envs, + }; +}