Merge branch 'main' of https://github.com/Dokploy/templates
80
.github/workflows/validate.yml
vendored
@@ -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..."
|
||||
|
||||
87
README.md
@@ -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.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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);
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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>
|
||||
) : (
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
23
blueprints/ackee/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 22 KiB |
18
blueprints/ackee/template.toml
Normal 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}"
|
||||
|
||||
21
blueprints/activepieces/template.toml
Normal 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}"
|
||||
@@ -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: []
|
||||
11
blueprints/actualbudget/template.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "actualbudget"
|
||||
port = 5_006
|
||||
host = "${main_domain}"
|
||||
@@ -1,12 +0,0 @@
|
||||
variables:
|
||||
main_domain: ${domain}
|
||||
|
||||
config:
|
||||
domains:
|
||||
- serviceName: actualbudget
|
||||
port: 5006
|
||||
host: ${main_domain}
|
||||
|
||||
env: []
|
||||
|
||||
mounts: []
|
||||
21
blueprints/adguardhome/docker-compose.yml
Normal 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: {}
|
||||
20
blueprints/adguardhome/logo.svg
Normal 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 |
12
blueprints/adguardhome/template.toml
Normal file
@@ -0,0 +1,12 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "adguardhome"
|
||||
port = 3000
|
||||
host = "${main_domain}"
|
||||
|
||||
7
blueprints/adminer/docker-compose.yml
Normal file
@@ -0,0 +1,7 @@
|
||||
version: "3.8"
|
||||
services:
|
||||
adminer:
|
||||
image: adminer:4.8.1
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- 8080
|
||||
42
blueprints/adminer/logo.svg
Normal 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 |
8
blueprints/adminer/template.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "adminer"
|
||||
port = 8080
|
||||
host = "${main_domain}"
|
||||
65
blueprints/affinepro/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/affinepro/logo.png
Normal file
|
After Width: | Height: | Size: 8.3 KiB |
25
blueprints/affinepro/template.toml
Normal 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}"
|
||||
11
blueprints/alist/template.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "alist"
|
||||
port = 5_244
|
||||
host = "${main_domain}"
|
||||
@@ -1,12 +0,0 @@
|
||||
variables:
|
||||
main_domain: ${domain}
|
||||
|
||||
config:
|
||||
domains:
|
||||
- serviceName: alist
|
||||
port: 5244
|
||||
host: ${main_domain}
|
||||
|
||||
env: []
|
||||
|
||||
mounts: []
|
||||
12
blueprints/alltube/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 31 KiB |
18
blueprints/alltube/template.toml
Normal 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}"
|
||||
17
blueprints/ampache/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 8.9 KiB |
12
blueprints/ampache/template.toml
Normal 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}"
|
||||
16
blueprints/anonupload/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/anonupload/logo.png
Normal file
|
After Width: | Height: | Size: 258 KiB |
16
blueprints/anonupload/template.toml
Normal 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}"
|
||||
12
blueprints/answer/template.toml
Normal 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}"
|
||||
@@ -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: []
|
||||
16
blueprints/anythingllm/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/anythingllm/logo.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
8
blueprints/anythingllm/template.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "anythingllm"
|
||||
port = 3001
|
||||
host = "${main_domain}"
|
||||
16
blueprints/apprise-api/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/apprise-api/logo.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
8
blueprints/apprise-api/template.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "apprise-api"
|
||||
port = 8000
|
||||
host = "${main_domain}"
|
||||
11
blueprints/appsmith/template.toml
Normal file
@@ -0,0 +1,11 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
env = []
|
||||
mounts = []
|
||||
|
||||
[[config.domains]]
|
||||
serviceName = "appsmith"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
@@ -1,12 +0,0 @@
|
||||
variables:
|
||||
main_domain: ${domain}
|
||||
|
||||
config:
|
||||
domains:
|
||||
- serviceName: appsmith
|
||||
port: 80
|
||||
host: ${main_domain}
|
||||
|
||||
env: []
|
||||
|
||||
mounts: []
|
||||
143
blueprints/appwrite/template.toml
Normal 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"
|
||||
@@ -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: []
|
||||
12
blueprints/aptabase/template.toml
Normal 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}"
|
||||
@@ -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: []
|
||||
14
blueprints/arangodb/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/arangodb/logo.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
12
blueprints/arangodb/template.toml
Normal 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}"
|
||||
77
blueprints/argilla/docker-compose.yml
Normal 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: {}
|
||||
12
blueprints/argilla/logo.svg
Normal 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 |
19
blueprints/argilla/template.toml
Normal 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"
|
||||
17
blueprints/audiobookshelf/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/audiobookshelf/logo.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
12
blueprints/audiobookshelf/template.toml
Normal 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}"
|
||||
40
blueprints/authorizer/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/authorizer/logo.png
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
16
blueprints/authorizer/template.toml
Normal 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}"
|
||||
73
blueprints/automatisch/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/automatisch/logo.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
20
blueprints/automatisch/template.toml
Normal 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}"
|
||||
19
blueprints/babybuddy/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/babybuddy/logo.png
Normal file
|
After Width: | Height: | Size: 27 KiB |
15
blueprints/babybuddy/template.toml
Normal 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}"
|
||||
1
blueprints/backrest/backrest.svg
Normal 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 |
21
blueprints/backrest/docker-compose.yml
Normal 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:
|
||||
11
blueprints/backrest/template.toml
Normal 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}"
|
||||
@@ -3,10 +3,9 @@ variables:
|
||||
|
||||
config:
|
||||
domains:
|
||||
- serviceName: otterwiki
|
||||
port: 80
|
||||
- serviceName: backrest
|
||||
port: 9898
|
||||
host: ${main_domain}
|
||||
|
||||
env: []
|
||||
|
||||
env:
|
||||
- TZ=Europe/Paris
|
||||
mounts: []
|
||||
16
blueprints/baikal/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 9.9 KiB |
8
blueprints/baikal/template.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "baikal"
|
||||
port = 80
|
||||
host = "${main_domain}"
|
||||
13
blueprints/barrage/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 13 KiB |
15
blueprints/barrage/template.toml
Normal 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}"
|
||||
11
blueprints/baserow/template.toml
Normal 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}"
|
||||
@@ -1,13 +0,0 @@
|
||||
variables:
|
||||
main_domain: ${domain}
|
||||
|
||||
config:
|
||||
domains:
|
||||
- serviceName: baserow
|
||||
port: 80
|
||||
host: ${main_domain}
|
||||
|
||||
env:
|
||||
- BASEROW_HOST=${main_domain}
|
||||
|
||||
mounts: []
|
||||
18
blueprints/bazarr/docker-compose.yml
Normal 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
|
After Width: | Height: | Size: 4.7 KiB |
14
blueprints/bazarr/template.toml
Normal 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}"
|
||||
13
blueprints/beszel/docker-compose.yml
Normal 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: {}
|
||||
1
blueprints/beszel/logo.svg
Normal 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 |
8
blueprints/beszel/template.toml
Normal file
@@ -0,0 +1,8 @@
|
||||
[variables]
|
||||
main_domain = "${domain}"
|
||||
|
||||
[config]
|
||||
[[config.domains]]
|
||||
serviceName = "beszel"
|
||||
port = 8090
|
||||
host = "${main_domain}"
|
||||
18
blueprints/blender/template.toml
Normal 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}"
|
||||
@@ -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: []
|
||||
114
blueprints/blinko/blinko.svg
Normal 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 |
48
blueprints/blinko/docker-compose.yml
Normal 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: {}
|
||||
20
blueprints/blinko/template.toml
Normal 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}"
|
||||
20
blueprints/blinko/template.yml
Normal 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: []
|
||||
35
blueprints/bookstack/docker-compose.yml
Normal 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: {}
|
||||
13
blueprints/bookstack/logo.svg
Normal 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 |
15
blueprints/bookstack/template.toml
Normal 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}"
|
||||
34
blueprints/botpress/docker-compose.yml
Normal 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: {}
|
||||
BIN
blueprints/botpress/logo.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
12
blueprints/botpress/template.toml
Normal 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}"
|
||||
15
blueprints/browserless/template.toml
Normal 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}"
|
||||