Merge branch 'canary' into feat/stack-env-support

This commit is contained in:
Mauricio Siu
2025-01-30 23:39:54 -06:00
614 changed files with 71918 additions and 18508 deletions
@@ -0,0 +1,12 @@
services:
actualbudget:
image: docker.io/actualbudget/actual-server:latest
environment:
# See all options at https://actualbudget.org/docs/config
- ACTUAL_PORT=5006
volumes:
- actual-data:/data
restart: unless-stopped
volumes:
actual-data:
@@ -0,0 +1,20 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 5006,
serviceName: "actualbudget",
},
];
return {
domains,
};
}
@@ -0,0 +1,14 @@
version: '3.3'
services:
alist:
image: xhofe/alist:v3.41.0
volumes:
- alist-data:/opt/alist/data
environment:
- PUID=0
- PGID=0
- UMASK=022
restart: unless-stopped
volumes:
alist-data:
+22
View File
@@ -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: 5244,
serviceName: "alist",
},
];
return {
domains,
};
}
@@ -0,0 +1,31 @@
services:
answer:
image: apache/answer:1.4.1
ports:
- '80'
restart: on-failure
volumes:
- answer-data:/data
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dokploy-network
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_DB: answer
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
volumes:
answer-data:
db-data:
+33
View File
@@ -0,0 +1,33 @@
import {
type DomainSchema,
type Schema,
type Template,
generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainServiceHash = generateHash(schema.projectName);
const mainDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 9080,
serviceName: "answer",
},
];
const envs = [
`ANSWER_HOST=http://${mainDomain}`,
`SERVICE_HASH=${mainServiceHash}`,
];
const mounts: Template["mounts"] = [];
return {
envs,
mounts,
domains,
};
}
@@ -0,0 +1,47 @@
services:
client:
image: bluewaveuptime/uptime_client:latest
restart: always
environment:
UPTIME_APP_API_BASE_URL: "http://${DOMAIN}/api/v1"
ports:
- 80
- 443
depends_on:
- server
networks:
- dokploy-network
server:
image: bluewaveuptime/uptime_server:latest
restart: always
ports:
- 5000
depends_on:
- redis
- mongodb
environment:
- DB_CONNECTION_STRING=mongodb://mongodb:27017/uptime_db
- REDIS_HOST=redis
networks:
- dokploy-network
# volumes:
# - /var/run/docker.sock:/var/run/docker.sock:ro
redis:
image: bluewaveuptime/uptime_redis:latest
restart: always
ports:
- 6379
volumes:
- ../files/redis/data:/data
networks:
- dokploy-network
mongodb:
image: bluewaveuptime/uptime_database_mongo:latest
restart: always
volumes:
- ../files/mongo/data:/data/db
command: ["mongod", "--quiet"]
ports:
- 27017
networks:
- dokploy-network
+25
View File
@@ -0,0 +1,25 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const envs = [`DOMAIN=${mainDomain}`];
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "client",
},
];
return {
domains,
envs,
};
}
@@ -0,0 +1,18 @@
services:
cloudflared:
image: 'cloudflare/cloudflared:latest'
environment:
# Don't forget to set this in your Dokploy Environment
- 'TUNNEL_TOKEN=${CLOUDFLARE_TUNNEL_TOKEN}'
network_mode: host
restart: unless-stopped
command: [
"tunnel",
# More tunnel run parameters here:
# https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/configure-tunnels/tunnel-run-parameters/
"--no-autoupdate",
#"--protocol", "http2",
"run"
]
@@ -0,0 +1,9 @@
import type { Schema, Template } from "../utils";
export function generate(schema: Schema): Template {
const envs = [`CLOUDFLARE_TUNNEL_TOKEN="<INSERT TOKEN>"`];
return {
envs,
};
}
@@ -0,0 +1,31 @@
# From Conduit's official documentation: https://docs.conduit.rs/deploying/docker.html#docker-compose
version: '3'
services:
homeserver:
image: registry.gitlab.com/famedly/conduit/matrix-conduit:v0.9.0
restart: unless-stopped
volumes:
- db:/var/lib/matrix-conduit/
networks:
- dokploy-network
environment:
CONDUIT_SERVER_NAME: ${MATRIX_SUBDOMAIN}
CONDUIT_DATABASE_PATH: /var/lib/matrix-conduit/
CONDUIT_DATABASE_BACKEND: rocksdb
CONDUIT_PORT: 6167
CONDUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB
CONDUIT_ALLOW_REGISTRATION: 'true'
#CONDUIT_REGISTRATION_TOKEN: '' # require password for registration
CONDUIT_ALLOW_FEDERATION: 'true'
CONDUIT_ALLOW_CHECK_FOR_UPDATES: 'true'
CONDUIT_TRUSTED_SERVERS: '["matrix.org"]'
#CONDUIT_MAX_CONCURRENT_REQUESTS: 100
CONDUIT_ADDRESS: 0.0.0.0
CONDUIT_CONFIG: '' # Ignore this
volumes:
db:
networks:
dokploy-network:
external: true
+28
View File
@@ -0,0 +1,28 @@
// EXAMPLE
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const matrixSubdomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: matrixSubdomain,
port: 6167,
serviceName: "homeserver",
},
];
const envs = [
`MATRIX_SUBDOMAIN=${matrixSubdomain} # Replace by your server name`,
];
return {
envs,
domains,
};
}
@@ -0,0 +1,48 @@
# conduwuit
# https://conduwuit.puppyirl.gay/deploying/docker-compose.yml
services:
homeserver:
image: girlbossceo/conduwuit:latest
restart: unless-stopped
ports:
- 8448:6167
volumes:
- db:/var/lib/conduwuit
#- ./conduwuit.toml:/etc/conduwuit.toml
environment:
# Edit this in your Dokploy Environment
CONDUWUIT_SERVER_NAME: ${CONDUWUIT_SERVER_NAME}
CONDUWUIT_DATABASE_PATH: /var/lib/conduwuit
CONDUWUIT_PORT: 6167
CONDUWUIT_MAX_REQUEST_SIZE: 20000000 # in bytes, ~20 MB
CONDUWUIT_ALLOW_REGISTRATION: 'true'
CONDUWUIT_REGISTRATION_TOKEN: ${CONDUWUIT_REGISTRATION_TOKEN}
CONDUWUIT_ALLOW_FEDERATION: 'true'
CONDUWUIT_ALLOW_CHECK_FOR_UPDATES: 'true'
CONDUWUIT_TRUSTED_SERVERS: '["matrix.org"]'
#CONDUWUIT_LOG: warn,state_res=warn
CONDUWUIT_ADDRESS: 0.0.0.0
# Uncomment if you mapped config toml in volumes
#CONDUWUIT_CONFIG: '/etc/conduwuit.toml'
### Uncomment if you want to use your own Element-Web App.
### Note: You need to provide a config.json for Element and you also need a second
### Domain or Subdomain for the communication between Element and conduwuit
### Config-Docs: https://github.com/vector-im/element-web/blob/develop/docs/config.md
# element-web:
# image: vectorim/element-web:latest
# restart: unless-stopped
# ports:
# - 8009:80
# volumes:
# - ./element_config.json:/app/config.json
# depends_on:
# - homeserver
volumes:
db:
+30
View File
@@ -0,0 +1,30 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const matrixSubdomain = generateRandomDomain(schema);
const registrationToken = generatePassword(20);
const domains: DomainSchema[] = [
{
host: matrixSubdomain,
port: 6167,
serviceName: "homeserver",
},
];
const envs = [
`CONDUWUIT_SERVER_NAME=${matrixSubdomain}`,
`CONDUWUIT_REGISTRATION_TOKEN=${registrationToken}`,
];
return {
envs,
domains,
};
}
@@ -0,0 +1,17 @@
version: '3.8'
services:
couchdb:
image: couchdb:latest
ports:
- '5984'
volumes:
- couchdb-data:/opt/couchdb/data
environment:
- COUCHDB_USER=${COUCHDB_USER}
- COUCHDB_PASSWORD=${COUCHDB_PASSWORD}
restart: unless-stopped
volumes:
couchdb-data:
driver: local
+28
View File
@@ -0,0 +1,28 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const username = generatePassword(16);
const password = generatePassword(32);
const domains: DomainSchema[] = [
{
serviceName: "couchdb",
host: mainDomain,
port: 5984,
},
];
const envs = [`COUCHDB_USER=${username}`, `COUCHDB_PASSWORD=${password}`];
return {
envs,
domains,
};
}
@@ -0,0 +1,34 @@
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- bootstrap.memory_lock=true
- ES_JAVA_OPTS=-Xms512m -Xmx512m
ulimits:
memlock:
soft: -1
hard: -1
ports:
- "9200"
volumes:
- es_data:/usr/share/elasticsearch/data
kibana:
image: docker.elastic.co/kibana/kibana:8.10.2
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
ports:
- "5601"
depends_on:
- elasticsearch
volumes:
es_data:
driver: local
@@ -0,0 +1,28 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const apiDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 5601,
serviceName: "kibana",
},
{
host: apiDomain,
port: 9200,
serviceName: "elasticsearch",
},
];
return {
domains,
};
}
@@ -0,0 +1,346 @@
x-custom-image: &custom_image
image: ${IMAGE_NAME:-docker.io/frappe/erpnext}:${VERSION:-version-15}
pull_policy: ${PULL_POLICY:-always}
deploy:
restart_policy:
condition: always
services:
backend:
<<: *custom_image
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
- wait-for-it
- '0.0.0.0:8000'
interval: 2s
timeout: 10s
retries: 30
frontend:
<<: *custom_image
command:
- nginx-entrypoint.sh
depends_on:
backend:
condition: service_started
required: true
websocket:
condition: service_started
required: true
environment:
BACKEND: backend:8000
FRAPPE_SITE_NAME_HEADER: ${FRAPPE_SITE_NAME_HEADER:-$$host}
SOCKETIO: websocket:9000
UPSTREAM_REAL_IP_ADDRESS: 127.0.0.1
UPSTREAM_REAL_IP_HEADER: X-Forwarded-For
UPSTREAM_REAL_IP_RECURSIVE: "off"
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
- wait-for-it
- '0.0.0.0:8080'
interval: 2s
timeout: 30s
retries: 30
queue-default:
<<: *custom_image
command:
- bench
- worker
- --queue
- default
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
- wait-for-it
- 'redis-queue:6379'
interval: 2s
timeout: 10s
retries: 30
depends_on:
configurator:
condition: service_completed_successfully
required: true
queue-long:
<<: *custom_image
command:
- bench
- worker
- --queue
- long
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
- wait-for-it
- 'redis-queue:6379'
interval: 2s
timeout: 10s
retries: 30
depends_on:
configurator:
condition: service_completed_successfully
required: true
queue-short:
<<: *custom_image
command:
- bench
- worker
- --queue
- short
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
healthcheck:
test:
- CMD
- wait-for-it
- 'redis-queue:6379'
interval: 2s
timeout: 10s
retries: 30
depends_on:
configurator:
condition: service_completed_successfully
required: true
scheduler:
<<: *custom_image
healthcheck:
test:
- CMD
- wait-for-it
- 'redis-queue:6379'
interval: 2s
timeout: 10s
retries: 30
command:
- bench
- schedule
depends_on:
configurator:
condition: service_completed_successfully
required: true
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
websocket:
<<: *custom_image
healthcheck:
test:
- CMD
- wait-for-it
- '0.0.0.0:9000'
interval: 2s
timeout: 10s
retries: 30
command:
- node
- /home/frappe/frappe-bench/apps/frappe/socketio.js
depends_on:
configurator:
condition: service_completed_successfully
required: true
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
configurator:
<<: *custom_image
deploy:
mode: replicated
replicas: ${CONFIGURE:-0}
restart_policy:
condition: none
entrypoint: ["bash", "-c"]
command:
- >
[[ $${REGENERATE_APPS_TXT} == "1" ]] && ls -1 apps > sites/apps.txt;
[[ -n `grep -hs ^ sites/common_site_config.json | jq -r ".db_host // empty"` ]] && exit 0;
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"
REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}"
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
create-site:
<<: *custom_image
deploy:
mode: replicated
replicas: ${CREATE_SITE:-0}
restart_policy:
condition: none
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";
[[ -d "sites/${SITE_NAME}" ]] && echo "${SITE_NAME} already exists" && exit 0;
bench new-site --mariadb-user-host-login-scope='%' --admin-password=$${ADMIN_PASSWORD} --db-root-username=root --db-root-password=$${DB_ROOT_PASSWORD} $${INSTALL_APP_ARGS} $${SITE_NAME};
volumes:
- sites:/home/frappe/frappe-bench/sites
environment:
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
SITE_NAME: ${SITE_NAME}
networks:
- bench-network
migration:
<<: *custom_image
deploy:
mode: replicated
replicas: ${MIGRATE:-0}
restart_policy:
condition: none
entrypoint: ["bash", "-c"]
command:
- >
curl -f http://${SITE_NAME}:8080/api/method/ping || echo "Site busy" && exit 0;
bench --site all set-config -p maintenance_mode 1;
bench --site all set-config -p pause_scheduler 1;
bench --site all migrate;
bench --site all set-config -p maintenance_mode 0;
bench --site all set-config -p pause_scheduler 0;
volumes:
- sites:/home/frappe/frappe-bench/sites
networks:
- bench-network
db:
image: mariadb:10.6
deploy:
restart_policy:
condition: always
healthcheck:
test: mysqladmin ping -h localhost --password=${DB_ROOT_PASSWORD}
interval: 1s
retries: 20
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --skip-character-set-client-handshake
- --skip-innodb-read-only-compressed
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
volumes:
- db-data:/var/lib/mysql
networks:
- bench-network
redis-cache:
deploy:
restart_policy:
condition: always
image: redis:6.2-alpine
volumes:
- redis-cache-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
- redis-cli
- ping
interval: 5s
timeout: 5s
retries: 3
redis-queue:
deploy:
restart_policy:
condition: always
image: redis:6.2-alpine
volumes:
- redis-queue-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
- redis-cli
- ping
interval: 5s
timeout: 5s
retries: 3
redis-socketio:
deploy:
restart_policy:
condition: always
image: redis:6.2-alpine
volumes:
- redis-socketio-data:/data
networks:
- bench-network
healthcheck:
test:
- CMD
- redis-cli
- ping
interval: 5s
timeout: 5s
retries: 3
volumes:
db-data:
redis-cache-data:
redis-queue-data:
redis-socketio-data:
sites:
networks:
bench-network:
+37
View File
@@ -0,0 +1,37 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const dbRootPassword = generatePassword(32);
const adminPassword = generatePassword(32);
const mainDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 8080,
serviceName: "frontend",
},
];
const envs = [
`SITE_NAME=${mainDomain}`,
`ADMIN_PASSWORD=${adminPassword}`,
`DB_ROOT_PASSWORD=${dbRootPassword}`,
"MIGRATE=1",
"CREATE_SITE=1",
"CONFIGURE=1",
"REGENERATE_APPS_TXT=1",
"INSTALL_APP_ARGS=--install-app erpnext",
"IMAGE_NAME=docker.io/frappe/erpnext",
"VERSION=version-15",
"FRAPPE_SITE_NAME_HEADER=",
];
return { envs, domains };
}
@@ -0,0 +1,61 @@
services:
evolution-api:
image: atendai/evolution-api:v2.1.2
restart: always
volumes:
- evolution-instances:/evolution/instances
networks:
- dokploy-network
environment:
- SERVER_URL=${SERVER_URL}
- AUTHENTICATION_TYPE=${AUTHENTICATION_TYPE}
- AUTHENTICATION_API_KEY=${AUTHENTICATION_API_KEY}
- AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=${AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES}
- LANGUAGE=${LANGUAGE}
- CONFIG_SESSION_PHONE_CLIENT=${CONFIG_SESSION_PHONE_CLIENT}
- CONFIG_SESSION_PHONE_NAME=${CONFIG_SESSION_PHONE_NAME}
- TELEMETRY=${TELEMETRY}
- TELEMETRY_URL=${TELEMETRY_URL}
- DATABASE_ENABLED=${DATABASE_ENABLED}
- DATABASE_PROVIDER=${DATABASE_PROVIDER}
- DATABASE_CONNECTION_URI=${DATABASE_CONNECTION_URI}
- DATABASE_SAVE_DATA_INSTANCE=${DATABASE_SAVE_DATA_INSTANCE}
- DATABASE_SAVE_DATA_NEW_MESSAGE=${DATABASE_SAVE_DATA_NEW_MESSAGE}
- DATABASE_SAVE_MESSAGE_UPDATE=${DATABASE_SAVE_MESSAGE_UPDATE}
- DATABASE_SAVE_DATA_CONTACTS=${DATABASE_SAVE_DATA_CONTACTS}
- DATABASE_SAVE_DATA_CHATS=${DATABASE_SAVE_DATA_CHATS}
- DATABASE_SAVE_DATA_LABELS=${DATABASE_SAVE_DATA_LABELS}
- DATABASE_SAVE_DATA_HISTORIC=${DATABASE_SAVE_DATA_HISTORIC}
- CACHE_REDIS_ENABLED=${CACHE_REDIS_ENABLED}
- CACHE_REDIS_URI=${CACHE_REDIS_URI}
- CACHE_REDIS_PREFIX_KEY=${CACHE_REDIS_PREFIX_KEY}
- CACHE_REDIS_SAVE_INSTANCES=${CACHE_REDIS_SAVE_INSTANCES}
evolution-postgres:
image: postgres:16-alpine
restart: always
volumes:
- evolution-postgres-data:/var/lib/postgresql/data
networks:
- dokploy-network
environment:
- POSTGRES_DB=${POSTGRES_DATABASE}
- POSTGRES_USER=${POSTGRES_USERNAME}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
evolution-redis:
image: redis:alpine
restart: always
volumes:
- evolution-redis-data:/data
networks:
- dokploy-network
networks:
dokploy-network:
external: true
volumes:
evolution-instances:
evolution-postgres-data:
evolution-redis-data:
@@ -0,0 +1,59 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const apiKey = generateBase64(64);
const postgresPassword = generatePassword();
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 8080,
serviceName: "evolution-api",
},
];
const envs = [
`SERVER_URL=https://${mainDomain}`,
"AUTHENTICATION_TYPE=apikey",
`AUTHENTICATION_API_KEY=${apiKey}`,
"AUTHENTICATION_EXPOSE_IN_FETCH_INSTANCES=true",
"LANGUAGE=en",
"CONFIG_SESSION_PHONE_CLIENT=Evolution API",
"CONFIG_SESSION_PHONE_NAME=Chrome",
"TELEMETRY=false",
"TELEMETRY_URL=",
"POSTGRES_DATABASE=evolution",
"POSTGRES_USERNAME=postgresql",
`POSTGRES_PASSWORD=${postgresPassword}`,
"DATABASE_ENABLED=true",
"DATABASE_PROVIDER=postgresql",
`DATABASE_CONNECTION_URI=postgres://postgresql:${postgresPassword}@evolution-postgres:5432/evolution`,
"DATABASE_SAVE_DATA_INSTANCE=true",
"DATABASE_SAVE_DATA_NEW_MESSAGE=true",
"DATABASE_SAVE_MESSAGE_UPDATE=true",
"DATABASE_SAVE_DATA_CONTACTS=true",
"DATABASE_SAVE_DATA_CHATS=true",
"DATABASE_SAVE_DATA_LABELS=true",
"DATABASE_SAVE_DATA_HISTORIC=true",
"CACHE_REDIS_ENABLED=true",
"CACHE_REDIS_URI=redis://evolution-redis:6379",
"CACHE_REDIS_PREFIX_KEY=evolution",
"CACHE_REDIS_SAVE_INSTANCES=true",
];
return {
domains,
envs,
};
}
@@ -0,0 +1,38 @@
x-environment: &environment
environment:
WEBAPP_URL: ${WEBAPP_URL}
NEXTAUTH_URL: ${NEXTAUTH_URL}
DATABASE_URL: "postgresql://postgres:postgres@postgres:5432/formbricks?schema=public"
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
ENCRYPTION_KEY: ${ENCRYPTION_KEY}
CRON_SECRET: ${CRON_SECRET}
EMAIL_VERIFICATION_DISABLED: 1
PASSWORD_RESET_DISABLED: 1
S3_FORCE_PATH_STYLE: 0
services:
postgres:
restart: always
image: pgvector/pgvector:pg17
volumes:
- postgres:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=postgres
networks:
- dokploy-network
formbricks:
restart: always
image: ghcr.io/formbricks/formbricks:v3.1.3
depends_on:
- postgres
ports:
- 3000
volumes:
- ../files/uploads:/home/nextjs/apps/web/uploads/
<<: *environment
volumes:
postgres:
driver: local
uploads:
@@ -0,0 +1,38 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64);
const encryptionKey = generateBase64(48);
const cronSecret = generateBase64(32);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3000,
serviceName: "formbricks",
},
];
const envs = [
`WEBAPP_URL=http://${mainDomain}`,
`NEXTAUTH_URL=http://${mainDomain}`,
`NEXTAUTH_SECRET=${secretBase}`,
`ENCRYPTION_KEY=${encryptionKey}`,
`CRON_SECRET=${cronSecret}`,
];
const mounts: Template["mounts"] = [];
return {
envs,
mounts,
domains,
};
}
@@ -0,0 +1,8 @@
services:
glance:
image: glanceapp/glance
volumes:
- ../files/app/glance.yml:/app/glance.yml
ports:
- 8080
restart: unless-stopped
+108
View File
@@ -0,0 +1,108 @@
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: "glance",
},
];
const mounts: Template["mounts"] = [
{
filePath: "/app/glance.yml",
content: `
branding:
hide-footer: true
logo-text: P
pages:
- name: Home
columns:
- size: small
widgets:
- type: calendar
- type: releases
show-source-icon: true
repositories:
- Dokploy/dokploy
- n8n-io/n8n
- Budibase/budibase
- home-assistant/core
- tidbyt/pixlet
- type: twitch-channels
channels:
- nmplol
- extraemily
- qtcinderella
- ludwig
- timthetatman
- mizkif
- size: full
widgets:
- type: hacker-news
- type: videos
style: grid-cards
channels:
- UC3GzdWYwUYI1ACxuP9Nm-eg
- UCGbg3DjQdcqWwqOLHpYHXIg
- UC24RSoLcjiNZbQcT54j5l7Q
limit: 3
- type: rss
limit: 10
collapse-after: 3
cache: 3h
feeds:
- url: https://daringfireball.net/feeds/main
title: Daring Fireball
- size: small
widgets:
- type: weather
location: Gansevoort, New York, United States
show-area-name: false
units: imperial
hour-format: 12h
- type: markets
markets:
- symbol: SPY
name: S&P 500
- symbol: VOO
name: Vanguard
- symbol: BTC-USD
name: Bitcoin
- symbol: ETH-USD
name: Etherium
- symbol: NVDA
name: NVIDIA
- symbol: AAPL
name: Apple
- symbol: MSFT
name: Microsoft
- symbol: GOOGL
name: Google
- symbol: AMD
name: AMD
- symbol: TSLA
name: Tesla`,
},
];
return {
domains,
mounts,
};
}
@@ -0,0 +1,28 @@
services:
glpi-mysql:
image: mysql:9.1.0
restart: always
volumes:
- glpi-mysql-data:/var/lib/mysql
networks:
- dokploy-network
glpi-web:
image: elestio/glpi:10.0.16
restart: always
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- glpi-www-data:/var/www/html/glpi
environment:
- TIMEZONE=Europe/Brussels
networks:
- dokploy-network
volumes:
glpi-mysql-data:
glpi-www-data:
networks:
dokploy-network:
external: true
+20
View File
@@ -0,0 +1,20 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const randomDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: randomDomain,
port: 80,
serviceName: "glpi-web",
},
];
return {
domains,
};
}
@@ -0,0 +1,18 @@
services:
gotenberg:
image: gotenberg/gotenberg:latest
environment:
# NOTE: requires the --api-enable-basic-auth option in "command"
# make sure to also change the credentials in Dokploy environment
GOTENBERG_API_BASIC_AUTH_USERNAME: ${GOTENBERG_API_BASIC_AUTH_USERNAME}
GOTENBERG_API_BASIC_AUTH_PASSWORD: ${GOTENBERG_API_BASIC_AUTH_PASSWORD}
command: [
"gotenberg",
# See the full list of options at https://gotenberg.dev/docs/configuration
# Examples:
"--api-enable-basic-auth"
#"--api-timeout=60s",
#"--chromium-auto-start"
]
restart: unless-stopped
+29
View File
@@ -0,0 +1,29 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const username = "gotenberg";
const password = "changethis";
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 3000,
serviceName: "gotenberg",
},
];
const envs = [
`GOTENBERG_API_BASIC_AUTH_USERNAME=${username}`,
`GOTENBERG_API_BASIC_AUTH_PASSWORD=${password}`,
];
return {
envs,
domains,
};
}
@@ -0,0 +1,11 @@
services:
homarr:
image: ghcr.io/homarr-labs/homarr:latest
restart: unless-stopped
volumes:
# - /var/run/docker.sock:/var/run/docker.sock # Optional, only if you want docker integration
- ../homarr/appdata:/appdata
environment:
- SECRET_ENCRYPTION_KEY=${SECRET_ENCRYPTION_KEY}
ports:
- 7575
+27
View File
@@ -0,0 +1,27 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const secretKey = generatePassword(64);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 7575,
serviceName: "homarr",
},
];
const envs = [`SECRET_ENCRYPTION_KEY=${secretKey}`];
return {
domains,
envs,
};
}
@@ -0,0 +1,184 @@
name: ${DOCKER_NAME}
version: "3"
services:
nginx:
networks:
- dokploy-network
image: "nginx:1.21.3"
ports:
- 80
volumes:
- ../files/volumes/nginx/.huly.nginx:/etc/nginx/conf.d/default.conf
restart: unless-stopped
mongodb:
networks:
- dokploy-network
image: "mongo:7-jammy"
environment:
- PUID=1000
- PGID=1000
volumes:
- db:/data/db
restart: unless-stopped
minio:
networks:
- dokploy-network
image: "minio/minio:RELEASE.2024-11-07T00-52-20Z"
command: server /data --address ":9000" --console-address ":9001"
volumes:
- files:/data
restart: unless-stopped
elastic:
networks:
- dokploy-network
image: "elasticsearch:7.14.2"
command: |
/bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment;
/usr/local/bin/docker-entrypoint.sh eswrapper"
volumes:
- elastic:/usr/share/elasticsearch/data
environment:
- ELASTICSEARCH_PORT_NUMBER=9200
- BITNAMI_DEBUG=true
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms1024m -Xmx1024m
- http.cors.enabled=true
- http.cors.allow-origin=http://localhost:8082
healthcheck:
interval: 20s
retries: 10
test: curl -s http://localhost:9200/_cluster/health | grep -vq '"status":"red"'
restart: unless-stopped
rekoni:
networks:
- dokploy-network
image: hardcoreeng/rekoni-service:${HULY_VERSION}
environment:
- SECRET=${SECRET}
deploy:
resources:
limits:
memory: 500M
restart: unless-stopped
transactor:
networks:
- dokploy-network
image: hardcoreeng/transactor:${HULY_VERSION}
environment:
- SERVER_PORT=3333
- SERVER_SECRET=${SECRET}
- SERVER_CURSOR_MAXTIMEMS=30000
- DB_URL=mongodb://mongodb:27017
- MONGO_URL=mongodb://mongodb:27017
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
- FRONT_URL=http://localhost:8087
- ACCOUNTS_URL=http://account:3000
- FULLTEXT_URL=http://fulltext:4700
- STATS_URL=http://stats:4900
- LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
restart: unless-stopped
collaborator:
networks:
- dokploy-network
image: hardcoreeng/collaborator:${HULY_VERSION}
environment:
- COLLABORATOR_PORT=3078
- SECRET=${SECRET}
- ACCOUNTS_URL=http://account:3000
- DB_URL=mongodb://mongodb:27017
- STATS_URL=http://stats:4900
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
restart: unless-stopped
account:
networks:
- dokploy-network
image: hardcoreeng/account:${HULY_VERSION}
environment:
- SERVER_PORT=3000
- SERVER_SECRET=${SECRET}
- DB_URL=mongodb://mongodb:27017
- MONGO_URL=mongodb://mongodb:27017
- TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
- FRONT_URL=http://front:8080
- STATS_URL=http://stats:4900
- MODEL_ENABLED=*
- ACCOUNTS_URL=http://localhost:3000
- ACCOUNT_PORT=3000
restart: unless-stopped
workspace:
networks:
- dokploy-network
image: hardcoreeng/workspace:${HULY_VERSION}
environment:
- SERVER_SECRET=${SECRET}
- DB_URL=mongodb://mongodb:27017
- MONGO_URL=mongodb://mongodb:27017
- TRANSACTOR_URL=ws://transactor:3333;ws${SECURE:+s}://${HOST_ADDRESS}/_transactor
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
- MODEL_ENABLED=*
- ACCOUNTS_URL=http://account:3000
- STATS_URL=http://stats:4900
restart: unless-stopped
front:
networks:
- dokploy-network
image: hardcoreeng/front:${HULY_VERSION}
environment:
- SERVER_PORT=8080
- SERVER_SECRET=${SECRET}
- LOVE_ENDPOINT=http${SECURE:+s}://${HOST_ADDRESS}/_love
- ACCOUNTS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_accounts
- REKONI_URL=http${SECURE:+s}://${HOST_ADDRESS}/_rekoni
- CALENDAR_URL=http${SECURE:+s}://${HOST_ADDRESS}/_calendar
- GMAIL_URL=http${SECURE:+s}://${HOST_ADDRESS}/_gmail
- TELEGRAM_URL=http${SECURE:+s}://${HOST_ADDRESS}/_telegram
- STATS_URL=http${SECURE:+s}://${HOST_ADDRESS}/_stats
- UPLOAD_URL=/files
- ELASTIC_URL=http://elastic:9200
- COLLABORATOR_URL=ws${SECURE:+s}://${HOST_ADDRESS}/_collaborator
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
- DB_URL=mongodb://mongodb:27017
- MONGO_URL=mongodb://mongodb:27017
- TITLE=${TITLE:-Huly Self Host}
- DEFAULT_LANGUAGE=${DEFAULT_LANGUAGE:-en}
- LAST_NAME_FIRST=${LAST_NAME_FIRST:-true}
- DESKTOP_UPDATES_CHANNEL=selfhost
restart: unless-stopped
fulltext:
networks:
- dokploy-network
image: hardcoreeng/fulltext:${HULY_VERSION}
environment:
- SERVER_SECRET=${SECRET}
- DB_URL=mongodb://mongodb:27017
- FULLTEXT_DB_URL=http://elastic:9200
- ELASTIC_INDEX_NAME=huly_storage_index
- STORAGE_CONFIG=minio|minio?accessKey=minioadmin&secretKey=minioadmin
- REKONI_URL=http://rekoni:4004
- ACCOUNTS_URL=http://account:3000
- STATS_URL=http://stats:4900
restart: unless-stopped
stats:
networks:
- dokploy-network
image: hardcoreeng/stats:${HULY_VERSION}
environment:
- PORT=4900
- SERVER_SECRET=${SECRET}
restart: unless-stopped
volumes:
db:
elastic:
files:
+152
View File
@@ -0,0 +1,152 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const hulySecret = generateBase64(64);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "nginx",
},
];
const envs = [
"HULY_VERSION=v0.6.377",
"DOCKER_NAME=huly",
"",
"# The address of the host or server from which you will access your Huly instance.",
"# This can be a domain name (e.g., huly.example.com) or an IP address (e.g., 192.168.1.1).",
`HOST_ADDRESS=${mainDomain}`,
"",
"# Set this variable to 'true' to enable SSL (HTTPS/WSS). ",
"# Leave it empty to use non-SSL (HTTP/WS).",
"SECURE=",
"",
"# Specify the IP address to bind to; leave blank to bind to all interfaces (0.0.0.0).",
"# Do not use IP:PORT format in HTTP_BIND or HTTP_PORT.",
"HTTP_PORT=80",
"HTTP_BIND=",
"",
"# Huly specific variables",
"TITLE=Huly",
"DEFAULT_LANGUAGE=en",
"LAST_NAME_FIRST=true",
"",
"# The following configs are auto-generated by the setup script. ",
"# Please do not manually overwrite.",
"",
"# Run with --secret to regenerate.",
`SECRET=${hulySecret}`,
];
const mounts: Template["mounts"] = [
{
filePath: "/volumes/nginx/.huly.nginx",
content: `server {
listen 80;
server_name _;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://front:8080;
}
location /_accounts {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/_accounts(/.*)$ $1 break;
proxy_pass http://account:3000/;
}
#location /_love {
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto $scheme;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection "upgrade";
# rewrite ^/_love(/.*)$ $1 break;
# proxy_pass http://love:8096/;
#}
location /_collaborator {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
rewrite ^/_collaborator(/.*)$ $1 break;
proxy_pass http://collaborator:3078/;
}
location /_transactor {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
rewrite ^/_transactor(/.*)$ $1 break;
proxy_pass http://transactor:3333/;
}
location ~ ^/eyJ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://transactor:3333;
}
location /_rekoni {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/_rekoni(/.*)$ $1 break;
proxy_pass http://rekoni:4004/;
}
location /_stats {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
rewrite ^/_stats(/.*)$ $1 break;
proxy_pass http://stats:4900/;
}
}`,
},
];
return {
domains,
envs,
mounts,
};
}
@@ -0,0 +1,8 @@
services:
it-tools:
image: corentinth/it-tools:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:80"]
interval: 30s
timeout: 10s
retries: 3
+20
View File
@@ -0,0 +1,20 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 80,
serviceName: "it-tools",
},
];
return {
domains,
};
}
@@ -0,0 +1,33 @@
version: "3.8"
services:
langflow:
image: langflowai/langflow:v1.1.1
ports:
- 7860
depends_on:
- postgres-langflow
environment:
- LANGFLOW_DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres-langflow:5432/langflow
# This variable defines where the logs, file storage, monitor data and secret keys are stored.
volumes:
- langflow-data:/app/langflow
networks:
- dokploy-network
postgres-langflow:
image: postgres:16
environment:
POSTGRES_USER: ${DB_USERNAME}
POSTGRES_PASSWORD: ${DB_PASSWORD}
POSTGRES_DB: langflow
ports:
- 5432
volumes:
- langflow-postgres:/var/lib/postgresql/data
networks:
- dokploy-network
volumes:
langflow-postgres:
langflow-data:
+28
View File
@@ -0,0 +1,28 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const dbPassword = generatePassword();
const dbUsername = "langflow";
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 7860,
serviceName: "langflow",
},
];
const envs = [`DB_PASSWORD=${dbPassword}`, `DB_USERNAME=${dbUsername}`];
return {
domains,
envs,
};
}
@@ -1,6 +1,6 @@
services:
db:
image: postgres:13
image: postgres:17-alpine
ports:
- 5432
networks:
@@ -19,7 +19,7 @@ services:
- listmonk-data:/var/lib/postgresql/data
setup:
image: listmonk/listmonk:v3.0.0
image: listmonk/listmonk:v4.1.0
networks:
- dokploy-network
volumes:
@@ -35,7 +35,7 @@ services:
app:
restart: unless-stopped
image: listmonk/listmonk:v3.0.0
image: listmonk/listmonk:v4.1.0
environment:
- TZ=Etc/UTC
depends_on:
+27 -32
View File
@@ -1,37 +1,32 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const randomDomain = generateRandomDomain(schema);
const adminPassword = generatePassword(32);
const randomDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: randomDomain,
port: 9000,
serviceName: "app",
},
];
const domains: DomainSchema[] = [
{
host: randomDomain,
port: 9000,
serviceName: "app",
},
];
const envs = [
`# login with admin:${adminPassword}`,
"# check config.toml in Advanced / Volumes for more options",
];
const envs = [
"# visit the page to setup your super admin user",
"# check config.toml in Advanced / Volumes for more options",
];
const mounts: Template["mounts"] = [
{
filePath: "config.toml",
content: `[app]
const mounts: Template["mounts"] = [
{
filePath: "config.toml",
content: `[app]
address = "0.0.0.0:9000"
admin_username = "admin"
admin_password = "${adminPassword}"
[db]
host = "db"
port = 5432
@@ -46,12 +41,12 @@ max_lifetime = "300s"
params = ""
`,
},
];
},
];
return {
envs,
mounts,
domains,
};
return {
envs,
mounts,
domains,
};
}
@@ -0,0 +1,42 @@
services:
app:
depends_on:
postgres:
condition: service_healthy
image: svhd/logto:1.22.0
entrypoint: ["sh", "-c", "npm run cli db seed -- --swe && npm start"]
ports:
- 3001
- 3002
networks:
- dokploy-network
environment:
TRUST_PROXY_HEADER: 1
DB_URL: postgres://logto:${LOGTO_POSTGRES_PASSWORD}@postgres:5432/logto
ENDPOINT: ${LOGTO_ENDPOINT}
ADMIN_ENDPOINT: ${LOGTO_ADMIN_ENDPOINT}
volumes:
- logto-connectors:/etc/logto/packages/core/connectors
postgres:
image: postgres:17-alpine
user: postgres
networks:
- dokploy-network
environment:
POSTGRES_USER: logto
POSTGRES_PASSWORD: ${LOGTO_POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready"]
interval: 10s
timeout: 5s
retries: 5
networks:
dokploy-network:
external: true
volumes:
logto-connectors:
postgres-data:
+37
View File
@@ -0,0 +1,37 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const adminDomain = generateRandomDomain(schema);
const postgresPassword = generatePassword();
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3001,
serviceName: "app",
},
{
host: adminDomain,
port: 3002,
serviceName: "app",
},
];
const envs = [
`LOGTO_ENDPOINT=http://${adminDomain}`,
`LOGTO_ADMIN_ENDPOINT=http://${adminDomain}`,
`LOGTO_POSTGRES_PASSWORD=${postgresPassword}`,
];
return {
domains,
envs,
};
}
@@ -0,0 +1,37 @@
services:
app:
image: ghcr.io/maybe-finance/maybe:sha-68c570eed8810fd59b5b33cca51bbad5eabb4cb4
restart: unless-stopped
volumes:
- ../files/uploads:/app/uploads
environment:
DATABASE_URL: postgresql://maybe:maybe@db:5432/maybe
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
SELF_HOSTED: true
SYNTH_API_KEY: ${SYNTH_API_KEY}
RAILS_FORCE_SSL: "false"
RAILS_ASSUME_SSL: "false"
GOOD_JOB_EXECUTION_MODE: async
depends_on:
db:
condition: service_healthy
db:
image: postgres:16
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
networks:
- dokploy-network
volumes:
- db-data:/var/lib/postgresql/data
environment:
POSTGRES_DB: maybe
POSTGRES_USER: maybe
POSTGRES_PASSWORD: maybe
volumes:
db-data:
+43
View File
@@ -0,0 +1,43 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const secretKeyBase = generateBase64(64);
const synthApiKey = generateBase64(32);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3000,
serviceName: "app",
},
];
const envs = [
`SECRET_KEY_BASE=${secretKeyBase}`,
"SELF_HOSTED=true",
`SYNTH_API_KEY=${synthApiKey}`,
"RAILS_FORCE_SSL=false",
"RAILS_ASSUME_SSL=false",
"GOOD_JOB_EXECUTION_MODE=async",
];
const mounts: Template["mounts"] = [
{
filePath: "./uploads",
content: "This is where user uploads will be stored",
},
];
return {
envs,
mounts,
domains,
};
}
@@ -1,7 +1,7 @@
version: "3.8"
services:
n8n:
image: docker.n8n.io/n8nio/n8n:1.48.1
image: docker.n8n.io/n8nio/n8n:1.70.3
restart: always
environment:
- N8N_HOST=${N8N_HOST}
@@ -0,0 +1,12 @@
---
services:
onedev:
image: 1dev/server:11.6.6
restart: always
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
- "onedev-data:/opt/onedev"
volumes:
onedev-data:
+22
View File
@@ -0,0 +1,22 @@
import {
type DomainSchema,
type Schema,
type Template,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const randomDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: randomDomain,
port: 6610,
serviceName: "onedev",
},
];
return {
domains,
};
}
@@ -0,0 +1,213 @@
## Common flags:
# demo-users
# email-verification
# log-emails
# log-invitation-tokens
# login-with-github
# login-with-gitlab
# login-with-google
# login-with-ldap
# login-with-oidc
# login-with-password
# prepl-server
# registration
# secure-session-cookies
# smtp
# smtp-debug
# telemetry
# webhooks
##
## You can read more about all available flags and other
## environment variables here:
## https://help.penpot.app/technical-guide/configuration/#advanced-configuration
#
# WARNING: if you're exposing Penpot to the internet, you should remove the flags
# 'disable-secure-session-cookies' and 'disable-email-verification'
volumes:
penpot_postgres_v15:
penpot_assets:
penpot_traefik:
# penpot_minio:
services:
penpot-frontend:
image: "penpotapp/frontend:2.3.2"
restart: always
ports:
- 8080
- 9001
volumes:
- penpot_assets:/opt/data/assets
depends_on:
- penpot-backend
- penpot-exporter
networks:
- dokploy-network
environment:
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies
penpot-backend:
image: "penpotapp/backend:2.3.2"
restart: always
volumes:
- penpot_assets:/opt/data/assets
depends_on:
- penpot-postgres
- penpot-redis
networks:
- dokploy-network
## Configuration envronment variables for the backend
## container.
environment:
PENPOT_PUBLIC_URI: http://${DOMAIN_NAME}
PENPOT_FLAGS: disable-email-verification enable-smtp enable-prepl-server disable-secure-session-cookies
## Penpot SECRET KEY. It serves as a master key from which other keys for subsystems
## (eg http sessions, or invitations) are derived.
##
## If you leave it commented, all created sessions and invitations will
## become invalid on container restart.
##
## If you going to uncomment this, we recommend to use a trully randomly generated
## 512 bits base64 encoded string here. You can generate one with:
##
## python3 -c "import secrets; print(secrets.token_urlsafe(64))"
# PENPOT_SECRET_KEY: my-insecure-key
## The PREPL host. Mainly used for external programatic access to penpot backend
## (example: admin). By default it will listen on `localhost` but if you are going to use
## the `admin`, you will need to uncomment this and set the host to `0.0.0.0`.
# PENPOT_PREPL_HOST: 0.0.0.0
## Database connection parameters. Don't touch them unless you are using custom
## postgresql connection parameters.
PENPOT_DATABASE_URI: postgresql://penpot-postgres/penpot
PENPOT_DATABASE_USERNAME: penpot
PENPOT_DATABASE_PASSWORD: penpot
## Redis is used for the websockets notifications. Don't touch unless the redis
## container has different parameters or different name.
PENPOT_REDIS_URI: redis://penpot-redis/0
## Default configuration for assets storage: using filesystem based with all files
## stored in a docker volume.
PENPOT_ASSETS_STORAGE_BACKEND: assets-fs
PENPOT_STORAGE_ASSETS_FS_DIRECTORY: /opt/data/assets
## Also can be configured to to use a S3 compatible storage
## service like MiniIO. Look below for minio service setup.
# AWS_ACCESS_KEY_ID: <KEY_ID>
# AWS_SECRET_ACCESS_KEY: <ACCESS_KEY>
# PENPOT_ASSETS_STORAGE_BACKEND: assets-s3
# PENPOT_STORAGE_ASSETS_S3_ENDPOINT: http://penpot-minio:9000
# PENPOT_STORAGE_ASSETS_S3_BUCKET: <BUKET_NAME>
## Telemetry. When enabled, a periodical process will send anonymous data about this
## instance. Telemetry data will enable us to learn how the application is used,
## based on real scenarios. If you want to help us, please leave it enabled. You can
## audit what data we send with the code available on github.
PENPOT_TELEMETRY_ENABLED: true
## Example SMTP/Email configuration. By default, emails are sent to the mailcatch
## service, but for production usage it is recommended to setup a real SMTP
## provider. Emails are used to confirm user registrations & invitations. Look below
## how the mailcatch service is configured.
PENPOT_SMTP_DEFAULT_FROM: no-[email protected]
PENPOT_SMTP_DEFAULT_REPLY_TO: no-[email protected]
PENPOT_SMTP_HOST: penpot-mailcatch
PENPOT_SMTP_PORT: 1025
PENPOT_SMTP_USERNAME:
PENPOT_SMTP_PASSWORD:
PENPOT_SMTP_TLS: false
PENPOT_SMTP_SSL: false
penpot-exporter:
image: "penpotapp/exporter:2.3.2"
restart: always
networks:
- dokploy-network
environment:
# Don't touch it; this uses an internal docker network to
# communicate with the frontend.
PENPOT_PUBLIC_URI: http://penpot-frontend
## Redis is used for the websockets notifications.
PENPOT_REDIS_URI: redis://penpot-redis/0
penpot-postgres:
image: "postgres:15"
restart: always
stop_signal: SIGINT
volumes:
- penpot_postgres_v15:/var/lib/postgresql/data
networks:
- dokploy-network
environment:
- POSTGRES_INITDB_ARGS=--data-checksums
- POSTGRES_DB=penpot
- POSTGRES_USER=penpot
- POSTGRES_PASSWORD=penpot
penpot-redis:
image: redis:7.2
restart: always
networks:
- dokploy-network
## A mailcatch service, used as temporal SMTP server. You can access via HTTP to the
## port 1080 for read all emails the penpot platform has sent. Should be only used as a
## temporal solution while no real SMTP provider is configured.
penpot-mailcatch:
image: sj26/mailcatcher:latest
restart: always
expose:
- '1025'
ports:
- 1080
networks:
- dokploy-network
## Example configuration of MiniIO (S3 compatible object storage service); If you don't
## have preference, then just use filesystem, this is here just for the completeness.
# minio:
# image: "minio/minio:latest"
# command: minio server /mnt/data --console-address ":9001"
# restart: always
#
# volumes:
# - "penpot_minio:/mnt/data"
#
# environment:
# - MINIO_ROOT_USER=minioadmin
# - MINIO_ROOT_PASSWORD=minioadmin
#
# ports:
# - 9000:9000
# - 9001:9001
+27
View File
@@ -0,0 +1,27 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 80,
serviceName: "penpot-frontend",
},
];
const envs = [`DOMAIN_NAME=${mainDomain}`];
return {
domains,
envs,
};
}
@@ -26,7 +26,7 @@ services:
hard: 262144
plausible:
image: ghcr.io/plausible/community-edition:v2.1.0
image: ghcr.io/plausible/community-edition:v2.1.4
restart: always
command: sh -c "sleep 10 && /entrypoint.sh db createdb && /entrypoint.sh db migrate && /entrypoint.sh run"
depends_on:
@@ -0,0 +1,29 @@
services:
shlink:
image: shlinkio/shlink:stable
environment:
- INITIAL_API_KEY=${INITIAL_API_KEY}
- DEFAULT_DOMAIN=${DEFAULT_DOMAIN}
# Note: you should also update SHLINK_SERVER_URL in the shlink-web service.
- IS_HTTPS_ENABLED=false
volumes:
- shlink-data:/etc/shlink/data
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8080/rest/v3/health"]
interval: 30s
timeout: 10s
retries: 3
shlink-web:
image: shlinkio/shlink-web-client
environment:
- SHLINK_SERVER_API_KEY=${INITIAL_API_KEY}
# Note: if you've set IS_HTTPS_ENABLED=true, change http to https.
- SHLINK_SERVER_URL=http://${DEFAULT_DOMAIN}
healthcheck:
test: ["CMD", "curl", "-f", "http://127.0.0.1:8080"]
interval: 30s
timeout: 10s
retries: 3
volumes:
shlink-data:
+35
View File
@@ -0,0 +1,35 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const defaultDomain = generateRandomDomain(schema);
const initialApiKey = generatePassword(30);
const domains: DomainSchema[] = [
{
host: `web-${defaultDomain}`,
port: 8080,
serviceName: "shlink-web",
},
{
host: defaultDomain,
port: 8080,
serviceName: "shlink",
},
];
const envs = [
`INITIAL_API_KEY=${initialApiKey}`,
`DEFAULT_DOMAIN=${defaultDomain}`,
];
return {
envs,
domains,
};
}
@@ -0,0 +1,9 @@
services:
server:
image: ghcr.io/spacedriveapp/spacedrive/server:latest
ports:
- 8080
environment:
- SD_AUTH=${SD_USERNAME}:${SD_PASSWORD}
volumes:
- /var/spacedrive:/var/spacedrive
@@ -0,0 +1,28 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const randomDomain = generateRandomDomain(schema);
const secretKey = generatePassword();
const randomUsername = "admin"; // Default username
const domains: DomainSchema[] = [
{
host: randomDomain,
port: 8080,
serviceName: "server",
},
];
const envs = [`SD_USERNAME=${randomUsername}`, `SD_PASSWORD=${secretKey}`];
return {
envs,
domains,
};
}
@@ -0,0 +1,65 @@
# Note: this is an UNOFFICIAL production docker image build for Superset:
# - https://github.com/amancevice/docker-superset
#
# After deploying this image, you will need to run one of the two
# commands below in a terminal within the superset container:
# $ superset-demo # Initialise database + load demo charts/datasets
# $ superset-init # Initialise database only
#
# You will be prompted to enter the credentials for the admin user.
services:
superset:
image: amancevice/superset
restart: always
depends_on:
- superset_postgres
- superset_redis
volumes:
# This superset_config.py can be edited in Dokploy's UI Advanced -> Volume Mount
- ../files/superset/superset_config.py:/etc/superset/superset_config.py
environment:
SECRET_KEY: ${SECRET_KEY}
MAPBOX_API_KEY: ${MAPBOX_API_KEY}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
REDIS_PASSWORD: ${REDIS_PASSWORD}
# Ensure the hosts matches your service names below.
POSTGRES_HOST: superset_postgres
REDIS_HOST: superset_redis
superset_postgres:
image: postgres
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
volumes:
- superset_postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 30s
timeout: 10s
retries: 3
networks:
- dokploy-network
superset_redis:
image: redis
restart: always
volumes:
- superset_redis_data:/data
command: redis-server --requirepass ${REDIS_PASSWORD}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 30s
timeout: 10s
retries: 3
networks:
- dokploy-network
volumes:
superset_postgres_data:
superset_redis_data:
+67
View File
@@ -0,0 +1,67 @@
import {
type DomainSchema,
type Schema,
type Template,
generatePassword,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mapboxApiKey = "";
const secretKey = generatePassword(30);
const postgresDb = "superset";
const postgresUser = "superset";
const postgresPassword = generatePassword(30);
const redisPassword = generatePassword(30);
const domains: DomainSchema[] = [
{
host: generateRandomDomain(schema),
port: 8088,
serviceName: "superset",
},
];
const envs = [
`SECRET_KEY=${secretKey}`,
`MAPBOX_API_KEY=${mapboxApiKey}`,
`POSTGRES_DB=${postgresDb}`,
`POSTGRES_USER=${postgresUser}`,
`POSTGRES_PASSWORD=${postgresPassword}`,
`REDIS_PASSWORD=${redisPassword}`,
];
const mounts: Template["mounts"] = [
{
filePath: "./superset/superset_config.py",
content: `
import os
SECRET_KEY = os.getenv("SECRET_KEY")
MAPBOX_API_KEY = os.getenv("MAPBOX_API_KEY", "")
CACHE_CONFIG = {
"CACHE_TYPE": "RedisCache",
"CACHE_DEFAULT_TIMEOUT": 300,
"CACHE_KEY_PREFIX": "superset_",
"CACHE_REDIS_HOST": "redis",
"CACHE_REDIS_PORT": 6379,
"CACHE_REDIS_DB": 1,
"CACHE_REDIS_URL": f"redis://:{os.getenv('REDIS_PASSWORD')}@{os.getenv('REDIS_HOST')}:6379/1",
}
FILTER_STATE_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_filter_"}
EXPLORE_FORM_DATA_CACHE_CONFIG = {**CACHE_CONFIG, "CACHE_KEY_PREFIX": "superset_explore_form_"}
SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{os.getenv('POSTGRES_USER')}:{os.getenv('POSTGRES_PASSWORD')}@{os.getenv('POSTGRES_HOST')}:5432/{os.getenv('POSTGRES_DB')}"
SQLALCHEMY_TRACK_MODIFICATIONS = True
`.trim(),
},
];
return {
envs,
domains,
mounts,
};
}
@@ -2,7 +2,7 @@ version: "3.9"
services:
teable:
image: ghcr.io/teableio/teable:1.3.1-alpha-build.460
image: ghcr.io/teableio/teable:latest
restart: always
volumes:
- teable-data:/app/.assets
+432 -11
View File
@@ -34,7 +34,7 @@ export const templates: TemplateData[] = [
{
id: "plausible",
name: "Plausible",
version: "v2.1.0",
version: "v2.1.4",
description:
"Plausible is a open source, self-hosted web analytics platform that lets you track website traffic and user behavior.",
logo: "plausible.svg",
@@ -155,7 +155,7 @@ export const templates: TemplateData[] = [
{
id: "n8n",
name: "n8n",
version: "1.48.1",
version: "1.70.3",
description:
"n8n is an open source low-code platform for automating workflows and integrations.",
logo: "n8n.png",
@@ -538,7 +538,7 @@ export const templates: TemplateData[] = [
website: "https://filebrowser.org/",
docs: "https://filebrowser.org/",
},
tags: ["file", "manager"],
tags: ["file-manager", "storage"],
load: () => import("./filebrowser/index").then((m) => m.generate),
},
{
@@ -619,7 +619,7 @@ export const templates: TemplateData[] = [
{
id: "vaultwarden",
name: "Vaultwarden",
version: "1.32.3",
version: "1.32.7",
description:
"Unofficial Bitwarden compatible server written in Rust, formerly known as bitwarden_rs",
logo: "vaultwarden.svg",
@@ -834,7 +834,7 @@ export const templates: TemplateData[] = [
website: "https://nextcloud.com/",
docs: "https://docs.nextcloud.com/",
},
tags: ["file", "sync"],
tags: ["file-manager", "sync"],
load: () => import("./nextcloud-aio/index").then((m) => m.generate),
},
{
@@ -951,8 +951,8 @@ export const templates: TemplateData[] = [
logo: "ryot.png",
links: {
github: "https://github.com/IgnisDa/ryot",
website: "https://ryot.dev/",
docs: "https://ryot.dev/docs/getting-started",
website: "https://ryot.io/",
docs: "https://docs.ryot.io/",
},
tags: ["media", "tracking", "self-hosted"],
load: () => import("./ryot/index").then((m) => m.generate),
@@ -1016,8 +1016,8 @@ export const templates: TemplateData[] = [
},
tags: ["browser", "automation"],
load: () => import("./browserless/index").then((m) => m.generate),
},
{
},
{
id: "drawio",
name: "draw.io",
version: "24.7.17",
@@ -1031,8 +1031,8 @@ export const templates: TemplateData[] = [
},
tags: ["drawing", "diagrams"],
load: () => import("./drawio/index").then((m) => m.generate),
},
{
},
{
id: "kimai",
name: "Kimai",
version: "2.26.0",
@@ -1047,4 +1047,425 @@ export const templates: TemplateData[] = [
tags: ["invoice", "business", "finance"],
load: () => import("./kimai/index").then((m) => m.generate),
},
{
id: "logto",
name: "Logto",
version: "1.22.0",
description:
"Logto is an open-source Identity and Access Management (IAM) platform designed to streamline Customer Identity and Access Management (CIAM) and Workforce Identity Management.",
logo: "logto.png",
links: {
github: "https://github.com/logto-io/logto",
website: "https://logto.io/",
docs: "https://docs.logto.io/introduction",
},
tags: ["identity", "auth"],
load: () => import("./logto/index").then((m) => m.generate),
},
{
id: "penpot",
name: "Penpot",
version: "2.3.2",
description:
"Penpot is the web-based open-source design tool that bridges the gap between designers and developers.",
logo: "penpot.svg",
links: {
github: "https://github.com/penpot/penpot",
website: "https://penpot.app/",
docs: "https://docs.penpot.app/",
},
tags: ["design", "collaboration"],
load: () => import("./penpot/index").then((m) => m.generate),
},
{
id: "huly",
name: "Huly",
version: "0.6.377",
description:
"Huly — All-in-One Project Management Platform (alternative to Linear, Jira, Slack, Notion, Motion)",
logo: "huly.svg",
links: {
github: "https://github.com/hcengineering/huly-selfhost",
website: "https://huly.io/",
docs: "https://docs.huly.io/",
},
tags: ["project-management", "community", "discussion"],
load: () => import("./huly/index").then((m) => m.generate),
},
{
id: "unsend",
name: "Unsend",
version: "v1.2.4",
description: "Open source alternative to Resend,Sendgrid, Postmark etc. ",
logo: "unsend.png",
links: {
github: "https://github.com/unsend-dev/unsend",
website: "https://unsend.dev/",
docs: "https://docs.unsend.dev/get-started/",
},
tags: ["e-mail", "marketing", "business"],
load: () => import("./unsend/index").then((m) => m.generate),
},
{
id: "langflow",
name: "Langflow",
version: "1.1.1",
description:
"Langflow is a low-code app builder for RAG and multi-agent AI applications. It’s Python-based and agnostic to any model, API, or database. ",
logo: "langflow.svg",
links: {
github: "https://github.com/langflow-ai/langflow/tree/main",
website: "https://www.langflow.org/",
docs: "https://docs.langflow.org/",
},
tags: ["ai"],
load: () => import("./langflow/index").then((m) => m.generate),
},
{
id: "elastic-search",
name: "Elasticsearch",
version: "8.10.2",
description:
"Elasticsearch is an open-source search and analytics engine, used for full-text search and analytics on structured data such as text, web pages, images, and videos.",
logo: "elasticsearch.svg",
links: {
github: "https://github.com/elastic/elasticsearch",
website: "https://www.elastic.co/elasticsearch/",
docs: "https://docs.elastic.co/elasticsearch/",
},
tags: ["search", "analytics"],
load: () => import("./elastic-search/index").then((m) => m.generate),
},
{
id: "onedev",
name: "OneDev",
version: "11.6.6",
description:
"Git server with CI/CD, kanban, and packages. Seamless integration. Unparalleled experience.",
logo: "onedev.png",
links: {
github: "https://github.com/theonedev/onedev/",
website: "https://onedev.io/",
docs: "https://docs.onedev.io/",
},
tags: ["self-hosted", "development"],
load: () => import("./onedev/index").then((m) => m.generate),
},
{
id: "unifi",
name: "Unifi Network",
version: "11.6.6",
description:
"Unifi Network is an open-source enterprise network management platform for wireless networks.",
logo: "unifi.webp",
links: {
github: "https://github.com/ubiquiti",
website: "https://www.ui.com/",
docs: "https://help.ui.com/hc/en-us/articles/360012282453-Self-Hosting-a-UniFi-Network-Server",
},
tags: ["self-hosted", "networking"],
load: () => import("./unifi/index").then((m) => m.generate),
},
{
id: "glpi",
name: "GLPI Project",
version: "10.0.16",
description: "The most complete open source service management software",
logo: "glpi.webp",
links: {
github: "https://github.com/glpi-project/glpi",
website: "https://glpi-project.org/",
docs: "https://glpi-project.org/documentation/",
},
tags: ["self-hosted", "project-management", "management"],
load: () => import("./glpi/index").then((m) => m.generate),
},
{
id: "checkmate",
name: "Checkmate",
version: "2.0.1",
description:
"Checkmate is an open-source, self-hosted tool designed to track and monitor server hardware, uptime, response times, and incidents in real-time with beautiful visualizations.",
logo: "checkmate.png",
links: {
github: "https://github.com/bluewave-labs/checkmate",
website: "https://bluewavelabs.ca",
docs: "https://bluewavelabs.gitbook.io/checkmate",
},
tags: ["self-hosted", "monitoring", "uptime"],
load: () => import("./checkmate/index").then((m) => m.generate),
},
{
id: "gotenberg",
name: "Gotenberg",
version: "latest",
description: "Gotenberg is a Docker-powered stateless API for PDF files.",
logo: "gotenberg.png",
links: {
github: "https://github.com/gotenberg/gotenberg",
website: "https://gotenberg.dev",
docs: "https://gotenberg.dev/docs/getting-started/introduction",
},
tags: ["api", "backend", "pdf", "tools"],
load: () => import("./gotenberg/index").then((m) => m.generate),
},
{
id: "actualbudget",
name: "Actual Budget",
version: "latest",
description:
"A super fast and privacy-focused app for managing your finances.",
logo: "actualbudget.png",
links: {
github: "https://github.com/actualbudget/actual",
website: "https://actualbudget.org",
docs: "https://actualbudget.org/docs",
},
tags: ["budgeting", "finance", "money"],
load: () => import("./actualbudget/index").then((m) => m.generate),
},
{
id: "conduit",
name: "Conduit",
version: "v0.9.0",
description:
"Conduit is a simple, fast and reliable chat server powered by Matrix",
logo: "conduit.svg",
links: {
github: "https://gitlab.com/famedly/conduit",
website: "https://conduit.rs/",
docs: "https://docs.conduit.rs/",
},
tags: ["matrix", "communication"],
load: () => import("./conduit/index").then((m) => m.generate),
},
{
id: "evolutionapi",
name: "Evolution API",
version: "v2.1.2",
description:
"Evolution API is a robust platform dedicated to empowering small businesses with limited resources, going beyond a simple messaging solution via WhatsApp.",
logo: "evolutionapi.png",
links: {
github: "https://github.com/EvolutionAPI/evolution-api",
docs: "https://doc.evolution-api.com/v2/en/get-started/introduction",
website: "https://evolution-api.com/opensource-whatsapp-api/",
},
tags: ["api", "whatsapp", "messaging"],
load: () => import("./evolutionapi/index").then((m) => m.generate),
},
{
id: "conduwuit",
name: "Conduwuit",
version: "latest",
description:
"Well-maintained, featureful Matrix chat homeserver (fork of Conduit)",
logo: "conduwuit.svg",
links: {
github: "https://github.com/girlbossceo/conduwuit",
website: "https://conduwuit.puppyirl.gay",
docs: "https://conduwuit.puppyirl.gay/configuration.html",
},
tags: ["backend", "chat", "communication", "matrix", "server"],
load: () => import("./conduwuit/index").then((m) => m.generate),
},
{
id: "cloudflared",
name: "Cloudflared",
version: "latest",
description:
"A lightweight daemon that securely connects local services to the internet through Cloudflare Tunnel.",
logo: "cloudflared.svg",
links: {
github: "https://github.com/cloudflare/cloudflared",
website:
"https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/",
docs: "https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/",
},
tags: ["cloud", "networking", "security", "tunnel"],
load: () => import("./cloudflared/index").then((m) => m.generate),
},
{
id: "couchdb",
name: "CouchDB",
version: "latest",
description:
"CouchDB is a document-oriented NoSQL database that excels at replication and horizontal scaling.",
logo: "couchdb.png",
links: {
github: "https://github.com/apache/couchdb",
website: "https://couchdb.apache.org/",
docs: "https://docs.couchdb.org/en/stable/",
},
tags: ["database", "storage"],
load: () => import("./couchdb/index").then((m) => m.generate),
},
{
id: "it-tools",
name: "IT Tools",
version: "latest",
description: "A collection of handy online it-tools for developers.",
logo: "it-tools.svg",
links: {
github: "https://github.com/CorentinTh/it-tools",
website: "https://it-tools.tech",
},
tags: ["developer", "tools"],
load: () => import("./it-tools/index").then((m) => m.generate),
},
{
id: "superset",
name: "Superset (Unofficial)",
version: "latest",
description: "Data visualization and data exploration platform.",
logo: "superset.svg",
links: {
github: "https://github.com/amancevice/docker-superset",
website: "https://superset.apache.org",
docs: "https://superset.apache.org/docs/intro",
},
tags: ["analytics", "bi", "dashboard", "database", "sql"],
load: () => import("./superset/index").then((m) => m.generate),
},
{
id: "glance",
name: "Glance",
version: "latest",
description:
"A self-hosted dashboard that puts all your feeds in one place. Features RSS feeds, weather, bookmarks, site monitoring, and more in a minimal, fast interface.",
logo: "glance.png",
links: {
github: "https://github.com/glanceapp/glance",
docs: "https://github.com/glanceapp/glance/blob/main/docs/configuration.md",
},
tags: ["dashboard", "monitoring", "widgets", "rss"],
load: () => import("./glance/index").then((m) => m.generate),
},
{
id: "homarr",
name: "Homarr",
version: "latest",
description:
"A sleek, modern dashboard that puts all your apps and services in one place with Docker integration.",
logo: "homarr.png",
links: {
github: "https://github.com/homarr-labs/homarr",
docs: "https://homarr.dev/docs/getting-started/installation/docker",
website: "https://homarr.dev/",
},
tags: ["dashboard", "monitoring"],
load: () => import("./homarr/index").then((m) => m.generate),
},
{
id: "erpnext",
name: "ERPNext",
version: "version-15",
description: "100% Open Source and highly customizable ERP software.",
logo: "erpnext.svg",
links: {
github: "https://github.com/frappe/erpnext",
docs: "https://docs.frappe.io/erpnext",
website: "https://erpnext.com",
},
tags: [
"erp",
"accounts",
"manufacturing",
"retail",
"sales",
"pos",
"hrms",
],
load: () => import("./erpnext/index").then((m) => m.generate),
},
{
id: "maybe",
name: "Maybe",
version: "latest",
description:
"Maybe is a self-hosted finance tracking application designed to simplify budgeting and expenses.",
logo: "maybe.svg",
links: {
github: "https://github.com/maybe-finance/maybe",
website: "https://maybe.finance/",
docs: "https://docs.maybe.finance/",
},
tags: ["finance", "self-hosted"],
load: () => import("./maybe/index").then((m) => m.generate),
},
{
id: "spacedrive",
name: "Spacedrive",
version: "latest",
description:
"Spacedrive is a cross-platform file manager. It connects your devices together to help you organize files from anywhere. powered by a virtual distributed filesystem (VDFS) written in Rust. Organize files across many devices in one place.",
links: {
github: "https://github.com/spacedriveapp/spacedrive",
website: "https://spacedrive.com/",
docs: "https://www.spacedrive.com/docs/product/getting-started/introduction",
},
logo: "spacedrive.png",
tags: ["file-manager", "vdfs", "storage"],
load: () => import("./spacedrive/index").then((m) => m.generate),
},
{
id: "alist",
name: "AList",
version: "v3.41.0",
description:
"🗂️A file list/WebDAV program that supports multiple storages, powered by Gin and Solidjs.",
logo: "alist.svg",
links: {
github: "https://github.com/AlistGo/alist",
website: "https://alist.nn.ci",
docs: "https://alist.nn.ci/guide/install/docker.html",
},
tags: ["file", "webdav", "storage"],
load: () => import("./alist/index").then((m) => m.generate),
},
{
id: "answer",
name: "Answer",
version: "v1.4.1",
description:
"Answer is an open-source Q&A platform for building a self-hosted question-and-answer service.",
logo: "answer.png",
links: {
github: "https://github.com/apache/answer",
website: "https://answer.apache.org/",
docs: "https://answer.apache.org/docs",
},
tags: ["q&a", "self-hosted"],
load: () => import("./answer/index").then((m) => m.generate),
},
{
id: "shlink",
name: "Shlink",
version: "stable",
description:
"URL shortener that can be used to serve shortened URLs under your own domain.",
logo: "shlink.svg",
links: {
github: "https://github.com/shlinkio/shlink",
website: "https://shlink.io",
docs: "https://shlink.io/documentation",
},
tags: ["sharing", "shortener", "url"],
load: () => import("./shlink/index").then((m) => m.generate),
},
{
id: "formbricks",
name: "Formbricks",
version: "v3.1.3",
description:
"Formbricks is an open-source survey and form platform for collecting user data.",
logo: "formbricks.png",
links: {
github: "https://github.com/formbricks/formbricks",
website: "https://formbricks.com/",
docs: "https://formbricks.com/docs",
},
tags: ["forms", "analytics"],
load: () => import("./formbricks/index").then((m) => m.generate),
},
];
@@ -0,0 +1,48 @@
services:
unifi-network-application:
image: lscr.io/linuxserver/unifi-network-application:latest
environment:
- PUID=1000 # User ID
- PGID=1000 # Group ID
- TZ=Etc/UTC # Timezone
- MONGO_HOST=unifi-db
- MONGO_USER=unifi
- MONGO_PASS=unifi_password
- MONGO_PORT=27017
- MONGO_DBNAME=unifi
- MEM_LIMIT=1024
- MEM_STARTUP=1024
- MONGO_TLS= #optional # MongoDB TLS setting
- MONGO_AUTHSOURCE= #optional # MongoDB authentication source
volumes: # Volumes to mount in the container
- ../files/config:/config # Map host directory to container directory
ports:
- 8443:8443 # HTTPS portal
# - 3478:3478/udp # STUN service
# - 10001:10001/udp # UniFi AP discovery
# - 8080:8080 # HTTP portal
# - 1900:1900/udp #optional # For DLNA
# - 8843:8843 #optional # HTTPS guest portal
# - 8880:8880 #optional # HTTP guest portal
# - 6789:6789 #optional # Mobile speed test port
# - 5514:5514/udp #optional # Remote syslog port
restart: unless-stopped
depends_on:
- unifi-db
networks:
- dokploy-network
unifi-db:
image: mongo:4.4
volumes:
- ../files/db/data:/data/db
- ../files/init-mongo.sh:/docker-entrypoint-initdb.d/init-mongo.sh:ro
ports:
- 27017
restart: unless-stopped
networks:
- dokploy-network
networks:
dokploy-network:
external: true
+27
View File
@@ -0,0 +1,27 @@
import type { Schema, Template } from "../utils";
export function generate(schema: Schema): Template {
const mounts: Template["mounts"] = [
{
filePath: "init-mongo.sh",
content: `
#!/bin/bash
mongo <<EOF
use unifi
db.createUser({
user: "unifi",
pwd: "unifi_password",
roles: [
{ db: "unifi", role: "dbOwner" },
{ db: "unifi_stat", role: "dbOwner" }
]
})
EOF
`,
},
];
return {
mounts,
};
}
@@ -0,0 +1,78 @@
name: unsend-prod
services:
unsend-db-prod:
image: postgres:16
networks:
- dokploy-network
restart: always
environment:
- POSTGRES_USER=${POSTGRES_USER:?err}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD:?err}
- POSTGRES_DB=${POSTGRES_DB:?err}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
# ports:
# - "5432:5432"
volumes:
- database:/var/lib/postgresql/data
unsend-redis-prod:
image: redis:7
networks:
- dokploy-network
restart: always
# ports:
# - "6379:6379"
volumes:
- cache:/data
command: ["redis-server", "--maxmemory-policy", "noeviction"]
unsend-storage-prod:
image: minio/minio:RELEASE.2024-11-07T00-52-20Z
networks:
- dokploy-network
ports:
- 9002
- 9001
volumes:
- storage:/data
environment:
MINIO_ROOT_USER: unsend
MINIO_ROOT_PASSWORD: password
entrypoint: sh
command: -c 'mkdir -p /data/unsend && minio server /data --console-address ":9001" --address ":9002"'
unsend:
image: unsend/unsend:v1.2.4
networks:
- dokploy-network
restart: always
ports:
- ${PORT:-3000}
environment:
- PORT=${PORT:-3000}
- DATABASE_URL=${DATABASE_URL:?err}
- NEXTAUTH_URL=${NEXTAUTH_URL:?err}
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET:?err}
- AWS_ACCESS_KEY=${AWS_ACCESS_KEY:?err}
- AWS_SECRET_KEY=${AWS_SECRET_KEY:?err}
- AWS_DEFAULT_REGION=${AWS_DEFAULT_REGION:?err}
- GITHUB_ID=${GITHUB_ID:?err}
- GITHUB_SECRET=${GITHUB_SECRET:?err}
- REDIS_URL=${REDIS_URL:?err}
- NEXT_PUBLIC_IS_CLOUD=${NEXT_PUBLIC_IS_CLOUD:-false}
- API_RATE_LIMIT=${API_RATE_LIMIT:-1}
depends_on:
unsend-db-prod:
condition: service_healthy
unsend-redis-prod:
condition: service_started
volumes:
database:
cache:
storage:
+44
View File
@@ -0,0 +1,44 @@
import {
type DomainSchema,
type Schema,
type Template,
generateBase64,
generateHash,
generateRandomDomain,
} from "../utils";
export function generate(schema: Schema): Template {
const mainDomain = generateRandomDomain(schema);
const secretBase = generateBase64(64);
const domains: DomainSchema[] = [
{
host: mainDomain,
port: 3000,
serviceName: "unsend",
},
];
const envs = [
"REDIS_URL=redis://unsend-redis-prod:6379",
"POSTGRES_USER=postgres",
"POSTGRES_PASSWORD=postgres",
"POSTGRES_DB=unsend",
"DATABASE_URL=postgresql://postgres:postgres@unsend-db-prod:5432/unsend",
"NEXTAUTH_URL=http://localhost:3000",
`NEXTAUTH_SECRET=${secretBase}`,
"GITHUB_ID='Fill'",
"GITHUB_SECRET='Fill'",
"AWS_DEFAULT_REGION=us-east-1",
"AWS_SECRET_KEY='Fill'",
"AWS_ACCESS_KEY='Fill'",
"DOCKER_OUTPUT=1",
"API_RATE_LIMIT=1",
"DISCORD_WEBHOOK_URL=",
];
return {
envs,
domains,
};
}
@@ -1,6 +1,6 @@
services:
vaultwarden:
image: vaultwarden/server:1.32.3
image: vaultwarden/server:1.32.7
restart: always
environment:
DOMAIN: ${DOMAIN}
@@ -1,7 +1,7 @@
version: "3.8"
services:
wordpress:
image: wordpress:5.8.3
image: wordpress:6.7.1
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: exampleuser