Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
17a53fa567 |
@@ -109,22 +109,20 @@ const Search = () => {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="relative">
|
||||
<Input
|
||||
type="text"
|
||||
placeholder="Search templates..."
|
||||
value={searchQuery}
|
||||
onChange={handleSearchChange}
|
||||
className="w-full"
|
||||
/>
|
||||
{searchQuery.length > 0 ? (
|
||||
<div className="cursor-pointer" onClick={handleClearSearch}>
|
||||
<XIcon className="absolute end-3 top-1/2 -translate-y-1/2 h-5 w-5 text-gray-400" />
|
||||
</div>
|
||||
) : (
|
||||
<SearchIcon className="absolute end-3 top-1/2 -translate-y-1/2 lg:size-5 size-4 text-gray-400" />
|
||||
)}
|
||||
</div>
|
||||
<Input
|
||||
type="text"
|
||||
placeholder="Search templates..."
|
||||
value={searchQuery}
|
||||
onChange={handleSearchChange}
|
||||
className="w-full p-6"
|
||||
/>
|
||||
{searchQuery.length > 0 ? (
|
||||
<div className="cursor-pointer" onClick={handleClearSearch}>
|
||||
<XIcon className="absolute end-3 translate-y-3.5 top-1/2 h-5 w-5 text-gray-400" />
|
||||
</div>
|
||||
) : (
|
||||
<SearchIcon className="absolute end-3 translate-y-2 top-1/2 lg:size-5 size-4 text-gray-400" />
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="flex flex-row gap-2 justify-between">
|
||||
@@ -156,7 +154,7 @@ const Search = () => {
|
||||
<ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
|
||||
</Button>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent className="w-50 p-0">
|
||||
<PopoverContent className="w-[200px] p-0">
|
||||
<Command shouldFilter={false}>
|
||||
<CommandInput
|
||||
placeholder="Search tags...."
|
||||
|
||||
@@ -5,7 +5,7 @@ import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuTrigger,
|
||||
DropdownMenuTrigger,
|
||||
} from "./components/ui/dropdown-menu"
|
||||
import { useTheme } from "./theme-provider"
|
||||
|
||||
@@ -13,7 +13,7 @@ export function ModeToggle() {
|
||||
const { setTheme } = useTheme()
|
||||
|
||||
return (
|
||||
<DropdownMenu modal={false}>
|
||||
<DropdownMenu>
|
||||
<DropdownMenuTrigger asChild>
|
||||
<Button variant="outline" size="icon">
|
||||
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
|
||||
|
||||
@@ -2,7 +2,7 @@ version: "3.8"
|
||||
|
||||
services:
|
||||
activepieces:
|
||||
image: activepieces/activepieces:0.91.2
|
||||
image: activepieces/activepieces:0.35.0
|
||||
restart: unless-stopped
|
||||
|
||||
depends_on:
|
||||
@@ -32,7 +32,7 @@ services:
|
||||
AP_TEMPLATES_SOURCE_URL: https://cloud.activepieces.com/api/v1/flow-templates
|
||||
|
||||
postgres:
|
||||
image: postgres:17
|
||||
image: postgres:14
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "activepieces",
|
||||
"name": "Activepieces",
|
||||
"version": "0.91.2",
|
||||
"version": "0.35.0",
|
||||
"description": "Open-source no-code business automation tool. An alternative to Zapier, Make.com, and Tray.",
|
||||
"logo": "activepieces.svg",
|
||||
"links": {
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# dokploy: allow-host-ports — DNS (53/tcp+udp), DHCP (67/68) and DNS-over-TLS/QUIC (853) are not HTTP protocols; clients must reach them directly on the host, Traefik cannot route them.
|
||||
version: "3.8"
|
||||
services:
|
||||
adguardhome:
|
||||
@@ -11,8 +10,7 @@ services:
|
||||
- "68:68/tcp" # DHCP Client
|
||||
- "853:853/tcp" # DNS over TLS, DNS-over-QUIC
|
||||
- "853:853/udp" # DNS over TLS, DNS-over-QUIC
|
||||
expose:
|
||||
- 6060 # HTTP (pprof) — debug endpoint, no need to publish it on the host
|
||||
- "6060:6060/tcp" # HTTP (pprof)
|
||||
volumes:
|
||||
- adguardhome-work:/opt/adguardhome/work
|
||||
- adguardhome-conf:/opt/adguardhome/conf
|
||||
|
||||
@@ -3,7 +3,6 @@ main_domain = "${domain}"
|
||||
timezone = "America/New_York"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "agentdvr"
|
||||
port = 8090
|
||||
@@ -11,3 +10,5 @@ host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
TIMEZONE = "${timezone}"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -24,7 +24,6 @@ port = 80
|
||||
host = "${main_domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
env = [
|
||||
# App
|
||||
"APP_URL=${main_domain}",
|
||||
@@ -51,4 +50,5 @@ env = [
|
||||
"MYSQL_RANDOM_ROOT_PASSWORD=yes"
|
||||
]
|
||||
|
||||
# No custom mounts needed; volumes are already defined in compose.
|
||||
# No custom mounts needed; volumes are already defined in compose.
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
# dokploy: allow-host-ports — Anytype clients speak the any-sync protocol (TCP 33010, UDP/QUIC 33020) directly against the server; it is not HTTP, so Traefik cannot route it.
|
||||
# Example: Any-Sync-Bundle with embedded MongoDB and Redis (all-in-one image)
|
||||
#
|
||||
# Usage:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "appwrite",
|
||||
"name": "Appwrite",
|
||||
"version": "2.3.0",
|
||||
"version": "1.9.5",
|
||||
"description": "Appwrite is an end-to-end platform for building Web, Mobile, Native, or Backend apps, packaged as a set of Docker microservices. It includes both a backend server and a fully integrated hosting solution for deploying static and server-side rendered frontends. Appwrite abstracts the complexity and repetitiveness required to build modern apps from scratch and allows you to build secure, full-stack applications faster.\nUsing Appwrite, you can easily integrate your app with user authentication and multiple sign-in methods, a database for storing and querying users and team data, storage and file management, image manipulation, Cloud Functions, messaging, and more services.",
|
||||
"links": {
|
||||
"github": "https://github.com/appwrite/appwrite",
|
||||
@@ -12,7 +12,8 @@
|
||||
"tags": [
|
||||
"database",
|
||||
"firebase",
|
||||
"postgresql",
|
||||
"mariadb",
|
||||
"mongodb",
|
||||
"hosting",
|
||||
"self-hosted"
|
||||
]
|
||||
|
||||
@@ -2,36 +2,25 @@
|
||||
main_domain = "${domain}"
|
||||
functions_domain = "functions.${main_domain}"
|
||||
sites_domain = "sites.${main_domain}"
|
||||
mqtt_domain = "mqtt.${main_domain}"
|
||||
openssl_key = "${password:32}"
|
||||
notifications_tracking_secret = "${password:32}"
|
||||
db_pw = "${password:32}"
|
||||
usage_pw = "${password:32}"
|
||||
db_root_pw = "${password:32}"
|
||||
db_user_pw = "${password:32}"
|
||||
executor_secret = "${password:32}"
|
||||
jobs_secret = "${password:32}"
|
||||
geo_secret = "${password:32}"
|
||||
|
||||
[config]
|
||||
# Build jobs and runtimes join <appName>_default, which isolated deployments never create
|
||||
# (every service sits on the external <appName> network instead).
|
||||
isolated = false
|
||||
env = [
|
||||
"_APP_ENV=production",
|
||||
"_APP_EDITION=self-hosted",
|
||||
"_APP_LOCALE=en",
|
||||
"_APP_POOL_ADAPTER=stack",
|
||||
"_APP_WORKER_PER_CORE=6",
|
||||
"_APP_OPTIONS_ABUSE=enabled",
|
||||
"_APP_OPTIONS_ABUSE_INCREASED_LIMIT_PROJECTS=",
|
||||
"_APP_OPTIONS_FORCE_HTTPS=disabled",
|
||||
"_APP_OPTIONS_ROUTER_FORCE_HTTPS=disabled",
|
||||
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
|
||||
"_APP_ROUTER_AUTO_CERTIFICATES=enabled",
|
||||
"_APP_LOCKING_ENABLED=enabled",
|
||||
"_APP_OPENSSL_KEY_V1=${openssl_key}",
|
||||
"_APP_NOTIFICATIONS_TRACKING_SECRET=${notifications_tracking_secret}",
|
||||
"_APP_DOMAIN=${main_domain}",
|
||||
"_APP_CONSOLE_DOMAIN=${main_domain}",
|
||||
"_APP_CONSOLE_URL=",
|
||||
"_APP_CONSOLE_TRUSTED_PROJECTS=",
|
||||
"_APP_CUSTOM_DOMAIN_DENY_LIST=example.com,test.com,app.example.com",
|
||||
"_APP_DOMAIN_FUNCTIONS=${functions_domain}",
|
||||
@@ -49,15 +38,6 @@ env = [
|
||||
"_APP_CONSOLE_SCHEMA=appwriteio",
|
||||
"_APP_CONSOLE_SESSION_ALERTS=disabled",
|
||||
"_APP_CONSOLE_COUNTRIES_DENYLIST=",
|
||||
"_APP_CONSOLE_GITHUB_APP_ID=",
|
||||
"_APP_CONSOLE_GITHUB_SECRET=",
|
||||
"_APP_CONSOLE_GITLAB_APP_ID=",
|
||||
"_APP_CONSOLE_GITLAB_SECRET=",
|
||||
"_APP_CONSOLE_GITLAB_ENDPOINT=",
|
||||
"_APP_CONSOLE_BITBUCKET_APP_ID=",
|
||||
"_APP_CONSOLE_BITBUCKET_SECRET=",
|
||||
"_APP_CONSOLE_GOOGLE_APP_ID=",
|
||||
"_APP_CONSOLE_GOOGLE_SECRET=",
|
||||
"_APP_SYSTEM_EMAIL_NAME=Appwrite",
|
||||
"_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io",
|
||||
"_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io",
|
||||
@@ -66,52 +46,33 @@ env = [
|
||||
"_APP_EMAIL_CERTIFICATES=",
|
||||
"_APP_COMPRESSION_ENABLED=enabled",
|
||||
"_APP_COMPRESSION_MIN_SIZE_BYTES=1024",
|
||||
"_APP_USAGE_STATS=enabled",
|
||||
"_APP_USAGE_AGGREGATION_INTERVAL=30",
|
||||
"_APP_STATS_RESOURCES_INTERVAL=30",
|
||||
"_APP_LOGGING_PROVIDER=",
|
||||
"_APP_LOGGING_CONFIG=",
|
||||
"_APP_LOGGING_FORMAT=pretty",
|
||||
"_APP_GEO_ENDPOINT=http://appwrite-geo/v1",
|
||||
"_APP_GEO_SECRET=${geo_secret}",
|
||||
"_APP_LOGGING_CONFIG_REALTIME=",
|
||||
"_APP_EXPERIMENT_LOGGING_PROVIDER=",
|
||||
"_APP_EXPERIMENT_LOGGING_CONFIG=",
|
||||
"_APP_REDIS_HOST=redis",
|
||||
"_APP_REDIS_PORT=6379",
|
||||
"_APP_REDIS_USER=",
|
||||
"_APP_REDIS_PASS=",
|
||||
"_APP_DB_ADAPTER=postgresql",
|
||||
"_APP_DB_HOST=postgresql",
|
||||
"_APP_DB_PORT=5432",
|
||||
"_APP_DB_ADAPTER=mongodb",
|
||||
"_APP_DB_HOST=mongodb",
|
||||
"_APP_DB_PORT=27017",
|
||||
"_APP_DB_SCHEMA=appwrite",
|
||||
"_APP_DB_USER=user",
|
||||
"_APP_DB_PASS=${db_pw}",
|
||||
"_APP_DB_PASS=${db_user_pw}",
|
||||
"_APP_DB_ROOT_PASS=${db_root_pw}",
|
||||
"_APP_DATABASE_SHARED_TABLES=",
|
||||
"_APP_DATABASE_SHARED_NAMESPACE=",
|
||||
"_APP_LIMIT_DATABASE_BATCH=100",
|
||||
"_APP_DOCUMENTSDB=disabled",
|
||||
"_APP_DB_ADAPTER_DOCUMENTSDB=mongodb",
|
||||
"_APP_DB_HOST_DOCUMENTSDB=mongodb",
|
||||
"_APP_DB_PORT_DOCUMENTSDB=27017",
|
||||
"_APP_DB_SCHEMA_DOCUMENTSDB=",
|
||||
"_APP_DB_USER_DOCUMENTSDB=",
|
||||
"_APP_DB_PASS_DOCUMENTSDB=",
|
||||
"_APP_CONNECTIONS_DATABASE_DOCUMENTSDB=",
|
||||
"_APP_VECTORSDB=disabled",
|
||||
"_APP_DB_ADAPTER_VECTORSDB=postgresql",
|
||||
"_APP_DB_HOST_VECTORSDB=postgresql",
|
||||
"_APP_DB_PORT_VECTORSDB=5432",
|
||||
"_APP_DB_ADAPTER_VECTORSDB=",
|
||||
"_APP_DB_HOST_VECTORSDB=",
|
||||
"_APP_DB_PORT_VECTORSDB=",
|
||||
"_APP_DB_SCHEMA_VECTORSDB=",
|
||||
"_APP_DB_USER_VECTORSDB=",
|
||||
"_APP_DB_PASS_VECTORSDB=",
|
||||
"_APP_CONNECTIONS_DATABASE_VECTORSDB=",
|
||||
"_APP_EMBEDDING=disabled",
|
||||
"_APP_USAGE_STATS=enabled",
|
||||
"_APP_USAGE_PASS=${usage_pw}",
|
||||
"_APP_CONNECTIONS_DB_USAGE=http://appwrite:${usage_pw}@clickhouse:8123/appwrite",
|
||||
"_APP_POOL_SIZE_USAGE=2",
|
||||
"_APP_CONNECTIONS_DB_EXECUTIONS=http://appwrite:${usage_pw}@clickhouse:8123/appwrite",
|
||||
"_APP_POOL_SIZE_EXECUTIONS=2",
|
||||
"_APP_MAINTENANCE_RETENTION_USAGE_TTL=180",
|
||||
"_APP_STATS_USAGE_QUEUE_NAME=v1-stats-usage",
|
||||
"_APP_STATS_RESOURCES_QUEUE_NAME=v1-stats-resources",
|
||||
"_APP_STATS_RESOURCES_INTERVAL=3600",
|
||||
"_APP_MQTT_REPLAY_DEPTH=5",
|
||||
"_APP_MQTT_MAX_PACKET_SIZE=64000",
|
||||
"_APP_SMTP_HOST=",
|
||||
"_APP_SMTP_PORT=",
|
||||
"_APP_SMTP_SECURE=",
|
||||
@@ -120,10 +81,8 @@ env = [
|
||||
"_APP_SMS_PROVIDER=",
|
||||
"_APP_SMS_FROM=",
|
||||
"_APP_SMS_PROJECTS_DENY_LIST=",
|
||||
"_APP_PWNED_PASSWORDS_DSN=none://localhost",
|
||||
"_APP_STORAGE_LIMIT=30000000",
|
||||
"_APP_STORAGE_PREVIEW_LIMIT=20000000",
|
||||
"_APP_AUTOGRAVITY_HOST=http://appwrite-autogravity:8080",
|
||||
"_APP_STORAGE_ANTIVIRUS=disabled",
|
||||
"_APP_STORAGE_ANTIVIRUS_HOST=clamav",
|
||||
"_APP_STORAGE_ANTIVIRUS_PORT=3310",
|
||||
@@ -150,26 +109,21 @@ env = [
|
||||
"_APP_STORAGE_WASABI_REGION=eu-central-1",
|
||||
"_APP_STORAGE_WASABI_BUCKET=",
|
||||
"_APP_COMPUTE_SIZE_LIMIT=30000000",
|
||||
"_APP_COMPUTE_BUILD_SIZE_LIMIT=2000000000",
|
||||
"_APP_COMPUTE_BUILD_TIMEOUT=2700",
|
||||
"_APP_COMPUTE_BUILD_TIMEOUT=900",
|
||||
"_APP_COMPUTE_CPUS=0",
|
||||
"_APP_COMPUTE_MEMORY=0",
|
||||
"_APP_COMPUTE_INACTIVE_THRESHOLD=60",
|
||||
"_APP_COMPUTE_MAINTENANCE_INTERVAL=3600",
|
||||
"_APP_OPEN_RUNTIMES_NFT=enabled",
|
||||
"_APP_COMPUTE_RUNTIMES_NETWORK=dokploy-network",
|
||||
"_APP_FUNCTIONS_TIMEOUT=900",
|
||||
"_APP_FUNCTIONS_CREATION_ABUSE_LIMIT=5000",
|
||||
"_APP_FUNCTIONS_SCHEDULE_SPREAD=0",
|
||||
"_APP_FUNCTIONS_RUNTIMES=node-22,python-3.12,php-8.3,ruby-3.3,dart-3.5,go-1.23,rust-1.83,bun-1.1,deno-1.46,java-21.0,dotnet-8.0",
|
||||
"_APP_SITES_TIMEOUT=900",
|
||||
"_APP_SITES_RUNTIMES=static-1,node-22",
|
||||
"_APP_EXECUTOR_SECRET=${executor_secret}",
|
||||
"_APP_EXECUTOR_HOST=http://openruntimes-executor/v1",
|
||||
"_APP_EXECUTOR_IMAGES=openruntimes/node:v5-22,openruntimes/python:v5-3.12,openruntimes/php:v5-8.3,openruntimes/static:v5-1",
|
||||
"_APP_EXECUTOR_CONNECTION_STORAGE=local://localhost",
|
||||
"_APP_JOBS_HOST=http://orchestrator:8080",
|
||||
"_APP_JOBS_SECRET=${jobs_secret}",
|
||||
"_APP_JOBS_ENDPOINT=http://appwrite",
|
||||
"_APP_OPEN_RUNTIMES_NFT=enabled",
|
||||
"_APP_BROWSER_HOST=http://appwrite-browser:3000/v1",
|
||||
"_APP_WORKER_SCREENSHOTS_ROUTER=http://appwrite",
|
||||
"_APP_DOCKER_HUB_USERNAME=",
|
||||
@@ -181,6 +135,7 @@ env = [
|
||||
"_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
|
||||
"_APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE=15778800",
|
||||
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
|
||||
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
|
||||
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
|
||||
"_APP_INTERVAL_DOMAIN_VERIFICATION=120",
|
||||
"_APP_INTERVAL_CLEANUP_STALE_EXECUTIONS=300",
|
||||
@@ -195,51 +150,61 @@ env = [
|
||||
"_APP_VCS_GITHUB_CLIENT_ID=",
|
||||
"_APP_VCS_GITHUB_CLIENT_SECRET=",
|
||||
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
|
||||
"_APP_VCS_GITEA_ENDPOINT=",
|
||||
"_APP_VCS_GITEA_BROWSER_ENDPOINT=",
|
||||
"_APP_VCS_GITEA_CLIENT_ID=",
|
||||
"_APP_VCS_GITEA_CLIENT_SECRET=",
|
||||
"_APP_VCS_GITEA_WEBHOOK_SECRET=",
|
||||
"_APP_VCS_GITLAB_ENDPOINT=",
|
||||
"_APP_VCS_GITLAB_CLIENT_ID=",
|
||||
"_APP_VCS_GITLAB_CLIENT_SECRET=",
|
||||
"_APP_VCS_GITLAB_WEBHOOK_SECRET=",
|
||||
"_APP_VCS_BITBUCKET_CLIENT_ID=",
|
||||
"_APP_VCS_BITBUCKET_CLIENT_SECRET=",
|
||||
"_APP_VCS_BITBUCKET_WEBHOOK_SECRET=",
|
||||
"_APP_VCS_ORIGIN_CLIENT_ID=",
|
||||
"_APP_VCS_ORIGIN_PRIVATE_KEY=",
|
||||
"_APP_VCS_WEBHOOK_URL=",
|
||||
"_APP_MIGRATION_HOST=appwrite",
|
||||
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
|
||||
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
|
||||
"_APP_ASSISTANT_OPENAI_API_KEY=",
|
||||
]
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "mongo-init.js"
|
||||
content = """// mongo-init.js
|
||||
|
||||
// Switch to the admin database
|
||||
const adminDb = db.getSiblingDB('admin');
|
||||
|
||||
// Get username and password from environment variables
|
||||
const username = process.env.MONGO_INITDB_USERNAME;
|
||||
const password = process.env.MONGO_INITDB_PASSWORD;
|
||||
const database = process.env.MONGO_INITDB_DATABASE;
|
||||
|
||||
// Create the user
|
||||
adminDb.createUser({
|
||||
user: username,
|
||||
pwd: password,
|
||||
roles: [
|
||||
{ role: 'readWrite', db: database }
|
||||
]
|
||||
});
|
||||
"""
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "mongo-entrypoint.sh"
|
||||
content = """#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Fix keyfile permissions if mounted from volume
|
||||
KEYFILE_PATH="/data/keyfile/mongo-keyfile"
|
||||
|
||||
if [ ! -f "$KEYFILE_PATH" ]; then
|
||||
echo "Generating random MongoDB keyfile..."
|
||||
mkdir -p /data/keyfile
|
||||
openssl rand -base64 756 > "$KEYFILE_PATH"
|
||||
fi
|
||||
|
||||
chmod 400 "$KEYFILE_PATH"
|
||||
chown mongodb:mongodb "$KEYFILE_PATH" 2>/dev/null || chown 999:999 "$KEYFILE_PATH"
|
||||
|
||||
# Use MongoDB's standard entrypoint with our command
|
||||
exec docker-entrypoint.sh mongod --replSet rs0 --bind_ip_all --auth --keyFile "$KEYFILE_PATH"
|
||||
"""
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite-console"
|
||||
port = 3000
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/v1"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/.well-known"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite-realtime"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/v1/realtime"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite"
|
||||
port = 80
|
||||
@@ -253,7 +218,13 @@ host = "${functions_domain}"
|
||||
path = "/"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite-mqtt"
|
||||
port = 8083
|
||||
host = "${mqtt_domain}"
|
||||
path = "/"
|
||||
serviceName = "appwrite-console"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/console"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appwrite-realtime"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/v1/realtime"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
autobase-console:
|
||||
image: autobase/console:2.11.0
|
||||
image: autobase/console:2.7.2
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "80"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "autobase",
|
||||
"name": "Autobase",
|
||||
"version": "2.11.0",
|
||||
"version": "2.7.2",
|
||||
"description": "Autobase for PostgreSQL® is an open-source alternative to cloud-managed databases (self-hosted DBaaS).",
|
||||
"links": {
|
||||
"github": "https://github.com/vitabaks/autobase",
|
||||
|
||||
@@ -4,7 +4,6 @@ mysql_root_password = "${password:32}"
|
||||
mysql_password = "${password:16}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "azuracast"
|
||||
port = 80
|
||||
@@ -28,3 +27,5 @@ NGINX_RADIO_PORTS = "8000,8010,8020,8030,8040,8050"
|
||||
PREFER_RELEASE_BUILDS = "true"
|
||||
COMPOSER_PLUGIN_MODE = "false"
|
||||
ADDITIONAL_MEDIA_SYNC_WORKER_COUNT = "0"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -2,7 +2,7 @@ version: "3.8"
|
||||
|
||||
services:
|
||||
bentopdf:
|
||||
image: ghcr.io/alam00000/bentopdf-simple:sha-72d20bb
|
||||
image: bentopdf/bentopdf:latest
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 8080
|
||||
- 80
|
||||
|
||||
@@ -4,6 +4,6 @@ main_domain = "${domain}"
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "bentopdf"
|
||||
port = 8080
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
@@ -72,7 +72,7 @@ s3_endpoint = ""
|
||||
s3_bucket = ""
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "webapp"
|
||||
port = 80
|
||||
@@ -165,3 +165,6 @@ MYSQL_DATABASE = "${system_db_name}"
|
||||
MYSQL_USER = "${db_user}"
|
||||
MYSQL_PASSWORD = "${db_password}"
|
||||
MYSQL_ROOT_PASSWORD = "${db_root_password}"
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
# BlogFactory on Dokploy
|
||||
|
||||
Dokploy creates independent database, storage, JWT, encryption, and scheduler secrets during import. Only the `web` service receives a public domain; the API, scheduler, PostgreSQL, and MinIO remain private.
|
||||
|
||||
## First administrator
|
||||
|
||||
1. Open the Compose service's environment settings and copy the generated `ADMIN_EMAILS` value.
|
||||
2. Open the generated BlogFactory domain and register with that exact email address.
|
||||
3. Return to the Compose environment settings, change `BLOGFACTORY_ALLOW_SIGNUP` to `false`, and redeploy.
|
||||
4. Add OpenRouter, CMS, or Google Search Console credentials from BlogFactory only when you need those optional integrations.
|
||||
|
||||
BlogFactory sends reviewed content to connected CMS providers as drafts. The template does not grant live-publish or delete authority.
|
||||
@@ -1,8 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64">
|
||||
<rect width="64" height="64" rx="8" fill="#fff"/>
|
||||
<rect x="1" y="1" width="62" height="62" rx="7" fill="none" stroke="#d7d8d4" stroke-width="2"/>
|
||||
<circle cx="50" cy="14" r="5" fill="#ff5a1f"/>
|
||||
<rect x="13" y="31" width="10" height="18" fill="#202224"/>
|
||||
<rect x="27" y="20" width="10" height="29" fill="#202224"/>
|
||||
<rect x="41" y="26" width="10" height="23" fill="#202224"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 453 B |
@@ -1,102 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:17.6-alpine3.22
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_DB: blogfactory
|
||||
POSTGRES_USER: blogfactory
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||
volumes:
|
||||
- postgres-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U blogfactory -d blogfactory"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
minio:
|
||||
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
|
||||
restart: unless-stopped
|
||||
command: server /data --console-address :9001
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD}
|
||||
volumes:
|
||||
- minio-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
api:
|
||||
image: ghcr.io/blogfactoryhq/blogfactory-api:v0.1.0
|
||||
restart: unless-stopped
|
||||
command: >-
|
||||
sh -c "bun run src/init-s3-bucket.ts && bun run src/db/migrate.ts && exec bun run src/index.ts"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
minio:
|
||||
condition: service_healthy
|
||||
expose:
|
||||
- 3000
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
PORT: 3000
|
||||
BLOGFACTORY_SELF_HOSTED: "true"
|
||||
DATABASE_URL: postgresql://blogfactory:${POSTGRES_PASSWORD}@postgres:5432/blogfactory
|
||||
JWT_SECRET: ${JWT_SECRET}
|
||||
API_KEY_ENCRYPTION_SECRET: ${API_KEY_ENCRYPTION_SECRET}
|
||||
ADMIN_EMAILS: ${ADMIN_EMAILS}
|
||||
BLOGFACTORY_ALLOW_SIGNUP: ${BLOGFACTORY_ALLOW_SIGNUP}
|
||||
CRON_SECRET: ${CRON_SECRET}
|
||||
WEB_APP_URL: ${BLOGFACTORY_URL}
|
||||
MCP_APP_URL: http://web/mcp-review.html
|
||||
MCP_ALLOWED_ORIGINS: ${BLOGFACTORY_URL}
|
||||
S3_ENDPOINT: http://minio:9000
|
||||
S3_ACCESS_KEY_ID: ${MINIO_ROOT_USER}
|
||||
S3_SECRET_ACCESS_KEY: ${MINIO_ROOT_PASSWORD}
|
||||
S3_BUCKET: blogfactory
|
||||
S3_REGION: us-east-1
|
||||
healthcheck:
|
||||
test: ["CMD", "bun", "-e", "fetch('http://localhost:3000/api/ready').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
web:
|
||||
image: ghcr.io/blogfactoryhq/blogfactory-web:v0.1.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_healthy
|
||||
expose:
|
||||
- 80
|
||||
environment:
|
||||
API_UPSTREAM: http://api:3000
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "nginx -t >/dev/null 2>&1 && wget -q -O /dev/null http://api:3000/api/ready"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
scheduler:
|
||||
image: curlimages/curl:8.15.0
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_healthy
|
||||
environment:
|
||||
CRON_SECRET: ${CRON_SECRET}
|
||||
CRON_INTERVAL_SECONDS: 21600
|
||||
entrypoint: ["/bin/sh", "-c"]
|
||||
command:
|
||||
- >-
|
||||
while true; do curl --fail --silent --show-error --output /dev/null -H "Authorization: Bearer $${CRON_SECRET}" http://api:3000/api/cron/drain && echo "Scheduler drain completed"; sleep "$${CRON_INTERVAL_SECONDS}"; done
|
||||
|
||||
volumes:
|
||||
postgres-data:
|
||||
minio-data:
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"id": "blogfactory",
|
||||
"name": "BlogFactory",
|
||||
"version": "v0.1.0",
|
||||
"description": "Self-hosted control plane for AI-assisted content operations and human-approved CMS draft delivery.",
|
||||
"logo": "blogfactory.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/BlogFactoryHQ/blogfactory",
|
||||
"website": "https://blogfactory.io/",
|
||||
"docs": "https://github.com/BlogFactoryHQ/blogfactory/blob/main/docs/self-hosting.md"
|
||||
},
|
||||
"tags": ["ai", "automation", "content-management"]
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
postgres_password = "${password:48}"
|
||||
minio_root_user = "blogfactory"
|
||||
minio_root_password = "${password:48}"
|
||||
jwt_secret = "${base64:48}"
|
||||
encryption_secret = "${base64:48}"
|
||||
cron_secret = "${base64:48}"
|
||||
admin_email = "${email}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"POSTGRES_PASSWORD=${postgres_password}",
|
||||
"MINIO_ROOT_USER=${minio_root_user}",
|
||||
"MINIO_ROOT_PASSWORD=${minio_root_password}",
|
||||
"JWT_SECRET=${jwt_secret}",
|
||||
"API_KEY_ENCRYPTION_SECRET=${encryption_secret}",
|
||||
"CRON_SECRET=${cron_secret}",
|
||||
"ADMIN_EMAILS=${admin_email}",
|
||||
"BLOGFACTORY_ALLOW_SIGNUP=true",
|
||||
"BLOGFACTORY_URL=https://${main_domain}",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "web"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
@@ -4,7 +4,6 @@ app_password = "${password:32}"
|
||||
db_root_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "booklore"
|
||||
port = 6060
|
||||
@@ -21,3 +20,5 @@ MYSQL_USER = "booklore"
|
||||
MYSQL_PASSWORD = "${app_password}"
|
||||
# API Key
|
||||
MYSQL_ROOT_PASSWORD = "${db_root_password}"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -2,10 +2,24 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "borgitory"
|
||||
port = 8000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
|
||||
[[config.mounts]]
|
||||
name = "borgitory-data"
|
||||
mountPath = "/app/data"
|
||||
description = "Database and encryption key storage"
|
||||
|
||||
[[config.mounts]]
|
||||
name = "borgitory-sources"
|
||||
mountPath = "/mnt/sources"
|
||||
description = "Sources to back up (read-only)"
|
||||
|
||||
[[config.mounts]]
|
||||
name = "borgitory-repos"
|
||||
mountPath = "/mnt/repos"
|
||||
description = "Borg repositories (read-only)"
|
||||
@@ -3,12 +3,18 @@ main_domain = "${domain}"
|
||||
postgres_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "budget-board-client"
|
||||
port = 6253
|
||||
host = "${main_domain}"
|
||||
path = "/"
|
||||
|
||||
|
||||
[config.env]
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
|
||||
|
||||
[[config.mounts]]
|
||||
source = "../files/db-data"
|
||||
target = "/var/lib/postgresql/data"
|
||||
type = "bind"
|
||||
@@ -1,8 +1,3 @@
|
||||
# If you are on a machine with ARM architecture, please add a "-arm" suffix to the calcom image on line 19.
|
||||
# For example, `calcom/cal.com:v6.2.0` will become `calcom/cal.com:v6.2.0-arm`
|
||||
|
||||
# If serving the instance on https, change `NEXT_PUBLIC_WEBAPP_URL` (Line 28) and `NEXTAUTH_URL` (Line 30) to https
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16-alpine
|
||||
@@ -16,25 +11,15 @@ services:
|
||||
- DATABASE_URL=postgres://postgres:password@postgres:5432/db
|
||||
|
||||
calcom:
|
||||
image: calcom/cal.com:v6.2.0
|
||||
image: calcom/cal.com:v2.7.6
|
||||
depends_on:
|
||||
- postgres
|
||||
environment:
|
||||
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
|
||||
- CALENDSO_ENCRYPTION_KEY=${CALENDSO_ENCRYPTION_KEY}
|
||||
- DATABASE_URL=postgres://postgres:password@postgres:5432/db
|
||||
- DATABASE_DIRECT_URL=postgres://postgres:password@postgres:5432/db
|
||||
- DATABASE_HOST=postgres:5432
|
||||
- NEXT_PUBLIC_WEBAPP_URL=http://${CALCOM_HOST}
|
||||
- ALLOWED_HOSTNAMES="${CALCOM_HOST}"
|
||||
- NEXTAUTH_URL=http://${CALCOM_HOST}/api/auth
|
||||
- NEXT_PUBLIC_DISABLE_SIGNUP=${DISABLE_SIGNUP}
|
||||
- EMAIL_SERVER_HOST=${SMTP_SERVER}
|
||||
- EMAIL_SERVER_PORT=${SMTP_PORT}
|
||||
- EMAIL_SERVER_USER=${EMAIL_SERVER_USER}
|
||||
- EMAIL_SERVER_PASSWORD=${SMTP_PASSWORD}
|
||||
- EMAIL_FROM=${EMAIL_FROM}
|
||||
|
||||
|
||||
volumes:
|
||||
calcom-data:
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"id": "calcom",
|
||||
"name": "Calcom",
|
||||
"version": "v6.2.0",
|
||||
"version": "v2.7.6",
|
||||
"description": "Calcom is a open source alternative to Calendly that allows to create scheduling and booking services.",
|
||||
"links": {
|
||||
"github": "https://github.com/calcom/cal.com",
|
||||
|
||||
@@ -8,12 +8,6 @@ env = [
|
||||
"CALCOM_HOST=${main_domain}",
|
||||
"NEXTAUTH_SECRET=${nextauth_secret}",
|
||||
"CALENDSO_ENCRYPTION_KEY=${calcom_encryption_key}",
|
||||
"DISABLE_SIGNUP=true",
|
||||
"SMTP_SERVER=",
|
||||
"SMTP_PORT=",
|
||||
"SMTP_PASSWORD=",
|
||||
"EMAIL_SERVER_USER=",
|
||||
"EMAIL_FROM=",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
|
||||
@@ -2,10 +2,13 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "checkcle"
|
||||
port = 8090
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
|
||||
[[config.mounts]]
|
||||
source = "checkcle-data"
|
||||
target = "/mnt/pb_data"
|
||||
@@ -6,6 +6,8 @@
|
||||
services:
|
||||
chibisafe:
|
||||
image: chibisafe/chibisafe:latest
|
||||
networks:
|
||||
- chibinet
|
||||
environment:
|
||||
- BASE_API_URL=http://chibisafe_server:8000
|
||||
restart: unless-stopped
|
||||
@@ -18,6 +20,8 @@ services:
|
||||
|
||||
chibisafe_server:
|
||||
image: chibisafe/chibisafe-server:latest
|
||||
networks:
|
||||
- chibinet
|
||||
volumes:
|
||||
- database:/app/database:rw
|
||||
- uploads:/app/uploads:rw
|
||||
@@ -39,6 +43,8 @@ services:
|
||||
|
||||
caddy:
|
||||
image: caddy:2-alpine
|
||||
networks:
|
||||
- chibinet
|
||||
volumes:
|
||||
- ../files/Caddyfile:/etc/caddy/Caddyfile:ro
|
||||
- uploads:/app/uploads:ro
|
||||
@@ -56,3 +62,8 @@ volumes:
|
||||
database:
|
||||
uploads:
|
||||
logs:
|
||||
|
||||
networks:
|
||||
chibinet:
|
||||
driver: bridge
|
||||
internal: true
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"logo": "logo.png",
|
||||
"links": {
|
||||
"github": "https://github.com/chiefonboarding/chiefonboarding",
|
||||
"website": "https://chiefonboarding.com/",
|
||||
"website": "https://demo.chiefonboarding.com/",
|
||||
"docs": "https://docs.chiefonboarding.com/"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -11,7 +11,6 @@ hide_history = "false"
|
||||
language = "en"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "convertx"
|
||||
port = 3000
|
||||
@@ -27,3 +26,8 @@ WEBROOT = "${webroot}"
|
||||
FFMPEG_ARGS = "${ffmpeg_args}"
|
||||
HIDE_HISTORY = "${hide_history}"
|
||||
LANGUAGE = "${language}"
|
||||
|
||||
[[config.mounts]]
|
||||
source = "../files/data"
|
||||
target = "/app/data"
|
||||
type = "bind"
|
||||
@@ -5,7 +5,7 @@
|
||||
"description": "Convex is an open-source reactive database designed to make life easy for web app developers.",
|
||||
"logo": "convex.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/get-convex/convex-backend",
|
||||
"github": "https://github.com/get-convex/convex",
|
||||
"website": "https://www.convex.dev/",
|
||||
"docs": "https://www.convex.dev/docs"
|
||||
},
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "cookiecloud"
|
||||
port = 8088
|
||||
@@ -10,3 +9,6 @@ host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
# No environment variables required by default
|
||||
|
||||
[[config.mounts]]
|
||||
# Data volume mount is defined in docker-compose.yml
|
||||
@@ -1,6 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400" stroke-width="18" stroke="#fff" fill="#595ce7">
|
||||
<path fill-rule="evenodd" d="m200 390c-105.1 0-190-84.9-190-190 0-105.1 84.9-190 190-190 105.1 0 190 84.9 190 190 0 105.1-84.9 190-190 190z"/>
|
||||
<path fill-rule="evenodd" d="m262.6 368.6c-65.2 0-117.9-75.4-117.9-168.7 0-93.3 52.7-168.7 117.9-168.7 65.1 0 117.8 75.4 117.8 168.7 0 93.3-52.7 168.7-117.8 168.7z"/>
|
||||
<path fill-rule="evenodd" d="m319.9 330.7c-31.8 0-57.4-58.2-57.4-130.2 0-72 25.6-130.1 57.4-130.1 31.7 0 57.3 58.1 57.3 130.1 0 72-25.6 130.2-57.3 130.2z"/>
|
||||
<path fill="#fff" fill-rule="evenodd" d="m364.5 267.5c-14.1 0-25.6-29.9-25.6-67 0-37 11.5-67 25.6-67 14.1 0 25.5 30 25.5 67 0 37.1-11.4 67-25.5 67z"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 768 B |
@@ -1,85 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
corsfix:
|
||||
image: ghcr.io/corsfix/corsfix-app:8899bb15e71c7238285ccefc4c95a0cd47daeaf0
|
||||
platform: linux/amd64
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "3000"
|
||||
environment:
|
||||
MONGODB_URI: mongodb://corsfix:${MONGODB_PASSWORD}@mongodb:27017/db?authSource=admin
|
||||
REDIS_URI: redis://default:${REDIS_PASSWORD}@redis:6379
|
||||
KEK_VERSION: KEK_VERSION_1
|
||||
KEK_VERSION_1: ${KEK_VERSION_1}
|
||||
AUTH_SECRET: ${AUTH_SECRET}
|
||||
AUTH_TRUST_HOST: "true"
|
||||
AUTH_URL: ${AUTH_URL}
|
||||
PROXY_DOMAIN: ${PROXY_DOMAIN}
|
||||
DISABLE_SIGNUP: ${DISABLE_SIGNUP:-false}
|
||||
depends_on:
|
||||
mongodb:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
corsfix-proxy:
|
||||
image: ghcr.io/corsfix/corsfix-proxy:8899bb15e71c7238285ccefc4c95a0cd47daeaf0
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- "80"
|
||||
environment:
|
||||
MONGODB_URI: mongodb://corsfix:${MONGODB_PASSWORD}@mongodb:27017/db?authSource=admin
|
||||
REDIS_URI: redis://default:${REDIS_PASSWORD}@redis:6379
|
||||
KEK_VERSION_1: ${KEK_VERSION_1}
|
||||
APP_DOMAIN: ${APP_DOMAIN}
|
||||
RPM: ${RPM:-180}
|
||||
ALLOWED_ORIGINS: ${ALLOWED_ORIGINS:-}
|
||||
ALLOWED_TARGETS: ${ALLOWED_TARGETS:-}
|
||||
depends_on:
|
||||
mongodb:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
|
||||
mongodb:
|
||||
image: mongo:8.0.17
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
MONGO_INITDB_ROOT_USERNAME: corsfix
|
||||
MONGO_INITDB_ROOT_PASSWORD: ${MONGODB_PASSWORD}
|
||||
MONGO_INITDB_DATABASE: db
|
||||
volumes:
|
||||
- mongodb-data:/data/db
|
||||
- mongodb-config:/data/configdb
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- >-
|
||||
mongosh --quiet --username "$${MONGO_INITDB_ROOT_USERNAME}"
|
||||
--password "$${MONGO_INITDB_ROOT_PASSWORD}" --authenticationDatabase admin
|
||||
--eval 'quit(db.adminCommand({ ping: 1 }).ok ? 0 : 1)'
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 30s
|
||||
|
||||
redis:
|
||||
image: redis:7.4.11-alpine
|
||||
restart: unless-stopped
|
||||
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD}", "--appendonly", "yes"]
|
||||
environment:
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD}
|
||||
volumes:
|
||||
- redis-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "REDISCLI_AUTH=\"$${REDIS_PASSWORD}\" redis-cli ping | grep -q PONG"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
start_period: 10s
|
||||
|
||||
volumes:
|
||||
mongodb-data:
|
||||
mongodb-config:
|
||||
redis-data:
|
||||
@@ -1,27 +0,0 @@
|
||||
# Corsfix
|
||||
|
||||
This template deploys the Corsfix dashboard and proxy with MongoDB and Redis.
|
||||
The dashboard image requires an **x86-64 / amd64 server**.
|
||||
|
||||
## Before deploying
|
||||
|
||||
1. Dokploy imports template domains without a certificate configuration, so `AUTH_URL` defaults to `http://` followed by the generated dashboard hostname. When enabling **HTTPS** and **Let's Encrypt** in the **Domains** tab, also change `AUTH_URL` in **Environment** to `https://` followed by that hostname and redeploy. This URL must match the public dashboard address, even though Dokploy terminates TLS at the edge. Enable HTTPS for **both** domains before using the playground, which uses HTTPS proxy URLs.
|
||||
2. If using custom domains, point both DNS records to your server, update the domain entries, and set `APP_DOMAIN` and `PROXY_DOMAIN` in **Environment** to the matching hostnames, without `https://` or a trailing slash. Update `AUTH_URL` to the full public dashboard URL, including its `http://` or `https://` scheme.
|
||||
3. Deploy, then open the dashboard domain (the `corsfix` service on port `3000`) and create your account with an email address and password. Self-hosted signup does not require an email server.
|
||||
4. Set `DISABLE_SIGNUP=true` in **Environment** and redeploy after creating the accounts you need.
|
||||
|
||||
## Using the proxy
|
||||
|
||||
The second domain routes to `corsfix-proxy` on port `80`. Use the dashboard to register your application's origin and permitted target domains, manage secrets, and try requests in the playground.
|
||||
|
||||
`RPM` sets the self-hosted rate limit (default: `180` requests per minute). Optional `ALLOWED_ORIGINS` and `ALLOWED_TARGETS` accept comma-separated hostnames for environment-based allowlists; leave them empty to manage applications through the dashboard.
|
||||
|
||||
## Persistent data and upgrades
|
||||
|
||||
MongoDB stores users, applications, and encrypted secrets in named volumes. Redis uses a named volume with append-only persistence. Preserve these volumes and the generated environment values when upgrading.
|
||||
|
||||
Keep a backup of `KEK_VERSION_1`: changing or losing this encryption key makes existing saved secrets unreadable. Do not re-import the template to upgrade an existing installation, because imports generate new credentials and keys. Update the image tags in the existing Compose configuration instead. Changing `MONGODB_PASSWORD` alone does not change the password already stored in MongoDB.
|
||||
|
||||
The Corsfix images are pinned to the same upstream commit because the project publishes commit tags rather than numbered releases.
|
||||
|
||||
See the [Corsfix self-hosting documentation](https://corsfix.com/docs/open-source/self-hosting) for more information.
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"id": "corsfix",
|
||||
"name": "Corsfix",
|
||||
"version": "8899bb15e71c7238285ccefc4c95a0cd47daeaf0",
|
||||
"description": "Corsfix is an open source CORS proxy platform for fetching APIs from browser applications, with origin and target allowlists, encrypted API secrets, response caching, and a management dashboard.",
|
||||
"logo": "corsfix.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/corsfix/corsfix",
|
||||
"website": "https://corsfix.com",
|
||||
"docs": "https://corsfix.com/docs/open-source/self-hosting"
|
||||
},
|
||||
"tags": ["proxy", "developer-tools", "networking"]
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
[variables]
|
||||
app_domain = "${domain}"
|
||||
proxy_domain = "${domain}"
|
||||
mongodb_password = "${hash:64}"
|
||||
redis_password = "${hash:64}"
|
||||
kek_version_1 = "${base64:32}"
|
||||
auth_secret = "${base64:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"APP_DOMAIN=${app_domain}",
|
||||
"AUTH_URL=http://${app_domain}",
|
||||
"PROXY_DOMAIN=${proxy_domain}",
|
||||
"MONGODB_PASSWORD=${mongodb_password}",
|
||||
"REDIS_PASSWORD=${redis_password}",
|
||||
"KEK_VERSION_1=${kek_version_1}",
|
||||
"AUTH_SECRET=${auth_secret}",
|
||||
"DISABLE_SIGNUP=false",
|
||||
"RPM=180",
|
||||
"ALLOWED_ORIGINS=",
|
||||
"ALLOWED_TARGETS=",
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "corsfix"
|
||||
port = 3000
|
||||
host = "${app_domain}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "corsfix-proxy"
|
||||
port = 80
|
||||
host = "${proxy_domain}"
|
||||
@@ -1,8 +0,0 @@
|
||||
<svg width="1031" height="244" viewBox="0 0 1031 244" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M374.72 225.76C356.8 225.76 341.027 221.653 327.4 213.44C313.773 205.04 303.133 193.093 295.48 177.6C287.827 162.107 284 143.627 284 122.16C284 100.88 287.733 82.4933 295.2 67C302.853 51.32 313.493 39.28 327.12 30.88C340.747 22.2933 356.707 18 375 18C399.64 18 418.773 24.16 432.4 36.48C446.027 48.8 454.893 65.88 459 87.72L427.36 89.4C424.747 75.7733 419.147 65.1333 410.56 57.48C401.973 49.64 390.12 45.72 375 45.72C362.867 45.72 352.32 48.8 343.36 54.96C334.587 61.12 327.68 69.8933 322.64 81.28C317.787 92.6667 315.36 106.293 315.36 122.16C315.36 138.027 317.787 151.653 322.64 163.04C327.68 174.427 334.68 183.107 343.64 189.08C352.6 195.053 362.96 198.04 374.72 198.04C390.773 198.04 403.187 193.84 411.96 185.44C420.92 176.853 426.52 165.093 428.76 150.16L460.4 151.84C457.973 166.96 453.12 180.027 445.84 191.04C438.56 202.053 428.947 210.64 417 216.8C405.053 222.773 390.96 225.76 374.72 225.76Z" fill="white"/>
|
||||
<path d="M488.982 221.28V72.32H516.142L517.262 111.8L514.742 110.96C516.795 97.52 520.902 87.72 527.062 81.56C533.409 75.4 541.902 72.32 552.542 72.32H566.822V98.92H552.542C545.075 98.92 538.822 100.133 533.782 102.56C528.742 104.987 524.915 108.72 522.302 113.76C519.875 118.8 518.662 125.333 518.662 133.36V221.28H488.982Z" fill="white"/>
|
||||
<path d="M648.166 224.64C633.606 224.64 621.006 221.467 610.366 215.12C599.913 208.773 591.793 199.72 586.006 187.96C580.406 176.2 577.606 162.48 577.606 146.8C577.606 131.12 580.406 117.493 586.006 105.92C591.793 94.16 599.913 85.1067 610.366 78.76C620.82 72.2267 633.14 68.96 647.326 68.96C660.766 68.96 672.62 72.1333 682.886 78.48C693.153 84.64 701.086 93.6 706.686 105.36C712.473 117.12 715.366 131.307 715.366 147.92V155.48H608.406C609.153 170.04 612.98 180.96 619.886 188.24C626.98 195.52 636.5 199.16 648.446 199.16C657.22 199.16 664.5 197.107 670.286 193C676.073 188.893 680.086 183.387 682.326 176.48L713.126 178.44C709.206 192.253 701.46 203.453 689.886 212.04C678.5 220.44 664.593 224.64 648.166 224.64ZM608.406 133.08H684.006C683.073 119.827 679.246 110.027 672.526 103.68C665.993 97.3333 657.593 94.16 647.326 94.16C636.686 94.16 627.913 97.52 621.006 104.24C614.286 110.773 610.086 120.387 608.406 133.08Z" fill="white"/>
|
||||
<path d="M805.64 224.64C791.08 224.64 778.48 221.467 767.84 215.12C757.387 208.773 749.267 199.72 743.48 187.96C737.88 176.2 735.08 162.48 735.08 146.8C735.08 131.12 737.88 117.493 743.48 105.92C749.267 94.16 757.387 85.1067 767.84 78.76C778.293 72.2267 790.613 68.96 804.8 68.96C818.24 68.96 830.093 72.1333 840.36 78.48C850.627 84.64 858.56 93.6 864.16 105.36C869.947 117.12 872.84 131.307 872.84 147.92V155.48H765.88C766.627 170.04 770.453 180.96 777.36 188.24C784.453 195.52 793.973 199.16 805.92 199.16C814.693 199.16 821.973 197.107 827.76 193C833.547 188.893 837.56 183.387 839.8 176.48L870.6 178.44C866.68 192.253 858.933 203.453 847.36 212.04C835.973 220.44 822.067 224.64 805.64 224.64ZM765.88 133.08H841.48C840.547 119.827 836.72 110.027 830 103.68C823.467 97.3333 815.067 94.16 804.8 94.16C794.16 94.16 785.387 97.52 778.48 104.24C771.76 110.773 767.56 120.387 765.88 133.08Z" fill="white"/>
|
||||
<path d="M954.714 224.64C942.02 224.64 930.914 221.467 921.394 215.12C912.06 208.773 904.874 199.813 899.834 188.24C894.98 176.48 892.554 162.667 892.554 146.8C892.554 130.933 895.074 117.213 900.114 105.64C905.154 93.88 912.34 84.8267 921.674 78.48C931.007 72.1333 942.02 68.96 954.714 68.96C964.98 68.96 974.127 71.1067 982.154 75.4C990.18 79.6933 996.247 85.6667 1000.35 93.32V22.48H1030.03V221.28H1002.31L1001.47 198.88C997.367 206.907 991.114 213.253 982.714 217.92C974.5 222.4 965.167 224.64 954.714 224.64ZM962.554 198.88C970.58 198.88 977.394 196.827 982.994 192.72C988.594 188.613 992.887 182.64 995.874 174.8C998.86 166.96 1000.35 157.627 1000.35 146.8C1000.35 135.6 998.86 126.173 995.874 118.52C992.887 110.68 988.594 104.8 982.994 100.88C977.394 96.7733 970.58 94.72 962.554 94.72C950.607 94.72 941.087 99.3867 933.994 108.72C926.9 117.867 923.354 130.56 923.354 146.8C923.354 162.853 926.9 175.547 933.994 184.88C941.087 194.213 950.607 198.88 962.554 198.88Z" fill="white"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M156.683 25.8912C156.683 20.7784 153.949 16.6984 150.153 15.8682L50.8845 0.803281C44.4474 -0.207939 40.8385 -0.418278 34.4022 1.07664C21.948 4.53448 19.4689 5.55156 7.16796 9.52026C1.74137 10.8567 0 14.8659 0 20.1609L0.111367 226.189C0.111367 231.049 3.3005 234.218 7.66406 235.676C14.0626 237.863 21.4027 240.262 28.5807 242.489C33.5011 244.038 38.8467 244.038 45.3161 243.664C52.231 243.259 92.7685 236.617 149.596 229.044C154.101 228.447 156.663 224.772 156.663 221.087L156.713 25.8912H156.683ZM132.658 192.425C134.521 192.222 139.148 190.127 139.148 184.639V59.9491C139.279 57.4788 137.528 52.9533 132.445 52.5382L75.861 44.5097C70.7786 44.2971 68.0552 47.9924 68.0552 51.4043V194.055C68.2678 196.525 70.161 200.362 75.2333 199.542L132.658 192.425Z" fill="white"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.9 KiB |
@@ -1,65 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
creed:
|
||||
build:
|
||||
context: https://github.com/connorhpbrn/creed.git#e9b096d6d68fef6df336338bc9965a94ab62f75e
|
||||
dockerfile_inline: |
|
||||
FROM node:20-alpine AS builder
|
||||
WORKDIR /app
|
||||
COPY package.json package-lock.json ./
|
||||
RUN npm ci
|
||||
COPY . .
|
||||
ARG NEXT_PUBLIC_SITE_URL
|
||||
ARG NEXT_PUBLIC_SUPABASE_URL
|
||||
ARG NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY
|
||||
ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
|
||||
ARG NEXT_PUBLIC_CONTACT_EMAIL
|
||||
ARG NEXT_PUBLIC_GITHUB_URL
|
||||
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
|
||||
NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL \
|
||||
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=$NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY \
|
||||
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=$NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY \
|
||||
NEXT_PUBLIC_CONTACT_EMAIL=$NEXT_PUBLIC_CONTACT_EMAIL \
|
||||
NEXT_PUBLIC_GITHUB_URL=$NEXT_PUBLIC_GITHUB_URL
|
||||
RUN npm run build
|
||||
|
||||
FROM node:20-alpine AS runner
|
||||
WORKDIR /app
|
||||
ENV NODE_ENV=production
|
||||
COPY --from=builder /app/public ./public
|
||||
COPY --from=builder /app/.next ./.next
|
||||
COPY --from=builder /app/node_modules ./node_modules
|
||||
COPY --from=builder /app/package.json ./package.json
|
||||
COPY --from=builder /app/next.config.ts ./next.config.ts
|
||||
EXPOSE 3000
|
||||
CMD ["npm", "start"]
|
||||
args:
|
||||
NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL}
|
||||
NEXT_PUBLIC_SUPABASE_URL: ${NEXT_PUBLIC_SUPABASE_URL}
|
||||
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY}
|
||||
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY: ${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
|
||||
NEXT_PUBLIC_CONTACT_EMAIL: ${NEXT_PUBLIC_CONTACT_EMAIL}
|
||||
NEXT_PUBLIC_GITHUB_URL: ${NEXT_PUBLIC_GITHUB_URL}
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- NEXT_PUBLIC_SITE_URL=${NEXT_PUBLIC_SITE_URL}
|
||||
- NEXT_PUBLIC_SUPABASE_URL=${NEXT_PUBLIC_SUPABASE_URL}
|
||||
- NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=${NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY}
|
||||
- SUPABASE_SECRET_KEY=${SUPABASE_SECRET_KEY}
|
||||
- CREED_ENCRYPTION_SECRET=${CREED_ENCRYPTION_SECRET}
|
||||
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
|
||||
- NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
|
||||
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
|
||||
- OPENROUTER_PLATFORM_KEY=${OPENROUTER_PLATFORM_KEY}
|
||||
- ANALYSIS_MODEL=${ANALYSIS_MODEL}
|
||||
- TAB_MODEL=${TAB_MODEL}
|
||||
- PANEL_MODEL=${PANEL_MODEL}
|
||||
- RESEND_API_KEY=${RESEND_API_KEY}
|
||||
- RESEND_FROM_EMAIL=${RESEND_FROM_EMAIL}
|
||||
- GITHUB_OAUTH_CLIENT_ID=${GITHUB_OAUTH_CLIENT_ID}
|
||||
- GITHUB_OAUTH_CLIENT_SECRET=${GITHUB_OAUTH_CLIENT_SECRET}
|
||||
- NEXT_PUBLIC_CONTACT_EMAIL=${NEXT_PUBLIC_CONTACT_EMAIL}
|
||||
- NEXT_PUBLIC_GITHUB_URL=${NEXT_PUBLIC_GITHUB_URL}
|
||||
- CREED_CSP_ENFORCE=${CREED_CSP_ENFORCE}
|
||||
expose:
|
||||
- 3000
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"id": "creed",
|
||||
"name": "Creed",
|
||||
"version": "e9b096d",
|
||||
"description": "One personal context file every AI agent reads before answering and proposes updates to as it learns about you. Requires an external Supabase project (see instructions).",
|
||||
"logo": "creed.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/hpbrn/creed",
|
||||
"website": "https://creed.md",
|
||||
"docs": "https://docs.creed.md/"
|
||||
},
|
||||
"tags": [
|
||||
"ai",
|
||||
"productivity",
|
||||
"mcp",
|
||||
"nextjs",
|
||||
"supabase"
|
||||
]
|
||||
}
|
||||
@@ -1,105 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
creed_encryption_secret = "${base64:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"NEXT_PUBLIC_SITE_URL=https://${main_domain}",
|
||||
"NEXT_PUBLIC_SUPABASE_URL=",
|
||||
"NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=",
|
||||
"SUPABASE_SECRET_KEY=",
|
||||
"CREED_ENCRYPTION_SECRET=${creed_encryption_secret}",
|
||||
"STRIPE_SECRET_KEY=",
|
||||
"NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=",
|
||||
"STRIPE_WEBHOOK_SECRET=",
|
||||
"OPENROUTER_PLATFORM_KEY=",
|
||||
"ANALYSIS_MODEL=",
|
||||
"TAB_MODEL=",
|
||||
"PANEL_MODEL=",
|
||||
"RESEND_API_KEY=",
|
||||
"RESEND_FROM_EMAIL=Creed <hello@example.com>",
|
||||
"GITHUB_OAUTH_CLIENT_ID=",
|
||||
"GITHUB_OAUTH_CLIENT_SECRET=",
|
||||
"NEXT_PUBLIC_CONTACT_EMAIL=",
|
||||
"NEXT_PUBLIC_GITHUB_URL=https://github.com/connorhpbrn/creed",
|
||||
"CREED_CSP_ENFORCE=",
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "creed"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[[config.mounts]]
|
||||
filePath = "README.md"
|
||||
content = """# Creed
|
||||
|
||||
Creed (creed.md) is a personal context file: one Markdown file every AI agent
|
||||
reads before answering and proposes updates to as it learns about you. This
|
||||
template builds the app from source (https://github.com/connorhpbrn/creed)
|
||||
and runs it as a stateless Next.js container — Postgres, auth, and storage
|
||||
live in Supabase, which is **not** part of this template.
|
||||
|
||||
## Before you deploy
|
||||
|
||||
Creed needs a Supabase project. It is not enough to point it at a plain
|
||||
Postgres database: the app relies on Supabase Auth, Row Level Security, and
|
||||
realtime subscriptions, and its schema is applied through the Supabase CLI.
|
||||
|
||||
1. Create a Supabase project — either a hosted one at supabase.com, or your
|
||||
own self-hosted instance (Dokploy has a separate **Supabase** template you
|
||||
can deploy for this).
|
||||
2. On a machine with Node 20+, clone the Creed repo and push its schema to
|
||||
your project:
|
||||
```bash
|
||||
git clone https://github.com/connorhpbrn/creed.git
|
||||
cd creed && npm install
|
||||
supabase link --project-ref <your-project-ref>
|
||||
supabase db push
|
||||
```
|
||||
3. From Project Settings -> API in your Supabase dashboard, copy the
|
||||
project URL, the publishable (anon) key, and the secret (service_role)
|
||||
key.
|
||||
|
||||
## Required environment variables
|
||||
|
||||
Fill these in on the **Environment** tab before the first deploy, then
|
||||
redeploy:
|
||||
|
||||
- `NEXT_PUBLIC_SUPABASE_URL`: your Supabase project URL.
|
||||
- `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY`: the Supabase anon/publishable key.
|
||||
- `SUPABASE_SECRET_KEY`: the Supabase service_role/secret key. Server-only,
|
||||
never exposed to the browser.
|
||||
- `CREED_ENCRYPTION_SECRET` is generated for you (used to encrypt provider
|
||||
tokens at rest).
|
||||
- `NEXT_PUBLIC_SITE_URL` is set to this service's domain automatically.
|
||||
|
||||
The app boots with only these set, but sign-in, AI features, and billing
|
||||
stay disabled until their own variables are configured.
|
||||
|
||||
## Optional integrations
|
||||
|
||||
- **Stripe** (paid plans): `STRIPE_SECRET_KEY`, `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY`,
|
||||
`STRIPE_WEBHOOK_SECRET`. Create a webhook endpoint at
|
||||
`https://<your-domain>/api/stripe/webhook` in the Stripe dashboard for the
|
||||
signing secret.
|
||||
- **OpenRouter** (managed AI credits): `OPENROUTER_PLATFORM_KEY` from
|
||||
https://openrouter.ai/keys. `ANALYSIS_MODEL`, `TAB_MODEL`, `PANEL_MODEL`
|
||||
override the default model per AI feature and can be left blank.
|
||||
- **Resend** (Company invite emails): `RESEND_API_KEY` and
|
||||
`RESEND_FROM_EMAIL` (must be on a domain verified in Resend).
|
||||
- **GitHub OAuth** (repo sync, not sign-in): create an OAuth App at
|
||||
https://github.com/settings/developers with callback URL
|
||||
`https://<your-domain>/auth/github/callback`, then set
|
||||
`GITHUB_OAUTH_CLIENT_ID` and `GITHUB_OAUTH_CLIENT_SECRET`.
|
||||
- `CREED_CSP_ENFORCE=1` switches the Content-Security-Policy header from
|
||||
report-only to enforcing. Leave it unset for at least one deploy cycle so
|
||||
you can check the browser console for violations first.
|
||||
|
||||
## Notes
|
||||
|
||||
- This template builds the image from the Creed GitHub repository during
|
||||
deployment; the first deploy can take a few minutes.
|
||||
- The app itself is stateless — all data lives in Supabase, so there are no
|
||||
volumes to back up here.
|
||||
"""
|
||||
@@ -6,8 +6,8 @@
|
||||
"logo": "image.png",
|
||||
"links": {
|
||||
"github": "https://github.com/sergi0g/cup",
|
||||
"website": "https://cup.sergi0g.dev/",
|
||||
"docs": "https://cup.sergi0g.dev/docs"
|
||||
"website": "https://cup.sh",
|
||||
"docs": "https://github.com/sergi0g/cup"
|
||||
},
|
||||
"tags": [
|
||||
"docker",
|
||||
|
||||
@@ -2,10 +2,16 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "cup"
|
||||
port = 8000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "cup"
|
||||
source = "/var/run/docker.sock"
|
||||
target = "/var/run/docker.sock"
|
||||
type = "bind"
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,27 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
databasement:
|
||||
image: davidcrty/databasement:1.8.4
|
||||
restart: unless-stopped
|
||||
expose:
|
||||
- 2226
|
||||
environment:
|
||||
- APP_KEY=${APP_KEY}
|
||||
- APP_URL=${APP_URL}
|
||||
- DB_CONNECTION=sqlite
|
||||
- DB_DATABASE=/data/database.sqlite
|
||||
- ENABLE_QUEUE_WORKER=true
|
||||
- TRUSTED_PROXIES=*
|
||||
- LOG_CHANNEL=stderr
|
||||
- APP_DISPLAY_TIMEZONE=${APP_DISPLAY_TIMEZONE}
|
||||
volumes:
|
||||
- databasement-data:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-f", "http://localhost:2226/health"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 60s
|
||||
|
||||
volumes:
|
||||
databasement-data:
|
||||
@@ -1,19 +0,0 @@
|
||||
{
|
||||
"id": "databasement",
|
||||
"name": "Databasement",
|
||||
"version": "1.8.4",
|
||||
"description": "Self-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite, Firebird and Redis to S3, SFTP, Samba or local storage. SSH tunnel support.",
|
||||
"logo": "databasement.png",
|
||||
"links": {
|
||||
"github": "https://github.com/David-Crty/databasement",
|
||||
"website": "https://david-crty.github.io/databasement/",
|
||||
"docs": "https://david-crty.github.io/databasement/self-hosting/docker"
|
||||
},
|
||||
"tags": [
|
||||
"backup",
|
||||
"database",
|
||||
"mysql",
|
||||
"postgres",
|
||||
"mongodb"
|
||||
]
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
app_key = "${base64:32}"
|
||||
timezone = "UTC"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"APP_KEY=base64:${app_key}",
|
||||
"APP_URL=https://${main_domain}",
|
||||
"APP_DISPLAY_TIMEZONE=${timezone}",
|
||||
"TRUSTED_PROXIES=*",
|
||||
"LOG_CHANNEL=stderr",
|
||||
"DB_CONNECTION=sqlite",
|
||||
"DB_DATABASE=/data/database.sqlite",
|
||||
"ENABLE_QUEUE_WORKER=true"
|
||||
]
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "databasement"
|
||||
port = 2226
|
||||
host = "${main_domain}"
|
||||
@@ -23,6 +23,7 @@ services:
|
||||
- us
|
||||
|
||||
data-api:
|
||||
container_name: datalens-data-api
|
||||
image: ghcr.io/datalens-tech/datalens-data-api:0.2192.0
|
||||
restart: always
|
||||
environment:
|
||||
@@ -42,6 +43,7 @@ services:
|
||||
- pg-compeng
|
||||
|
||||
pg-us:
|
||||
container_name: datalens-pg-us
|
||||
image: postgres:16-alpine
|
||||
restart: always
|
||||
environment:
|
||||
@@ -73,8 +75,8 @@ services:
|
||||
datalens:
|
||||
image: ghcr.io/datalens-tech/datalens-ui:0.2601.0
|
||||
restart: always
|
||||
expose:
|
||||
- 8080 # web UI — routed through Traefik via the template domain
|
||||
ports:
|
||||
- ${UI_PORT:-8080}:8080
|
||||
depends_on:
|
||||
- us
|
||||
- control-api
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
services:
|
||||
dexio:
|
||||
image: ghcr.io/dexio-wiki/dexio:1.0.0
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- DEXIO_PUBLIC_URL=${DEXIO_PUBLIC_URL}
|
||||
- DEXIO_SECRET_KEY=${DEXIO_SECRET_KEY}
|
||||
- DEXIO_DB=/data/dexio.db
|
||||
- DEXIO_FILES_DIR=/data/files
|
||||
expose:
|
||||
- 8080
|
||||
volumes:
|
||||
- dexio-data:/data
|
||||
|
||||
volumes:
|
||||
dexio-data:
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-769 -852 1567 1567"><!-- Dexio mark: a small graph, hub and four nodes. Built by brand/build.py. --><rect x="-769" y="-852" width="1567" height="1567" rx="345" fill="#000000"/><path d="M79.9 0.0L20.4 -475.2L-20.4 -475.2L-79.9 0.0ZM29.1 74.4L498.1 -173.2L483.3 -211.2L-29.1 -74.4ZM-52.3 60.3L392.4 367.4L419.0 336.6L52.3 -60.3ZM-33.6 -72.5L-462.2 191.8L-445.0 228.8L33.6 72.5Z" fill="#ffffff"/><circle cx="0.0" cy="-475.2" r="87.6" fill="#ffffff"/><circle cx="490.7" cy="-192.2" r="87.6" fill="#ffffff"/><circle cx="405.7" cy="352.0" r="74.5" fill="#ffffff"/><circle cx="-453.6" cy="210.3" r="96.4" fill="#ffffff"/><circle cx="0.0" cy="0.0" r="166.5" fill="#38bdf8"/></svg>
|
||||
|
Before Width: | Height: | Size: 723 B |
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"id": "dexio",
|
||||
"name": "Dexio",
|
||||
"version": "1.0.0",
|
||||
"description": "One wiki for all your agents. AI agents read and write linked markdown pages over MCP from any machine, and people see what they know in a web app: the link graph, every page and its history.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/dexio-wiki/dexio",
|
||||
"website": "https://dexio.wiki",
|
||||
"docs": "https://github.com/dexio-wiki/dexio/blob/main/deploy/README.md"
|
||||
},
|
||||
"tags": [
|
||||
"wiki",
|
||||
"knowledge-base",
|
||||
"markdown",
|
||||
"mcp",
|
||||
"ai",
|
||||
"agents"
|
||||
]
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
secret_key = "${password:64}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"DEXIO_PUBLIC_URL=https://${main_domain}",
|
||||
"DEXIO_SECRET_KEY=${secret_key}",
|
||||
]
|
||||
|
||||
# Dexio's session cookie is HTTPS-only, so the domain asks for a certificate.
|
||||
[[config.domains]]
|
||||
serviceName = "dexio"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
https = true
|
||||
certificateType = "letsencrypt"
|
||||
@@ -1,77 +0,0 @@
|
||||
# ============================================================================
|
||||
# Didacta Community — blueprint de Dokploy
|
||||
# ----------------------------------------------------------------------------
|
||||
# Formato de `blueprints/<id>/docker-compose.yml` del repositorio
|
||||
# Dokploy/templates. Reglas de esa casa que este fichero cumple:
|
||||
# - Sin `ports:` (el proxy de Dokploy entra por la red interna).
|
||||
# - Sin `container_name:` ni `networks:` (los gestiona Dokploy).
|
||||
# - `restart: unless-stopped` en todos los servicios.
|
||||
# - El nombre del servicio principal coincide con el id del blueprint.
|
||||
#
|
||||
# Las variables las inyecta Dokploy en un `.env` junto a este fichero a partir
|
||||
# de `[config.env]` de template.toml — de ahí el `env_file` de cada servicio.
|
||||
#
|
||||
# UN SOLO DOMINIO: el contenedor corre API (:4000) y web (:3000) juntos, y
|
||||
# Next.js reescribe `/api/*`, `/healthz` y `/readyz` al 4000 interno. El
|
||||
# dominio de template.toml apunta al 3000 y no hace falta nada más.
|
||||
# ============================================================================
|
||||
|
||||
services:
|
||||
didacta:
|
||||
image: ghcr.io/va360labs/didacta-community:0.0.1-alpha.107
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
expose:
|
||||
- 3000
|
||||
volumes:
|
||||
# Uploads de cursos, certificados y evidencias + la clave de cifrado
|
||||
# autogenerada. Es el volumen que hay que respaldar.
|
||||
- didacta-data:/app/data
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
healthcheck:
|
||||
test: ['CMD', 'curl', '-fsS', 'http://127.0.0.1:4000/healthz']
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
# El primer arranque aplica migraciones, RLS y grants antes de servir.
|
||||
start_period: 120s
|
||||
|
||||
postgres:
|
||||
# pgvector NO es opcional: la migración baseline hace
|
||||
# `CREATE EXTENSION "vector"` y falla contra un postgres:16 estándar.
|
||||
image: pgvector/pgvector:pg16
|
||||
restart: unless-stopped
|
||||
env_file:
|
||||
- .env
|
||||
volumes:
|
||||
- didacta-postgres-data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ['CMD-SHELL', 'pg_isready -U "$$POSTGRES_USER" -d "$$POSTGRES_DB"']
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
restart: unless-stopped
|
||||
command: redis-server --appendonly yes
|
||||
volumes:
|
||||
- didacta-redis-data:/data
|
||||
healthcheck:
|
||||
test: ['CMD', 'redis-cli', 'ping']
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
|
||||
volumes:
|
||||
didacta-data:
|
||||
driver: local
|
||||
didacta-postgres-data:
|
||||
driver: local
|
||||
didacta-redis-data:
|
||||
driver: local
|
||||
|
Before Width: | Height: | Size: 32 KiB |
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"id": "didacta",
|
||||
"name": "Didacta",
|
||||
"version": "0.0.1-alpha.107",
|
||||
"description": "Didacta is a fair-code, self-hosted learning platform (LMS) with multi-tenant isolation, a public course catalog, enrollment flows, gamification and a module marketplace.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/va360labs/didacta-io",
|
||||
"website": "https://didacta.io",
|
||||
"docs": "https://docs.didacta.io"
|
||||
},
|
||||
"tags": ["education", "lms", "elearning", "courses"]
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
# ============================================================================
|
||||
# Didacta Community — configuración del blueprint de Dokploy
|
||||
# ----------------------------------------------------------------------------
|
||||
# Dokploy resuelve los helpers de [variables], escribe [config.env] en un .env
|
||||
# junto al docker-compose.yml y publica el dominio de [[config.domains]].
|
||||
#
|
||||
# Helpers disponibles: ${domain}, ${password:N}, ${base64:N}, ${hash:N},
|
||||
# ${uuid}, ${randomPort}, ${email}, ${username}, ${timestamp}.
|
||||
# ============================================================================
|
||||
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
# 64 caracteres sin símbolos: firma las sesiones. Rotarlo echa a todo el mundo.
|
||||
auth_secret = "${password:64}"
|
||||
# Token de un solo uso del alta inicial. Va en una URL, así que sin símbolos.
|
||||
setup_token = "${password:32}"
|
||||
# Va dentro de la cadena de conexión de Postgres: sin símbolos a propósito.
|
||||
postgres_password = "${password:32}"
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "didacta"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
[config.env]
|
||||
NODE_ENV = "production"
|
||||
# Debe coincidir SIEMPRE con el tag de la imagen del docker-compose.yml.
|
||||
DIDACTA_CORE_VERSION = "0.0.1-alpha.107"
|
||||
|
||||
# Base absoluta de los enlaces que salen por correo (verificación de email,
|
||||
# invitaciones, recordatorios). Sin esto los correos llevan enlaces rotos.
|
||||
WEB_PUBLIC_URL = "https://${main_domain}"
|
||||
WEB_PUBLIC_ALLOWED_HOSTS = "${main_domain}"
|
||||
|
||||
# Credenciales del Postgres del propio blueprint. El servicio `postgres` las
|
||||
# lee del mismo .env para inicializar el cluster.
|
||||
POSTGRES_USER = "didacta"
|
||||
POSTGRES_PASSWORD = "${postgres_password}"
|
||||
POSTGRES_DB = "didacta"
|
||||
|
||||
# Conexión de BOOTSTRAP (superusuario). Se usa solo para migraciones, RLS y
|
||||
# grants — nunca para servir tráfico. El entrypoint deriva de aquí la conexión
|
||||
# de runtime hacia el rol `didacta_app` (NOBYPASSRLS), que es lo que hace real
|
||||
# el aislamiento entre tenants. Por eso NO se define DATABASE_URL.
|
||||
ADMIN_DATABASE_URL = "postgresql://didacta:${postgres_password}@postgres:5432/didacta?schema=public"
|
||||
REDIS_URL = "redis://redis:6379"
|
||||
|
||||
AUTH_SECRET = "${auth_secret}"
|
||||
# Fijarlo evita tener que buscar el token en los logs: el alta se hace en
|
||||
# https://<dominio>/setup?token=<este valor>.
|
||||
DIDACTA_SETUP_TOKEN = "${setup_token}"
|
||||
|
||||
# Puertos INTERNOS fijos. No tocar: el dominio apunta al 3000 y el healthcheck
|
||||
# al 4000.
|
||||
API_PORT = "4000"
|
||||
WEB_PORT = "3000"
|
||||
|
||||
# Almacenamiento local sobre el volumen persistente `didacta-data`. Para S3
|
||||
# (AWS, Hetzner, MinIO…): STORAGE_DRIVER=s3 y rellenar las S3_*.
|
||||
STORAGE_DRIVER = "local"
|
||||
STORAGE_ROOT = "/app/data/storage"
|
||||
|
||||
# SMTP: sin esto la instalación arranca igual, avisa por la interfaz y no puede
|
||||
# mandar correos. Rellenar desde el panel de Dokploy después del despliegue.
|
||||
SMTP_HOST = ""
|
||||
SMTP_PORT = "587"
|
||||
SMTP_USER = ""
|
||||
SMTP_PASS = ""
|
||||
SMTP_SECURE = "false"
|
||||
SMTP_FROM = ""
|
||||
|
||||
# Licencia Enterprise (opcional). Vacío = edición Community.
|
||||
DIDACTA_LICENSE_KEY = ""
|
||||
|
||||
# TENANT_SETTINGS_ENC_KEY se deja SIN definir a propósito: la app genera una
|
||||
# clave hex de 32 bytes en el primer arranque y la persiste en el volumen
|
||||
# `didacta-data`. Definirla con un helper que no produzca exactamente 64
|
||||
# caracteres hexadecimales rompería el cifrado de secretos (SSO, SMTP por
|
||||
# tenant, Stripe) de forma silenciosa.
|
||||
@@ -2,7 +2,6 @@
|
||||
app_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "directory-lister" # Must match the service name in docker-compose.yml
|
||||
port = 80
|
||||
@@ -16,3 +15,5 @@ READMES_FIRST = "false"
|
||||
ZIP_DOWNLOADS = "true"
|
||||
TIMEZONE = "UTC"
|
||||
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
dockroute:
|
||||
image: ghcr.io/dockroute/dockroute:0.2.0
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- DOCKROUTE_PROVIDER=${DOCKROUTE_PROVIDER}
|
||||
- DOCKROUTE_OWNER_ID=${DOCKROUTE_OWNER_ID}
|
||||
- DOCKROUTE_POLICY=${DOCKROUTE_POLICY}
|
||||
- DOCKROUTE_DEFAULT_TARGET=${DOCKROUTE_DEFAULT_TARGET}
|
||||
- DOCKROUTE_DOMAIN_FILTER=${DOCKROUTE_DOMAIN_FILTER}
|
||||
- CLOUDFLARE_API_TOKEN=${CLOUDFLARE_API_TOKEN}
|
||||
- CLOUDFLARE_ACCOUNT_ID=${CLOUDFLARE_ACCOUNT_ID}
|
||||
- CLOUDFLARE_TUNNEL_ID=${CLOUDFLARE_TUNNEL_ID}
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
|
Before Width: | Height: | Size: 691 KiB |
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"id": "dockroute",
|
||||
"name": "DockRoute",
|
||||
"version": "0.2.0",
|
||||
"description": "External-DNS for plain Docker hosts: watches container labels and reconciles DNS records and Cloudflare Tunnel routes, never touching records it cannot prove it manages.",
|
||||
"logo": "dockroute.png",
|
||||
"links": {
|
||||
"github": "https://github.com/Dockroute/Dockroute",
|
||||
"website": "https://www.dockroute.dev",
|
||||
"docs": "https://www.dockroute.dev"
|
||||
},
|
||||
"tags": [
|
||||
"dns",
|
||||
"networking",
|
||||
"automation"
|
||||
]
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
variables = {}
|
||||
|
||||
[config]
|
||||
domains = []
|
||||
mounts = []
|
||||
|
||||
[config.env]
|
||||
DOCKROUTE_PROVIDER = "log"
|
||||
DOCKROUTE_OWNER_ID = "default"
|
||||
DOCKROUTE_POLICY = "sync"
|
||||
DOCKROUTE_DEFAULT_TARGET = ""
|
||||
DOCKROUTE_DOMAIN_FILTER = ""
|
||||
CLOUDFLARE_API_TOKEN = ""
|
||||
CLOUDFLARE_ACCOUNT_ID = ""
|
||||
CLOUDFLARE_TUNNEL_ID = ""
|
||||
@@ -6,8 +6,8 @@
|
||||
"logo": "docling-serve.png",
|
||||
"links": {
|
||||
"github": "https://github.com/docling-project/docling-serve",
|
||||
"website": "",
|
||||
"docs": "https://github.com/docling-project/docling-serve/blob/main/docs/README.md",
|
||||
"website": "https://docling-project.github.io/docling-serve/",
|
||||
"docs": "https://docling-project.github.io/docling-serve/",
|
||||
"dockerhub": "https://quay.io/repository/docling-project/docling-serve"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "docling-serve"
|
||||
port = 5001
|
||||
@@ -12,3 +11,5 @@ host = "${main_domain}"
|
||||
DOCLING_SERVE_ENABLE_UI = "1"
|
||||
DOCLING_SERVE_HOST = "0.0.0.0"
|
||||
DOCLING_SERVE_PORT = "5001"
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -3,7 +3,6 @@ main_domain = "${domain}"
|
||||
pg_password = "${password:32}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "app"
|
||||
port = 3000
|
||||
@@ -27,3 +26,8 @@ DL_PG_NAME = "domain_locker"
|
||||
# DL_DOMAIN_INFO_API = ""
|
||||
# DL_DOMAIN_SUBS_API = ""
|
||||
# DL_DISABLE_WRITE_METHODS = "false"
|
||||
|
||||
[[config.mounts]]
|
||||
# Example mount for PostgreSQL persistence (already defined in compose volumes)
|
||||
# filePath = "/var/lib/postgresql/data"
|
||||
# content = ""
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"logo": "doublezero.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/technomancy-dev/00",
|
||||
"website": "",
|
||||
"website": "https://www.double-zero.cloud/",
|
||||
"docs": "https://github.com/technomancy-dev/00"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"links": {
|
||||
"github": "https://github.com/amir20/dozzle",
|
||||
"website": "https://dozzle.dev",
|
||||
"docs": "https://dozzle.dev/guide/what-is-dozzle"
|
||||
"docs": "https://dozzle.dev/docs"
|
||||
},
|
||||
"tags": [
|
||||
"monitoring",
|
||||
|
||||
@@ -3,7 +3,6 @@ main_domain = "${domain}"
|
||||
docker_socket = "/var/run/docker.sock"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "dozzle"
|
||||
port = 8080
|
||||
@@ -12,3 +11,8 @@ host = "${main_domain}"
|
||||
[config.env]
|
||||
DOZZLE_USERNAME = "${username}"
|
||||
DOZZLE_PASSWORD = "${password:16}"
|
||||
|
||||
[[config.mounts]]
|
||||
source = "${docker_socket}"
|
||||
target = "/var/run/docker.sock"
|
||||
read_only = true
|
||||
|
||||
@@ -4,8 +4,8 @@ services:
|
||||
image: 'docker.dragonflydb.io/dragonflydb/dragonfly'
|
||||
ulimits:
|
||||
memlock: -1
|
||||
expose:
|
||||
- 6379
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- dragonflydata:/data
|
||||
environment:
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
"logo": "drawio.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/jgraph/drawio",
|
||||
"website": "https://www.drawio.com/",
|
||||
"docs": "https://www.drawio.com/docs/"
|
||||
"website": "https://draw.io/",
|
||||
"docs": "https://www.drawio.com/doc/"
|
||||
},
|
||||
"tags": [
|
||||
"drawing",
|
||||
|
||||
@@ -5,10 +5,9 @@
|
||||
"description": "Drawnix is an application for generating and managing visual content, powered by pubuzhixing/drawnix Docker image.",
|
||||
"logo": "image.png",
|
||||
"links": {
|
||||
"github": "https://github.com/plait-board/drawnix/",
|
||||
"website": "https://drawnix.com/",
|
||||
"docs": "https://github.com/plait-board/drawnix/blob/develop/README_en.md#docker",
|
||||
"dockerhub": "https://hub.docker.com/r/pubuzhixing/drawnix"
|
||||
"github": "https://github.com/pubuzhixing/drawnix",
|
||||
"website": "https://hub.docker.com/r/pubuzhixing/drawnix",
|
||||
"docs": "https://hub.docker.com/r/pubuzhixing/drawnix"
|
||||
},
|
||||
"tags": [
|
||||
"visualization",
|
||||
|
||||
@@ -8,6 +8,12 @@ services:
|
||||
MASTERPASS: ${MASTERPASS}
|
||||
volumes:
|
||||
- drizzle-gateway:/app
|
||||
networks:
|
||||
- dokploy-network
|
||||
|
||||
volumes:
|
||||
drizzle-gateway:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"description": "Drizzle Gateway is a self-hosted database gateway that allows you to connect to your databases from anywhere.",
|
||||
"logo": "drizzle-gateway.svg",
|
||||
"links": {
|
||||
"github": "",
|
||||
"website": "https://gateway.drizzle.team/",
|
||||
"docs": "https://gateway.drizzle.team/docs/railway"
|
||||
"github": "https://github.com/drizzle-team/drizzle-gateway",
|
||||
"website": "https://drizzle-team.github.io/",
|
||||
"docs": "https://drizzle-team.github.io/docs"
|
||||
},
|
||||
"tags": [
|
||||
"database",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/dumbwareio/dumbassets",
|
||||
"website": "https://dumbware.io/DumbAssets/",
|
||||
"website": "https://www.dumbware.io/software/DumbAssets/",
|
||||
"docs": "https://github.com/dumbwareio/dumbassets"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -3,7 +3,6 @@ main_domain = "${domain}"
|
||||
default_pin = "${password:4}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "dumbassets"
|
||||
port = 3000
|
||||
@@ -20,3 +19,9 @@ DEMO_MODE = "false"
|
||||
APPRISE_URL = ""
|
||||
CURRENCY_CODE = "USD"
|
||||
CURRENCY_LOCALE = "en-US"
|
||||
|
||||
[[config.mounts]]
|
||||
serviceName = "dumbassets"
|
||||
type = "volume"
|
||||
source = "dumbassets-data"
|
||||
target = "/app/data"
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
"description": "DumbBudget is a simple, self-hosted budget tracking service with PIN protection and no database required.",
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/DumbWareio/DumbBudget",
|
||||
"website": "https://dumbware.io/DumbBudget",
|
||||
"docs": "https://github.com/DumbWareio/DumbBudget/blob/main/README.md"
|
||||
"github": "https://github.com/dumbwareio/dumbbudget",
|
||||
"website": "https://www.dumbware.io/software/DumbBudget/",
|
||||
"docs": "https://github.com/dumbwareio/dumbbudget"
|
||||
},
|
||||
"tags": [
|
||||
"budget",
|
||||
|
||||
@@ -4,7 +4,6 @@ main_domain = "${domain}"
|
||||
dumbbudget_pin = "${password:16}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "dumbbudget"
|
||||
port = 3000
|
||||
@@ -21,4 +20,5 @@ ALLOWED_ORIGINS = "${main_domain}"
|
||||
|
||||
# The named volume 'dumbbudget-data' is defined in the docker-compose.yml.
|
||||
# According to Dokploy's template examples, volumes declared in the compose
|
||||
# file are automatically managed and do not require a separate entry here.
|
||||
# file are automatically managed and do not require a separate entry here.
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/dumbwareio/dumbdrop",
|
||||
"website": "https://dumbware.io/DumbDrop/",
|
||||
"website": "https://www.dumbware.io/software/DumbDrop/",
|
||||
"docs": "https://github.com/dumbwareio/dumbdrop"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
main_domain = "https://${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "dumbdrop"
|
||||
port = 3000
|
||||
@@ -21,3 +20,5 @@ APPRISE_URL = ""
|
||||
APPRISE_MESSAGE = "New file uploaded {filename} ({size}), Storage used {storage}"
|
||||
APPRISE_SIZE_UNIT = "Auto"
|
||||
ALLOWED_EXTENSIONS = ""
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
"logo": "logo.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/dumbwareio/dumbpad",
|
||||
"website": "https://dumbware.io/DumbPad/",
|
||||
"website": "https://www.dumbware.io/software/DumbPad/",
|
||||
"docs": "https://github.com/dumbwareio/dumbpad"
|
||||
},
|
||||
"tags": [
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "dumbpad"
|
||||
port = 3000
|
||||
@@ -18,3 +17,5 @@ LOCKOUT_TIME = "15"
|
||||
MAX_ATTEMPTS = "5"
|
||||
COOKIE_MAX_AGE = "24"
|
||||
PAGE_HISTORY_COOKIE_AGE = "365"
|
||||
|
||||
[[config.mounts]]
|
||||
|
||||
@@ -3,6 +3,7 @@ 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
|
||||
@@ -19,6 +20,7 @@ services:
|
||||
|
||||
kibana:
|
||||
image: docker.elastic.co/kibana/kibana:8.10.2
|
||||
container_name: kibana
|
||||
environment:
|
||||
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
|
||||
expose:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"links": {
|
||||
"github": "https://github.com/elastic/elasticsearch",
|
||||
"website": "https://www.elastic.co/elasticsearch/",
|
||||
"docs": "https://www.elastic.co/docs/solutions/search"
|
||||
"docs": "https://docs.elastic.co/elasticsearch/"
|
||||
},
|
||||
"tags": [
|
||||
"search",
|
||||
|
||||
@@ -21,6 +21,10 @@ services:
|
||||
volumes:
|
||||
- emqx_data:/opt/emqx/data
|
||||
- emqx_log:/opt/emqx/log
|
||||
networks:
|
||||
dokploy-network:
|
||||
aliases:
|
||||
- emqx-service
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "/opt/emqx/bin/emqx_ctl", "status"]
|
||||
@@ -48,3 +52,7 @@ services:
|
||||
volumes:
|
||||
emqx_data:
|
||||
emqx_log:
|
||||
|
||||
networks:
|
||||
dokploy-network:
|
||||
external: true
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# dokploy: allow-host-ports — Enshrouded game clients connect over raw UDP (15637 game, 27015 Steam query); Traefik cannot route UDP game traffic.
|
||||
services:
|
||||
enshrouded:
|
||||
image: mornedhels/enshrouded-server:latest
|
||||
container_name: enshrouded
|
||||
hostname: enshrouded
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 90s
|
||||
|
||||
@@ -10,6 +10,8 @@ services:
|
||||
<<: *custom_image
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -40,6 +42,8 @@ services:
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
healthcheck:
|
||||
test:
|
||||
@@ -59,6 +63,8 @@ services:
|
||||
- default
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -81,6 +87,8 @@ services:
|
||||
- long
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -103,6 +111,8 @@ services:
|
||||
- short
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -135,6 +145,8 @@ services:
|
||||
required: true
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
websocket:
|
||||
<<: *custom_image
|
||||
@@ -155,6 +167,8 @@ services:
|
||||
required: true
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
configurator:
|
||||
<<: *custom_image
|
||||
@@ -183,6 +197,8 @@ services:
|
||||
REGENERATE_APPS_TXT: "${REGENERATE_APPS_TXT:-0}"
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
create-site:
|
||||
<<: *custom_image
|
||||
@@ -221,6 +237,8 @@ services:
|
||||
DB_PORT: "${DB_PORT:-3306}"
|
||||
DB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||
INSTALL_APP_ARGS: ${INSTALL_APP_ARGS}
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
migration:
|
||||
<<: *custom_image
|
||||
@@ -240,6 +258,8 @@ services:
|
||||
bench --site all set-config -p pause_scheduler 0;
|
||||
volumes:
|
||||
- sites:/home/frappe/frappe-bench/sites
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
db:
|
||||
image: mariadb:10.6
|
||||
@@ -262,6 +282,8 @@ services:
|
||||
- MARIADB_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
|
||||
volumes:
|
||||
- db-data:/var/lib/mysql
|
||||
networks:
|
||||
- bench-network
|
||||
|
||||
redis-cache:
|
||||
deploy:
|
||||
@@ -270,6 +292,8 @@ services:
|
||||
image: redis:6.2-alpine
|
||||
volumes:
|
||||
- redis-cache-data:/data
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -286,6 +310,8 @@ services:
|
||||
image: redis:6.2-alpine
|
||||
volumes:
|
||||
- redis-queue-data:/data
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -302,6 +328,8 @@ services:
|
||||
image: redis:6.2-alpine
|
||||
volumes:
|
||||
- redis-socketio-data:/data
|
||||
networks:
|
||||
- bench-network
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
@@ -321,3 +349,6 @@ volumes:
|
||||
type: "${SITE_VOLUME_TYPE}"
|
||||
o: "${SITE_VOLUME_OPTS}"
|
||||
device: "${SITE_VOLUME_DEV}"
|
||||
|
||||
networks:
|
||||
bench-network:
|
||||
|
||||
@@ -1,253 +0,0 @@
|
||||
# Ethora Core as a Dokploy template. GENERATED FILE: edit the bundle's
|
||||
# deploy/compose/docker-compose.yml and run build-template.sh.
|
||||
#
|
||||
# Same services and start order as the bundle (config -> databases -> xmpp ->
|
||||
# api, jobs -> init -> frontend), without the bundled Caddy: Dokploy's Traefik
|
||||
# routes the four public hosts declared in template.toml. The scripts and
|
||||
# templates are the template's mounts, which Dokploy writes under ../files/.
|
||||
# Every variable comes from the .env Dokploy writes next to this file
|
||||
# (template.toml, [config] env). See README.md in this directory.
|
||||
|
||||
x-logging: &logging
|
||||
logging:
|
||||
driver: json-file
|
||||
options:
|
||||
max-size: "20m"
|
||||
max-file: "5"
|
||||
|
||||
x-api: &api
|
||||
image: ${ETHORA_API_IMAGE:-docker.io/dappros/ethora-api:2610}
|
||||
entrypoint: ["tini", "--", "bash", "/ethora/scripts/api-entrypoint.sh"]
|
||||
volumes:
|
||||
- config:/ethora/config:ro
|
||||
- ../files/scripts:/ethora/scripts:ro
|
||||
<<: *logging
|
||||
|
||||
services:
|
||||
# ---------------------------------------------------------------- config --
|
||||
config:
|
||||
image: ${ETHORA_XMPP_IMAGE:-docker.io/dappros/ethora-xmpp:2610}
|
||||
user: "0:0"
|
||||
entrypoint: ["/bin/sh", "/ethora/scripts/render-config.sh"]
|
||||
# Every value in .env reaches the renderer, so any variable of the
|
||||
# installer's templates (POSTMARK_*, EMAIL_TLD_*, RATE_LIMIT_*, ...) can
|
||||
# be set there. The hosts are derived here once, for caddy and xmpp too.
|
||||
env_file:
|
||||
- path: .env
|
||||
required: false
|
||||
environment:
|
||||
ROOT_DOMAIN: ${ROOT_DOMAIN:?ROOT_DOMAIN is not set; run ./configure.sh or fill in .env}
|
||||
API_DOMAIN: ${API_DOMAIN:-api.${ROOT_DOMAIN}}
|
||||
WEB_DOMAIN: ${WEB_DOMAIN:-app.${ROOT_DOMAIN}}
|
||||
XMPP_DOMAIN: ${XMPP_DOMAIN:-xmpp.${ROOT_DOMAIN}}
|
||||
FILES_DOMAIN: ${FILES_DOMAIN:-files.${ROOT_DOMAIN}}
|
||||
volumes:
|
||||
- config:/out/config
|
||||
- mysql-initdb:/out/mysql-initdb
|
||||
- ../files/scripts:/ethora/scripts:ro
|
||||
- ../files/templates:/ethora/templates:ro
|
||||
restart: "no"
|
||||
<<: *logging
|
||||
|
||||
# ------------------------------------------------------------- databases --
|
||||
mongo:
|
||||
image: mongo:6.0.8
|
||||
command: ["mongod", "--replSet", "rs0", "--bind_ip_all"]
|
||||
volumes:
|
||||
- mongo:/data/db
|
||||
- mongo-config:/data/configdb
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
# A TCP connect, not mongosh: see docker-compose.enterprise.yml.
|
||||
test: ["CMD", "bash", "-c", "exec 3<>/dev/tcp/127.0.0.1/27017"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
<<: *logging
|
||||
|
||||
mongo-init:
|
||||
image: mongo:6.0.8
|
||||
entrypoint: ["bash", "/ethora/scripts/mongo-init.sh"]
|
||||
volumes:
|
||||
- ../files/scripts:/ethora/scripts:ro
|
||||
depends_on:
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
restart: "no"
|
||||
<<: *logging
|
||||
|
||||
mysql:
|
||||
image: mysql:8.1.0
|
||||
command: ["--default-authentication-plugin=mysql_native_password"]
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:?MYSQL_ROOT_PASSWORD is not set}
|
||||
# ejabberd connects as root from its own container (as on a host install).
|
||||
MYSQL_ROOT_HOST: "%"
|
||||
volumes:
|
||||
- mysql:/var/lib/mysql
|
||||
- mysql-initdb:/docker-entrypoint-initdb.d:ro
|
||||
depends_on:
|
||||
config:
|
||||
condition: service_completed_successfully
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mysqladmin ping -h 127.0.0.1 -uroot -p\"$$MYSQL_ROOT_PASSWORD\" --silent"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
start_period: 30s
|
||||
<<: *logging
|
||||
|
||||
redis:
|
||||
image: redis:7.4-alpine
|
||||
volumes:
|
||||
- redis:/data
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
<<: *logging
|
||||
|
||||
minio:
|
||||
# Our unmodified copy of the MinIO release every install runs (AGPL-3.0);
|
||||
# MinIO withdrew its public images. Set MINIO_IMAGE for a private mirror.
|
||||
image: ${MINIO_IMAGE:-docker.io/dappros/minio:RELEASE.2025-09-07T16-13-09Z}
|
||||
command: ["server", "/data"]
|
||||
environment:
|
||||
MINIO_ROOT_USER: ${MINIO_ROOT_USER:?MINIO_ROOT_USER is not set}
|
||||
MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:?MINIO_ROOT_PASSWORD is not set}
|
||||
volumes:
|
||||
- minio:/data
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "-fsS", "http://127.0.0.1:9000/minio/health/live"]
|
||||
interval: 15s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
<<: *logging
|
||||
|
||||
centrifugo:
|
||||
image: centrifugo/centrifugo:v6
|
||||
command: ["centrifugo", "-c", "/ethora/config/centrifugo/config.json"]
|
||||
volumes:
|
||||
- config:/ethora/config:ro
|
||||
depends_on:
|
||||
config:
|
||||
condition: service_completed_successfully
|
||||
ulimits:
|
||||
nofile:
|
||||
soft: 65535
|
||||
hard: 65535
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:8000/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 3
|
||||
start_period: 10s
|
||||
<<: *logging
|
||||
|
||||
# ------------------------------------------------------------------ xmpp --
|
||||
xmpp:
|
||||
image: ${ETHORA_XMPP_IMAGE:-docker.io/dappros/ethora-xmpp:2610}
|
||||
entrypoint: ["/bin/sh", "/ethora/scripts/xmpp-start.sh"]
|
||||
environment:
|
||||
XMPP_DOMAIN: ${XMPP_DOMAIN:-xmpp.${ROOT_DOMAIN}}
|
||||
XMPP_ADMIN_PASSWORD: ${XMPP_ADMIN_PASSWORD:?XMPP_ADMIN_PASSWORD is not set}
|
||||
volumes:
|
||||
- config:/ethora/config:ro
|
||||
- ../files/scripts:/ethora/scripts:ro
|
||||
# Native XMPP clients (port 5222) are not exposed by default; web and SDK
|
||||
# clients connect over wss://xmpp.<root>/ws through caddy. See README.md.
|
||||
depends_on:
|
||||
config:
|
||||
condition: service_completed_successfully
|
||||
mysql:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
# Healthy once ejabberd runs AND the admin account is ensured, which is
|
||||
# what the API and init need.
|
||||
test: ["CMD-SHELL", "test -f /tmp/ethora-admin-ready && /opt/ejabberd/bin/ejabberdctl status >/dev/null"]
|
||||
interval: 10s
|
||||
timeout: 10s
|
||||
retries: 30
|
||||
start_period: 30s
|
||||
<<: *logging
|
||||
|
||||
# ------------------------------------------------------------------- api --
|
||||
api:
|
||||
<<: *api
|
||||
command: ["api"]
|
||||
depends_on:
|
||||
config:
|
||||
condition: service_completed_successfully
|
||||
mongo-init:
|
||||
condition: service_completed_successfully
|
||||
redis:
|
||||
condition: service_healthy
|
||||
minio:
|
||||
condition: service_healthy
|
||||
xmpp:
|
||||
condition: service_started
|
||||
restart: unless-stopped
|
||||
# Healthcheck: the image's own (GET /v1/ping).
|
||||
|
||||
jobs:
|
||||
<<: *api
|
||||
command: ["jobs"]
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_healthy
|
||||
restart: unless-stopped
|
||||
healthcheck:
|
||||
disable: true
|
||||
|
||||
init:
|
||||
<<: *api
|
||||
command: ["init"]
|
||||
depends_on:
|
||||
api:
|
||||
condition: service_healthy
|
||||
xmpp:
|
||||
condition: service_healthy
|
||||
restart: "no"
|
||||
healthcheck:
|
||||
disable: true
|
||||
|
||||
# End-to-end check through the public URLs (scripts/verify.js):
|
||||
# docker compose --profile verify run --rm verify
|
||||
verify:
|
||||
<<: *api
|
||||
profiles: ["verify"]
|
||||
command: ["verify"]
|
||||
restart: "no"
|
||||
healthcheck:
|
||||
disable: true
|
||||
|
||||
# -------------------------------------------------------------- frontend --
|
||||
frontend:
|
||||
image: ${ETHORA_FRONTEND_IMAGE:-docker.io/dappros/ethora-frontend:2610}
|
||||
entrypoint: ["/bin/sh", "/ethora/scripts/frontend-start.sh"]
|
||||
command: ["serve"]
|
||||
volumes:
|
||||
- config:/ethora/config:ro
|
||||
- ../files/scripts:/ethora/scripts:ro
|
||||
depends_on:
|
||||
config:
|
||||
condition: service_completed_successfully
|
||||
restart: unless-stopped
|
||||
<<: *logging
|
||||
|
||||
volumes:
|
||||
# Your data. Survive `docker compose down`; `down -v` deletes them.
|
||||
mongo:
|
||||
mysql:
|
||||
minio:
|
||||
redis:
|
||||
# Regenerated on every start; safe to delete.
|
||||
mongo-config:
|
||||
config:
|
||||
mysql-initdb:
|
||||
@@ -1,4 +0,0 @@
|
||||
<svg width="40" height="40" viewBox="0 0 40 40" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.86612 16.7203C6.86612 11.5765 11.036 7.40666 16.1798 7.40666H29.941C30.6313 7.40666 31.191 7.9663 31.191 8.65666C31.191 12.8786 30.0116 15.9059 28.0999 18C26.2039 20.0767 23.7131 21.0979 21.3351 21.5628C18.9587 22.0273 16.6127 21.9536 14.884 21.773C14.0858 21.6896 13.4086 21.5822 12.9067 21.4898L9.38309 28.0216C9.52342 29.1887 10.517 30.0932 11.7219 30.0932H29.941C30.6313 30.0932 31.191 30.6529 31.191 31.3432C31.191 32.0336 30.6313 32.5932 29.941 32.5932H11.7219C9.04014 32.5932 6.86612 30.4192 6.86612 27.7374V16.7203ZM9.36612 22.7875L11.1495 19.4816C11.4215 18.9773 12.0015 18.7226 12.5568 18.8634L12.5579 18.8637L12.5626 18.8648L12.592 18.872C12.6198 18.8787 12.6635 18.8889 12.7221 18.9021C12.8393 18.9284 13.0159 18.9662 13.2434 19.0094C13.6987 19.096 14.3548 19.2041 15.1438 19.2865C16.7322 19.4525 18.8091 19.5092 20.8555 19.1092C22.9004 18.7095 24.8323 17.8712 26.2536 16.3144C27.4955 14.954 28.4459 12.9372 28.6501 9.90666H16.1798C12.4167 9.90666 9.36612 12.9572 9.36612 16.7203V22.7875Z" fill="#0052CD"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M29.786 2.5H10.214C5.95366 2.5 2.5 5.95366 2.5 10.214V29.786C2.5 34.0463 5.95366 37.5 10.214 37.5H29.786C34.0463 37.5 37.5 34.0463 37.5 29.786V10.214C37.5 5.95366 34.0463 2.5 29.786 2.5ZM10.214 0C4.57295 0 0 4.57295 0 10.214V29.786C0 35.4271 4.57295 40 10.214 40H29.786C35.4271 40 40 35.4271 40 29.786V10.214C40 4.57295 35.4271 0 29.786 0H10.214Z" fill="#0052CD"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"id": "ethora-core",
|
||||
"name": "Ethora Core",
|
||||
"version": "2610",
|
||||
"description": "Self-hosted chat and messaging server: API, web chat and admin panel, XMPP server (ejabberd) and file storage, with SDKs for web, iOS, Android and React Native.",
|
||||
"logo": "ethora.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/dappros/ethora-install",
|
||||
"website": "https://ethora.com/",
|
||||
"docs": "https://github.com/dappros/ethora-install/tree/main/deploy/compose"
|
||||
},
|
||||
"tags": [
|
||||
"chat",
|
||||
"self-hosted"
|
||||
]
|
||||
}
|
||||
@@ -5,9 +5,9 @@
|
||||
"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/evolution-foundation/evolution-api",
|
||||
"docs": "https://docs.evolutionfoundation.com.br/en",
|
||||
"website": "https://evolutionfoundation.com.br/"
|
||||
"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",
|
||||
|
||||
@@ -7,7 +7,6 @@ root_pass = "${password:32}"
|
||||
secret_key = "${password:64}"
|
||||
|
||||
[config]
|
||||
mounts = []
|
||||
[[config.domains]]
|
||||
serviceName = "ezbookkeeping"
|
||||
port = 8080
|
||||
@@ -28,3 +27,5 @@ EBK_DATABASE_PASSWD = "${db_pass}"
|
||||
EBK_LOG_MODE = "file"
|
||||
# Security secret key used for application protection
|
||||
EBK_SECURITY_SECRET_KEY = "${secret_key}"
|
||||
|
||||
[[config.mounts]]
|
||||
@@ -1,37 +0,0 @@
|
||||
version: "3.8"
|
||||
|
||||
services:
|
||||
falkordb:
|
||||
image: falkordb/falkordb:v4.20.4-alpine
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
- REDIS_ARGS=--requirepass ${FALKORDB_PASSWORD} --appendonly yes
|
||||
- FALKORDB_ARGS=MAX_QUEUED_QUERIES 25 TIMEOUT 1000 RESULTSET_SIZE 10000 IMPORT_FOLDER /app/.data/import
|
||||
- FALKORDB_PASSWORD=${FALKORDB_PASSWORD}
|
||||
- AUTH_URL=${AUTH_URL}
|
||||
- AUTH_SECRET=${AUTH_SECRET}
|
||||
- NEXTAUTH_URL=${AUTH_URL}
|
||||
- NEXTAUTH_SECRET=${AUTH_SECRET}
|
||||
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
|
||||
- ALLOWED_ORIGINS=${AUTH_URL}
|
||||
- TRUST_PROXY_HEADERS=true
|
||||
- CSV_STORAGE=local
|
||||
- CSV_LOCAL_TEMP_DIR=/app/.data/import
|
||||
- CSV_LOCAL_LOAD_URI_MODE=file
|
||||
- API_TOKEN_STORAGE_PATH=/app/.data/api_tokens.json
|
||||
volumes:
|
||||
- falkordb_data:/var/lib/falkordb/data
|
||||
- falkordb_browser_data:/app/.data
|
||||
expose:
|
||||
- 3000
|
||||
- 6379
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "REDISCLI_AUTH=$$FALKORDB_PASSWORD redis-cli ping | grep PONG"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
start_period: 10s
|
||||
|
||||
volumes:
|
||||
falkordb_data:
|
||||
falkordb_browser_data:
|
||||
@@ -1,17 +0,0 @@
|
||||
<svg width="508" height="508" viewBox="0 0 508 508" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0_1764_80)">
|
||||
<rect x="2" width="508" height="508" rx="63.5" fill="#191919"/>
|
||||
<path d="M459.448 247.263C459.06 249.273 458.295 251.265 457.465 253.036C456.174 255.775 454.477 258.357 452.439 260.598C447.809 265.671 441.271 268.253 434.576 269.608C427.88 270.964 407.573 270.088 399.089 268.041C377.481 262.821 355.182 262.941 341.966 268.05C333.583 271.296 330.651 273.15 326.224 276.968C308.711 292.027 300.872 328.455 293.919 349.897C289.188 364.56 284.549 379.823 273.925 391.378C257.565 409.149 230.332 414 205.635 414H97.1546C95.7989 414 94.7752 412.773 95.0427 411.436L97.588 398.35C99.6538 387.689 109.005 379.998 119.869 379.998H192.706C213.732 379.998 236.234 377.056 247.891 360.963C254.43 351.916 256.311 340.711 258.985 330.051C268.346 292.728 271.454 258.219 308.822 243.5C297.811 236.621 289.806 225.499 287.021 213.27C281.902 190.694 294.011 167.962 295.136 144.897C295.634 135.075 293.319 123.999 284.697 118.549C278.656 114.722 270.91 114.611 263.652 114.611C236.409 114.639 219.182 114.657 187.504 114.676H180.145C165.897 114.685 155.199 101.691 157.919 87.7101L158.685 83.7446C158.879 82.7209 159.745 82.0016 160.778 82.0016C177.637 82.0016 241.602 82.103 273.695 82.0016C292.222 81.9555 313.036 82.8224 325.579 95.7242C329.738 100.013 332.394 104.992 333.962 110.387C334.035 110.6 334.091 110.83 334.155 111.051C337.752 124.267 334.921 139.852 331.296 153.621C326.63 171.531 321.632 192.345 331.628 209.461C335.603 216.258 341.828 221.293 349.224 223.959C353.356 225.453 355.126 226.2 359.516 226.163C361.711 226.144 363.897 225.923 366.064 225.536C370.38 224.779 375.074 223.728 378.966 222.963C380.829 222.594 382.701 222.262 384.591 221.994C389.719 221.275 395.206 221.137 400.426 222.179C404.253 222.944 407.988 224.355 411.188 226.605C414.591 229.003 416.602 231.982 418.391 235.671C419.396 237.737 420.641 239.83 422.67 240.909C426.303 242.846 431.938 241.545 435.848 241.232C439.915 240.909 443.955 240.273 448.012 239.802C449.986 239.572 451.959 239.369 453.942 239.277C455.501 239.203 457.198 239.406 458.369 240.559C459.208 241.388 459.605 242.587 459.697 243.768C459.78 244.911 459.678 246.083 459.457 247.254L459.448 247.263Z" fill="url(#paint0_linear_1764_80)"/>
|
||||
<path d="M182.763 183.28L172.627 235.164C172.36 236.556 173.421 237.848 174.841 237.848H229.159C230.58 237.848 231.64 239.139 231.373 240.531L228.956 253.055C226.909 263.66 217.622 271.333 206.823 271.333H167.509C166.43 271.333 165.499 272.099 165.296 273.159L154.663 327.847C152.606 338.443 143.319 346.088 132.529 346.088H110.525C109.105 346.088 108.045 344.797 108.312 343.405L145.902 149.794C146.104 148.734 147.036 147.968 148.115 147.968H254.096C255.516 147.968 256.577 149.259 256.309 150.652L253.893 163.176C251.846 173.781 242.559 181.454 231.76 181.454H184.985C183.906 181.454 182.975 182.219 182.772 183.28H182.763Z" fill="white"/>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="paint0_linear_1764_80" x1="459.787" y1="82.0147" x2="70.7574" y2="381.599" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#7466FF"/>
|
||||
<stop offset="0.5" stop-color="#FF66B3"/>
|
||||
<stop offset="1" stop-color="#FF804D"/>
|
||||
</linearGradient>
|
||||
<clipPath id="clip0_1764_80">
|
||||
<rect width="508" height="508" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@@ -1,4 +0,0 @@
|
||||
1. Open the generated domain to access FalkorDB Browser.
|
||||
2. Create a connection using `localhost` as the host and `6379` as the port.
|
||||
3. Leave the username empty and use the generated `FALKORDB_PASSWORD` from the Dokploy environment settings.
|
||||
4. Keep port `6379` private unless remote database clients need direct access. The browser interface can access it inside the container.
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"id": "falkordb",
|
||||
"name": "FalkorDB",
|
||||
"version": "4.20.4",
|
||||
"description": "A high-performance graph database for knowledge graphs, GraphRAG, agent memory, fraud detection and other relationship-heavy workloads. Includes the FalkorDB Browser interface.",
|
||||
"logo": "falkordb.svg",
|
||||
"links": {
|
||||
"github": "https://github.com/FalkorDB/FalkorDB",
|
||||
"website": "https://www.falkordb.com/",
|
||||
"docs": "https://docs.falkordb.com/"
|
||||
},
|
||||
"tags": [
|
||||
"database",
|
||||
"graph-database",
|
||||
"knowledge-graph",
|
||||
"graphrag",
|
||||
"ai",
|
||||
"redis"
|
||||
]
|
||||
}
|
||||
@@ -1,19 +0,0 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
falkordb_url = "https://${main_domain}"
|
||||
falkordb_password = "${hash:32}"
|
||||
auth_secret = "${base64:48}"
|
||||
encryption_key = "${hash:32}"
|
||||
|
||||
[config]
|
||||
env = [
|
||||
"FALKORDB_PASSWORD=${falkordb_password}",
|
||||
"AUTH_URL=${falkordb_url}",
|
||||
"AUTH_SECRET=${auth_secret}",
|
||||
"ENCRYPTION_KEY=${encryption_key}",
|
||||
]
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "falkordb"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
@@ -1,116 +0,0 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
feedbacks:
|
||||
image: softinator/feedbacks@sha256:f7d759e671b48906a4aa5deff92b4644a73a6a4239f32b4cebba5cfcef8cc97b
|
||||
restart: unless-stopped
|
||||
init: true
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /tmp:size=128m,mode=1777
|
||||
cap_drop: [ALL]
|
||||
security_opt: [no-new-privileges:true]
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
PORT: 3000
|
||||
APP_ORIGIN: ${APP_ORIGIN:?required}
|
||||
DATABASE_URL: postgresql://feedbacks:${POSTGRES_PASSWORD:?required}@postgres:5432/feedbacks
|
||||
DATABASE_POOL_MAX: ${DATABASE_POOL_MAX:-10}
|
||||
TRUST_PROXY_HOPS: ${TRUST_PROXY_HOPS:-1}
|
||||
ASSET_DRIVER: s3
|
||||
ORGANIZATION_ID: ${ORGANIZATION_ID:?required}
|
||||
# Defaults to the bundled SeaweedFS S3; override all S3_* to use external storage.
|
||||
S3_ENDPOINT: ${S3_ENDPOINT:-https://s3:8333}
|
||||
S3_REGION: ${S3_REGION:-us-east-1}
|
||||
S3_BUCKET: ${S3_BUCKET:-feedbacks}
|
||||
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
|
||||
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
|
||||
# Feedbacks requires an HTTPS S3 endpoint in production; trust the bundled SeaweedFS self-signed cert.
|
||||
NODE_EXTRA_CA_CERTS: /s3-config/public.crt
|
||||
TURNSTILE_SITE_KEY: ${TURNSTILE_SITE_KEY:-}
|
||||
TURNSTILE_SECRET_KEY: ${TURNSTILE_SECRET_KEY:-}
|
||||
GITHUB_APPS_JSON: ${GITHUB_APPS_JSON:-}
|
||||
GITHUB_APP_ID: ${GITHUB_APP_ID:-}
|
||||
GITHUB_APP_SLUG: ${GITHUB_APP_SLUG:-}
|
||||
GITHUB_APP_PRIVATE_KEY_BASE64: ${GITHUB_APP_PRIVATE_KEY_BASE64:-}
|
||||
volumes:
|
||||
- feedbacks-s3-config:/s3-config:ro
|
||||
expose: ["3000"]
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
s3-bucket:
|
||||
condition: service_completed_successfully
|
||||
stop_grace_period: 15s
|
||||
postgres:
|
||||
image: postgres:17-bookworm
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: feedbacks
|
||||
POSTGRES_DB: feedbacks
|
||||
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?required}
|
||||
volumes: ["feedbacks-postgres:/var/lib/postgresql/data"]
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U feedbacks -d feedbacks"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 10
|
||||
s3-init:
|
||||
image: alpine:3.22
|
||||
restart: "no"
|
||||
environment:
|
||||
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
|
||||
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
|
||||
volumes:
|
||||
- feedbacks-s3-config:/config
|
||||
entrypoint: ["/bin/sh", "-c"]
|
||||
command:
|
||||
- |
|
||||
set -e
|
||||
if [ ! -s /config/public.crt ]; then
|
||||
apk add --no-cache openssl >/dev/null
|
||||
openssl req -x509 -newkey rsa:2048 -nodes -days 3650 \
|
||||
-subj "/CN=s3" -addext "subjectAltName=DNS:s3" \
|
||||
-addext "basicConstraints=critical,CA:TRUE" \
|
||||
-keyout /config/private.key -out /config/public.crt
|
||||
fi
|
||||
printf '{"identities":[{"name":"feedbacks","credentials":[{"accessKey":"%s","secretKey":"%s"}],"actions":["Admin","Read","Write","List","Tagging"]}]}' \
|
||||
"$$S3_ACCESS_KEY_ID" "$$S3_SECRET_ACCESS_KEY" > /config/s3.json
|
||||
chmod 644 /config/*
|
||||
s3:
|
||||
image: chrislusf/seaweedfs:4.48
|
||||
restart: unless-stopped
|
||||
command: server -dir=/data -s3 -s3.port=8333 -s3.config=/config/s3.json -s3.cert.file=/config/public.crt -s3.key.file=/config/private.key
|
||||
volumes:
|
||||
- feedbacks-s3:/data
|
||||
- feedbacks-s3-config:/config:ro
|
||||
depends_on:
|
||||
s3-init:
|
||||
condition: service_completed_successfully
|
||||
s3-bucket:
|
||||
image: alpine:3.22
|
||||
restart: "no"
|
||||
depends_on:
|
||||
- s3
|
||||
environment:
|
||||
S3_BUCKET: ${S3_BUCKET:-feedbacks}
|
||||
S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:?required}
|
||||
S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:?required}
|
||||
volumes:
|
||||
- feedbacks-s3-config:/config:ro
|
||||
entrypoint: ["/bin/sh", "-c"]
|
||||
command:
|
||||
- |
|
||||
set -e
|
||||
apk add --no-cache curl >/dev/null
|
||||
for i in $$(seq 1 60); do
|
||||
code=$$(curl -s -o /dev/null -w '%{http_code}' --cacert /config/public.crt \
|
||||
--aws-sigv4 "aws:amz:us-east-1:s3" --user "$$S3_ACCESS_KEY_ID:$$S3_SECRET_ACCESS_KEY" \
|
||||
-X PUT "https://s3:8333/$$S3_BUCKET") || code=000
|
||||
case "$$code" in 200|409) echo "bucket ready ($$code)"; exit 0;; esac
|
||||
sleep 2
|
||||
done
|
||||
echo "could not create bucket (last HTTP $$code)"; exit 1
|
||||
volumes:
|
||||
feedbacks-postgres:
|
||||
feedbacks-s3:
|
||||
feedbacks-s3-config:
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |