mirror of
https://github.com/Dokploy/templates
synced 2025-06-26 18:16:07 +00:00
Merge branch 'Dokploy:main' into main
This commit is contained in:
commit
29d76e31e1
76
.github/workflows/validate.yml
vendored
76
.github/workflows/validate.yml
vendored
@ -49,6 +49,82 @@ jobs:
|
|||||||
echo "✅ Blueprint folders validated successfully."
|
echo "✅ Blueprint folders validated successfully."
|
||||||
fi
|
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
|
- name: Validate meta.json matches blueprint folders and logo files
|
||||||
run: |
|
run: |
|
||||||
echo "🔍 Validating meta.json against blueprint folders and logos..."
|
echo "🔍 Validating meta.json against blueprint folders and logos..."
|
||||||
|
@ -7,7 +7,7 @@ This is the official repository for the Dokploy Open Source Templates.
|
|||||||
|
|
||||||
1. Fork the repository
|
1. Fork the repository
|
||||||
2. Create a new branch
|
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
|
4. Add the template metadata (name, description, version, logo, links, tags) to the `meta.json` file
|
||||||
5. Add the logo to the template folder
|
5. Add the logo to the template folder
|
||||||
6. Commit and push your changes
|
6. Commit and push your changes
|
||||||
@ -58,7 +58,7 @@ port = 3000
|
|||||||
host = "${main_domain}"
|
host = "${main_domain}"
|
||||||
|
|
||||||
|
|
||||||
[[config.env]]
|
[config.env]
|
||||||
|
|
||||||
[[config.mounts]]
|
[[config.mounts]]
|
||||||
```
|
```
|
||||||
@ -131,7 +131,7 @@ 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
|
### Helpers
|
||||||
|
|
||||||
@ -145,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.
|
- `randomPort`: This is a helper that will generate a random port for the template.
|
||||||
- `timestamp`: This is a helper that will generate a timestamp.
|
- `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.
|
- `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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
65
blueprints/kestra/docker-compose.yml
Normal file
65
blueprints/kestra/docker-compose.yml
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
volumes:
|
||||||
|
postgres-data:
|
||||||
|
driver: local
|
||||||
|
kestra-data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
services:
|
||||||
|
postgres:
|
||||||
|
image: postgres
|
||||||
|
volumes:
|
||||||
|
- postgres-data:/var/lib/postgresql/data
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: kestra
|
||||||
|
POSTGRES_USER: kestra
|
||||||
|
POSTGRES_PASSWORD: k3str4
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 10
|
||||||
|
|
||||||
|
kestra:
|
||||||
|
image: kestra/kestra:latest
|
||||||
|
pull_policy: always
|
||||||
|
# Note that this setup with a root user is intended for development purpose.
|
||||||
|
# Our base image runs without root, but the Docker Compose implementation needs root to access the Docker socket
|
||||||
|
# To run Kestra in a rootless mode in production, see: https://kestra.io/docs/installation/podman-compose
|
||||||
|
user: "root"
|
||||||
|
command: server standalone
|
||||||
|
volumes:
|
||||||
|
- kestra-data:/app/storage
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
- /tmp/kestra-wd:/tmp/kestra-wd
|
||||||
|
environment:
|
||||||
|
KESTRA_CONFIGURATION: |
|
||||||
|
datasources:
|
||||||
|
postgres:
|
||||||
|
url: jdbc:postgresql://postgres:5432/kestra
|
||||||
|
driverClassName: org.postgresql.Driver
|
||||||
|
username: kestra
|
||||||
|
password: k3str4
|
||||||
|
kestra:
|
||||||
|
server:
|
||||||
|
basicAuth:
|
||||||
|
enabled: false
|
||||||
|
username: "admin@localhost.dev" # it must be a valid email address
|
||||||
|
password: kestra
|
||||||
|
repository:
|
||||||
|
type: postgres
|
||||||
|
storage:
|
||||||
|
type: local
|
||||||
|
local:
|
||||||
|
basePath: "/app/storage"
|
||||||
|
queue:
|
||||||
|
type: postgres
|
||||||
|
tasks:
|
||||||
|
tmpDir:
|
||||||
|
path: /tmp/kestra-wd/tmp
|
||||||
|
url: http://localhost:8080/
|
||||||
|
ports:
|
||||||
|
- "8080"
|
||||||
|
- "8081"
|
||||||
|
depends_on:
|
||||||
|
postgres:
|
||||||
|
condition: service_started
|
17
blueprints/kestra/kestra.svg
Normal file
17
blueprints/kestra/kestra.svg
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<svg width="600" height="601" viewBox="0 0 600 601" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_380_149)">
|
||||||
|
<path d="M0 68.0229C0 30.9784 30.0305 0.947876 67.075 0.947876H532.925C569.97 0.947876 600 30.9784 600 68.0229V533.873C600 570.917 569.969 600.948 532.925 600.948H67.075C30.0305 600.948 0 570.917 0 533.873V68.0229Z" fill="#2C0059"/>
|
||||||
|
<path d="M285.264 252.767C293.401 244.63 306.594 244.63 314.731 252.767L348.179 286.215C356.317 294.352 356.317 307.545 348.179 315.682L314.731 349.13C306.594 357.268 293.401 357.268 285.264 349.13L251.816 315.682C243.679 307.545 243.679 294.352 251.816 286.215L285.264 252.767Z" fill="#A950FF"/>
|
||||||
|
<path d="M439.322 252.5C447.313 244.509 460.27 244.509 468.261 252.5L502.237 286.476C510.228 294.467 510.228 307.424 502.237 315.415L468.261 349.391C460.27 357.382 447.313 357.383 439.322 349.391L405.346 315.415C397.355 307.424 397.355 294.467 405.346 286.476L439.322 252.5Z" fill="#A950FF"/>
|
||||||
|
<path d="M285.528 98.7109C293.519 90.7194 306.476 90.7194 314.468 98.7109L348.443 132.686C356.435 140.678 356.435 153.635 348.443 161.626L314.468 195.602C306.476 203.593 293.519 203.593 285.528 195.602L251.552 161.626C243.561 153.635 243.561 140.678 251.552 132.686L285.528 98.7109Z" fill="#E9C1FF"/>
|
||||||
|
<path d="M271.29 209.32C279.427 217.457 279.427 230.65 271.29 238.787L237.842 272.235C229.705 280.372 216.512 280.372 208.375 272.235L174.927 238.787C166.789 230.65 166.789 217.457 174.927 209.32L208.375 175.871C216.512 167.734 229.705 167.734 237.842 175.871L271.29 209.32Z" fill="#CD88FF"/>
|
||||||
|
<path d="M194.654 286.476C202.645 294.467 202.645 307.424 194.654 315.415L160.678 349.391C152.687 357.382 139.73 357.382 131.738 349.391L97.7629 315.415C89.7714 307.424 89.7714 294.467 97.7629 286.476L131.738 252.5C139.73 244.509 152.687 244.509 160.678 252.5L194.654 286.476Z" fill="#A950FF"/>
|
||||||
|
<path d="M425.078 209.32C433.215 217.457 433.215 230.65 425.078 238.787L391.63 272.235C383.492 280.372 370.3 280.372 362.163 272.235L328.714 238.787C320.577 230.65 320.577 217.457 328.714 209.32L362.163 175.871C370.3 167.734 383.492 167.734 391.63 175.871L425.078 209.32Z" fill="#CD88FF"/>
|
||||||
|
<path d="M332.916 428.992C351.095 447.171 351.095 476.645 332.916 494.824C314.737 513.003 285.263 513.003 267.084 494.824C248.905 476.645 248.905 447.171 267.084 428.992C285.263 410.813 314.737 410.813 332.916 428.992Z" fill="#F62E76"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_380_149">
|
||||||
|
<rect width="600" height="600" fill="white" transform="translate(0 0.947876)"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
13
blueprints/kestra/template.toml
Normal file
13
blueprints/kestra/template.toml
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[variables]
|
||||||
|
main_domain = "${domain}"
|
||||||
|
|
||||||
|
[config]
|
||||||
|
[[config.domains]]
|
||||||
|
serviceName = "kestra"
|
||||||
|
port = 8080
|
||||||
|
host = "${main_domain}"
|
||||||
|
|
||||||
|
|
||||||
|
[config.env]
|
||||||
|
|
||||||
|
[[config.mounts]]
|
34
meta.json
34
meta.json
@ -1,5 +1,4 @@
|
|||||||
[
|
[ {
|
||||||
{
|
|
||||||
"id": "appwrite",
|
"id": "appwrite",
|
||||||
"name": "Appwrite",
|
"name": "Appwrite",
|
||||||
"version": "1.6.0",
|
"version": "1.6.0",
|
||||||
@ -273,6 +272,21 @@
|
|||||||
"automation"
|
"automation"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"id": "kestra",
|
||||||
|
"name": "Kestra",
|
||||||
|
"version": "latest",
|
||||||
|
"description": "Unified Orchestration Platform to Simplify Business-Critical Workflows and Govern them as Code and from the UI.",
|
||||||
|
"logo": "kestra.svg",
|
||||||
|
"links": {
|
||||||
|
"github": "https://github.com/kestra-io/kestra",
|
||||||
|
"website": "https://kestra.io",
|
||||||
|
"docs": "https://kestra.io/docs"
|
||||||
|
},
|
||||||
|
"tags": [
|
||||||
|
"automation"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "wordpress",
|
"id": "wordpress",
|
||||||
"name": "Wordpress",
|
"name": "Wordpress",
|
||||||
@ -1636,7 +1650,8 @@
|
|||||||
"logo": "it-tools.svg",
|
"logo": "it-tools.svg",
|
||||||
"links": {
|
"links": {
|
||||||
"github": "https://github.com/CorentinTh/it-tools",
|
"github": "https://github.com/CorentinTh/it-tools",
|
||||||
"website": "https://it-tools.tech"
|
"website": "https://it-tools.tech",
|
||||||
|
"docs": "https://it-tools.tech/docs"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"developer",
|
"developer",
|
||||||
@ -1670,7 +1685,8 @@
|
|||||||
"logo": "glance.png",
|
"logo": "glance.png",
|
||||||
"links": {
|
"links": {
|
||||||
"github": "https://github.com/glanceapp/glance",
|
"github": "https://github.com/glanceapp/glance",
|
||||||
"docs": "https://github.com/glanceapp/glance/blob/main/docs/configuration.md"
|
"docs": "https://github.com/glanceapp/glance/blob/main/docs/configuration.md",
|
||||||
|
"website": "https://glance.app/"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"dashboard",
|
"dashboard",
|
||||||
@ -2148,7 +2164,8 @@
|
|||||||
"logo": "logo.png",
|
"logo": "logo.png",
|
||||||
"links": {
|
"links": {
|
||||||
"github": "https://github.com/supernova3339/anonupload",
|
"github": "https://github.com/supernova3339/anonupload",
|
||||||
"docs": "https://github.com/Supernova3339/anonupload/blob/main/env.md"
|
"docs": "https://github.com/Supernova3339/anonupload/blob/main/env.md",
|
||||||
|
"website": "https://anonupload.com/"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"file-sharing",
|
"file-sharing",
|
||||||
@ -2265,7 +2282,9 @@
|
|||||||
"description": "Barrage is a minimalistic Deluge WebUI app with full mobile support. It features a responsive mobile-first design, allowing you to manage your torrents with ease from any device.",
|
"description": "Barrage is a minimalistic Deluge WebUI app with full mobile support. It features a responsive mobile-first design, allowing you to manage your torrents with ease from any device.",
|
||||||
"logo": "logo.png",
|
"logo": "logo.png",
|
||||||
"links": {
|
"links": {
|
||||||
"github": "https://github.com/maulik9898/barrage"
|
"github": "https://github.com/maulik9898/barrage",
|
||||||
|
"website": "https://github.com/maulik9898/barrage",
|
||||||
|
"docs": "https://github.com/maulik9898/barrage/blob/main/README.md"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"torrents",
|
"torrents",
|
||||||
@ -2536,7 +2555,8 @@
|
|||||||
"logo": "logo.png",
|
"logo": "logo.png",
|
||||||
"links": {
|
"links": {
|
||||||
"github": "https://github.com/linuxserver/docker-chromium",
|
"github": "https://github.com/linuxserver/docker-chromium",
|
||||||
"docs": "https://docs.linuxserver.io/images/docker-chromium"
|
"docs": "https://docs.linuxserver.io/images/docker-chromium",
|
||||||
|
"website": "https://docs.linuxserver.io/images/docker-chromium"
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"browser",
|
"browser",
|
||||||
|
Loading…
Reference in New Issue
Block a user