Compare commits
53 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d55c4ba91c | |||
|
|
d1cc35f74a | ||
| 9fc9328da1 | |||
|
|
09db63628f | ||
| dc382931d1 | |||
|
|
312c394c47 | ||
| 1e66bfeff6 | |||
|
|
dfd7499bcb | ||
| 90e7296c5d | |||
|
|
b70d06cb9f | ||
| b6016ae919 | |||
|
|
69ee047ca3 | ||
| 16203f261c | |||
|
|
e98ddd732a | ||
|
|
0225a4a99f | ||
| 3c83a4e355 | |||
|
|
0acd1b437c | ||
|
|
0d01cecc65 | ||
| 7c46b1f182 | |||
|
|
997d009d30 | ||
| 611bd27357 | |||
|
|
83454d883c | ||
| 90414bc509 | |||
|
|
54d622151f | ||
| 5c6d2f2c84 | |||
| 9107ce3af6 | |||
| 7101cc4b75 | |||
|
|
7978eb7e94 | ||
| fc645c9f5d | |||
|
|
191b0ddf90 | ||
| 0eaccc6edb | |||
|
|
d51031b453 | ||
| 5eee9625eb | |||
|
|
5879ea246e | ||
| 6770728911 | |||
|
|
958e39ddb0 | ||
| dce1bd1b45 | |||
|
|
4ecde2fb68 | ||
| ea77759ddf | |||
|
|
78db1d6109 | ||
| 31ec44dfa1 | |||
|
|
429a66b505 | ||
| d6c0a39820 | |||
|
|
dad21b5eab | ||
| b5ea0820cf | |||
|
|
d69d756a51 | ||
| d52d8885e8 | |||
|
|
c8616869e0 | ||
| e636488db9 | |||
|
|
a2aaec06c4 | ||
|
|
b564422754 | ||
|
|
3a7c888f53 | ||
| ea876e41d3 |
@@ -1,51 +1,201 @@
|
||||
# default-applications-tree
|
||||
|
||||
You can add more application sections into applications-tree.json.
|
||||
You have to specify the application name and version. For example:
|
||||
This repository defines the available applications and their configuration templates. Each application lives in its own subdirectory and is registered in `applications-tree.json`.
|
||||
|
||||
---
|
||||
|
||||
## applications-tree.json
|
||||
|
||||
The root `applications-tree.json` file lists all available applications. Each entry in the `apps` array registers one application:
|
||||
|
||||
```json
|
||||
{
|
||||
"apps": [
|
||||
{
|
||||
"name": "nextcloud",
|
||||
"version": "latest"
|
||||
"name": "Nextcloud",
|
||||
"subtitle": "File Synchronization",
|
||||
"version": "31.0.8-fpm-alpine",
|
||||
"icon": "data:image/svg+xml;base64,..."
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
The name must be the same as the directory name of the application.
|
||||
### App entry fields
|
||||
|
||||
The directory of an application have to contain a template.json file and can contain more json files (service, domain, secret, etc. files).
|
||||
| Field | Required | Description |
|
||||
|------------|----------|-------------|
|
||||
| `name` | yes | Display name of the application. Must match the directory name (case-insensitive). |
|
||||
| `version` | yes | Default version tag used when deploying. Use `"latest"` for the most recent image. |
|
||||
| `subtitle` | no | Short tagline shown in the app listing UI. |
|
||||
| `icon` | no | Base64-encoded SVG or PNG image used as the app icon in the UI (`data:image/svg+xml;base64,...` or `data:image/png;base64,...`). |
|
||||
|
||||
The mandatory template.json file's structure is the following.
|
||||
- "name" - the name of the application, must be the same as the directory name
|
||||
- "fields" - array of used variables by service
|
||||
---
|
||||
|
||||
{
|
||||
"name": "vaultwarden",
|
||||
"fields": [
|
||||
...
|
||||
]
|
||||
}
|
||||
## Application directory structure
|
||||
|
||||
An element of fields can contain the following keys.
|
||||
- description - label of the field, this text will appear before element
|
||||
- key - name of variable
|
||||
- value - default value of variable in the form
|
||||
- required - if set "true" then fill in of the field is required in the form
|
||||
- type - if not set then default is text, available field types: text, password, textarea, select
|
||||
- if type is "select" then options are separated by ",". Option's value and text is separated by ":", but text is not mandatory. For example:
|
||||
Each application has its own directory (e.g. `nextcloud/`). The directory name must match the `name` in `applications-tree.json`. It must contain a `template.json` file and can contain additional JSON files for services, domains, secrets, firewall rules, etc.
|
||||
|
||||
"value": "yes,no"
|
||||
"value": "1:gmail,2:microsoft outlook/hotmail,3:other",
|
||||
```
|
||||
nextcloud/
|
||||
template.json ← mandatory configuration template
|
||||
service-nextcloud.json ← service definition
|
||||
domain-nextcloud.json ← domain/ingress configuration
|
||||
nextcloud-secret.json ← secrets / environment variables
|
||||
firewall-nextcloud.json ← firewall rules
|
||||
...
|
||||
```
|
||||
|
||||
- generated - the value of the variable is auto generated, so the field will not appear in the form. Generated examples:
|
||||
---
|
||||
|
||||
"time|md5|8" - generated from time, encoded by md5 and character length is 8
|
||||
"random|md5|20" - random generated number, encoded by sha256, length is 20
|
||||
## template.json
|
||||
|
||||
Field element example:
|
||||
The `template.json` file defines the application's metadata and the list of configuration fields that are presented in the deployment form.
|
||||
|
||||
{
|
||||
"description": "Please add Nextcloud password:",
|
||||
"key": "NEXTCLOUD_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"type": "password"
|
||||
},
|
||||
### Top-level structure
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "Nextcloud",
|
||||
"title": "Nextcloud",
|
||||
"subtitle": "File Synchronization",
|
||||
"description": "Nextcloud is a suite of client-server software...",
|
||||
"icon": "data:image/svg+xml;base64,...",
|
||||
"fields": [ ... ]
|
||||
}
|
||||
```
|
||||
|
||||
### Top-level fields
|
||||
|
||||
| Field | Required | Description |
|
||||
|---------------|----------|-------------|
|
||||
| `name` | yes | Must match the directory name. Used as the application identifier. |
|
||||
| `title` | no | Human-readable display title shown in the form header (falls back to `name` if omitted). |
|
||||
| `subtitle` | no | Short tagline displayed below the title. |
|
||||
| `description` | no | Longer description of the application shown in the form or app listing. |
|
||||
| `icon` | no | Base64-encoded SVG or PNG icon (`data:image/svg+xml;base64,...`). |
|
||||
| `fields` | yes | Array of configuration field definitions (see below). |
|
||||
|
||||
---
|
||||
|
||||
## Field definitions
|
||||
|
||||
Each element of the `fields` array defines one configuration variable. Fields are rendered as form inputs during deployment. Fields with `generated` set are auto-populated and not shown in the form.
|
||||
|
||||
### Field properties
|
||||
|
||||
| Property | Required | Description |
|
||||
|---------------|----------|-------------|
|
||||
| `description` | yes | Label text displayed before the input. |
|
||||
| `key` | yes | The environment variable name that will hold the value. |
|
||||
| `value` | no | Default value pre-filled in the form. For `select` fields this defines the available options (see below). |
|
||||
| `required` | no | Set to `"true"` to make the field mandatory. The form will not submit until it is filled. |
|
||||
| `type` | no | Input type. Defaults to `"text"`. See [Field types](#field-types). |
|
||||
| `info` | no | Additional hint or explanatory text shown alongside or below the field. |
|
||||
| `generated` | no | Auto-generation pattern. When set the field is not shown in the form; its value is generated automatically. See [Generated values](#generated-values). |
|
||||
| `advanced` | no | Set to `"true"` to hide the field from the UI by default. It can be revealed by pressing the `>` button. |
|
||||
|
||||
### Field types
|
||||
|
||||
The `type` property controls how the field is rendered:
|
||||
|
||||
| Type | Description |
|
||||
|-------------|-------------|
|
||||
| `text` | *(default)* Single-line plain text input. |
|
||||
| `password` | The value is hidden from human-readable display wherever it is shown in the UI. |
|
||||
| `textarea` | Multi-line text input. |
|
||||
| `select` | Dropdown. Options are defined in `value` as a comma-separated list. Each option can be `optionValue` or `displayText:optionValue`. |
|
||||
|
||||
#### Select field examples
|
||||
|
||||
Simple yes/no toggle:
|
||||
```json
|
||||
{
|
||||
"description": "Enable feature",
|
||||
"key": "FEATURE_ENABLED",
|
||||
"value": "false,true",
|
||||
"type": "select"
|
||||
}
|
||||
```
|
||||
|
||||
Options with display labels:
|
||||
```json
|
||||
{
|
||||
"description": "Email provider",
|
||||
"key": "MAIL_PROVIDER",
|
||||
"value": "1:Gmail,2:Microsoft Outlook/Hotmail,3:Other",
|
||||
"type": "select"
|
||||
}
|
||||
```
|
||||
|
||||
TOTP authentication toggle (advanced):
|
||||
```json
|
||||
{
|
||||
"description": "TOTP authentication (true/false)",
|
||||
"key": "GUACAMOLE_TOTP",
|
||||
"value": "false,true",
|
||||
"required": "true",
|
||||
"type": "select",
|
||||
"advanced": "true"
|
||||
}
|
||||
```
|
||||
|
||||
### Generated values
|
||||
|
||||
When `generated` is set the field value is computed automatically. The format is:
|
||||
|
||||
```
|
||||
"<source>|<encoding>|<length>"
|
||||
```
|
||||
|
||||
| Part | Options | Description |
|
||||
|------------|------------------|-------------|
|
||||
| `source` | `time`, `random` | `time` seeds the hash from the current timestamp; `random` uses a random number. |
|
||||
| `encoding` | `md5`, `sha256` | Hash algorithm applied to the source value. |
|
||||
| `length` | integer | Number of characters to take from the hash output. |
|
||||
|
||||
#### Examples
|
||||
|
||||
| Pattern | Result |
|
||||
|---------------------|--------|
|
||||
| `"time\|md5\|8"` | 8-character MD5 hash seeded from the current time. |
|
||||
| `"random\|md5\|12"` | 12-character MD5 hash seeded from a random number. |
|
||||
| `"random\|sha256\|20"` | 20-character SHA-256 hash seeded from a random number. |
|
||||
| `""` | Auto-generated with default settings (pattern not specified). |
|
||||
|
||||
---
|
||||
|
||||
## Complete field example
|
||||
|
||||
```json
|
||||
{
|
||||
"description": "Nextcloud admin password",
|
||||
"key": "NEXTCLOUD_ADMIN_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"type": "password",
|
||||
"info": "Must be at least 8 characters long."
|
||||
}
|
||||
```
|
||||
|
||||
Auto-generated database password (not shown in the form):
|
||||
```json
|
||||
{
|
||||
"description": "Postgres password for user",
|
||||
"key": "POSTGRES_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|md5|12"
|
||||
}
|
||||
```
|
||||
|
||||
Advanced optional SMTP field:
|
||||
```json
|
||||
{
|
||||
"description": "Email sending protocol",
|
||||
"key": "MAIL_PROTOCOL",
|
||||
"value": "",
|
||||
"info": "Options are: empty (for no encryption), ssl, tls",
|
||||
"advanced": "true"
|
||||
}
|
||||
```
|
||||
|
||||
+15
-1
File diff suppressed because one or more lines are too long
@@ -35,7 +35,7 @@
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/immich/db",
|
||||
"DEST": "/var/lib/postgres",
|
||||
"DEST": "/var/lib/postgresql/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"jellyfin": {
|
||||
"USER": "#JELLYFIN_USER",
|
||||
"PASS": "#JELLYFIN_PASS"
|
||||
"USER": "#USER",
|
||||
"PASS": "#PASS"
|
||||
}
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
{
|
||||
"leantimemysql": {
|
||||
"MARIADB_DATABASE": "#DB_MYSQL",
|
||||
"MARIADB_USER": "#DB_USER",
|
||||
"MARIADB_PASSWORD": "#DB_PASSWORD",
|
||||
"MARIADB_ROOT_PASSWORD": "#DB_ROOT_PASSWORD"
|
||||
"MARIADB_DATABASE": "#MARIADB_DATABASE",
|
||||
"MARIADB_USER": "#MARIADB_USER",
|
||||
"MARIADB_PASSWORD": "#MARIADB_PASSWORD",
|
||||
"MARIADB_ROOT_PASSWORD": "#MARIADB_ROOT_PASSWORD"
|
||||
},
|
||||
"leantimeapp": {
|
||||
"LEAN_DB_USER": "#DB_USER",
|
||||
"LEAN_DB_PASSWORD": "#DB_PASSWORD",
|
||||
"LEAN_DB_USER": "#MARIADB_USER",
|
||||
"LEAN_DB_PASSWORD": "#MARIADB_PASSWORD",
|
||||
"LEAN_DB_HOST": "leantimemysql-db",
|
||||
"LEAN_DB_DATABASE": "#DB_MYSQL",
|
||||
"LEAN_DB_DATABASE": "#MARIADB_DATABASE",
|
||||
"LEAN_OIDC_CLIENT_SECRET": "#OIDC_CLIENT_SECRET",
|
||||
"LEAN_S3_SECRET": "#S3_SECRET",
|
||||
"LEAN_SESSION_PASSWORD": "#SESSION_PASSWORD"
|
||||
|
||||
@@ -35,28 +35,28 @@
|
||||
},
|
||||
{
|
||||
"description": "MYSQL database name",
|
||||
"key": "DB_MYSQL",
|
||||
"key": "MARIADB_DATABASE",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|10"
|
||||
},
|
||||
{
|
||||
"description": "MYSQL username",
|
||||
"key": "DB_USER",
|
||||
"key": "MARIADB_USER",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|8"
|
||||
},
|
||||
{
|
||||
"description": "MYSQL password for user",
|
||||
"key": "DB_PASSWORD",
|
||||
"key": "MARIADB_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|md5|12"
|
||||
},
|
||||
{
|
||||
"description": "MYSQL root user password",
|
||||
"key": "DB_ROOT_PASSWORD",
|
||||
"key": "MARIADB_ROOT_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|sha256|20"
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/nextcloud/db",
|
||||
"DEST": "/var/lib/postgres",
|
||||
"DEST": "/var/lib/postgresql/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "openwebui",
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/domain-check",
|
||||
"UPDATE": "true",
|
||||
"MEMORY": "64M",
|
||||
"NAME": "domain_checker",
|
||||
"ROLES": "domain_checker",
|
||||
"NETWORK": "host",
|
||||
"SELECTOR": "",
|
||||
"SCALE": "0",
|
||||
"EXTRA": "--rm --privileged",
|
||||
"PRE_START": [],
|
||||
"DEPEND": [],
|
||||
"POST_START": [],
|
||||
"CMD": "",
|
||||
"ENVS": [
|
||||
{
|
||||
"PROXY": "smarthostloadbalancer"
|
||||
},
|
||||
{
|
||||
"TARGET": "openwebui-app"
|
||||
},
|
||||
{
|
||||
"PORT": "8080"
|
||||
},
|
||||
{
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
{
|
||||
"SMARTHOST_PROXY_PATH": "/smarthost-domains"
|
||||
},
|
||||
{
|
||||
"OPERATION": "CREATE"
|
||||
}
|
||||
],
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/config/smarthost-domains",
|
||||
"DEST": "/smarthost-domains",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "firewalls",
|
||||
"DOMAIN": "null"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/firewall",
|
||||
"NAME": "firewall",
|
||||
"MEMORY": "64M",
|
||||
"NETWORK": "host",
|
||||
"SCALE": "0",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/run/",
|
||||
"DEST": "/run/",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/user/config/services",
|
||||
"DEST": "/services",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [],
|
||||
"READYNESS": [
|
||||
{
|
||||
"tcp": ""
|
||||
},
|
||||
{
|
||||
"HTTP": ""
|
||||
},
|
||||
{
|
||||
"EXEC": "/ready.sh"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"CHAIN": "DOCKER-USER"
|
||||
},
|
||||
{
|
||||
"SOURCE": "coredns"
|
||||
},
|
||||
{
|
||||
"TARGET": "openwebui-app"
|
||||
},
|
||||
{
|
||||
"TYPE": "udp"
|
||||
},
|
||||
{
|
||||
"TARGET_PORT": "53"
|
||||
},
|
||||
{
|
||||
"COMMENT": "dns for openwebui"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--privileged --rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "firewalls",
|
||||
"DOMAIN": "null"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/firewall",
|
||||
"NAME": "firewall",
|
||||
"MEMORY": "64M",
|
||||
"NETWORK": "host",
|
||||
"SCALE": "0",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/run/",
|
||||
"DEST": "/run/",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/user/config/services",
|
||||
"DEST": "/services",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [],
|
||||
"READYNESS": [
|
||||
{
|
||||
"tcp": ""
|
||||
},
|
||||
{
|
||||
"HTTP": ""
|
||||
},
|
||||
{
|
||||
"EXEC": "/ready.sh"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"CHAIN": "DOCKER-USER"
|
||||
},
|
||||
{
|
||||
"SOURCE": "smarthostbackend"
|
||||
},
|
||||
{
|
||||
"TARGET": "openwebui-app"
|
||||
},
|
||||
{
|
||||
"TYPE": "tcp"
|
||||
},
|
||||
{
|
||||
"TARGET_PORT": "8080"
|
||||
},
|
||||
{
|
||||
"COMMENT": "proxy for openwebui"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--privileged --rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"openwebuipostgres": {
|
||||
"POSTGRES_DB": "#POSTGRES_DB",
|
||||
"POSTGRES_USER": "#POSTGRES_USER",
|
||||
"POSTGRES_PASSWORD": "#POSTGRES_PASSWORD",
|
||||
"POSTGRES_ROOT_PASSWORD": "#POSTGRES_ROOT_PASSWORD"
|
||||
},
|
||||
"openwebuiapp": {
|
||||
"WEBUI_ADMIN_NAME": "#WEBUI_ADMIN_NAME",
|
||||
"WEBUI_ADMIN_EMAIL": "#WEBUI_ADMIN_EMAIL",
|
||||
"WEBUI_ADMIN_PASSWORD": "#WEBUI_ADMIN_PASSWORD",
|
||||
"WEBUI_SECRET_KEY": "#WEBUI_SECRET_KEY",
|
||||
"OPENAI_API_KEY": "#OPENAI_API_KEY",
|
||||
"DATABASE_URL": "postgres://#POSTGRES_USER:#POSTGRES_PASSWORD@openwebuipostgres-db:5432/#POSTGRES_DB"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,196 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "openwebui",
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "alpine:latest",
|
||||
"UPDATE": "true",
|
||||
"NAME": "openwebui-init",
|
||||
"NETWORK": "host",
|
||||
"MEMORY": "64M",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "USER_DATA",
|
||||
"DEST": "/etc/user/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"ENTRYPOINT": "sh -c",
|
||||
"CMD": "mkdir -p /etc/user/data/openwebui/data && mkdir -p /etc/user/data/openwebui/db && mkdir -p /etc/user/data/openwebui/pipelines && mkdir -p /etc/user/data/openwebui/qdrant",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "postgres:16-alpine",
|
||||
"UPDATE": "true",
|
||||
"NAME": "openwebuipostgres-db",
|
||||
"MEMORY": "256M",
|
||||
"NETWORK": "openwebui-net",
|
||||
"SELECTOR": "openwebuipostgres-db",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/openwebui/db",
|
||||
"DEST": "/var/lib/postgresql/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "5432",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/openwebui/openwebui.json"
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "qdrant/qdrant:latest",
|
||||
"UPDATE": "true",
|
||||
"NAME": "openwebui-qdrant",
|
||||
"MEMORY": "1024M",
|
||||
"NETWORK": "openwebui-net",
|
||||
"SELECTOR": "openwebui-qdrant",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/openwebui/qdrant",
|
||||
"DEST": "/qdrant/storage",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "6333",
|
||||
"TYPE": "tcp"
|
||||
},
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "6334",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "ghcr.io/open-webui/pipelines:main",
|
||||
"UPDATE": "true",
|
||||
"NAME": "openwebui-pipelines",
|
||||
"MEMORY": "1024M",
|
||||
"NETWORK": "openwebui-net",
|
||||
"SELECTOR": "openwebui-pipelines",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/openwebui/pipelines",
|
||||
"DEST": "/app/pipelines",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "9099",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"OPENAI_API_BASE_URL": "#OPENAI_API_BASE_URL"
|
||||
},
|
||||
{
|
||||
"VECTOR_DB": "qdrant"
|
||||
},
|
||||
{
|
||||
"QDRANT_HOST": "openwebui-qdrant"
|
||||
},
|
||||
{
|
||||
"QDRANT_PORT": "6333"
|
||||
},
|
||||
{
|
||||
"QDRANT_URI": "http://openwebui-qdrant:6333"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": [],
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "ghcr.io/open-webui/open-webui:main",
|
||||
"UPDATE": "true",
|
||||
"NAME": "openwebuiapp",
|
||||
"MEMORY": "4096M",
|
||||
"NETWORK": "openwebui-net",
|
||||
"SELECTOR": "openwebui-app",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/openwebui/data",
|
||||
"DEST": "/app/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "8080",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"OPENAI_API_BASE_URL": "#OPENAI_API_BASE_URL"
|
||||
},
|
||||
{
|
||||
"VECTOR_DB": "qdrant"
|
||||
},
|
||||
{
|
||||
"QDRANT_HOST": "openwebui-qdrant"
|
||||
},
|
||||
{
|
||||
"QDRANT_PORT": "6333"
|
||||
},
|
||||
{
|
||||
"QDRANT_URI": "http://openwebui-qdrant:6333"
|
||||
},
|
||||
{
|
||||
"ENABLE_RAG_PIPELINE": "True"
|
||||
},
|
||||
{
|
||||
"RAG_PIPELINE_URL": "http://openwebui-pipelines:9099/v1"
|
||||
}
|
||||
],
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/openwebui/openwebui.json"
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": [],
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": [
|
||||
"firewall-openwebui",
|
||||
"domain-openwebui",
|
||||
"firewall-openwebui-dns"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
{
|
||||
"name": "OpenWebUI",
|
||||
"title": "Open WebUI",
|
||||
"subtitle": "AI Chat Interface",
|
||||
"description": "Open WebUI is a user-friendly WebUI for LLMs (formerly Ollama WebUI). It supports various LLM runners including OpenAI compatible APIs, with features like RAG, multi-modal support, and a powerful pipeline system.",
|
||||
"icon": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iNyIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTE1IDI1QzE1IDE3LjI2OCAyMS4yNjggMTEgMjkgMTFDMzYuNzMyIDExIDQzIDE3LjI2OCA0MyAyNUM0MyAzMi43MzIgMzYuNzMyIDM5IDI5IDM5QzI3LjQ3IDM5IDI2IDM4LjczIDI0LjYwMyAzOC4yMjhMMTkgNDJMMjAuMTE3IDM1LjkzMkMxNy4wMyAzMy45MTUgMTUgMjkuNzYzIDE1IDI1WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTIzIDI1QzIzIDIzLjYyIDI0LjEyIDIyLjUgMjUuNSAyMi41QzI2Ljg4IDIyLjUgMjggMjMuNjIgMjggMjVDMjggMjYuMzggMjYuODggMjcuNSAyNS41IDI3LjVDMjQuMTIgMjcuNSAyMyAyNi4zOCAyMyAyNVoiIGZpbGw9ImJsYWNrIi8+CjxwYXRoIGQ9Ik0yOSAyNUMzMCAyMy42MiAzMS4xMiAyMi41IDMyLjUgMjIuNUMzMy44OCAyMi41IDM1IDIzLjYyIDM1IDI1QzM1IDI2LjM4IDMzLjg4IDI3LjUgMzIuNSAyNy41QzMxLjEyIDI3LjUgMzAgMjYuMzggMjkgMjVaIiBmaWxsPSJibGFjayIvPgo8cGF0aCBkPSJNMjAuODMyIDMxLjc2OEMyMi40NTMgMzQuMDI0IDI1LjUyNyAzNS41IDI5IDM1LjVDMzQuMjkzIDM1LjUgMzguNzA0IDMyLjY0IDQwLjU1IDI4LjVDNDEuNjE2IDI2LjI0IDQyIDI0Ljk1MyA0MiAyNUM0MiAxNy4yNjggMzYuNzMyIDExIDI5IDExQzIxLjI2OCAxMSAxNSAxNy4yNjggMTUgMjVDMTUgMjUuODI3IDE1LjA4IDI2LjYxNyAxNS4yMzMgMjcuMzY3TDIwLjgzMiAzMS43NjhaIiBmaWxsPSIjMjlBMEYxIi8+Cjwvc3ZnPg==",
|
||||
"fields": [
|
||||
{
|
||||
"description": "Domain",
|
||||
"key": "DOMAIN",
|
||||
"value": "",
|
||||
"required": "true"
|
||||
},
|
||||
{
|
||||
"description": "Admin username",
|
||||
"key": "WEBUI_ADMIN_NAME",
|
||||
"value": "",
|
||||
"info": "The initial admin username for Open WebUI.",
|
||||
"required": "true"
|
||||
},
|
||||
{
|
||||
"description": "Admin password",
|
||||
"key": "WEBUI_ADMIN_PASSWORD",
|
||||
"value": "",
|
||||
"info": "The initial admin password for Open WebUI.",
|
||||
"required": "true",
|
||||
"type": "password"
|
||||
},
|
||||
{
|
||||
"description": "OpenAI compatible API endpoint",
|
||||
"key": "OPENAI_API_BASE_URL",
|
||||
"value": "",
|
||||
"info": "Optional API url for OpenAI compatible API endpoint.",
|
||||
"advanced": "true"
|
||||
},
|
||||
{
|
||||
"description": "WebUI secret key",
|
||||
"key": "WEBUI_SECRET_KEY",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "openssl|hex|32"
|
||||
},
|
||||
{
|
||||
"description": "OpenAI API key",
|
||||
"key": "OPENAI_API_KEY",
|
||||
"value": "",
|
||||
"info": "Optional API key for OpenAI compatible API endpoint.",
|
||||
"advanced": "true",
|
||||
"type": "password"
|
||||
},
|
||||
{
|
||||
"description": "Postgres database name",
|
||||
"key": "POSTGRES_DB",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|8"
|
||||
},
|
||||
{
|
||||
"description": "Postgres username",
|
||||
"key": "POSTGRES_USER",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|8"
|
||||
},
|
||||
{
|
||||
"description": "Postgres password for user",
|
||||
"key": "POSTGRES_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|md5|12"
|
||||
},
|
||||
{
|
||||
"description": "Postgres root user password",
|
||||
"key": "POSTGRES_ROOT_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|sha256|20"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"outlinepostgres": {
|
||||
"POSTGRES_DB": "#DB_NAME",
|
||||
"POSTGRES_USER": "#DB_USER",
|
||||
"POSTGRES_PASSWORD": "#DB_PASSWORD"
|
||||
"POSTGRES_DB": "#POSTGRES_DB",
|
||||
"POSTGRES_USER": "#POSTGRES_USER",
|
||||
"POSTGRES_PASSWORD": "#POSTGRES_PASSWORD",
|
||||
"POSTGRES_ROOT_PASSWORD": "#POSTGRES_ROOT_PASSWORD"
|
||||
},
|
||||
"outlineapp": {
|
||||
"SECRET_KEY": "#SECRET_KEY",
|
||||
"UTILS_SECRET": "#UTILS_SECRET",
|
||||
"DATABASE_URL": "postgres://#DB_USER:#DB_PASSWORD@outlinepostgres-db:5432/#DB_NAME",
|
||||
"DATABASE_URL": "postgres://#POSTGRES_USER:#POSTGRES_PASSWORD@outlinepostgres-db:5432/#POSTGRES_DB",
|
||||
"SLACK_CLIENT_ID": "#SLACK_CLIENT_ID",
|
||||
"SLACK_CLIENT_SECRET": "#SLACK_CLIENT_SECRET",
|
||||
"GOOGLE_CLIENT_ID": "#GOOGLE_CLIENT_ID",
|
||||
|
||||
@@ -21,28 +21,28 @@
|
||||
},
|
||||
{
|
||||
"description": "Postgres database name",
|
||||
"key": "DB_NAME",
|
||||
"key": "POSTGRES_DB",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|8"
|
||||
},
|
||||
{
|
||||
"description": "Postgres username",
|
||||
"key": "DB_USER",
|
||||
"key": "POSTGRES_USER",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "time|md5|8"
|
||||
},
|
||||
{
|
||||
"description": "Postgres password for user",
|
||||
"key": "DB_PASSWORD",
|
||||
"key": "POSTGRES_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|md5|12"
|
||||
},
|
||||
{
|
||||
"description": "Postgres root user password",
|
||||
"key": "DB_ROOT_PASSWORD",
|
||||
"key": "POSTGRES_ROOT_PASSWORD",
|
||||
"value": "",
|
||||
"required": "true",
|
||||
"generated": "random|sha256|20"
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "quackback",
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/domain-check",
|
||||
"UPDATE": "true",
|
||||
"MEMORY": "64M",
|
||||
"NAME": "domain_checker",
|
||||
"ROLES": "domain_checker",
|
||||
"NETWORK": "host",
|
||||
"SELECTOR": "",
|
||||
"SCALE": "0",
|
||||
"EXTRA": "--rm --privileged",
|
||||
"PRE_START": [],
|
||||
"DEPEND": [],
|
||||
"POST_START": [],
|
||||
"CMD": "",
|
||||
"ENVS": [
|
||||
{
|
||||
"PROXY": "smarthostloadbalancer"
|
||||
},
|
||||
{
|
||||
"TARGET": "quackback-app"
|
||||
},
|
||||
{
|
||||
"PORT": "3000"
|
||||
},
|
||||
{
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
{
|
||||
"SMARTHOST_PROXY_PATH": "/smarthost-domains"
|
||||
},
|
||||
{
|
||||
"OPERATION": "CREATE"
|
||||
}
|
||||
],
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/config/smarthost-domains",
|
||||
"DEST": "/smarthost-domains",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "firewalls",
|
||||
"DOMAIN": "null"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/firewall",
|
||||
"NAME": "firewall",
|
||||
"MEMORY": "64M",
|
||||
"NETWORK": "host",
|
||||
"SCALE": "0",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/run/",
|
||||
"DEST": "/run/",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/user/config/services",
|
||||
"DEST": "/services",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [],
|
||||
"READYNESS": [
|
||||
{
|
||||
"tcp": ""
|
||||
},
|
||||
{
|
||||
"HTTP": ""
|
||||
},
|
||||
{
|
||||
"EXEC": "/ready.sh"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"CHAIN": "DOCKER-USER"
|
||||
},
|
||||
{
|
||||
"SOURCE": "coredns"
|
||||
},
|
||||
{
|
||||
"TARGET": "quackback-app"
|
||||
},
|
||||
{
|
||||
"TYPE": "udp"
|
||||
},
|
||||
{
|
||||
"TARGET_PORT": "53"
|
||||
},
|
||||
{
|
||||
"COMMENT": "dns for quackback"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--privileged --rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "firewalls",
|
||||
"DOMAIN": "null"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/firewall",
|
||||
"NAME": "firewall",
|
||||
"MEMORY": "64M",
|
||||
"NETWORK": "host",
|
||||
"SCALE": "0",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/run/",
|
||||
"DEST": "/run/",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/user/config/services",
|
||||
"DEST": "/services",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [],
|
||||
"READYNESS": [
|
||||
{
|
||||
"tcp": ""
|
||||
},
|
||||
{
|
||||
"HTTP": ""
|
||||
},
|
||||
{
|
||||
"EXEC": "/ready.sh"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"CHAIN": "DOCKER-USER"
|
||||
},
|
||||
{
|
||||
"SOURCE": "quackback-app"
|
||||
},
|
||||
{
|
||||
"TARGET": "smtp"
|
||||
},
|
||||
{
|
||||
"TYPE": "tcp"
|
||||
},
|
||||
{
|
||||
"TARGET_PORT": "25"
|
||||
},
|
||||
{
|
||||
"COMMENT": "smtp for openproject"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--privileged --rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "firewalls",
|
||||
"DOMAIN": "null"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "safebox/firewall",
|
||||
"NAME": "firewall",
|
||||
"MEMORY": "64M",
|
||||
"NETWORK": "host",
|
||||
"SCALE": "0",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/run/",
|
||||
"DEST": "/run/",
|
||||
"TYPE": "rw"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/user/config/services",
|
||||
"DEST": "/services",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/etc/system/data/dns/hosts.local",
|
||||
"DEST": "/etc/dns/hosts.local",
|
||||
"TYPE": "ro"
|
||||
},
|
||||
{
|
||||
"SOURCE": "/var/run/docker.sock",
|
||||
"DEST": "/var/run/docker.sock",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [],
|
||||
"READYNESS": [
|
||||
{
|
||||
"tcp": ""
|
||||
},
|
||||
{
|
||||
"HTTP": ""
|
||||
},
|
||||
{
|
||||
"EXEC": "/ready.sh"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"CHAIN": "DOCKER-USER"
|
||||
},
|
||||
{
|
||||
"SOURCE": "smarthostbackend"
|
||||
},
|
||||
{
|
||||
"TARGET": "quackback-app"
|
||||
},
|
||||
{
|
||||
"TYPE": "tcp"
|
||||
},
|
||||
{
|
||||
"TARGET_PORT": "3000"
|
||||
},
|
||||
{
|
||||
"COMMENT": "proxy for quackback"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--privileged --rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"quackbackpostgres": {
|
||||
"POSTGRES_DB": "#POSTGRES_DB",
|
||||
"POSTGRES_USER": "#POSTGRES_USER",
|
||||
"POSTGRES_PASSWORD": "#POSTGRES_PASSWORD",
|
||||
"POSTGRES_ROOT_PASSWORD": "#POSTGRES_ROOT_PASSWORD"
|
||||
},
|
||||
"quackbackminio": {
|
||||
"MINIO_ROOT_USER": "#MINIO_ROOT_USER",
|
||||
"MINIO_ROOT_PASSWORD": "#MINIO_ROOT_PASSWORD"
|
||||
},
|
||||
"quackbackapp": {
|
||||
"SECRET_KEY": "#SECRET_KEY",
|
||||
"UTILS_SECRET": "#UTILS_SECRET",
|
||||
"DATABASE_URL": "postgres://#POSTGRES_USER:#POSTGRES_PASSWORD@quackbackpostgres-db:5432/#POSTGRES_DB",
|
||||
"SLACK_CLIENT_ID": "#SLACK_CLIENT_ID",
|
||||
"SLACK_CLIENT_SECRET": "#SLACK_CLIENT_SECRET",
|
||||
"GOOGLE_CLIENT_ID": "#GOOGLE_CLIENT_ID",
|
||||
"GOOGLE_CLIENT_SECRET": "#GOOGLE_CLIENT_SECRET",
|
||||
"GITHUB_CLIENT_ID": "#GITHUB_CLIENT_ID",
|
||||
"GITHUB_CLIENT_SECRET": "#GITHUB_CLIENT_SECRET",
|
||||
"EMAIL_SMTP_USER": "#SMTP_USERNAME",
|
||||
"EMAIL_SMTP_PASS": "#SMTP_PASSWORD"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,205 @@
|
||||
{
|
||||
"main": {
|
||||
"SERVICE_NAME": "quackback",
|
||||
"DOMAIN": "#DOMAIN"
|
||||
},
|
||||
"containers": [
|
||||
{
|
||||
"IMAGE": "alpine:latest",
|
||||
"UPDATE": "true",
|
||||
"NAME": "quackback-init",
|
||||
"NETWORK": "host",
|
||||
"MEMORY": "64M",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "USER_DATA",
|
||||
"DEST": "/etc/user/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"ENTRYPOINT": "sh -c",
|
||||
"CMD": "mkdir -p /etc/user/data/quackback/data && mkdir -p /etc/user/data/quackback/db && mkdir -p /etc/user/data/quackback/minio && mkdir -p /etc/user/data/quackback/dragonfly",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "safebox/postgres-quackback:18",
|
||||
"UPDATE": "true",
|
||||
"NAME": "quackbackpostgres-db",
|
||||
"MEMORY": "256M",
|
||||
"NETWORK": "quackback-net",
|
||||
"SELECTOR": "quackbackpostgres-db",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/quackback/db",
|
||||
"DEST": "/var/lib/postgresql",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "5432",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/quackback/quackback.json"
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "postgres -c shared_preload_libraries=pg_cron -c cron.database_name=quackback -c max_connections=200",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "minio/minio:latest",
|
||||
"UPDATE": "true",
|
||||
"NAME": "quackbackminio-app",
|
||||
"MEMORY": "2048M",
|
||||
"NETWORK": "quackback-net",
|
||||
"SELECTOR": "quackbackminio-app",
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/quackback/minio",
|
||||
"DEST": "/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "9000",
|
||||
"TYPE": "tcp"
|
||||
},
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "9001",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/quackback/quackback.json"
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "server /data --console-address \":9001\"",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "docker.dragonflydb.io/dragonflydb/dragonfly:v1.27.1",
|
||||
"UPDATE": "true",
|
||||
"NAME": "quackbackredis-server",
|
||||
"MEMORY": "4096M",
|
||||
"NETWORK": "quackback-net",
|
||||
"SELECTOR": "quackbackredis",
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "6379",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/quackback/dragonfly",
|
||||
"DEST": "/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
"EXTRA": "--restart always --ulimit memlock=-1:-1",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"CMD": "dragonfly --cluster_mode=emulated --lock_on_hashtags",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "minio/mc:latest",
|
||||
"UPDATE": "true",
|
||||
"NAME": "quackbackminio-init",
|
||||
"NETWORK": "quackback-net",
|
||||
"MEMORY": "256M",
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/quackback/quackback.json"
|
||||
],
|
||||
"EXTRA": "--rm",
|
||||
"DEPEND": "null",
|
||||
"START_ON_BOOT": "false",
|
||||
"ENTRYPOINT": "sh -c",
|
||||
"CMD": "mc alias set local http://quackbackminio-app:9000 \"$MINIO_ROOT_USER\" \"$MINIO_ROOT_PASSWORD\"; mc mb local/quackback --ignore-existing; mc anonymous set download local/quackback; exit 0;",
|
||||
"PRE_START": "null",
|
||||
"POST_START": "null"
|
||||
},
|
||||
{
|
||||
"IMAGE": "safebox/quackback:#VERSION",
|
||||
"UPDATE": "true",
|
||||
"MEMORY": "4096M",
|
||||
"NAME": "quackbackapp",
|
||||
"NETWORK": "quackback-net",
|
||||
"SELECTOR": "quackback-app",
|
||||
"PORTS": [
|
||||
{
|
||||
"SOURCE": "null",
|
||||
"DEST": "3000",
|
||||
"TYPE": "tcp"
|
||||
}
|
||||
],
|
||||
"ENVS": [
|
||||
{
|
||||
"REDIS_URL": "redis://quackbackredis-server:6379"
|
||||
},
|
||||
{
|
||||
"BASE_URL": "https://#DOMAIN"
|
||||
},
|
||||
{
|
||||
"DISABLE_TELEMETRY": "true"
|
||||
},
|
||||
{
|
||||
"EMAIL_SMTP_HOST": "#SMTP_HOST"
|
||||
},
|
||||
{
|
||||
"EMAIL_SMTP_PORT": "#SMTP_PORT"
|
||||
},
|
||||
{
|
||||
"EMAIL_FROM": "#SMTP_FROM_EMAIL"
|
||||
},
|
||||
{
|
||||
"OPENAI_OPENAI_BASE_URL": "#OPENAI_BASE_URL"
|
||||
},
|
||||
{
|
||||
"S3_ENDPOINT": "http://quackbackminio-app:9000"
|
||||
},
|
||||
{
|
||||
"S3_BUCKET": "#S3_BUCKET"
|
||||
},
|
||||
{
|
||||
"S3_REGION": "#S3_REGION"
|
||||
},
|
||||
{
|
||||
"S3_FORCE_PATH_STYLE": "true"
|
||||
}
|
||||
],
|
||||
"ENV_FILES": [
|
||||
"/etc/user/secret/quackback/quackback.json"
|
||||
],
|
||||
"EXTRA": "--restart always",
|
||||
"DEPEND": [],
|
||||
"START_ON_BOOT": "true",
|
||||
"CMD": "null",
|
||||
"PRE_START": "null",
|
||||
"POST_START": [
|
||||
"firewall-quackback",
|
||||
"domain-quackback",
|
||||
"firewall-quackback-dns",
|
||||
"firewall-quackback-smtp"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -35,7 +35,7 @@
|
||||
"VOLUMES": [
|
||||
{
|
||||
"SOURCE": "/etc/user/data/vaultwarden/db",
|
||||
"DEST": "/var/lib/postgres",
|
||||
"DEST": "/var/lib/postgresql/data",
|
||||
"TYPE": "rw"
|
||||
}
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user