This commit is contained in:
Mohab Gabber
2025-04-03 15:07:41 +02:00
370 changed files with 8433 additions and 5255 deletions

View File

@@ -28,7 +28,7 @@ jobs:
TEMPLATE_NAME=$(basename "$dir")
COMPOSE_FILE="$dir/docker-compose.yml"
TEMPLATE_FILE="$dir/template.yml"
TEMPLATE_FILE="$dir/template.toml"
if [ ! -f "$COMPOSE_FILE" ]; then
echo "❌ Missing docker-compose.yml in $TEMPLATE_NAME"
@@ -36,7 +36,7 @@ jobs:
fi
if [ ! -f "$TEMPLATE_FILE" ]; then
echo "❌ Missing template.yml in $TEMPLATE_NAME"
echo "❌ Missing template.toml in $TEMPLATE_NAME"
ERROR=1
fi
fi
@@ -49,6 +49,82 @@ jobs:
echo "✅ Blueprint folders validated successfully."
fi
- name: Validate meta.json structure and required fields
run: |
echo "🔍 Validating meta.json structure and required fields..."
# First check if meta.json exists and is valid JSON
if [ ! -f "meta.json" ]; then
echo "❌ meta.json file not found"
exit 1
fi
if ! jq empty meta.json 2>/dev/null; then
echo "❌ meta.json is not a valid JSON file"
exit 1
fi
ERROR=0
ERRORS_FOUND=""
# Debug: Show total number of entries
TOTAL_ENTRIES=$(jq '. | length' meta.json)
echo "📊 Total entries in meta.json: $TOTAL_ENTRIES"
# Get all entries at once and process them
TOTAL_INDEX=$(($TOTAL_ENTRIES - 1))
for i in $(seq 0 $TOTAL_INDEX); do
entry=$(jq -c ".[$i]" meta.json)
INDEX=$((i + 1))
echo "-------------------------------------------"
echo "🔍 Checking entry #$INDEX..."
# Get the ID for better error reporting
ID=$(echo "$entry" | jq -r '.id // "UNKNOWN"')
echo "📝 Processing entry with ID: $ID"
# Validate required top-level fields
for field in "id" "name" "version" "description" "logo" "links" "tags"; do
if [ "$(echo "$entry" | jq "has(\"$field\")")" != "true" ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID) is missing required field: $field"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
# Validate links object required fields
if [ "$(echo "$entry" | jq 'has("links")')" == "true" ]; then
for link_field in "github" "website" "docs"; do
if [ "$(echo "$entry" | jq ".links | has(\"$link_field\")")" != "true" ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID): links object is missing required field: $link_field"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
fi
# Validate tags array is not empty
if [ "$(echo "$entry" | jq '.tags | length')" -eq 0 ]; then
ERROR_MSG="❌ Entry #$INDEX (ID: $ID): tags array cannot be empty"
echo "$ERROR_MSG"
ERRORS_FOUND="${ERRORS_FOUND}${ERROR_MSG}\n"
ERROR=1
fi
done
echo "-------------------------------------------"
if [ $ERROR -eq 1 ]; then
echo "❌ meta.json structure validation failed."
echo -e "Summary of all errors found:${ERRORS_FOUND}"
exit 1
else
echo "✅ meta.json structure validated successfully."
fi
- name: Validate meta.json matches blueprint folders and logo files
run: |
echo "🔍 Validating meta.json against blueprint folders and logos..."

View File

@@ -7,7 +7,7 @@ This is the official repository for the Dokploy Open Source Templates.
1. Fork the repository
2. Create a new branch
3. Add the template to the `blueprints` folder (docker-compose.yml, template.yml)
3. Add the template to the `blueprints` folder (`docker-compose.yml`, `template.toml`)
4. Add the template metadata (name, description, version, logo, links, tags) to the `meta.json` file
5. Add the logo to the template folder
6. Commit and push your changes
@@ -45,19 +45,22 @@ services:
volumes:
grafana-storage: {}
```
3. Add the `template.yml` file to the folder, this is where we specify the domains, mounts and env variables, to understand more the structure of `template.yml` you can read here [Template.yml structure](#templateyml-structure)
3. Add the `template.toml` file to the folder, this is where we specify the domains, mounts and env variables, to understand more the structure of `template.toml` you can read here [Template.toml structure](#template.toml-structure)
```yaml
variables:
main_domain: ${domain}
```toml
[variables]
main_domain = "${domain}"
config:
domains:
- serviceName: grafana
port: 3000
host: ${main_domain}
env: []
mounts: []
[config]
[[config.domains]]
serviceName = "grafana"
port = 3000
host = "${main_domain}"
[config.env]
[[config.mounts]]
```
4. Add meta information to the `meta.json` file in the root folder
@@ -82,51 +85,53 @@ config:
6. Commit and push your changes
7. Create a pull request
### Template.yml structure
Dokploy use a defined structure for the `template.yml` file, we have 4 sections available:
### Template.toml structure
Dokploy use a defined structure for the `template.toml` file, we have 4 sections available:
1. `variables`: This is where we define the variables that will be used in the `domains`, `env` and `mounts` sections.
2. `domains`: This is where we define the configuration for the template.
3. `env`: This is where we define the environment variables for the template.
4. `mounts`: This is where we define the mounts for the template.
- The `variables(Optional)` structure is the following:
```yaml
variables:
main_domain: ${domain}
my_domain: https://my-domain.com
my_password: ${password:32}
any_helper: ${you-can-use-any-helper}
```toml
[variables]
main_domain = "${domain}"
my_domain = "https://my-domain.com"
my_password = "${password:32}"
any_helper = "${you-can-use-any-helper}"
```
- The `config` structure is the following:
```yaml
config:
domains: # Optional
- serviceName: grafana # Required
port: 3000 # Required
host: ${main_domain} # Required
path: / # Optional
```toml
[config]
# Optional sections below
env: # Optional
- AP_HOST=${main_domain}
- AP_API_KEY=${api_key}
- AP_ENCRYPTION_KEY=${encryption_key}
- AP_JWT_SECRET=${jwt_secret}
- AP_POSTGRES_PASSWORD=${postgres_password}
[[config.domains]]
serviceName = "grafana" # Required
port = 3000 # Required
host = "${main_domain}" # Required
path = "/" # Optional
mounts: # Optional or []
- filePath: /content/file.txt
content: |
My content
env = [
"AP_HOST=${main_domain}",
"AP_API_KEY=${api_key}",
"AP_ENCRYPTION_KEY=${encryption_key}",
"AP_JWT_SECRET=${jwt_secret}",
"AP_POSTGRES_PASSWORD=${postgres_password}"
]
[[config.mounts]]
filePath = "/content/file.txt"
content = """
My content
"""
```
Important: you can reference any variable in the `domains`, `env` and `mounts` sections. just use the `${variable_name}` syntax, in the case you don't want to define a variable, you can use the `domain`, `base64`, `password`, `hash`, `uuid`, `randomPort` or `timestamp` helpers.
Important: you can reference any variable in the `domains`, `env` and `mounts` sections. just use the `${variable_name}` syntax, in the case you don't want to define a variable, you can use the `domain`, `base64`, `password`, `hash`, `uuid`, `randomPort`, `timestamp`, `jwt`, `email`, or `username` helpers.
### Helpers
@@ -140,6 +145,8 @@ We have a few helpers that are very common when creating a template, these are:
- `randomPort`: This is a helper that will generate a random port for the template.
- `timestamp`: This is a helper that will generate a timestamp.
- `jwt or jwt:length`: This is a helper that will generate a jwt for the template.
- `email`: This is a helper that will generate a random email for the template.
- `username`: This is a helper that will generate a random username in lowercase for the template.

View File

@@ -16,6 +16,7 @@
"@codemirror/language": "^6.10.1",
"@codemirror/legacy-modes": "6.4.0",
"@codemirror/view": "6.29.0",
"@iarna/toml": "^2.2.5",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
@@ -33,11 +34,13 @@
"next-themes": "^0.4.5",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-router-dom": "^7.4.1",
"sonner": "^2.0.1",
"tailwind-merge": "^3.0.2",
"tailwindcss": "^4.0.12",
"tailwindcss-animate": "^1.0.7",
"vite-plugin-static-copy": "2.3.0",
"yaml": "2.7.1",
"zustand": "^5.0.3"
},
"devDependencies": {

98
app/pnpm-lock.yaml generated
View File

@@ -26,6 +26,9 @@ importers:
'@codemirror/view':
specifier: 6.29.0
version: 6.29.0
'@iarna/toml':
specifier: ^2.2.5
version: 2.2.5
'@radix-ui/react-dialog':
specifier: ^1.1.6
version: 1.1.6(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -46,7 +49,7 @@ importers:
version: 1.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@tailwindcss/vite':
specifier: ^4.0.12
version: 4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2))
version: 4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
'@uiw/codemirror-theme-github':
specifier: ^4.22.1
version: 4.23.10(@codemirror/language@6.10.8)(@codemirror/state@6.5.2)(@codemirror/view@6.29.0)
@@ -77,6 +80,9 @@ importers:
react-dom:
specifier: ^19.0.0
version: 19.0.0(react@19.0.0)
react-router-dom:
specifier: ^7.4.1
version: 7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
sonner:
specifier: ^2.0.1
version: 2.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -91,7 +97,10 @@ importers:
version: 1.0.7(tailwindcss@4.0.12)
vite-plugin-static-copy:
specifier: 2.3.0
version: 2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2))
version: 2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
yaml:
specifier: 2.7.1
version: 2.7.1
zustand:
specifier: ^5.0.3
version: 5.0.3(@types/react@19.0.10)(react@19.0.0)
@@ -107,7 +116,7 @@ importers:
version: 19.0.4(@types/react@19.0.10)
'@vitejs/plugin-react':
specifier: ^4.3.4
version: 4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2))
version: 4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))
globals:
specifier: ^15.15.0
version: 15.15.0
@@ -116,7 +125,7 @@ importers:
version: 5.7.3
vite:
specifier: ^6.2.0
version: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)
version: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
packages:
@@ -408,6 +417,9 @@ packages:
'@floating-ui/utils@0.2.9':
resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
'@iarna/toml@2.2.5':
resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
@@ -1112,6 +1124,9 @@ packages:
'@types/babel__traverse@7.20.6':
resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
@@ -1211,6 +1226,10 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
cookie@1.0.2:
resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
engines: {node: '>=18'}
copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
@@ -1489,6 +1508,23 @@ packages:
'@types/react':
optional: true
react-router-dom@7.4.1:
resolution: {integrity: sha512-L3/4tig0Lvs6m6THK0HRV4eHUdpx0dlJasgCxXKnavwhh4tKYgpuZk75HRYNoRKDyDWi9QgzGXsQ1oQSBlWpAA==}
engines: {node: '>=20.0.0'}
peerDependencies:
react: '>=18'
react-dom: '>=18'
react-router@7.4.1:
resolution: {integrity: sha512-Vmizn9ZNzxfh3cumddqv3kLOKvc7AskUT0dC1prTabhiEi0U4A33LmkDOJ79tXaeSqCqMBXBU/ySX88W85+EUg==}
engines: {node: '>=20.0.0'}
peerDependencies:
react: '>=18'
react-dom: '>=18'
peerDependenciesMeta:
react-dom:
optional: true
react-style-singleton@2.2.3:
resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
engines: {node: '>=10'}
@@ -1529,6 +1565,9 @@ packages:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
set-cookie-parser@2.7.1:
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
sonner@2.0.1:
resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==}
peerDependencies:
@@ -1567,6 +1606,9 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
turbo-stream@2.4.0:
resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==}
typescript@5.7.3:
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
engines: {node: '>=14.17'}
@@ -1657,6 +1699,11 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
yaml@2.7.1:
resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==}
engines: {node: '>= 14'}
hasBin: true
zustand@5.0.3:
resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==}
engines: {node: '>=12.20.0'}
@@ -1965,6 +2012,8 @@ snapshots:
'@floating-ui/utils@0.2.9': {}
'@iarna/toml@2.2.5': {}
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
@@ -2581,13 +2630,13 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.12
'@tailwindcss/oxide-win32-x64-msvc': 4.0.12
'@tailwindcss/vite@4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2))':
'@tailwindcss/vite@4.0.12(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
dependencies:
'@tailwindcss/node': 4.0.12
'@tailwindcss/oxide': 4.0.12
lightningcss: 1.29.2
tailwindcss: 4.0.12
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
'@types/babel__core@7.20.5':
dependencies:
@@ -2610,6 +2659,8 @@ snapshots:
dependencies:
'@babel/types': 7.26.9
'@types/cookie@0.6.0': {}
'@types/estree@1.0.6': {}
'@types/node@20.17.24':
@@ -2665,14 +2716,14 @@ snapshots:
- '@codemirror/lint'
- '@codemirror/search'
'@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2))':
'@vitejs/plugin-react@4.3.4(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1))':
dependencies:
'@babel/core': 7.26.9
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
transitivePeerDependencies:
- supports-color
@@ -2740,6 +2791,8 @@ snapshots:
convert-source-map@2.0.0: {}
cookie@1.0.2: {}
copy-to-clipboard@3.3.3:
dependencies:
toggle-selection: 1.0.6
@@ -2982,6 +3035,22 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.10
react-router-dom@7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
react-router: 7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-router@7.4.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@types/cookie': 0.6.0
cookie: 1.0.2
react: 19.0.0
set-cookie-parser: 2.7.1
turbo-stream: 2.4.0
optionalDependencies:
react-dom: 19.0.0(react@19.0.0)
react-style-singleton@2.2.3(@types/react@19.0.10)(react@19.0.0):
dependencies:
get-nonce: 1.0.1
@@ -3033,6 +3102,8 @@ snapshots:
semver@6.3.1: {}
set-cookie-parser@2.7.1: {}
sonner@2.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
react: 19.0.0
@@ -3060,6 +3131,8 @@ snapshots:
tslib@2.8.1: {}
turbo-stream@2.4.0: {}
typescript@5.7.3: {}
undici-types@6.19.8: {}
@@ -3087,16 +3160,16 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.10
vite-plugin-static-copy@2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)):
vite-plugin-static-copy@2.3.0(vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)):
dependencies:
chokidar: 3.6.0
fast-glob: 3.3.3
fs-extra: 11.3.0
p-map: 7.0.3
picocolors: 1.1.1
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)
vite: 6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1)
vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2):
vite@6.2.1(@types/node@20.17.24)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.7.1):
dependencies:
esbuild: 0.25.1
postcss: 8.5.3
@@ -3106,11 +3179,14 @@ snapshots:
fsevents: 2.3.3
jiti: 2.4.2
lightningcss: 1.29.2
yaml: 2.7.1
w3c-keyname@2.2.8: {}
yallist@3.1.1: {}
yaml@2.7.1: {}
zustand@5.0.3(@types/react@19.0.10)(react@19.0.0):
optionalDependencies:
'@types/react': 19.0.10

36
app/script.js Normal file
View File

@@ -0,0 +1,36 @@
import yaml from "yaml";
import toml from "@iarna/toml";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
function convertYamlToToml(yamlContent) {
const parsedYaml = yaml.parse(yamlContent);
return toml.stringify(parsedYaml);
}
function processDirectory(dirPath) {
const files = fs.readdirSync(dirPath);
files.forEach((file) => {
const filePath = path.join(dirPath, file);
const stat = fs.statSync(filePath);
if (stat.isDirectory()) {
processDirectory(filePath);
} else if (file === "template.yml") {
console.log(`Converting ${filePath}`);
const yamlContent = fs.readFileSync(filePath, "utf8");
const tomlContent = convertYamlToToml(yamlContent);
const tomlPath = path.join(dirPath, "template.toml");
fs.writeFileSync(tomlPath, tomlContent);
}
});
}
// Ruta al directorio blueprints relativa al script
const blueprintsPath = path.join(__dirname, "..", "blueprints");
processDirectory(blueprintsPath);

View File

@@ -3,16 +3,19 @@ import Navigation from "./components/Navigation";
import Search from "./components/Search";
import { useStore } from "@/store";
import "./App.css";
import { BrowserRouter } from "react-router-dom";
function App() {
const view = useStore((state) => state.view);
return (
<div className="min-h-screen">
<Navigation />
<Search />
<TemplateGrid view={view} />
</div>
<BrowserRouter>
<div className="min-h-screen">
<Navigation />
<Search />
<TemplateGrid view={view} />
</div>
</BrowserRouter>
);
}

View File

@@ -16,9 +16,10 @@ import { Check, ChevronsUpDown } from "lucide-react";
import React from "react";
import { Tabs, TabsList, TabsTrigger } from "./ui/tabs";
import SelectedTags from "./SelectedTags";
import { useSearchParams } from "react-router-dom";
const Search = () => {
const { templates, searchQuery, setSearchQuery, setView, templatesCount } =
const { templates, searchQuery, setSearchQuery, setView, templatesCount, setFilteredTemplates, setTemplatesCount } =
useStore();
const selectedTags = useStore((state) => state.selectedTags);
const addSelectedTag = useStore((state) => state.addSelectedTag);
@@ -26,6 +27,7 @@ const Search = () => {
const [open, setOpen] = React.useState(false);
const [tagSearch, setTagSearch] = React.useState("");
const view = useStore((state) => state.view);
const [searchParams, setSearchParams] = useSearchParams();
// Get all unique tags, safely handle empty templates
const uniqueTags = React.useMemo(() => {
@@ -43,6 +45,53 @@ const Search = () => {
);
}, [uniqueTags, tagSearch]);
// Initialize search query from URL params and apply filters
React.useEffect(() => {
const queryFromUrl = searchParams.get("q") || "";
if (queryFromUrl !== searchQuery) {
setSearchQuery(queryFromUrl);
}
// Apply filters whenever templates, search query or selected tags change
if (templates) {
const filtered = templates.filter((template) => {
// Filter by search query
const matchesSearch = template.name
.toLowerCase()
.includes(queryFromUrl.toLowerCase());
// Filter by selected tags
const matchesTags =
selectedTags.length === 0 ||
selectedTags.every((tag) => template.tags.includes(tag));
return matchesSearch && matchesTags;
});
setFilteredTemplates(filtered);
setTemplatesCount(filtered.length);
}
}, [searchParams, templates, selectedTags, setSearchQuery, setFilteredTemplates, setTemplatesCount]);
// Update URL params when search query changes
const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {
const newQuery = e.target.value;
setSearchQuery(newQuery);
if (newQuery) {
setSearchParams({ q: newQuery });
} else {
searchParams.delete("q");
setSearchParams(searchParams);
}
};
// Clear search and URL params
const handleClearSearch = () => {
setSearchQuery("");
searchParams.delete("q");
setSearchParams(searchParams);
};
return (
<div className=" mx-auto p-4 lg:p-12 border-b w-full">
{/* <h1 className="text-2xl md:text-3xl xl:text-4xl font-bold text-center mb-8">
@@ -63,11 +112,11 @@ const Search = () => {
type="text"
placeholder="Search templates..."
value={searchQuery}
onChange={(e) => setSearchQuery(e.target.value)}
onChange={handleSearchChange}
className="w-full p-6"
/>
{searchQuery.length > 0 ? (
<div className="cursor-pointer" onClick={() => setSearchQuery("")}>
<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>
) : (

View File

@@ -228,7 +228,7 @@ const TemplateDialog: React.FC<TemplateDialogProps> = ({
<div className="relative w-full rounded-md overflow-hidden border">
<CodeEditor
value={templateFiles.config || ""}
language="yaml"
language="toml"
className="font-mono w-full [&_*]:!break-words"
/>
<Button

View File

@@ -82,7 +82,7 @@ const TemplateGrid: React.FC<TemplateGridProps> = ({ view }) => {
try {
const [dockerComposeRes, configRes] = await Promise.all([
fetch(`/blueprints/${templateId}/docker-compose.yml`),
fetch(`/blueprints/${templateId}/template.yml`),
fetch(`/blueprints/${templateId}/template.toml`),
]);
const dockerCompose = dockerComposeRes.ok

View File

@@ -121,7 +121,7 @@ function dockerComposeComplete(
interface Props extends ReactCodeMirrorProps {
wrapperClassName?: string;
disabled?: boolean;
language?: "yaml" | "json" | "properties" | "shell";
language?: "yaml" | "json" | "properties" | "shell" | "toml";
lineWrapping?: boolean;
lineNumbers?: boolean;
}

View File

@@ -0,0 +1,23 @@
version: "3"
services:
ackee:
image: electerious/ackee:3.4.2
ports:
- "3000"
environment:
- ACKEE_USERNAME=${ACKEE_USERNAME}
- ACKEE_PASSWORD=${ACKEE_PASSWORD}
- ACKEE_MONGODB=${ACKEE_MONGODB}
mongo:
image: mongo:4
environment:
- MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD}
volumes:
- mongo-data:/data/db
volumes:
mongo-data:

BIN
blueprints/ackee/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1,18 @@
[variables]
ACKEE_USERNAME = "default"
ACKEE_PASSWORD = "${password:16}"
MONGO_INITDB_ROOT_PASSWORD = "${password:16}"
ACKEE_MONGODB = "mongodb://mongo:${MONGO_INITDB_ROOT_PASSWORD}@mongo:27017"
[config]
[[config.domains]]
serviceName = "ackee"
port = 3000
host = "${domain}"
[config.env]
ACKEE_USERNAME = "${ACKEE_USERNAME}"
ACKEE_PASSWORD = "${ACKEE_PASSWORD}"
ACKEE_MONGODB = "${ACKEE_MONGODB}"
MONGO_INITDB_ROOT_PASSWORD = "${MONGO_INITDB_ROOT_PASSWORD}"

View File

@@ -0,0 +1,21 @@
[variables]
main_domain = "${domain}"
api_key = "${password:32}"
encryption_key = "${password:32}"
jwt_secret = "${password:32}"
postgres_password = "${password:32}"
[config]
env = [
"AP_HOST=${main_domain}",
"AP_API_KEY=${api_key}",
"AP_ENCRYPTION_KEY=${encryption_key}",
"AP_JWT_SECRET=${jwt_secret}",
"AP_POSTGRES_PASSWORD=${postgres_password}",
]
mounts = []
[[config.domains]]
serviceName = "activepieces"
port = 80
host = "${main_domain}"

View File

@@ -1,21 +0,0 @@
variables:
main_domain: ${domain}
api_key: ${password:32}
encryption_key: ${password:32}
jwt_secret: ${password:32}
postgres_password: ${password:32}
config:
domains:
- serviceName: activepieces
port: 80
host: ${main_domain}
env:
- AP_HOST=${main_domain}
- AP_API_KEY=${api_key}
- AP_ENCRYPTION_KEY=${encryption_key}
- AP_JWT_SECRET=${jwt_secret}
- AP_POSTGRES_PASSWORD=${postgres_password}
mounts: []

View File

@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[config]
env = []
mounts = []
[[config.domains]]
serviceName = "actualbudget"
port = 5_006
host = "${main_domain}"

View File

@@ -1,12 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: actualbudget
port: 5006
host: ${main_domain}
env: []
mounts: []

View File

@@ -0,0 +1,21 @@
version: "3.8"
services:
adguardhome:
image: adguard/adguardhome:latest
restart: unless-stopped
ports:
- "53:53/tcp"
- "53:53/udp"
- "784:784/udp"
- "853:853/tcp"
- "853:853/udp"
- "8853:8853/udp"
- "5443:5443/tcp"
- "5443:5443/udp"
volumes:
- adguardhome-work:/opt/adguardhome/work
- adguardhome-conf:/opt/adguardhome/conf
volumes:
adguardhome-work: {}
adguardhome-conf: {}

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="80px" height="80px" viewBox="0 0 80 80" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.2 (67145) - http://www.bohemiancoding.com/sketch -->
<title>logo@2x</title>
<desc>Created with Sketch.</desc>
<g id="logo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<rect id="Rectangle" fill="#FFFFFF" x="0" y="0" width="80" height="80" rx="20"></rect>
<g id="Group-10" transform="translate(12.000000, 12.000000)">
<g id="Group-9">
<g id="Group-8">
<g id="Group-7">
<path d="M28.2221276,0 C19.4007575,0 8.75997994,2.07442553 8.65485005e-06,6.64038298 C8.65485005e-06,16.501617 -0.120909272,41.0689362 28.2221276,57.855 C56.5657909,41.0689362 56.4454995,16.501617 56.4454995,6.64038298 C47.6849017,2.07442553 37.0441241,0 28.2221276,0 L28.2221276,0 Z" id="Path" fill="#68BC71"></path>
<path d="M28.1932991,57.8379179 C-0.120827266,41.0522735 8.65485006e-06,16.4982725 8.65485006e-06,6.64038298 C8.75043947,2.07939831 19.3775821,0.00452145957 28.1932991,7.38217799e-06 L28.1932991,57.8379237 Z" id="Combined-Shape" fill="#67B279"></path>
</g>
<path d="M27.1926958,38.6027397 L44.2590846,15.6010416 C43.0084943,14.5986526 41.911548,15.3061181 41.3076915,15.8538333 L41.2856573,15.8555888 L27.0557264,30.6585285 L21.6942672,24.2064902 C19.1365123,21.2514028 15.6592758,23.5054616 14.8469876,24.1011604 L27.1926958,38.6027397" id="Fill-11" fill="#FFFFFF"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
[config]
env = []
mounts = []
[[config.domains]]
serviceName = "adguardhome"
port = 3000
host = "${main_domain}"

View File

@@ -0,0 +1,7 @@
version: "3.8"
services:
adminer:
image: adminer:4.8.1
restart: unless-stopped
ports:
- 8080

View File

@@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="791px"
height="792px" viewBox="-91.5 -0.5 791 792" enable-background="new -91.5 -0.5 791 792" xml:space="preserve">
<g id="Layer_2">
<rect x="-91.5" y="-0.5" fill="#005982" width="791" height="792"/>
<rect x="-90.5" y="-0.5" fill="none" width="790" height="792"/>
</g>
<g id="Layer_1">
<path fill="#FFFFFF" d="M336.162,343.266c-7.003-27.503-58.849-54.543-149.432-54.543c-90.517,0-142.358,27.004-149.416,54.488
c-0.543,1.058-0.875,2.241-0.875,3.513v249.82c0,2.393,1.101,4.505,2.794,5.937c11.992,25.549,62.822,49.176,147.496,49.176
c84.697,0,135.532-23.639,147.507-49.199c1.679-1.428,2.768-3.531,2.768-5.913v-5.691c0-0.047,0.008-0.09,0.008-0.137
c0-0.027-0.008-0.05-0.008-0.077v-81.224c0-0.046,0.008-0.09,0.008-0.136c0-0.028-0.008-0.051-0.008-0.078V429.61
c0-0.048,0.008-0.09,0.008-0.137c0-0.027-0.008-0.052-0.008-0.079v-79.59c0-0.047,0.008-0.09,0.008-0.137s-0.008-0.094-0.008-0.141
v-2.802C337.005,345.475,336.685,344.312,336.162,343.266z M321.392,509.372c-0.165,21.415-55.417,45.233-134.662,45.233
c-79.36,0-134.668-23.889-134.668-45.33c0-0.027-0.008-0.052-0.008-0.079v-52.169c22.261,18.717,67.967,33.387,134.676,33.387
c66.698,0,112.392-14.665,134.662-33.375V509.372z M321.392,429.567C321.227,450.98,265.974,474.8,186.73,474.8
c-79.36,0-134.668-23.889-134.668-45.331c0-0.026-0.008-0.051-0.008-0.078v-52.169c22.261,18.716,67.967,33.386,134.676,33.386
c66.698,0,112.392-14.661,134.662-33.374V429.567z M186.73,304.337c79.244,0,134.497,23.818,134.662,45.233v0.191
c-0.165,21.415-55.417,45.233-134.662,45.233c-79.36,0-134.668-23.889-134.668-45.327
C52.062,328.229,107.37,304.337,186.73,304.337z M186.73,636.043c-79.36,0-134.668-23.89-134.668-45.327
c0-0.027-0.008-0.05-0.008-0.077v-53.802c22.261,18.717,67.967,33.387,134.676,33.387c66.698,0,112.392-14.665,134.662-33.375
v53.961C321.227,612.228,265.974,636.043,186.73,636.043z"/>
<g>
<path fill="#FF0000" d="M427.38,365.951l-71.116-59.932l71.116-59.827l16.46,16.671l-52.335,42.944l52.335,43.472L427.38,365.951z
"/>
<path fill="#FF0000" d="M566.131,260.227c0,5.909-0.897,11.203-2.691,15.88c-1.793,4.679-4.362,8.723-7.702,12.134
c-3.342,3.413-7.369,6.173-12.081,8.283c-4.714,2.11-9.989,3.553-15.827,4.326l-1.056,19.837h-22.052l-1.899-39.673h15.3
c3.445,0,6.418-0.491,8.915-1.477c2.496-0.984,4.537-2.322,6.12-4.01s2.743-3.64,3.482-5.856c0.738-2.216,1.107-4.554,1.107-7.017
c0-3.376-0.722-6.524-2.163-9.444c-1.442-2.918-3.692-5.486-6.753-7.702c-3.06-2.216-6.947-3.957-11.659-5.223
c-4.713-1.266-10.377-1.899-16.987-1.899h-6.226v-23.952h7.28c10.832,0,20.293,1.284,28.384,3.851
c8.088,2.568,14.841,5.979,20.258,10.235c5.416,4.257,9.479,9.127,12.188,14.614C564.775,248.62,566.131,254.317,566.131,260.227z
M533.21,349.069c0,2.321-0.458,4.502-1.371,6.542c-0.915,2.041-2.147,3.835-3.693,5.381c-1.548,1.548-3.377,2.76-5.486,3.64
c-2.11,0.879-4.363,1.319-6.753,1.319c-2.393,0-4.627-0.44-6.7-1.319c-2.076-0.88-3.888-2.092-5.435-3.64
c-1.548-1.546-2.779-3.34-3.692-5.381c-0.915-2.04-1.372-4.221-1.372-6.542s0.457-4.5,1.372-6.542
c0.913-2.04,2.145-3.833,3.692-5.381c1.547-1.546,3.358-2.76,5.435-3.64c2.073-0.879,4.308-1.319,6.7-1.319
c2.39,0,4.643,0.44,6.753,1.319c2.109,0.88,3.938,2.094,5.486,3.64c1.546,1.548,2.778,3.342,3.693,5.381
C532.752,344.568,533.21,346.748,533.21,349.069z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "adminer"
port = 8080
host = "${main_domain}"

View File

@@ -0,0 +1,65 @@
version: "3.8"
services:
affinepro:
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
restart: unless-stopped
ports:
- 3010
volumes:
- affine-storage:/root/.affine/storage
- affine-config:/root/.affine/config
environment:
- REDIS_SERVER_HOST=redis
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
- AFFINE_SERVER_HOST=${DOMAIN}
- MAILER_HOST=${MAILER_HOST}
- MAILER_PORT=${MAILER_PORT}
- MAILER_USER=${MAILER_USER}
- MAILER_PASSWORD=${MAILER_PASSWORD}
- MAILER_SENDER=${MAILER_SENDER}
depends_on:
- db
- redis
migration:
image: ghcr.io/toeverything/affine-graphql:stable-780dd83
command: node ./scripts/self-host-predeploy.js
environment:
- REDIS_SERVER_HOST=redis
- REDIS_SERVER_PASSWORD=${REDIS_PASSWORD}
- DATABASE_URL=postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/affinepro
- AFFINE_SERVER_HOST=${DOMAIN}
- MAILER_HOST=${MAILER_HOST}
- MAILER_PORT=${MAILER_PORT}
- MAILER_USER=${MAILER_USER}
- MAILER_PASSWORD=${MAILER_PASSWORD}
- MAILER_SENDER=${MAILER_SENDER}
volumes:
- affine-storage:/root/.affine/storage
- affine-config:/root/.affine/config
depends_on:
- db
- redis
db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=affinepro
volumes:
- postgres-data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redis-data:/data
volumes:
affine-storage: {}
affine-config: {}
postgres-data: {}
redis-data: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -0,0 +1,25 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password:16}"
redis_password = "${password:16}"
mailer_host = ""
mailer_port = "587"
mailer_user = ""
mailer_password = ""
mailer_sender = ""
[config]
[[config.domains]]
serviceName = "affinepro"
port = 3010
host = "${main_domain}"
[config.env]
DOMAIN = "${main_domain}"
POSTGRES_PASSWORD = "${postgres_password}"
REDIS_PASSWORD = "${redis_password}"
MAILER_HOST = "${mailer_host}"
MAILER_PORT = "${mailer_port}"
MAILER_USER = "${mailer_user}"
MAILER_PASSWORD = "${mailer_password}"
MAILER_SENDER = "${mailer_sender}"

View File

@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[config]
env = []
mounts = []
[[config.domains]]
serviceName = "alist"
port = 5_244
host = "${main_domain}"

View File

@@ -1,12 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: alist
port: 5244
host: ${main_domain}
env: []
mounts: []

View File

@@ -0,0 +1,12 @@
version: "3.8"
services:
alltube:
image: dnomd343/alltube:latest
restart: unless-stopped
ports:
- 80
environment:
- TITLE=${TITLE}
- CONVERT=${CONVERT}
- STREAM=${STREAM}
- REMUX=${REMUX}

BIN
blueprints/alltube/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@@ -0,0 +1,18 @@
[variables]
main_domain = "${domain}"
title = "My AllTube Site"
convert = "true"
stream = "true"
remux = "true"
[config]
[[config.domains]]
serviceName = "alltube"
port = 80
host = "${main_domain}"
[config.env]
TITLE = "${title}"
CONVERT = "${convert}"
STREAM = "${stream}"
REMUX = "${remux}"

View File

@@ -0,0 +1,17 @@
version: "3.8"
services:
ampache:
image: ampache/ampache:latest
restart: unless-stopped
ports:
- 80
volumes:
- config:/var/www/config
- log:/var/log/ampache
- mysql:/var/lib/mysql
- ${MEDIA_PATH}:/media
volumes:
config: {}
log: {}
mysql: {}

BIN
blueprints/ampache/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
media_path = "/path/to/your/media"
[config]
[[config.domains]]
serviceName = "ampache"
port = 80
host = "${main_domain}"
[config.env]
MEDIA_PATH = "${media_path}"

View File

@@ -0,0 +1,16 @@
version: "3.8"
services:
anonupload:
image: ghcr.io/supernova3339/anonfiles:1
restart: unless-stopped
ports:
- 80
environment:
- ADMIN_EMAIL=${ADMIN_EMAIL}
- ADMIN_PASSWORD=${ADMIN_PASSWORD}
- CONTACT_EMAIL=${CONTACT_EMAIL}
volumes:
- uploads:/var/www/html/uploads
volumes:
uploads: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

View File

@@ -0,0 +1,16 @@
[variables]
main_domain = "${domain}"
admin_email = "${email}"
admin_password = "${password:16}"
contact_email = "${email}"
[config]
[[config.domains]]
serviceName = "anonupload"
port = 80
host = "${main_domain}"
[config.env]
ADMIN_EMAIL = "${admin_email}"
ADMIN_PASSWORD = "${admin_password}"
CONTACT_EMAIL = "${contact_email}"

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
service_hash = "${hash:32}"
[config]
env = ["ANSWER_HOST=http://${main_domain}", "SERVICE_HASH=${service_hash}"]
mounts = []
[[config.domains]]
serviceName = "answer"
port = 9_080
host = "${main_domain}"

View File

@@ -1,15 +0,0 @@
variables:
main_domain: ${domain}
service_hash: ${hash:32}
config:
domains:
- serviceName: answer
port: 9080
host: ${main_domain}
env:
- ANSWER_HOST=http://${main_domain}
- SERVICE_HASH=${service_hash}
mounts: []

View File

@@ -0,0 +1,16 @@
version: "3.8"
services:
anythingllm:
image: mintplexlabs/anythingllm:latest
restart: unless-stopped
ports:
- 3001
environment:
- STORAGE_DIR=/app/server/storage
volumes:
- storage:/app/server/storage
cap_add:
- SYS_ADMIN
volumes:
storage: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "anythingllm"
port = 3001
host = "${main_domain}"

View File

@@ -0,0 +1,16 @@
version: "3.8"
services:
apprise-api:
image: linuxserver/apprise-api:latest
restart: unless-stopped
ports:
- 8000
environment:
- PUID=1000
- PGID=1000
- TZ=UTC
volumes:
- config:/config
volumes:
config: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "apprise-api"
port = 8000
host = "${main_domain}"

View File

@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[config]
env = []
mounts = []
[[config.domains]]
serviceName = "appsmith"
port = 80
host = "${main_domain}"

View File

@@ -1,12 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: appsmith
port: 80
host: ${main_domain}
env: []
mounts: []

View File

@@ -0,0 +1,143 @@
[variables]
main_domain = "${domain}"
[config]
env = [
"_APP_ENV=production",
"_APP_LOCALE=en",
"_APP_OPTIONS_ABUSE=enabled",
"_APP_OPTIONS_FORCE_HTTPS=disabled",
"_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled",
"_APP_OPTIONS_ROUTER_PROTECTION=disabled",
"_APP_OPENSSL_KEY_V1=your-secret-key",
"_APP_DOMAIN=${main_domain}",
"_APP_DOMAIN_FUNCTIONS=${main_domain}",
"_APP_DOMAIN_TARGET=${main_domain}",
"_APP_CONSOLE_WHITELIST_ROOT=enabled",
"_APP_CONSOLE_WHITELIST_EMAILS=",
"_APP_CONSOLE_WHITELIST_IPS=",
"_APP_CONSOLE_HOSTNAMES=",
"_APP_SYSTEM_EMAIL_NAME=Appwrite",
"_APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io",
"_APP_SYSTEM_TEAM_EMAIL=team@appwrite.io",
"_APP_SYSTEM_RESPONSE_FORMAT=",
"_APP_SYSTEM_SECURITY_EMAIL_ADDRESS=certs@appwrite.io",
"_APP_EMAIL_SECURITY=",
"_APP_EMAIL_CERTIFICATES=",
"_APP_USAGE_STATS=enabled",
"_APP_LOGGING_PROVIDER=",
"_APP_LOGGING_CONFIG=",
"_APP_USAGE_AGGREGATION_INTERVAL=30",
"_APP_USAGE_TIMESERIES_INTERVAL=30",
"_APP_USAGE_DATABASE_INTERVAL=900",
"_APP_WORKER_PER_CORE=6",
"_APP_CONSOLE_SESSION_ALERTS=disabled",
"_APP_REDIS_HOST=redis",
"_APP_REDIS_PORT=6379",
"_APP_REDIS_USER=",
"_APP_REDIS_PASS=",
"_APP_DB_HOST=mariadb",
"_APP_DB_PORT=3306",
"_APP_DB_SCHEMA=appwrite",
"_APP_DB_USER=user",
"_APP_DB_PASS=password",
"_APP_DB_ROOT_PASS=rootsecretpassword",
"_APP_INFLUXDB_HOST=influxdb",
"_APP_INFLUXDB_PORT=8086",
"_APP_STATSD_HOST=telegraf",
"_APP_STATSD_PORT=8125",
"_APP_SMTP_HOST=",
"_APP_SMTP_PORT=",
"_APP_SMTP_SECURE=",
"_APP_SMTP_USERNAME=",
"_APP_SMTP_PASSWORD=",
"_APP_SMS_PROVIDER=",
"_APP_SMS_FROM=",
"_APP_STORAGE_LIMIT=30000000",
"_APP_STORAGE_PREVIEW_LIMIT=20000000",
"_APP_STORAGE_ANTIVIRUS=disabled",
"_APP_STORAGE_ANTIVIRUS_HOST=clamav",
"_APP_STORAGE_ANTIVIRUS_PORT=3310",
"_APP_STORAGE_DEVICE=local",
"_APP_STORAGE_S3_ACCESS_KEY=",
"_APP_STORAGE_S3_SECRET=",
"_APP_STORAGE_S3_REGION=us-east-1",
"_APP_STORAGE_S3_BUCKET=",
"_APP_STORAGE_DO_SPACES_ACCESS_KEY=",
"_APP_STORAGE_DO_SPACES_SECRET=",
"_APP_STORAGE_DO_SPACES_REGION=us-east-1",
"_APP_STORAGE_DO_SPACES_BUCKET=",
"_APP_STORAGE_BACKBLAZE_ACCESS_KEY=",
"_APP_STORAGE_BACKBLAZE_SECRET=",
"_APP_STORAGE_BACKBLAZE_REGION=us-west-004",
"_APP_STORAGE_BACKBLAZE_BUCKET=",
"_APP_STORAGE_LINODE_ACCESS_KEY=",
"_APP_STORAGE_LINODE_SECRET=",
"_APP_STORAGE_LINODE_REGION=eu-central-1",
"_APP_STORAGE_LINODE_BUCKET=",
"_APP_STORAGE_WASABI_ACCESS_KEY=",
"_APP_STORAGE_WASABI_SECRET=",
"_APP_STORAGE_WASABI_REGION=eu-central-1",
"_APP_STORAGE_WASABI_BUCKET=",
"_APP_FUNCTIONS_SIZE_LIMIT=30000000",
"_APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000",
"_APP_FUNCTIONS_TIMEOUT=900",
"_APP_FUNCTIONS_BUILD_TIMEOUT=900",
"_APP_FUNCTIONS_CONTAINERS=10",
"_APP_FUNCTIONS_CPUS=0",
"_APP_FUNCTIONS_MEMORY=0",
"_APP_FUNCTIONS_MEMORY_SWAP=0",
"_APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0",
"_APP_EXECUTOR_SECRET=your-secret-key",
"_APP_EXECUTOR_HOST=http://exc1/v1",
"_APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes",
"_APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0",
"_APP_FUNCTIONS_INACTIVE_THRESHOLD=60",
"DOCKERHUB_PULL_USERNAME=",
"DOCKERHUB_PULL_PASSWORD=",
"DOCKERHUB_PULL_EMAIL=",
"OPEN_RUNTIMES_NETWORK=appwrite_runtimes",
"_APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes",
"_APP_DOCKER_HUB_USERNAME=",
"_APP_DOCKER_HUB_PASSWORD=",
"_APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600",
"_APP_VCS_GITHUB_APP_NAME=",
"_APP_VCS_GITHUB_PRIVATE_KEY=",
"_APP_VCS_GITHUB_APP_ID=",
"_APP_VCS_GITHUB_CLIENT_ID=",
"_APP_VCS_GITHUB_CLIENT_SECRET=",
"_APP_VCS_GITHUB_WEBHOOK_SECRET=",
"_APP_MAINTENANCE_INTERVAL=86400",
"_APP_MAINTENANCE_DELAY=0",
"_APP_MAINTENANCE_RETENTION_CACHE=2592000",
"_APP_MAINTENANCE_RETENTION_EXECUTION=1209600",
"_APP_MAINTENANCE_RETENTION_AUDIT=1209600",
"_APP_MAINTENANCE_RETENTION_ABUSE=86400",
"_APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000",
"_APP_MAINTENANCE_RETENTION_SCHEDULES=86400",
"_APP_GRAPHQL_MAX_BATCH_SIZE=10",
"_APP_GRAPHQL_MAX_COMPLEXITY=250",
"_APP_GRAPHQL_MAX_DEPTH=3",
"_APP_MIGRATIONS_FIREBASE_CLIENT_ID=",
"_APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=",
"_APP_ASSISTANT_OPENAI_API_KEY=",
]
mounts = []
[[config.domains]]
serviceName = "appwrite"
port = 80
host = "${main_domain}"
path = "/"
[[config.domains]]
serviceName = "appwrite-console"
port = 80
host = "${main_domain}"
path = "/console"
[[config.domains]]
serviceName = "appwrite-realtime"
port = 80
host = "${main_domain}"
path = "/v1/realtime"

View File

@@ -1,139 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: appwrite
port: 80
host: ${main_domain}
path: /
- serviceName: appwrite-console
port: 80
host: ${main_domain}
path: /console
- serviceName: appwrite-realtime
port: 80
host: ${main_domain}
path: /v1/realtime
env:
- _APP_ENV=production
- _APP_LOCALE=en
- _APP_OPTIONS_ABUSE=enabled
- _APP_OPTIONS_FORCE_HTTPS=disabled
- _APP_OPTIONS_FUNCTIONS_FORCE_HTTPS=disabled
- _APP_OPTIONS_ROUTER_PROTECTION=disabled
- _APP_OPENSSL_KEY_V1=your-secret-key
- _APP_DOMAIN=${main_domain}
- _APP_DOMAIN_FUNCTIONS=${main_domain}
- _APP_DOMAIN_TARGET=${main_domain}
- _APP_CONSOLE_WHITELIST_ROOT=enabled
- _APP_CONSOLE_WHITELIST_EMAILS=
- _APP_CONSOLE_WHITELIST_IPS=
- _APP_CONSOLE_HOSTNAMES=
- _APP_SYSTEM_EMAIL_NAME=Appwrite
- _APP_SYSTEM_EMAIL_ADDRESS=noreply@appwrite.io
- _APP_SYSTEM_TEAM_EMAIL=team@appwrite.io
- _APP_SYSTEM_RESPONSE_FORMAT=
- _APP_SYSTEM_SECURITY_EMAIL_ADDRESS=certs@appwrite.io
- _APP_EMAIL_SECURITY=
- _APP_EMAIL_CERTIFICATES=
- _APP_USAGE_STATS=enabled
- _APP_LOGGING_PROVIDER=
- _APP_LOGGING_CONFIG=
- _APP_USAGE_AGGREGATION_INTERVAL=30
- _APP_USAGE_TIMESERIES_INTERVAL=30
- _APP_USAGE_DATABASE_INTERVAL=900
- _APP_WORKER_PER_CORE=6
- _APP_CONSOLE_SESSION_ALERTS=disabled
- _APP_REDIS_HOST=redis
- _APP_REDIS_PORT=6379
- _APP_REDIS_USER=
- _APP_REDIS_PASS=
- _APP_DB_HOST=mariadb
- _APP_DB_PORT=3306
- _APP_DB_SCHEMA=appwrite
- _APP_DB_USER=user
- _APP_DB_PASS=password
- _APP_DB_ROOT_PASS=rootsecretpassword
- _APP_INFLUXDB_HOST=influxdb
- _APP_INFLUXDB_PORT=8086
- _APP_STATSD_HOST=telegraf
- _APP_STATSD_PORT=8125
- _APP_SMTP_HOST=
- _APP_SMTP_PORT=
- _APP_SMTP_SECURE=
- _APP_SMTP_USERNAME=
- _APP_SMTP_PASSWORD=
- _APP_SMS_PROVIDER=
- _APP_SMS_FROM=
- _APP_STORAGE_LIMIT=30000000
- _APP_STORAGE_PREVIEW_LIMIT=20000000
- _APP_STORAGE_ANTIVIRUS=disabled
- _APP_STORAGE_ANTIVIRUS_HOST=clamav
- _APP_STORAGE_ANTIVIRUS_PORT=3310
- _APP_STORAGE_DEVICE=local
- _APP_STORAGE_S3_ACCESS_KEY=
- _APP_STORAGE_S3_SECRET=
- _APP_STORAGE_S3_REGION=us-east-1
- _APP_STORAGE_S3_BUCKET=
- _APP_STORAGE_DO_SPACES_ACCESS_KEY=
- _APP_STORAGE_DO_SPACES_SECRET=
- _APP_STORAGE_DO_SPACES_REGION=us-east-1
- _APP_STORAGE_DO_SPACES_BUCKET=
- _APP_STORAGE_BACKBLAZE_ACCESS_KEY=
- _APP_STORAGE_BACKBLAZE_SECRET=
- _APP_STORAGE_BACKBLAZE_REGION=us-west-004
- _APP_STORAGE_BACKBLAZE_BUCKET=
- _APP_STORAGE_LINODE_ACCESS_KEY=
- _APP_STORAGE_LINODE_SECRET=
- _APP_STORAGE_LINODE_REGION=eu-central-1
- _APP_STORAGE_LINODE_BUCKET=
- _APP_STORAGE_WASABI_ACCESS_KEY=
- _APP_STORAGE_WASABI_SECRET=
- _APP_STORAGE_WASABI_REGION=eu-central-1
- _APP_STORAGE_WASABI_BUCKET=
- _APP_FUNCTIONS_SIZE_LIMIT=30000000
- _APP_FUNCTIONS_BUILD_SIZE_LIMIT=2000000000
- _APP_FUNCTIONS_TIMEOUT=900
- _APP_FUNCTIONS_BUILD_TIMEOUT=900
- _APP_FUNCTIONS_CONTAINERS=10
- _APP_FUNCTIONS_CPUS=0
- _APP_FUNCTIONS_MEMORY=0
- _APP_FUNCTIONS_MEMORY_SWAP=0
- _APP_FUNCTIONS_RUNTIMES=node-16.0,php-8.0,python-3.9,ruby-3.0
- _APP_EXECUTOR_SECRET=your-secret-key
- _APP_EXECUTOR_HOST=http://exc1/v1
- _APP_EXECUTOR_RUNTIME_NETWORK=appwrite_runtimes
- _APP_FUNCTIONS_ENVS=node-16.0,php-7.4,python-3.9,ruby-3.0
- _APP_FUNCTIONS_INACTIVE_THRESHOLD=60
- DOCKERHUB_PULL_USERNAME=
- DOCKERHUB_PULL_PASSWORD=
- DOCKERHUB_PULL_EMAIL=
- OPEN_RUNTIMES_NETWORK=appwrite_runtimes
- _APP_FUNCTIONS_RUNTIMES_NETWORK=runtimes
- _APP_DOCKER_HUB_USERNAME=
- _APP_DOCKER_HUB_PASSWORD=
- _APP_FUNCTIONS_MAINTENANCE_INTERVAL=3600
- _APP_VCS_GITHUB_APP_NAME=
- _APP_VCS_GITHUB_PRIVATE_KEY=
- _APP_VCS_GITHUB_APP_ID=
- _APP_VCS_GITHUB_CLIENT_ID=
- _APP_VCS_GITHUB_CLIENT_SECRET=
- _APP_VCS_GITHUB_WEBHOOK_SECRET=
- _APP_MAINTENANCE_INTERVAL=86400
- _APP_MAINTENANCE_DELAY=0
- _APP_MAINTENANCE_RETENTION_CACHE=2592000
- _APP_MAINTENANCE_RETENTION_EXECUTION=1209600
- _APP_MAINTENANCE_RETENTION_AUDIT=1209600
- _APP_MAINTENANCE_RETENTION_ABUSE=86400
- _APP_MAINTENANCE_RETENTION_USAGE_HOURLY=8640000
- _APP_MAINTENANCE_RETENTION_SCHEDULES=86400
- _APP_GRAPHQL_MAX_BATCH_SIZE=10
- _APP_GRAPHQL_MAX_COMPLEXITY=250
- _APP_GRAPHQL_MAX_DEPTH=3
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID=
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET=
- _APP_ASSISTANT_OPENAI_API_KEY=
mounts: []

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
auth_secret = "${base64:32}"
[config]
env = ["APTABASE_HOST=${main_domain}", "AUTH_SECRET=${auth_secret}"]
mounts = []
[[config.domains]]
serviceName = "aptabase"
port = 8_080
host = "${main_domain}"

View File

@@ -1,15 +0,0 @@
variables:
main_domain: ${domain}
auth_secret: ${base64:32}
config:
domains:
- serviceName: aptabase
port: 8080
host: ${main_domain}
env:
- APTABASE_HOST=${main_domain}
- AUTH_SECRET=${auth_secret}
mounts: []

View File

@@ -0,0 +1,14 @@
version: "3.8"
services:
arangodb:
image: arangodb:3.12.4
restart: unless-stopped
ports:
- 8529
environment:
- ARANGO_ROOT_PASSWORD=${ARANGO_PASSWORD}
volumes:
- data:/var/lib/arangodb3
volumes:
data: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
arango_password = "${password:16}"
[config]
[[config.domains]]
serviceName = "arangodb"
port = 8529
host = "${main_domain}"
[config.env]
ARANGO_PASSWORD = "${arango_password}"

View File

@@ -0,0 +1,77 @@
version: "3.8"
services:
argilla-web:
image: argilla/argilla-server:latest
restart: unless-stopped
ports:
- 6900
environment:
- ARGILLA_HOME_PATH=/var/lib/argilla
- ARGILLA_ELASTICSEARCH=http://argilla-elasticsearch:9200
- ARGILLA_DATABASE_URL=postgresql+asyncpg://postgres:${DB_PASSWORD}@argilla-db:5432/argilla
- ARGILLA_REDIS_URL=redis://:${REDIS_PASSWORD}@argilla-redis:6379/0
- USERNAME=${LOGIN_USERNAME}
- PASSWORD=${LOGIN_PASSWORD}
- API_KEY=argilla.apikey
- WORKSPACE=default
volumes:
- argilladata:/var/lib/argilla
depends_on:
- argilla-elasticsearch
- argilla-db
- argilla-redis
argilla-worker:
image: argilla/argilla-server:latest
restart: unless-stopped
environment:
- BACKGROUND_NUM_WORKERS=2
- ARGILLA_HOME_PATH=/var/lib/argilla
- ARGILLA_ELASTICSEARCH=http://argilla-elasticsearch:9200
- ARGILLA_DATABASE_URL=postgresql+asyncpg://postgres:${DB_PASSWORD}@argilla-db:5432/argilla
- ARGILLA_REDIS_URL=redis://:${REDIS_PASSWORD}@argilla-redis:6379/0
volumes:
- argilladata:/var/lib/argilla
command: python -m argilla_server worker --num-workers ${BACKGROUND_NUM_WORKERS}
depends_on:
- argilla-elasticsearch
- argilla-db
- argilla-redis
argilla-elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
restart: unless-stopped
environment:
- node.name=elasticsearch
- cluster.name=es-argilla-local
- discovery.type=single-node
- ES_JAVA_OPTS=-Xms512m -Xmx512m
- cluster.routing.allocation.disk.threshold_enabled=false
- xpack.security.enabled=false
volumes:
- elasticdata:/usr/share/elasticsearch/data
argilla-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=argilla
volumes:
- dbdata:/var/lib/postgresql/data
argilla-redis:
image: redis:7-alpine
restart: unless-stopped
environment:
- REDIS_PASSWORD=${REDIS_PASSWORD}
command: redis-server --requirepass ${REDIS_PASSWORD}
volumes:
- redisdata:/data
volumes:
argilladata: {}
elasticdata: {}
dbdata: {}
redisdata: {}

View File

@@ -0,0 +1,12 @@
<svg width="481" height="252" viewBox="0 0 481 252" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M125.336 251.397C194.557 251.397 250.671 195.216 250.671 125.913C250.671 56.6109 194.557 0.430069 125.336 0.430069C56.1147 0.430069 0 56.6109 0 125.913C0 195.216 56.1147 251.397 125.336 251.397Z" fill="url(#paint0_linear_0_1)"/>
<path d="M479.93 251.397C342.032 251.397 229.83 139.062 229.83 1.00175H317.193C317.193 91.0411 390.282 164.216 480.215 164.216V251.397H479.93Z" fill="#F8C0A7"/>
<defs>
<linearGradient id="paint0_linear_0_1" x1="55.414" y1="60.2073" x2="211.749" y2="206.798" gradientUnits="userSpaceOnUse">
<stop offset="0.0151877" stop-color="#FF675F"/>
<stop offset="1" stop-color="#F73D3D"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 751 B

View File

@@ -0,0 +1,19 @@
[variables]
main_domain = "${domain}"
login_username = "${username}"
login_password = "${password:8}"
db_password = "${password:16}"
redis_password = "${password:16}"
[config]
[[config.domains]]
serviceName = "argilla-web"
port = 6900
host = "${main_domain}"
[config.env]
LOGIN_USERNAME = "${login_username}"
LOGIN_PASSWORD = "${login_password}"
DB_PASSWORD = "${db_password}"
REDIS_PASSWORD = "${redis_password}"
BACKGROUND_NUM_WORKERS = "2"

View File

@@ -0,0 +1,17 @@
version: "3.8"
services:
audiobookshelf:
image: ghcr.io/advplyr/audiobookshelf:2.19.4
restart: unless-stopped
ports:
- 80
environment:
- TZ=UTC
volumes:
- config:/config
- metadata:/metadata
- ${AUDIOBOOKS_PATH}:/audiobooks
volumes:
config: {}
metadata: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
audiobooks_path = "/path/to/your/audiobooks"
[config]
[[config.domains]]
serviceName = "audiobookshelf"
port = 80
host = "${main_domain}"
[config.env]
AUDIOBOOKS_PATH = "${audiobooks_path}"

View File

@@ -0,0 +1,40 @@
version: "3.8"
services:
authorizer:
image: lakhansamani/authorizer:1.4.4
restart: unless-stopped
ports:
- 8080
environment:
- DATABASE_TYPE=postgres
- DATABASE_URL=postgres://postgres:${DB_PASSWORD}@authorizer-db:5432/authorizer?sslmode=disable
- REDIS_URL=redis://authorizer-redis:6379
- ADMIN_SECRET=${ADMIN_SECRET}
- JWT_SECRET=${JWT_SECRET}
- COOKIE_NAME=authorizer
- ACCESS_TOKEN_EXPIRY_TIME=86400
- REFRESH_TOKEN_EXPIRY_TIME=86400
- DISABLE_PLAYGROUND=true
depends_on:
- authorizer-db
- authorizer-redis
authorizer-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=authorizer
volumes:
- db_data:/var/lib/postgresql/data
authorizer-redis:
image: redis:7-alpine
restart: unless-stopped
volumes:
- redis_data:/data
volumes:
db_data: {}
redis_data: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,16 @@
[variables]
main_domain = "${domain}"
db_password = "${password:16}"
admin_secret = "${password:32}"
jwt_secret = "${password:32}"
[config]
[[config.domains]]
serviceName = "authorizer"
port = 8080
host = "${main_domain}"
[config.env]
DB_PASSWORD = "${db_password}"
ADMIN_SECRET = "${admin_secret}"
JWT_SECRET = "${jwt_secret}"

View File

@@ -0,0 +1,73 @@
version: "3.8"
services:
automatisch:
image: dockeriddonuts/automatisch:2.0
restart: unless-stopped
ports:
- 443
environment:
- HOST=${DOMAIN}
- PROTOCOL=http
- PORT=443
- APP_ENV=production
- REDIS_HOST=automatisch-redis
- REDIS_USERNAME=default
- REDIS_PASSWORD=${REDIS_PASSWORD}
- POSTGRES_HOST=automatisch-postgres
- POSTGRES_DATABASE=automatisch
- POSTGRES_USERNAME=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- WEBHOOK_SECRET_KEY=${WEBHOOK_SECRET_KEY}
- APP_SECRET_KEY=${APP_SECRET_KEY}
volumes:
- storage:/automatisch/storage
depends_on:
- automatisch-postgres
- automatisch-redis
automatisch-worker:
image: dockeriddonuts/automatisch:2.0
restart: unless-stopped
environment:
- APP_ENV=production
- REDIS_HOST=automatisch-redis
- REDIS_PASSWORD=${REDIS_PASSWORD}
- POSTGRES_HOST=automatisch-postgres
- POSTGRES_DATABASE=automatisch
- POSTGRES_USERNAME=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- ENCRYPTION_KEY=${ENCRYPTION_KEY}
- WEBHOOK_SECRET_KEY=${WEBHOOK_SECRET_KEY}
- APP_SECRET_KEY=${APP_SECRET_KEY}
- WORKER=true
volumes:
- storage:/automatisch/storage
depends_on:
- automatisch-postgres
- automatisch-redis
automatisch-postgres:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=automatisch
volumes:
- postgres_data:/var/lib/postgresql/data
automatisch-redis:
image: redis:7-alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_PASSWORD}
environment:
- REDIS_USERNAME=default
- REDIS_PASSWORD=${REDIS_PASSWORD}
volumes:
- redis_data:/data
volumes:
storage: {}
postgres_data: {}
redis_data: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,20 @@
[variables]
main_domain = "${domain}"
db_password = "${password:16}"
redis_password = "${password:16}"
encryption_key = "${password:32}"
webhook_secret_key = "${password:32}"
app_secret_key = "${password:32}"
[config]
[[config.domains]]
serviceName = "automatisch"
port = 3000
host = "${main_domain}"
[config.env]
DB_PASSWORD = "${db_password}"
REDIS_PASSWORD = "${redis_password}"
ENCRYPTION_KEY = "${encryption_key}"
WEBHOOK_SECRET_KEY = "${webhook_secret_key}"
APP_SECRET_KEY = "${app_secret_key}"

View File

@@ -0,0 +1,19 @@
version: "3.8"
services:
babybuddy:
image: linuxserver/babybuddy:2.7.0
restart: unless-stopped
ports:
- 8000
environment:
- PUID=1000
- PGID=1000
- TZ=UTC
- CSRF_TRUSTED_ORIGINS=https://${DOMAIN}
- TIME_ZONE=${TIME_ZONE:-UTC}
- SECRET_KEY=${SECRET_KEY}
volumes:
- config:/config
volumes:
config: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@@ -0,0 +1,15 @@
[variables]
main_domain = "${domain}"
secret_key = "${password:32}"
time_zone = "America/New_York"
[config]
[[config.domains]]
serviceName = "babybuddy"
port = 8000
host = "${main_domain}"
[config.env]
DOMAIN = "${main_domain}"
SECRET_KEY = "${secret_key}"
TIME_ZONE = "${time_zone}"

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="-80 0 650 500" style="background: black"><g fill="#fff"><path d="M511.7 196.3c-1.1-10.2-4.6-18.4-10.6-24.6-6-6.1-14.2-10.2-24.6-12.1-3.7-.7-8.2-1.3-13.4-1.7h-59.9c-.1 0-.1-.1-.2-.1h-76.9c0 .1-.1.1-.2.1h-26.8l-.1.1h-1.1c-.2 0-.4 0-.6-.1-.1 0-.2 0-.4-.1h-5.4c-.2 0-.4.1-.5.1h-.1c0 .1-.1.1-.1.2-.1.2-.2.4-.2.6 0 .1-.1.1-.1.1-2.3 4.8-4.6 9.6-6.8 14.4-4.9 8.2-7.9 17.6-12.4 25.9-10.6 22.5-21.3 45-31.9 67.4L195 360.4c-4.9-8-9.8-16-14.8-24.1-6.4-10.5-12.8-21-19.3-31.4-7.4-12-14.8-24.1-22.1-36.1-4-6.5-10.8-11.1-18.1-12.8-7.6-1.8-15.7-.4-22.3 3.8-2.2 1.4-4.3 3.2-6 5.1-3.6 2.4-6.6 5.5-8.8 9.2-.2.3-.4.6-.6 1-6.2 10.5-12.4 21-18.5 31.5-6.5 11-12.9 21.9-19.4 32.9-6.5 11.1-13 22.1-19.5 33.2L4.3 409c-4 6.8-5.3 14.9-3.3 22.5 1.9 7.3 6.7 13.8 13.2 17.7 4.6 2.8 9.9 4.2 15.2 4.2 2.5 0 4.9-.3 7.3-.9 7.3-1.9 13.9-6.7 17.7-13.2.4-.6.8-1.3 1.1-1.9 6.9-11.8 13.8-23.5 20.8-35.3 6.4-10.8 12.8-21.7 19.1-32.5 5.9-10.1 11.9-20.2 17.8-30.3.4.7.8 1.4 1.3 2 6.6 10.8 13.2 21.5 19.8 32.2s13.1 21.4 19.7 32.1c6.4 10.5 12.9 21 19.3 31.5 4 6.5 10.8 11.1 18.1 12.8 1.6.4 3.2.6 4.9.7v.1h73.4c37.5-.3 61.4-.9 71.7-2 16.4-1.7 31.8-6.4 46-13.9q21.3-11.25 39.6-30.3c12.2-12.6 21.4-25.6 27.8-39 8.1-17 10.3-31.7 6.8-44.3q-5.25-18.75-28.2-26.7c15.3-5.7 29.3-14.4 42.1-25.9s22.5-24.1 29-37.9c5.9-12.7 8.3-24.2 7.2-34.4M395.2 362.6c-4.9 10.4-11.7 18.7-20.1 25-8.4 6.2-17.4 10.1-26.9 11.7q-9.45 1.8-41.1 1.8h-54.3l37.4-78.6h47.4c26.7 0 43.4 1.4 50 4.2 6.7 2.8 10.6 7.3 12 13.4 1.3 6.2-.2 13.6-4.4 22.5m48-123.5c-4.5 9.5-11 17.1-19.5 23-8.5 5.8-18.1 9.3-28.7 10.5-5.9.7-20.2 1-43.1 1h-38.5l32.3-67.9h33.7c27.6 0 44.2.3 49.7 1 9.2 1.2 14.9 4.6 17.2 10.3 2.3 5.6 1.2 13-3.1 22.1"/><path d="M313.6 157.9h-8.4q4.2-.6 8.4 0m4.5-24.2c-8.2-8.2-12.9-19.5-12.9-31.1s4.7-22.9 12.9-31.1 19.5-12.9 31.1-12.9 22.9 4.7 31.1 12.9 12.9 19.5 12.9 31.1-4.7 22.9-12.9 31.1-19.5 12.9-31.1 12.9c-11.7-.1-22.9-4.7-31.1-12.9M196.2 241.5c0 .2-.1 3.7-.4 3.7H90.5c-.1 0-.2-.3-.2-.6-2.8-.3-5.3-1.8-7-3.9-.2.1-.3.2-.4.2-12.6-20.6-25.2-41.2-37.7-61.8-5.4-8.8-10.7-17.6-16.1-26.3-1.2-1 .6-2 1.2-2.5 3.6-3.1 10.7-8.6 14.6-10.6 2.4 3.9 4.8 7.9 7.2 11.8 14.9 24.4 29.8 48.8 44.7 73.3h99c.3 0 .3 2.3.3 2.4.3 4.7.3 9.5.1 14.3"/></g></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1,21 @@
services:
backrest:
image: garethgeorge/backrest:v1.7.3
restart: unless-stopped
ports:
- 9898
environment:
- BACKREST_PORT=9898
- BACKREST_DATA=/data # where it stores current state data
- BACKREST_CONFIG=/config/config.json # where it stores backup configurations
- XDG_CACHE_HOME=/cache # backup cache
- TZ=${TZ}
volumes:
- backrest/data:/data
- backrest/config:/config
- backrest/config:/cache # to preserve backup cache between restarts
- /:/userdata:ro # we mount /mnt/data to /userdata (that we want to backup)
volumes:
backrest:
backrest-cache:

View File

@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[config]
env = ["TZ=Europe/Paris"]
mounts = []
[[config.domains]]
serviceName = "backrest"
port = 9_898
host = "${main_domain}"

View File

@@ -3,10 +3,9 @@ variables:
config:
domains:
- serviceName: otterwiki
port: 80
- serviceName: backrest
port: 9898
host: ${main_domain}
env: []
env:
- TZ=Europe/Paris
mounts: []

View File

@@ -0,0 +1,16 @@
version: "3.8"
services:
baikal:
image: ckulka/baikal:nginx-php8.2
restart: unless-stopped
ports:
- 80
environment:
- TZ=UTC
volumes:
- config:/var/www/baikal/config
- data:/var/www/baikal/Specific
volumes:
config: {}
data: {}

BIN
blueprints/baikal/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "baikal"
port = 80
host = "${main_domain}"

View File

@@ -0,0 +1,13 @@
version: "3.8"
services:
barrage:
image: maulik9898/barrage:0.3.0
restart: unless-stopped
ports:
- 3000
environment:
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET}
- NEXTAUTH_URL=http://${DOMAIN}
- DELUGE_URL=${DELUGE_URL}
- DELUGE_PASSWORD=${DELUGE_PASSWORD}
- BARRAGE_PASSWORD=${BARRAGE_PASSWORD}

BIN
blueprints/barrage/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -0,0 +1,15 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "barrage"
port = 3000
host = "${main_domain}"
[config.env]
NEXTAUTH_SECRET = "${base64}"
NEXTAUTH_URL = "http://${main_domain}"
DELUGE_URL = "http://your-deluge-ip:8112"
DELUGE_PASSWORD = "${password:16}"
BARRAGE_PASSWORD = "${password:16}"

View File

@@ -0,0 +1,11 @@
[variables]
main_domain = "${domain}"
[config]
env = ["BASEROW_HOST=${main_domain}"]
mounts = []
[[config.domains]]
serviceName = "baserow"
port = 80
host = "${main_domain}"

View File

@@ -1,13 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: baserow
port: 80
host: ${main_domain}
env:
- BASEROW_HOST=${main_domain}
mounts: []

View File

@@ -0,0 +1,18 @@
version: "3.8"
services:
bazarr:
image: lscr.io/linuxserver/bazarr:1.5.1
restart: unless-stopped
ports:
- 6767
environment:
- PUID=1000
- PGID=1000
- TZ=UTC
volumes:
- config:/config
- ${MOVIES_PATH}:/movies
- ${TV_PATH}:/tv
volumes:
config: {}

BIN
blueprints/bazarr/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@@ -0,0 +1,14 @@
[variables]
main_domain = "${domain}"
movies_path = "/path/to/movies"
tv_path = "/path/to/tv"
[config]
[[config.domains]]
serviceName = "bazarr"
port = 6767
host = "${main_domain}"
[config.env]
MOVIES_PATH = "${movies_path}"
TV_PATH = "${tv_path}"

View File

@@ -0,0 +1,13 @@
version: "3.8"
services:
beszel:
image: henrygd/beszel:0.9.1
restart: unless-stopped
ports:
- 8090
volumes:
- beszel_data:/beszel_data
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
beszel_data: {}

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 56 70" fill="#888"><path d="M35 70H0V0h35q4.4 0 8.2 1.7a21.4 21.4 0 0 1 6.6 4.5q2.9 2.8 4.5 6.6Q56 16.7 56 21a15.4 15.4 0 0 1-.3 3.2 17.6 17.6 0 0 1-.2.8 19.4 19.4 0 0 1-1.5 4 17 17 0 0 1-2.4 3.4 13.5 13.5 0 0 1-2.6 2.3 12.5 12.5 0 0 1-.4.3q1.7 1 3 2.5Q53 39.1 54 41a18.3 18.3 0 0 1 1.5 4 17.4 17.4 0 0 1 .5 3 15.3 15.3 0 0 1 0 1q0 4.4-1.7 8.2a21.4 21.4 0 0 1-4.5 6.6q-2.8 2.9-6.6 4.6Q39.4 70 35 70ZM14 14v14h21a7 7 0 0 0 2.3-.3 6.6 6.6 0 0 0 .4-.2Q39 27 40 26a6.9 6.9 0 0 0 1.5-2.2q.5-1.3.5-2.8a7 7 0 0 0-.4-2.3 6.6 6.6 0 0 0-.1-.4Q40.9 17 40 16a7 7 0 0 0-2.3-1.4 6.9 6.9 0 0 0-2.5-.6 7.9 7.9 0 0 0-.2 0H14Zm0 28v14h21a7 7 0 0 0 2.3-.4 6.6 6.6 0 0 0 .4-.1Q39 54.9 40 54a7 7 0 0 0 1.5-2.2 6.9 6.9 0 0 0 .5-2.6 7.9 7.9 0 0 0 0-.2 7 7 0 0 0-.4-2.3 6.6 6.6 0 0 0-.1-.4Q40.9 45 40 44a7 7 0 0 0-2.3-1.5 6.9 6.9 0 0 0-2.5-.6 7.9 7.9 0 0 0-.2 0H14Z"/></svg>

After

Width:  |  Height:  |  Size: 903 B

View File

@@ -0,0 +1,8 @@
[variables]
main_domain = "${domain}"
[config]
[[config.domains]]
serviceName = "beszel"
port = 8090
host = "${main_domain}"

View File

@@ -0,0 +1,18 @@
[variables]
main_domain = "${domain}"
[config]
env = [
"PUID=1000",
"PGID=1000",
"TZ=Etc/UTC",
"SUBFOLDER=/",
"NVIDIA_VISIBLE_DEVICES=all",
"NVIDIA_DRIVER_CAPABILITIES=all",
]
mounts = []
[[config.domains]]
serviceName = "blender"
port = 3_000
host = "${main_domain}"

View File

@@ -1,18 +0,0 @@
variables:
main_domain: ${domain}
config:
domains:
- serviceName: blender
port: 3000
host: ${main_domain}
env:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- SUBFOLDER=/
- NVIDIA_VISIBLE_DEVICES=all
- NVIDIA_DRIVER_CAPABILITIES=all
mounts: []

View File

@@ -0,0 +1,114 @@
<svg width="1024" height="1024" viewBox="0 0 1024 1024" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1_3)">
<rect width="1024" height="1024" rx="267" fill="url(#paint0_linear_1_3)"/>
<g style="mix-blend-mode:overlay">
<line x1="17.4026" y1="-3069" x2="17.4026" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="50.2617" y1="-3069" x2="50.2617" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="83.1208" y1="-3069" x2="83.1208" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="115.98" y1="-3069" x2="115.98" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="148.839" y1="-3069" x2="148.839" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="181.698" y1="-3069" x2="181.698" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="214.557" y1="-3069" x2="214.557" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="247.417" y1="-3069" x2="247.417" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="280.276" y1="-3069" x2="280.276" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="313.135" y1="-3069" x2="313.135" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="345.994" y1="-3069" x2="345.994" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="378.853" y1="-3069" x2="378.853" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="411.712" y1="-3069" x2="411.712" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="444.571" y1="-3069" x2="444.571" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="477.43" y1="-3069" x2="477.43" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="510.289" y1="-3069" x2="510.289" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="543.149" y1="-3069" x2="543.149" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="576.008" y1="-3069" x2="576.008" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="608.867" y1="-3069" x2="608.867" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="641.726" y1="-3069" x2="641.726" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="674.585" y1="-3069" x2="674.585" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="707.444" y1="-3069" x2="707.444" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="740.304" y1="-3069" x2="740.304" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="773.163" y1="-3069" x2="773.163" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="806.022" y1="-3069" x2="806.022" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="838.881" y1="-3069" x2="838.881" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="871.74" y1="-3069" x2="871.74" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="904.599" y1="-3069" x2="904.599" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="937.458" y1="-3069" x2="937.458" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="970.317" y1="-3069" x2="970.317" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="1003.18" y1="-3069" x2="1003.18" y2="3881" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="11.5" x2="-15.9948" y2="11.4999" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="39.5" x2="-15.9948" y2="39.4999" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="67.5" x2="-15.9946" y2="67.4999" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="95.5" x2="-15.9945" y2="95.4999" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="123.5" x2="-15.9945" y2="123.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="151.5" x2="-15.9944" y2="151.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="179.5" x2="-15.9944" y2="179.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="207.5" x2="-15.9941" y2="207.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="235.5" x2="-15.9941" y2="235.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="263.5" x2="-15.994" y2="263.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="291.5" x2="-15.994" y2="291.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="319.5" x2="-15.9939" y2="319.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="347.5" x2="-15.9939" y2="347.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="375.5" x2="-15.9937" y2="375.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="403.5" x2="-15.9937" y2="403.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="431.5" x2="-15.9935" y2="431.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="459.5" x2="-15.9935" y2="459.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="487.5" x2="-15.9935" y2="487.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="515.5" x2="-15.9933" y2="515.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="543.5" x2="-15.9933" y2="543.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="571.5" x2="-15.9933" y2="571.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="599.5" x2="-15.9932" y2="599.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="627.5" x2="-15.9932" y2="627.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="655.5" x2="-15.993" y2="655.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="683.5" x2="-15.993" y2="683.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="711.5" x2="-15.9928" y2="711.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="739.5" x2="-15.9928" y2="739.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="767.5" x2="-15.9927" y2="767.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="795.5" x2="-15.9927" y2="795.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="823.5" x2="-15.9926" y2="823.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="851.5" x2="-15.9926" y2="851.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="879.5" x2="-15.9922" y2="879.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="907.5" x2="-15.9922" y2="907.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="935.5" x2="-15.9921" y2="935.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="963.5" x2="-15.9921" y2="963.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="991.5" x2="-15.9919" y2="991.5" stroke="white" stroke-opacity="0.2"/>
<line x1="1626.96" y1="1019.5" x2="-15.9919" y2="1019.5" stroke="white" stroke-opacity="0.2"/>
</g>
<circle cx="539" cy="531.521" r="273" fill="url(#paint1_linear_1_3)"/>
<path d="M196.206 267.647C184.176 273.707 182.142 294.177 182.763 306.932C182.98 311.386 185.812 315.214 189.96 316.852C213.92 326.313 246.186 327.787 255.979 328.481C264.787 329.105 264.339 324.454 263.493 319.88C263.148 318.011 262.198 316.289 260.776 315.027L212.568 272.269C207.954 268.178 201.713 264.873 196.206 267.647Z" fill="white" stroke="black"/>
<path d="M305.971 160.544C293.123 154.358 279.891 167.481 271.949 177.767C269.257 181.255 268.693 185.871 270.138 190.034C280.064 218.641 297.012 266.106 304.132 273.728C310.69 280.748 322.672 273.372 328.238 268.037C329.803 266.537 330.283 264.316 329.899 262.182L313.962 173.644C313.008 168.341 310.826 162.881 305.971 160.544Z" fill="white" stroke="black"/>
<circle opacity="0.37" cx="376.5" cy="455.021" r="61.5" fill="#FF2E3C"/>
<circle opacity="0.37" cx="551.5" cy="461.021" r="67.5" fill="#FF2E3C"/>
<g filter="url(#filter0_b_1_3)">
<circle cx="522" cy="554.521" r="273" fill="url(#paint2_linear_1_3)"/>
<circle cx="522" cy="554.521" r="272" stroke="url(#paint3_linear_1_3)" stroke-width="2"/>
</g>
<path d="M565.623 369.415L503.25 397.459C502.424 397.83 501.667 398.35 501.085 399.043C493.406 408.186 496.293 420.291 499.412 426.57C500.06 427.874 501.224 428.817 502.572 429.368L565.143 454.945C567.52 455.916 570.237 455.509 572.224 453.883L572.665 453.523C577.307 449.724 580 444.042 580 438.043V436.486C580 433.274 577.814 430.475 574.698 429.695L554 424.521L534.351 420.1C534.117 420.047 533.888 419.976 533.667 419.885C531.04 418.812 530.148 415.536 531.87 413.28L533.997 410.491C534.969 409.216 536.35 408.314 537.907 407.936L553.448 404.155C553.815 404.066 554.189 404.007 554.566 403.978L564.28 403.23C573.822 402.496 582.598 395.872 580.955 386.444C579.297 376.925 573.954 368.77 567.458 368.937C566.82 368.953 566.205 369.154 565.623 369.415Z" fill="black" stroke="black"/>
<ellipse cx="398.491" cy="403.257" rx="28" ry="33.5" transform="rotate(2.60014 398.491 403.257)" fill="black"/>
</g>
<defs>
<filter id="filter0_b_1_3" x="196.7" y="229.221" width="650.6" height="650.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feGaussianBlur in="BackgroundImageFix" stdDeviation="26.15"/>
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur_1_3"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur_1_3" result="shape"/>
</filter>
<linearGradient id="paint0_linear_1_3" x1="69" y1="48.5" x2="908" y2="998" gradientUnits="userSpaceOnUse">
<stop/>
<stop offset="1" stop-color="#20171B" stop-opacity="0.9"/>
</linearGradient>
<linearGradient id="paint1_linear_1_3" x1="539.041" y1="826.505" x2="539.041" y2="283.356" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFD000"/>
<stop offset="0.52" stop-color="#FFCA40"/>
<stop offset="1" stop-color="#FFE0F9"/>
</linearGradient>
<linearGradient id="paint2_linear_1_3" x1="279.825" y1="796.696" x2="764.175" y2="312.346" gradientUnits="userSpaceOnUse">
<stop stop-color="white" stop-opacity="0.2"/>
<stop offset="1" stop-color="white" stop-opacity="0.49"/>
</linearGradient>
<linearGradient id="paint3_linear_1_3" x1="287.541" y1="324.463" x2="743.946" y2="812.465" gradientUnits="userSpaceOnUse">
<stop stop-color="white"/>
<stop offset="1" stop-color="white" stop-opacity="0"/>
</linearGradient>
<clipPath id="clip0_1_3">
<rect width="1024" height="1024" rx="267" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@@ -0,0 +1,48 @@
version: "3.8"
services:
blinko-website:
image: blinkospace/blinko:latest
container_name: blinko-website
environment:
NODE_ENV: production
NEXTAUTH_SECRET: ${nextauth_secret}
DATABASE_URL: postgresql://postgres:${postgres_password}@blinko-postgres:5432/postgres
NEXTAUTH_URL: ${nextauth_url}
NEXT_PUBLIC_BASE_URL: ${next_public_base_url}
depends_on:
blinko-postgres:
condition: service_healthy
restart: always
logging:
options:
max-size: "10m"
max-file: "3"
ports:
- 1111:1111
healthcheck:
test: ["CMD", "curl", "-f", "http://blinko-website:1111/"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
blinko-postgres:
image: postgres:14
container_name: blinko-postgres
restart: always
environment:
POSTGRES_DB: postgres
POSTGRES_USER: postgres
POSTGRES_PASSWORD: ${postgres_password}
TZ: Asia/Shanghai
volumes:
- blinko-db:/var/lib/postgresql/data
healthcheck:
test: ["CMD", "pg_isready", "-U", "postgres", "-d", "postgres"]
interval: 5s
timeout: 10s
retries: 5
volumes:
blinko-db: {}

View File

@@ -0,0 +1,20 @@
[variables]
main_domain = "${domain}"
postgres_password = "${password:16}"
nextauth_secret = "${password:32}"
nextauth_url = "http://${main_domain}"
next_public_base_url = "http://${main_domain}"
[config]
env = [
"nextauth_secret=${nextauth_secret}",
"postgres_password=${postgres_password}",
"nextauth_url=${nextauth_url}",
"next_public_base_url=${next_public_base_url}",
]
mounts = []
[[config.domains]]
serviceName = "blinko-website"
port = 1_111
host = "${main_domain}"

View File

@@ -0,0 +1,20 @@
variables:
main_domain: ${domain}
postgres_password: ${password:16}
nextauth_secret: ${password:32}
nextauth_url: http://${main_domain}
next_public_base_url: http://${main_domain}
config:
domains:
- serviceName: blinko-website
port: 1111
host: ${main_domain}
env:
- nextauth_secret=${nextauth_secret}
- postgres_password=${postgres_password}
- nextauth_url=${nextauth_url}
- next_public_base_url=${next_public_base_url}
mounts: []

View File

@@ -0,0 +1,35 @@
version: "3.8"
services:
bookstack:
image: lscr.io/linuxserver/bookstack:24.12.1
restart: unless-stopped
ports:
- 80
environment:
- PUID=1000
- PGID=1000
- APP_URL=http://${DOMAIN}
- DB_HOST=bookstack-db
- DB_USERNAME=mariadb
- DB_PASSWORD=${DB_PASSWORD}
- DB_DATABASE=bookstack
- APP_KEY=${APP_KEY}
volumes:
- config:/config
depends_on:
- bookstack-db
bookstack-db:
image: mariadb:10.11
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
- MYSQL_DATABASE=bookstack
- MYSQL_USER=mariadb
- MYSQL_PASSWORD=${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
config: {}
db_data: {}

View File

@@ -0,0 +1,13 @@
<svg xmlns="http://www.w3.org/2000/svg" height="61.699mm" width="65.023mm" version="1.1" viewBox="0 0 230.39711 218.6199">
<g stroke-linejoin="round" fill-rule="evenodd" transform="translate(-245.27 -58.434)" stroke="#0288d1" stroke-width="6" fill="#fff">
<g stroke-linecap="round">
<path d="m343.79 238.6 128.88-74.409-92.058-53.15-128.88 74.409z"></path>
<path d="m251.73 185.45v21.26l92.058 53.15 128.88-74.409v-21.26"></path>
<path d="m343.79 274.03-92.058-53.15s-7.5-16.918 0-28.346l92.058 53.15 128.88-74.409v28.346l-128.88 74.409"></path>
<path d="m343.79 188.99 128.88-74.41-92.06-53.146-128.88 74.406z"></path>
<path d="m343.79 188.99 128.88-74.409 0.00001 28.346-128.88 74.409-92.058-53.15s-6.0714-17.632 0-28.346z"></path>
<path d="m343.79 245.69-92.058-53.15s-7.5-16.918 0-28.346l92.058 53.15 128.88-74.409-0.00001 28.346-128.88 74.409"></path>
</g>
<path d="m402.09 73.836-55.234 31.89 21.48 1.7716 3.0686 12.402 55.235-31.89z"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 986 B

View File

@@ -0,0 +1,15 @@
[variables]
main_domain = "${domain}"
db_password = "${password:16}"
app_key = "${password:32}"
[config]
[[config.domains]]
serviceName = "bookstack"
port = 80
host = "${main_domain}"
[config.env]
DOMAIN = "${main_domain}"
DB_PASSWORD = "${db_password}"
APP_KEY = "${app_key}"

View File

@@ -0,0 +1,34 @@
version: "3.8"
services:
botpress:
image: botpress/server:12.31.9
restart: unless-stopped
ports:
- 81
environment:
- BP_HOST=0.0.0.0
- NODE_ENV=production
- PG_HOST=botpress-db
- PG_PORT=5432
- PG_USER=postgres
- PG_PASSWORD=${DB_PASSWORD}
- PG_SSL=false
- PORT=80
volumes:
- data:/botpress/data
depends_on:
- botpress-db
botpress-db:
image: postgres:15-alpine
restart: unless-stopped
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=botpress
volumes:
- db_data:/var/lib/postgresql/data
volumes:
data: {}
db_data: {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -0,0 +1,12 @@
[variables]
main_domain = "${domain}"
db_password = "${password:16}"
[config]
[[config.domains]]
serviceName = "botpress"
port = 81
host = "${main_domain}"
[config.env]
DB_PASSWORD = "${db_password}"

View File

@@ -0,0 +1,15 @@
[variables]
main_domain = "${domain}"
browserless_token = "${password:16}"
[config]
env = [
"BROWERLESS_HOST=${main_domain}",
"BROWSERLESS_TOKEN=${browserless_token}",
]
mounts = []
[[config.domains]]
serviceName = "browserless"
port = 3_000
host = "${main_domain}"

Some files were not shown because too many files have changed in this diff Show More