mirror of
https://github.com/andwati/dokploy.git
synced 2026-11-10 22:15:16 +00:00
Merge branch 'canary' into feat/stack-env-support
This commit is contained in:
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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:
|
||||
@@ -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:
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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:
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user