mirror of
https://github.com/okxlin/appstore.git
synced 2026-10-30 16:05:49 +00:00
Merge localApps into Renovate update
This commit is contained in:
@@ -42,7 +42,7 @@ jobs:
|
||||
RENOVATE_DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
run: node .github/scripts/check_dockerhub_credentials.mjs
|
||||
- name: Run Renovate
|
||||
uses: renovatebot/github-action@f3a31a786096ba6b40d0f0ffe11a494ef73bfa7c # v46.3.4
|
||||
uses: renovatebot/github-action@a63d9a7bc606f7336fd20b47f2f32259a35e6213 # v46.3.9
|
||||
with:
|
||||
configurationFile: .github/renovate-global.js
|
||||
docker-cmd-file: .github/scripts/renovate-entrypoint.sh
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
2fauth:
|
||||
image: "2fauth/2fauth:8.0.2"
|
||||
image: "2fauth/2fauth:8.0.3"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
adguardhome-sync:
|
||||
image: "linuxserver/adguardhome-sync:0.9.3"
|
||||
image: "linuxserver/adguardhome-sync:0.9.4"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
CONTAINER_NAME=
|
||||
PANEL_APP_PORT_HTTP=8080
|
||||
CONFIG_PATH=./data/config
|
||||
CONFIGFILE=/config/adguardhome-sync.yaml
|
||||
TIME_ZONE=Asia/Shanghai
|
||||
@@ -0,0 +1,67 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 8080
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTP
|
||||
labelEn: HTTP Port
|
||||
labelZh: HTTP 端口
|
||||
label:
|
||||
en: HTTP Port
|
||||
zh: HTTP 端口
|
||||
zh-Hant: HTTP 連接埠
|
||||
ja: HTTP ポート
|
||||
ko: HTTP 포트
|
||||
ru: HTTP-порт
|
||||
ms: Port HTTP
|
||||
pt-br: Porta HTTP
|
||||
required: true
|
||||
type: number
|
||||
rule: paramPort
|
||||
- default: ./data/config
|
||||
edit: true
|
||||
envKey: CONFIG_PATH
|
||||
labelEn: Config folder path
|
||||
labelZh: 配置文件路径
|
||||
label:
|
||||
en: Config folder path
|
||||
zh: 配置文件路径
|
||||
zh-Hant: 設定檔資料夾路徑
|
||||
ja: 設定フォルダーのパス
|
||||
ko: 설정 폴더 경로
|
||||
ru: Путь к папке конфигурации
|
||||
ms: Laluan folder konfigurasi
|
||||
pt-br: Caminho da pasta de configuração
|
||||
required: true
|
||||
type: text
|
||||
- default: /config/adguardhome-sync.yaml
|
||||
edit: true
|
||||
envKey: CONFIGFILE
|
||||
labelEn: Config file
|
||||
labelZh: 配置文件
|
||||
label:
|
||||
en: Config file
|
||||
zh: 配置文件
|
||||
zh-Hant: 設定檔
|
||||
ja: 設定ファイル
|
||||
ko: 설정 파일
|
||||
ru: Файл конфигурации
|
||||
ms: Fail konfigurasi
|
||||
pt-br: Arquivo de configuracao
|
||||
required: true
|
||||
type: text
|
||||
- default: Asia/Shanghai
|
||||
edit: true
|
||||
envKey: TIME_ZONE
|
||||
labelEn: Time zone
|
||||
labelZh: 时区
|
||||
label:
|
||||
en: Time zone
|
||||
zh: 时区
|
||||
zh-Hant: 時區
|
||||
ja: タイムゾーン
|
||||
ko: 시간대
|
||||
ru: Часовой пояс
|
||||
ms: Zon waktu
|
||||
pt-br: Fuso horário
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,21 @@
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
services:
|
||||
adguardhome-sync:
|
||||
image: "linuxserver/adguardhome-sync:0.9.4"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTP}:8080"
|
||||
volumes:
|
||||
- "${CONFIG_PATH}:/config"
|
||||
environment:
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- TZ=${TIME_ZONE}
|
||||
- CONFIGFILE=${CONFIGFILE}
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
@@ -0,0 +1,2 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
@@ -8,7 +8,7 @@ services:
|
||||
- "${PANEL_APP_PORT_HTTP}:8001"
|
||||
volumes:
|
||||
- anqicms-data:/app
|
||||
image: "anqicms/anqicms:v3.6.4"
|
||||
image: "anqicms/anqicms:v3.6.7"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ services:
|
||||
- "${PANEL_APP_PORT_HTTP}:8001"
|
||||
volumes:
|
||||
- anqicms-data:/app
|
||||
image: "anqicms/anqicms:v3.6.6"
|
||||
image: "anqicms/anqicms:v3.6.7"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
anubis:
|
||||
image: "ghcr.io/techarohq/anubis:v1.28.0@sha256:48deacf791149e27c2cf6f5d8b4243e1a3db7a5816a168de0af6e58d9a519e2e"
|
||||
image: "ghcr.io/techarohq/anubis:v1.28.1@sha256:1744c03a918160a28b0d2e8c1656de6585f4071b30b4c3b0d51d02282c9b7c25"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
user: "1000:1000"
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
CONTAINER_NAME=asciinema-server
|
||||
PANEL_APP_BIND_ADDRESS=127.0.0.1
|
||||
PANEL_APP_PORT_HTTP=4000
|
||||
ASCIINEMA_URL_SCHEME=http
|
||||
ASCIINEMA_URL_HOST=asciinema.local
|
||||
ASCIINEMA_URL_PORT=4000
|
||||
ASCIINEMA_SECRET_KEY_BASE=generate
|
||||
ASCIINEMA_POSTGRES_PASSWORD=generate
|
||||
ASCIINEMA_SIGN_UP_DISABLED=false
|
||||
ASCIINEMA_UPLOAD_AUTH_REQUIRED=true
|
||||
ASCIINEMA_TIMEZONE=UTC
|
||||
APP_DATA_DIR=./data
|
||||
@@ -0,0 +1,195 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 127.0.0.1
|
||||
edit: true
|
||||
envKey: PANEL_APP_BIND_ADDRESS
|
||||
labelEn: Bind Address
|
||||
labelZh: 绑定地址
|
||||
label:
|
||||
en: Bind Address
|
||||
zh: 绑定地址
|
||||
zh-Hant: 綁定位址
|
||||
ja: バインドアドレス
|
||||
ko: 바인드 주소
|
||||
ru: Адрес привязки
|
||||
ms: Alamat ikatan
|
||||
pt-br: Endereco de vinculacao
|
||||
required: true
|
||||
type: text
|
||||
- default: 4000
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTP
|
||||
labelEn: HTTP Port
|
||||
labelZh: HTTP 端口
|
||||
label:
|
||||
en: HTTP Port
|
||||
zh: HTTP 端口
|
||||
zh-Hant: HTTP 連接埠
|
||||
ja: HTTP ポート
|
||||
ko: HTTP 포트
|
||||
ru: HTTP-порт
|
||||
ms: Port HTTP
|
||||
pt-br: Porta HTTP
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: http
|
||||
edit: true
|
||||
envKey: ASCIINEMA_URL_SCHEME
|
||||
labelEn: Public URL Scheme
|
||||
labelZh: 公开 URL 协议
|
||||
label:
|
||||
en: Public URL Scheme
|
||||
zh: 公开 URL 协议
|
||||
zh-Hant: 公開 URL 協定
|
||||
ja: 公開 URL スキーム
|
||||
ko: 공개 URL 스킴
|
||||
ru: Схема публичного URL
|
||||
ms: Skema URL awam
|
||||
pt-br: Esquema da URL publica
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: HTTP
|
||||
value: http
|
||||
- label: HTTPS
|
||||
value: https
|
||||
- default: asciinema.local
|
||||
edit: true
|
||||
envKey: ASCIINEMA_URL_HOST
|
||||
labelEn: Public URL Host
|
||||
labelZh: 公开 URL 主机名
|
||||
label:
|
||||
en: Public URL Host
|
||||
zh: 公开 URL 主机名
|
||||
zh-Hant: 公開 URL 主機名稱
|
||||
ja: 公開 URL ホスト
|
||||
ko: 공개 URL 호스트
|
||||
ru: Хост публичного URL
|
||||
ms: Hos URL awam
|
||||
pt-br: Host da URL publica
|
||||
required: true
|
||||
type: text
|
||||
- default: 4000
|
||||
edit: true
|
||||
envKey: ASCIINEMA_URL_PORT
|
||||
labelEn: Public URL Port
|
||||
labelZh: 公开 URL 端口
|
||||
label:
|
||||
en: Public URL Port
|
||||
zh: 公开 URL 端口
|
||||
zh-Hant: 公開 URL 連接埠
|
||||
ja: 公開 URL ポート
|
||||
ko: 공개 URL 포트
|
||||
ru: Порт публичного URL
|
||||
ms: Port URL awam
|
||||
pt-br: Porta da URL publica
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: generate
|
||||
edit: true
|
||||
envKey: ASCIINEMA_SECRET_KEY_BASE
|
||||
labelEn: Session Secret
|
||||
labelZh: 会话密钥
|
||||
label:
|
||||
en: Session Secret
|
||||
zh: 会话密钥
|
||||
zh-Hant: 工作階段密鑰
|
||||
ja: セッションシークレット
|
||||
ko: 세션 비밀 키
|
||||
ru: Секрет сеанса
|
||||
ms: Rahsia sesi
|
||||
pt-br: Segredo de sessao
|
||||
required: true
|
||||
type: password
|
||||
- default: generate
|
||||
edit: true
|
||||
envKey: ASCIINEMA_POSTGRES_PASSWORD
|
||||
labelEn: Database Password
|
||||
labelZh: 数据库密码
|
||||
label:
|
||||
en: Database Password
|
||||
zh: 数据库密码
|
||||
zh-Hant: 資料庫密碼
|
||||
ja: データベースパスワード
|
||||
ko: 데이터베이스 비밀번호
|
||||
ru: Пароль базы данных
|
||||
ms: Kata laluan pangkalan data
|
||||
pt-br: Senha do banco de dados
|
||||
required: true
|
||||
type: password
|
||||
- default: "false"
|
||||
edit: true
|
||||
envKey: ASCIINEMA_SIGN_UP_DISABLED
|
||||
labelEn: Disable Public Signup
|
||||
labelZh: 禁用公开注册
|
||||
label:
|
||||
en: Disable Public Signup
|
||||
zh: 禁用公开注册
|
||||
zh-Hant: 停用公開註冊
|
||||
ja: 公開登録を無効化
|
||||
ko: 공개 가입 비활성화
|
||||
ru: Отключить публичную регистрацию
|
||||
ms: Lumpuhkan pendaftaran awam
|
||||
pt-br: Desativar cadastro publico
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "False"
|
||||
value: "false"
|
||||
- label: "True"
|
||||
value: "true"
|
||||
- default: "true"
|
||||
edit: true
|
||||
envKey: ASCIINEMA_UPLOAD_AUTH_REQUIRED
|
||||
labelEn: Require Upload Authentication
|
||||
labelZh: 要求上传认证
|
||||
label:
|
||||
en: Require Upload Authentication
|
||||
zh: 要求上传认证
|
||||
zh-Hant: 要求上傳驗證
|
||||
ja: アップロード認証を必須化
|
||||
ko: 업로드 인증 필요
|
||||
ru: Требовать аутентификацию загрузки
|
||||
ms: Wajibkan pengesahan muat naik
|
||||
pt-br: Exigir autenticacao para envio
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "True"
|
||||
value: "true"
|
||||
- label: "False"
|
||||
value: "false"
|
||||
- default: UTC
|
||||
edit: true
|
||||
envKey: ASCIINEMA_TIMEZONE
|
||||
labelEn: Timezone
|
||||
labelZh: 时区
|
||||
label:
|
||||
en: Timezone
|
||||
zh: 时区
|
||||
zh-Hant: 時區
|
||||
ja: タイムゾーン
|
||||
ko: 시간대
|
||||
ru: Часовой пояс
|
||||
ms: Zon waktu
|
||||
pt-br: Fuso horario
|
||||
required: true
|
||||
type: text
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori data
|
||||
pt-br: Diretorio de dados
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,82 @@
|
||||
services:
|
||||
asciinema-server:
|
||||
image: "ghcr.io/asciinema/asciinema-server:20260626@sha256:0474b2186be46b23f5e16dbd4319727dbb68f27a303705fbe632821bf524b313"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
asciinema-postgres:
|
||||
condition: service_healthy
|
||||
user: "1000:0"
|
||||
networks:
|
||||
- 1panel-network
|
||||
- asciinema-internal
|
||||
ports:
|
||||
- "${PANEL_APP_BIND_ADDRESS}:${PANEL_APP_PORT_HTTP}:4000"
|
||||
environment:
|
||||
- DATABASE_URL=postgresql://asciinema:${ASCIINEMA_POSTGRES_PASSWORD}@asciinema-postgres/asciinema
|
||||
- SECRET_KEY_BASE=${ASCIINEMA_SECRET_KEY_BASE}
|
||||
- URL_SCHEME=${ASCIINEMA_URL_SCHEME}
|
||||
- URL_HOST=${ASCIINEMA_URL_HOST}
|
||||
- URL_PORT=${ASCIINEMA_URL_PORT}
|
||||
- TZ=${ASCIINEMA_TIMEZONE}
|
||||
- BIND_ALL=1
|
||||
- ADMIN_BIND_ALL=0
|
||||
- ADMIN_PANEL_ON_MAIN_ENDPOINT=1
|
||||
- SIGN_UP_DISABLED=${ASCIINEMA_SIGN_UP_DISABLED}
|
||||
- UPLOAD_AUTH_REQUIRED=${ASCIINEMA_UPLOAD_AUTH_REQUIRED}
|
||||
- DATA_DIR=/var/lib/asciinema
|
||||
- CACHE_PATH=/var/cache/asciinema
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /tmp:uid=1000,gid=0,mode=1770
|
||||
- /var/cache/asciinema:uid=1000,gid=0,mode=0770
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/asciinema:/var/lib/asciinema"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -q --spider http://127.0.0.1:4000/ || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 12
|
||||
start_period: 60s
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
asciinema-postgres:
|
||||
image: "postgres:17-alpine@sha256:1bcc18d81671b02906296aad470ec9778a6b71016ce953092024b680bad007b0"
|
||||
container_name: ${CONTAINER_NAME}-postgres
|
||||
restart: unless-stopped
|
||||
user: "70:70"
|
||||
networks:
|
||||
- asciinema-internal
|
||||
environment:
|
||||
- POSTGRES_USER=asciinema
|
||||
- POSTGRES_PASSWORD=${ASCIINEMA_POSTGRES_PASSWORD}
|
||||
- POSTGRES_DB=asciinema
|
||||
read_only: true
|
||||
tmpfs:
|
||||
- /run/postgresql:uid=70,gid=70,mode=0770
|
||||
- /tmp:uid=70,gid=70,mode=1770
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}/postgres:/var/lib/postgresql/data"
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U asciinema -d asciinema"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 12
|
||||
start_period: 10s
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
asciinema-internal:
|
||||
internal: true
|
||||
@@ -0,0 +1,144 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
|
||||
|
||||
fail() {
|
||||
printf '%s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
set_env_value() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
local temp_file
|
||||
temp_file="$(mktemp "${ROOT_DIR}/.asciinema-env.tmp.XXXXXX")"
|
||||
awk -v key="$key" -v value="$value" '
|
||||
BEGIN { written = 0 }
|
||||
$0 ~ "^" key "=" {
|
||||
if (!written) {
|
||||
print key "=" value
|
||||
written = 1
|
||||
}
|
||||
next
|
||||
}
|
||||
{ print }
|
||||
END { if (!written) print key "=" value }
|
||||
' "$ENV_FILE" > "$temp_file"
|
||||
chmod 600 "$temp_file"
|
||||
mv -f -- "$temp_file" "$ENV_FILE"
|
||||
}
|
||||
|
||||
validate_port() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
[[ "$value" =~ ^[0-9]+$ ]] || fail "$key must be an integer"
|
||||
((10#$value >= 1 && 10#$value <= 65535)) || fail "$key must be between 1 and 65535"
|
||||
}
|
||||
|
||||
validate_boolean() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
[[ "$value" == "true" || "$value" == "false" ]] || fail "$key must be true or false"
|
||||
}
|
||||
|
||||
[[ -f "$ENV_FILE" ]] || fail "$ENV_FILE not found"
|
||||
[[ ! -L "$ENV_FILE" ]] || fail "$ENV_FILE must not be a symbolic link"
|
||||
|
||||
bind_address="$(read_env_value PANEL_APP_BIND_ADDRESS)"
|
||||
[[ "$bind_address" =~ ^[0-9]{1,3}(\.[0-9]{1,3}){3}$ ]] || fail "PANEL_APP_BIND_ADDRESS must be an IPv4 address"
|
||||
IFS=. read -r octet1 octet2 octet3 octet4 <<< "$bind_address"
|
||||
for octet in "$octet1" "$octet2" "$octet3" "$octet4"; do
|
||||
((10#$octet <= 255)) || fail "PANEL_APP_BIND_ADDRESS contains an invalid IPv4 octet"
|
||||
done
|
||||
|
||||
validate_port PANEL_APP_PORT_HTTP "$(read_env_value PANEL_APP_PORT_HTTP)"
|
||||
validate_port ASCIINEMA_URL_PORT "$(read_env_value ASCIINEMA_URL_PORT)"
|
||||
|
||||
url_scheme="$(read_env_value ASCIINEMA_URL_SCHEME)"
|
||||
[[ "$url_scheme" == "http" || "$url_scheme" == "https" ]] || fail "ASCIINEMA_URL_SCHEME must be http or https"
|
||||
|
||||
url_host="$(read_env_value ASCIINEMA_URL_HOST)"
|
||||
[[ ${#url_host} -ge 1 && ${#url_host} -le 253 ]] || fail "ASCIINEMA_URL_HOST has an invalid length"
|
||||
[[ "$url_host" != *..* ]] || fail "ASCIINEMA_URL_HOST contains an empty label"
|
||||
IFS=. read -ra host_labels <<< "$url_host"
|
||||
for host_label in "${host_labels[@]}"; do
|
||||
[[ ${#host_label} -le 63 ]] || fail "ASCIINEMA_URL_HOST contains an oversized label"
|
||||
[[ "$host_label" =~ ^[A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])?$ ]] || fail "ASCIINEMA_URL_HOST must be a hostname or IPv4 address"
|
||||
done
|
||||
|
||||
validate_boolean ASCIINEMA_SIGN_UP_DISABLED "$(read_env_value ASCIINEMA_SIGN_UP_DISABLED)"
|
||||
validate_boolean ASCIINEMA_UPLOAD_AUTH_REQUIRED "$(read_env_value ASCIINEMA_UPLOAD_AUTH_REQUIRED)"
|
||||
|
||||
timezone="$(read_env_value ASCIINEMA_TIMEZONE)"
|
||||
[[ "$timezone" =~ ^[A-Za-z0-9_+/-]{1,64}$ && "$timezone" != *..* ]] || fail "ASCIINEMA_TIMEZONE contains unsupported characters"
|
||||
|
||||
secret="$(read_env_value ASCIINEMA_SECRET_KEY_BASE)"
|
||||
if [[ -z "$secret" || "$secret" == "generate" ]]; then
|
||||
command -v base64 >/dev/null 2>&1 || fail "base64 is required to generate ASCIINEMA_SECRET_KEY_BASE"
|
||||
random_material="$(head -c 96 /dev/urandom | base64 | tr -dc A-Za-z0-9)"
|
||||
secret="${random_material:0:64}"
|
||||
fi
|
||||
[[ "$secret" =~ ^[A-Za-z0-9]{64,128}$ ]] || fail "ASCIINEMA_SECRET_KEY_BASE must contain 64 to 128 alphanumeric characters"
|
||||
|
||||
postgres_password="$(read_env_value ASCIINEMA_POSTGRES_PASSWORD)"
|
||||
if [[ -z "$postgres_password" || "$postgres_password" == "generate" ]]; then
|
||||
command -v base64 >/dev/null 2>&1 || fail "base64 is required to generate ASCIINEMA_POSTGRES_PASSWORD"
|
||||
random_material="$(head -c 48 /dev/urandom | base64 | tr -dc A-Za-z0-9)"
|
||||
postgres_password="${random_material:0:32}"
|
||||
fi
|
||||
[[ "$postgres_password" =~ ^[A-Za-z0-9]{16,128}$ ]] || fail "ASCIINEMA_POSTGRES_PASSWORD must contain 16 to 128 alphanumeric characters"
|
||||
|
||||
data_dir_raw="$(read_env_value APP_DATA_DIR)"
|
||||
[[ -n "$data_dir_raw" ]] || data_dir_raw="./data"
|
||||
case "$data_dir_raw" in
|
||||
/*) fail "APP_DATA_DIR must be relative to the application version directory" ;;
|
||||
*$'\n'* | *$'\r'* | *\\* | *'$'* | *'#'* | *'"'* | *"'") fail "APP_DATA_DIR contains unsupported characters" ;;
|
||||
esac
|
||||
data_dir="$(realpath -m -- "${ROOT_DIR}/${data_dir_raw#./}")"
|
||||
case "$data_dir" in
|
||||
"${ROOT_DIR}"/*) ;;
|
||||
*) fail "APP_DATA_DIR must stay inside the application version directory" ;;
|
||||
esac
|
||||
[[ ! -L "$data_dir" ]] || fail "APP_DATA_DIR must not be a symbolic link"
|
||||
|
||||
install -d -m 0750 -- "$data_dir"
|
||||
resolved_data_dir="$(realpath -e -- "$data_dir")"
|
||||
case "$resolved_data_dir" in
|
||||
"${ROOT_DIR}"/*) ;;
|
||||
*) fail "APP_DATA_DIR resolves outside the application version directory" ;;
|
||||
esac
|
||||
[[ "$(id -u)" -eq 0 ]] || fail "asciinema server init must run as root to prepare data ownership"
|
||||
|
||||
for child_name in asciinema postgres; do
|
||||
[[ ! -L "$data_dir/$child_name" ]] || fail "APP_DATA_DIR/$child_name must not be a symbolic link"
|
||||
done
|
||||
install -d -m 0770 -- "$data_dir/asciinema"
|
||||
install -d -m 0700 -- "$data_dir/postgres"
|
||||
for child_name in asciinema postgres; do
|
||||
resolved_child="$(realpath -e -- "$data_dir/$child_name")"
|
||||
case "$resolved_child" in
|
||||
"${resolved_data_dir}"/*) ;;
|
||||
*) fail "APP_DATA_DIR/$child_name resolves outside APP_DATA_DIR" ;;
|
||||
esac
|
||||
done
|
||||
chown -R --no-dereference 1000:0 "$data_dir/asciinema"
|
||||
chown -R --no-dereference 70:70 "$data_dir/postgres"
|
||||
chmod 0770 "$data_dir/asciinema"
|
||||
chmod 0700 "$data_dir/postgres"
|
||||
|
||||
set_env_value ASCIINEMA_SECRET_KEY_BASE "$secret"
|
||||
set_env_value ASCIINEMA_POSTGRES_PASSWORD "$postgres_password"
|
||||
chmod 600 "$ENV_FILE"
|
||||
+126
@@ -0,0 +1,126 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
|
||||
|
||||
fail() {
|
||||
printf '%s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
read_env_value() {
|
||||
local file="$1"
|
||||
local key="$2"
|
||||
local value
|
||||
[[ -f "$file" && ! -L "$file" ]] || return 1
|
||||
value="$(awk -v key="$key" 'index($0, key "=") == 1 { value = substr($0, length(key) + 2) } END { print value }' "$file")"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
set_env_value() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
local temp_file
|
||||
temp_file="$(mktemp "${ENV_FILE}.asciinema-upgrade.XXXXXX")"
|
||||
awk -v key="$key" -v value="$value" '
|
||||
BEGIN { written = 0; prefix = key "=" }
|
||||
index($0, prefix) == 1 {
|
||||
if (!written) {
|
||||
print prefix value
|
||||
written = 1
|
||||
}
|
||||
next
|
||||
}
|
||||
{ print }
|
||||
END { if (!written) print prefix value }
|
||||
' "$ENV_FILE" > "$temp_file"
|
||||
chmod 600 "$temp_file"
|
||||
mv -f -- "$temp_file" "$ENV_FILE"
|
||||
}
|
||||
|
||||
credentials_need_recovery() {
|
||||
local key value
|
||||
for key in ASCIINEMA_SECRET_KEY_BASE ASCIINEMA_POSTGRES_PASSWORD; do
|
||||
value="$(read_env_value "$ENV_FILE" "$key")"
|
||||
[[ -z "$value" || "$value" == generate ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
restore_credentials_from_env() {
|
||||
local candidate="$1"
|
||||
local current_container previous_container key current_value previous_value
|
||||
local needs_recovery=0
|
||||
|
||||
[[ -f "$candidate" && ! -L "$candidate" ]] || return 1
|
||||
current_container="$(read_env_value "$ENV_FILE" CONTAINER_NAME)"
|
||||
previous_container="$(read_env_value "$candidate" CONTAINER_NAME)"
|
||||
[[ -n "$current_container" && "$previous_container" == "$current_container" ]] || return 1
|
||||
|
||||
for key in ASCIINEMA_SECRET_KEY_BASE ASCIINEMA_POSTGRES_PASSWORD; do
|
||||
current_value="$(read_env_value "$ENV_FILE" "$key")"
|
||||
[[ -n "$current_value" && "$current_value" != generate ]] && continue
|
||||
previous_value="$(read_env_value "$candidate" "$key")"
|
||||
if [[ "$key" == ASCIINEMA_SECRET_KEY_BASE ]]; then
|
||||
[[ "$previous_value" =~ ^[A-Za-z0-9]{64,128}$ ]] || return 1
|
||||
else
|
||||
[[ "$previous_value" =~ ^[A-Za-z0-9]{16,128}$ ]] || return 1
|
||||
fi
|
||||
set_env_value "$key" "$previous_value"
|
||||
needs_recovery=1
|
||||
done
|
||||
|
||||
(( needs_recovery == 1 )) || ! credentials_need_recovery
|
||||
}
|
||||
|
||||
restore_credentials_from_backup() (
|
||||
local panel_root app_key install_name backup_dir archive archive_entry
|
||||
local latest_mtime=0 archive_mtime temp_dir old_env
|
||||
|
||||
panel_root="${ROOT_DIR%%/apps/*}"
|
||||
[[ "$panel_root" != "$ROOT_DIR" ]] || exit 1
|
||||
app_key="$(basename "$(dirname "$ROOT_DIR")")"
|
||||
install_name="$(basename "$ROOT_DIR")"
|
||||
[[ "$app_key" =~ ^[A-Za-z0-9._-]+$ && "$install_name" =~ ^[A-Za-z0-9._-]+$ ]] || exit 1
|
||||
backup_dir="$panel_root/backup/app/local${app_key}/${install_name}"
|
||||
[[ -d "$backup_dir" && ! -L "$backup_dir" ]] || exit 1
|
||||
|
||||
archive=""
|
||||
while IFS= read -r -d '' candidate; do
|
||||
archive_mtime="$(stat -c '%Y' "$candidate")"
|
||||
if [[ -z "$archive" ]] || (( archive_mtime > latest_mtime )); then
|
||||
archive="$candidate"
|
||||
latest_mtime="$archive_mtime"
|
||||
fi
|
||||
done < <(find "$backup_dir" -maxdepth 1 -type f -name 'upgrade_backup_*.tar.gz' -print0)
|
||||
[[ -n "$archive" ]] || exit 1
|
||||
|
||||
archive_entry="$(tar -tzf "$archive" | awk '$0 ~ /(^|\/)app\.tar\.gz$/ { print; exit }')"
|
||||
[[ -n "$archive_entry" ]] || exit 1
|
||||
if ! tar -xOf "$archive" -- "$archive_entry" | tar -tzf - | grep -Fqx "$install_name/.env"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
temp_dir="$(mktemp -d "$ROOT_DIR/.asciinema-upgrade-backup.XXXXXX")"
|
||||
trap 'rm -rf -- "$temp_dir"' EXIT
|
||||
old_env="$temp_dir/old.env"
|
||||
tar -xOf "$archive" -- "$archive_entry" | tar -xOzf - -- "$install_name/.env" > "$old_env"
|
||||
chmod 600 "$old_env"
|
||||
restore_credentials_from_env "$old_env"
|
||||
)
|
||||
|
||||
[[ -f "$ENV_FILE" && ! -L "$ENV_FILE" ]] || fail "$ENV_FILE not found or is a symbolic link"
|
||||
|
||||
if credentials_need_recovery; then
|
||||
if ! restore_credentials_from_backup && credentials_need_recovery; then
|
||||
fail "Could not recover generated Asciinema credentials from the 1Panel upgrade backup; refusing to continue with newly generated credentials"
|
||||
fi
|
||||
fi
|
||||
|
||||
exec "$SCRIPT_DIR/init.sh"
|
||||
@@ -46,7 +46,7 @@ services:
|
||||
createdBy: "Apps"
|
||||
|
||||
asciinema-postgres:
|
||||
image: "postgres:17-alpine@sha256:742f40ea20b9ff2ff31db5458d127452988a2164df9e17441e191f3b72252193"
|
||||
image: "postgres:17-alpine@sha256:1bcc18d81671b02906296aad470ec9778a6b71016ce953092024b680bad007b0"
|
||||
container_name: ${CONTAINER_NAME}-postgres
|
||||
restart: unless-stopped
|
||||
user: "70:70"
|
||||
|
||||
@@ -1,4 +1,126 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
"$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)/init.sh"
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
|
||||
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-${ROOT_DIR}/.env}"
|
||||
|
||||
fail() {
|
||||
printf '%s\n' "$1" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
read_env_value() {
|
||||
local file="$1"
|
||||
local key="$2"
|
||||
local value
|
||||
[[ -f "$file" && ! -L "$file" ]] || return 1
|
||||
value="$(awk -v key="$key" 'index($0, key "=") == 1 { value = substr($0, length(key) + 2) } END { print value }' "$file")"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
set_env_value() {
|
||||
local key="$1"
|
||||
local value="$2"
|
||||
local temp_file
|
||||
temp_file="$(mktemp "${ENV_FILE}.asciinema-upgrade.XXXXXX")"
|
||||
awk -v key="$key" -v value="$value" '
|
||||
BEGIN { written = 0; prefix = key "=" }
|
||||
index($0, prefix) == 1 {
|
||||
if (!written) {
|
||||
print prefix value
|
||||
written = 1
|
||||
}
|
||||
next
|
||||
}
|
||||
{ print }
|
||||
END { if (!written) print prefix value }
|
||||
' "$ENV_FILE" > "$temp_file"
|
||||
chmod 600 "$temp_file"
|
||||
mv -f -- "$temp_file" "$ENV_FILE"
|
||||
}
|
||||
|
||||
credentials_need_recovery() {
|
||||
local key value
|
||||
for key in ASCIINEMA_SECRET_KEY_BASE ASCIINEMA_POSTGRES_PASSWORD; do
|
||||
value="$(read_env_value "$ENV_FILE" "$key")"
|
||||
[[ -z "$value" || "$value" == generate ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
restore_credentials_from_env() {
|
||||
local candidate="$1"
|
||||
local current_container previous_container key current_value previous_value
|
||||
local needs_recovery=0
|
||||
|
||||
[[ -f "$candidate" && ! -L "$candidate" ]] || return 1
|
||||
current_container="$(read_env_value "$ENV_FILE" CONTAINER_NAME)"
|
||||
previous_container="$(read_env_value "$candidate" CONTAINER_NAME)"
|
||||
[[ -n "$current_container" && "$previous_container" == "$current_container" ]] || return 1
|
||||
|
||||
for key in ASCIINEMA_SECRET_KEY_BASE ASCIINEMA_POSTGRES_PASSWORD; do
|
||||
current_value="$(read_env_value "$ENV_FILE" "$key")"
|
||||
[[ -n "$current_value" && "$current_value" != generate ]] && continue
|
||||
previous_value="$(read_env_value "$candidate" "$key")"
|
||||
if [[ "$key" == ASCIINEMA_SECRET_KEY_BASE ]]; then
|
||||
[[ "$previous_value" =~ ^[A-Za-z0-9]{64,128}$ ]] || return 1
|
||||
else
|
||||
[[ "$previous_value" =~ ^[A-Za-z0-9]{16,128}$ ]] || return 1
|
||||
fi
|
||||
set_env_value "$key" "$previous_value"
|
||||
needs_recovery=1
|
||||
done
|
||||
|
||||
(( needs_recovery == 1 )) || ! credentials_need_recovery
|
||||
}
|
||||
|
||||
restore_credentials_from_backup() (
|
||||
local panel_root app_key install_name backup_dir archive archive_entry
|
||||
local latest_mtime=0 archive_mtime temp_dir old_env
|
||||
|
||||
panel_root="${ROOT_DIR%%/apps/*}"
|
||||
[[ "$panel_root" != "$ROOT_DIR" ]] || exit 1
|
||||
app_key="$(basename "$(dirname "$ROOT_DIR")")"
|
||||
install_name="$(basename "$ROOT_DIR")"
|
||||
[[ "$app_key" =~ ^[A-Za-z0-9._-]+$ && "$install_name" =~ ^[A-Za-z0-9._-]+$ ]] || exit 1
|
||||
backup_dir="$panel_root/backup/app/local${app_key}/${install_name}"
|
||||
[[ -d "$backup_dir" && ! -L "$backup_dir" ]] || exit 1
|
||||
|
||||
archive=""
|
||||
while IFS= read -r -d '' candidate; do
|
||||
archive_mtime="$(stat -c '%Y' "$candidate")"
|
||||
if [[ -z "$archive" ]] || (( archive_mtime > latest_mtime )); then
|
||||
archive="$candidate"
|
||||
latest_mtime="$archive_mtime"
|
||||
fi
|
||||
done < <(find "$backup_dir" -maxdepth 1 -type f -name 'upgrade_backup_*.tar.gz' -print0)
|
||||
[[ -n "$archive" ]] || exit 1
|
||||
|
||||
archive_entry="$(tar -tzf "$archive" | awk '$0 ~ /(^|\/)app\.tar\.gz$/ { print; exit }')"
|
||||
[[ -n "$archive_entry" ]] || exit 1
|
||||
if ! tar -xOf "$archive" -- "$archive_entry" | tar -tzf - | grep -Fqx "$install_name/.env"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
temp_dir="$(mktemp -d "$ROOT_DIR/.asciinema-upgrade-backup.XXXXXX")"
|
||||
trap 'rm -rf -- "$temp_dir"' EXIT
|
||||
old_env="$temp_dir/old.env"
|
||||
tar -xOf "$archive" -- "$archive_entry" | tar -xOzf - -- "$install_name/.env" > "$old_env"
|
||||
chmod 600 "$old_env"
|
||||
restore_credentials_from_env "$old_env"
|
||||
)
|
||||
|
||||
[[ -f "$ENV_FILE" && ! -L "$ENV_FILE" ]] || fail "$ENV_FILE not found or is a symbolic link"
|
||||
|
||||
if credentials_need_recovery; then
|
||||
if ! restore_credentials_from_backup && credentials_need_recovery; then
|
||||
fail "Could not recover generated Asciinema credentials from the 1Panel upgrade backup; refusing to continue with newly generated credentials"
|
||||
fi
|
||||
fi
|
||||
|
||||
exec "$SCRIPT_DIR/init.sh"
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
PANEL_APP_PORT_HTTPS=41001
|
||||
HTTP_PWD=replace-with-a-random-value
|
||||
SHM_SIZE=1024m
|
||||
APP_DATA_DIR=./data
|
||||
CONTAINER_NAME=
|
||||
@@ -0,0 +1,69 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 41001
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTPS
|
||||
labelEn: HTTPS Port
|
||||
labelZh: HTTPS 端口
|
||||
label:
|
||||
en: HTTPS Port
|
||||
zh: HTTPS 端口
|
||||
zh-Hant: HTTPS 連接埠
|
||||
ja: HTTPS ポート
|
||||
ko: HTTPS 포트
|
||||
ru: Порт HTTPS
|
||||
ms: Port HTTPS
|
||||
pt-br: Porta HTTPS
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: HTTP_PWD
|
||||
labelEn: Access Password
|
||||
labelZh: 访问密码
|
||||
label:
|
||||
en: Access Password
|
||||
zh: 访问密码
|
||||
zh-Hant: 存取密碼
|
||||
ja: アクセスパスワード
|
||||
ko: 접속 비밀번호
|
||||
ru: Пароль доступа
|
||||
ms: Kata Laluan Akses
|
||||
pt-br: Senha de Acesso
|
||||
random: true
|
||||
required: true
|
||||
rule: paramComplexity
|
||||
type: password
|
||||
- default: 1024m
|
||||
edit: true
|
||||
envKey: SHM_SIZE
|
||||
labelEn: Shared Memory Size
|
||||
labelZh: 共享内存大小
|
||||
label:
|
||||
en: Shared Memory Size
|
||||
zh: 共享内存大小
|
||||
zh-Hant: 共享記憶體大小
|
||||
ja: 共有メモリサイズ
|
||||
ko: 공유 메모리 크기
|
||||
ru: Размер общей памяти
|
||||
ms: Saiz Memori Dikongsi
|
||||
pt-br: Tamanho da Memória Compartilhada
|
||||
required: true
|
||||
type: text
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori Data
|
||||
pt-br: Diretório de Dados
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
audacity-kasm:
|
||||
image: "kasmweb/audacity:1.19.0-rolling-weekly@sha256:8a5c6dad4f16e0cad022aee7beb2fa0d664c5331d6eb60b15790b2b482a0bf92"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTPS}:6901"
|
||||
environment:
|
||||
- VNC_PW=${HTTP_PWD}
|
||||
shm_size: ${SHM_SIZE}
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- >-
|
||||
curl --insecure --fail --silent --show-error
|
||||
--user "kasm_user:$$VNC_PW"
|
||||
https://127.0.0.1:6901/
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
start_period: 90s
|
||||
retries: 5
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}:/home/kasm-user"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
data_raw="${APP_DATA_DIR:-}"
|
||||
if [[ -z "$data_raw" ]]; then
|
||||
data_raw="$(read_env_value APP_DATA_DIR)"
|
||||
fi
|
||||
data_raw="${data_raw:-./data}"
|
||||
|
||||
[[ "$data_raw" != /* ]] || {
|
||||
printf '%s\n' 'APP_DATA_DIR must be a relative path' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
data_dir="$(realpath -m -- "$ROOT_DIR/${data_raw#./}")"
|
||||
case "$data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR must remain inside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p -- "$data_dir"
|
||||
resolved_data_dir="$(realpath -e -- "$data_dir")"
|
||||
case "$resolved_data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR resolves outside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
chown 1000:1000 -- "$resolved_data_dir"
|
||||
chmod 0700 -- "$resolved_data_dir"
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Preserve APP_DATA_DIR so uninstall does not destroy user files.
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
"$(dirname "$0")/init.sh"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
audacity-kasm:
|
||||
image: "kasmweb/audacity:1.19.0-rolling-weekly@sha256:b3470505d3734a6a3322e19ae8fdf3f6d792d856126ede3af58e4af1f3aa7be4"
|
||||
image: "kasmweb/audacity:1.19.0-rolling-weekly@sha256:8a5c6dad4f16e0cad022aee7beb2fa0d664c5331d6eb60b15790b2b482a0bf92"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
audacity:
|
||||
image: "linuxserver/audacity:3.7.8"
|
||||
image: "linuxserver/audacity:3.7.9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
bark:
|
||||
image: "finab/bark-server:v2.3.7"
|
||||
image: "finab/bark-server:v2.3.9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
BARK_SERVER_ADDRESS="0.0.0.0"
|
||||
BARK_SERVER_BASIC_AUTH_PASSWORD=""
|
||||
BARK_SERVER_BASIC_AUTH_USER=""
|
||||
BARK_SERVER_CASE_SENSITIVE="false"
|
||||
BARK_SERVER_CERT=""
|
||||
BARK_SERVER_CONCURRENCY=262144
|
||||
BARK_SERVER_DATA_DIR="/data"
|
||||
BARK_SERVER_DSN=""
|
||||
BARK_SERVER_IDLE_TIMEOUT="10s"
|
||||
BARK_SERVER_KEY=""
|
||||
BARK_SERVER_PROXY_HEADER=""
|
||||
BARK_SERVER_READ_TIMEOUT="3s"
|
||||
BARK_SERVER_REDUCE_MEMORY_USAGE="false"
|
||||
BARK_SERVER_SERVERLESS="false"
|
||||
BARK_SERVER_STRICT_ROUTING="false"
|
||||
BARK_SERVER_URL_PREFIX="/"
|
||||
BARK_SERVER_WRITE_TIMEOUT="3s"
|
||||
CONTAINER_NAME="bark"
|
||||
DATA_PATH="./data"
|
||||
PANEL_APP_PORT_HTTP=40280
|
||||
@@ -0,0 +1,327 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: "40280"
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTP
|
||||
labelEn: Port
|
||||
labelZh: 端口
|
||||
label:
|
||||
en: 'Port'
|
||||
zh: '端口'
|
||||
zh-Hant: '埠'
|
||||
ja: 'ポート'
|
||||
ko: '포트'
|
||||
ru: 'Порт'
|
||||
ms: 'Port'
|
||||
pt-br: 'Porta'
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: "./data"
|
||||
disabled: true
|
||||
envKey: DATA_PATH
|
||||
labelEn: Data Path
|
||||
labelZh: 数据路径
|
||||
label:
|
||||
en: 'Data Path'
|
||||
zh: '数据路径'
|
||||
zh-Hant: '資料路徑'
|
||||
ja: 'データパス'
|
||||
ko: '데이터 경로'
|
||||
ru: 'Путь к данным'
|
||||
ms: 'Laluan data'
|
||||
pt-br: 'Caminho de dados'
|
||||
required: true
|
||||
type: text
|
||||
- default: "0.0.0.0"
|
||||
disabled: true
|
||||
envKey: BARK_SERVER_ADDRESS
|
||||
labelEn: Bark Server Address
|
||||
labelZh: Bark 服务器地址
|
||||
label:
|
||||
en: 'Bark Server Address'
|
||||
zh: 'Bark 服务器地址'
|
||||
zh-Hant: 'Bark 伺服器位址'
|
||||
ja: 'Bark サーバーアドレス'
|
||||
ko: 'Bark 서버 주소'
|
||||
ru: 'Адрес сервера Bark'
|
||||
ms: 'Alamat pelayan Bark'
|
||||
pt-br: 'Endereço do servidor Bark'
|
||||
required: true
|
||||
type: text
|
||||
- default: "/"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_URL_PREFIX
|
||||
labelEn: Bark Server URL Prefix
|
||||
labelZh: Bark 服务器 URL 前缀
|
||||
label:
|
||||
en: 'Bark Server URL Prefix'
|
||||
zh: 'Bark 服务器 URL 前缀'
|
||||
zh-Hant: 'Bark 伺服器 URL 前綴'
|
||||
ja: 'Bark サーバー URL プレフィックス'
|
||||
ko: 'Bark 서버 URL 접두사'
|
||||
ru: 'Префикс URL сервера Bark'
|
||||
ms: 'Awalan URL pelayan Bark'
|
||||
pt-br: 'Prefixo de URL do servidor Bark'
|
||||
required: true
|
||||
type: text
|
||||
- default: "/data"
|
||||
disabled: true
|
||||
envKey: BARK_SERVER_DATA_DIR
|
||||
labelEn: Bark Server Data Directory
|
||||
labelZh: Bark 服务器数据目录
|
||||
label:
|
||||
en: 'Bark Server Data Directory'
|
||||
zh: 'Bark 服务器数据目录'
|
||||
zh-Hant: 'Bark 伺服器資料目錄'
|
||||
ja: 'Bark サーバーデータディレクトリ'
|
||||
ko: 'Bark 서버 데이터 디렉터리'
|
||||
ru: 'Каталог данных сервера Bark'
|
||||
ms: 'Direktori data pelayan Bark'
|
||||
pt-br: 'Diretório de dados do servidor Bark'
|
||||
required: true
|
||||
type: text
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_DSN
|
||||
labelEn: Bark Server DSN
|
||||
labelZh: Bark 服务器 DSN
|
||||
label:
|
||||
en: 'Bark Server DSN'
|
||||
zh: 'Bark 服务器 DSN'
|
||||
zh-Hant: 'Bark 伺服器 DSN'
|
||||
ja: 'Bark サーバー DSN'
|
||||
ko: 'Bark 서버 DSN'
|
||||
ru: 'DSN сервера Bark'
|
||||
ms: 'DSN pelayan Bark'
|
||||
pt-br: 'DSN do servidor Bark'
|
||||
required: false
|
||||
type: text
|
||||
- default: "false"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_SERVERLESS
|
||||
labelEn: Bark Server Serverless
|
||||
labelZh: Bark 服务器无服务器
|
||||
label:
|
||||
en: 'Bark Server Serverless'
|
||||
zh: 'Bark 服务器无服务器'
|
||||
zh-Hant: 'Bark 伺服器無伺服器'
|
||||
ja: 'Bark サーバー Serverless'
|
||||
ko: 'Bark 서버 서버리스'
|
||||
ru: 'Bark Serverless'
|
||||
ms: 'Bark Serverless'
|
||||
pt-br: 'Bark Serverless'
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "true"
|
||||
value: "true"
|
||||
- label: "false"
|
||||
value: "false"
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_CERT
|
||||
labelEn: Bark Server Certificate
|
||||
labelZh: Bark 服务器证书
|
||||
label:
|
||||
en: 'Bark Server Certificate'
|
||||
zh: 'Bark 服务器证书'
|
||||
zh-Hant: 'Bark 伺服器憑證'
|
||||
ja: 'Bark サーバー証明書'
|
||||
ko: 'Bark 서버 인증서'
|
||||
ru: 'Сертификат сервера Bark'
|
||||
ms: 'Sijil pelayan Bark'
|
||||
pt-br: 'Certificado do servidor Bark'
|
||||
required: false
|
||||
type: text
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_KEY
|
||||
labelEn: Bark Server Key
|
||||
labelZh: Bark 服务器密钥
|
||||
label:
|
||||
en: 'Bark Server Key'
|
||||
zh: 'Bark 服务器密钥'
|
||||
zh-Hant: 'Bark 伺服器金鑰'
|
||||
ja: 'Bark サーバーキー'
|
||||
ko: 'Bark 서버 키'
|
||||
ru: 'Ключ сервера Bark'
|
||||
ms: 'Kunci pelayan Bark'
|
||||
pt-br: 'Chave do servidor Bark'
|
||||
required: false
|
||||
type: text
|
||||
- default: "false"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_CASE_SENSITIVE
|
||||
labelEn: Bark Server Case Sensitive
|
||||
labelZh: Bark 服务器区分大小写
|
||||
label:
|
||||
en: 'Bark Server Case Sensitive'
|
||||
zh: 'Bark 服务器区分大小写'
|
||||
zh-Hant: 'Bark 伺服器區分大小寫'
|
||||
ja: 'Bark サーバー大文字小文字を区別'
|
||||
ko: 'Bark 서버 대/소문자 구분'
|
||||
ru: 'Bark с учетом регистра'
|
||||
ms: 'Bark peka huruf besar/kecil'
|
||||
pt-br: 'Bark sensível a maiúsculas/minúsculas'
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "true"
|
||||
value: "true"
|
||||
- label: "false"
|
||||
value: "false"
|
||||
- default: "false"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_STRICT_ROUTING
|
||||
labelEn: Bark Server Strict Routing
|
||||
labelZh: Bark 服务器严格路由
|
||||
label:
|
||||
en: 'Bark Server Strict Routing'
|
||||
zh: 'Bark 服务器严格路由'
|
||||
zh-Hant: 'Bark 伺服器嚴格路由'
|
||||
ja: 'Bark サーバー厳格ルーティング'
|
||||
ko: 'Bark 서버 엄격 라우팅'
|
||||
ru: 'Строгая маршрутизация Bark'
|
||||
ms: 'Perutean ketat Bark'
|
||||
pt-br: 'Roteamento estrito do Bark'
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "true"
|
||||
value: "true"
|
||||
- label: "false"
|
||||
value: "false"
|
||||
- default: "false"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_REDUCE_MEMORY_USAGE
|
||||
labelEn: Bark Server Reduce Memory Usage
|
||||
labelZh: Bark 服务器减少内存使用
|
||||
label:
|
||||
en: 'Bark Server Reduce Memory Usage'
|
||||
zh: 'Bark 服务器减少内存使用'
|
||||
zh-Hant: 'Bark 伺服器減少記憶體使用'
|
||||
ja: 'Bark サーバーメモリ使用量を削減'
|
||||
ko: 'Bark 서버 메모리 사용량 감소'
|
||||
ru: 'Снижение использования памяти Bark'
|
||||
ms: 'Kurangkan penggunaan memori Bark'
|
||||
pt-br: 'Reduzir uso de memória do Bark'
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: "true"
|
||||
value: "true"
|
||||
- label: "false"
|
||||
value: "false"
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_BASIC_AUTH_USER
|
||||
labelEn: Bark Server Basic Auth User
|
||||
labelZh: Bark 服务器基本身份验证用户
|
||||
label:
|
||||
en: 'Bark Server Basic Auth User'
|
||||
zh: 'Bark 服务器基本身份验证用户'
|
||||
zh-Hant: 'Bark 伺服器基本驗證使用者'
|
||||
ja: 'Bark サーバー基本認証ユーザー'
|
||||
ko: 'Bark 서버 기본 인증 사용자'
|
||||
ru: 'Пользователь базовой аутентификации Bark'
|
||||
ms: 'Pengguna pengesahan asas Bark'
|
||||
pt-br: 'Usuário de autenticação básica do Bark'
|
||||
required: false
|
||||
type: text
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_BASIC_AUTH_PASSWORD
|
||||
labelEn: Bark Server Basic Auth Password
|
||||
labelZh: Bark 服务器基本身份验证密码
|
||||
label:
|
||||
en: 'Bark Server Basic Auth Password'
|
||||
zh: 'Bark 服务器基本身份验证密码'
|
||||
zh-Hant: 'Bark 伺服器基本驗證密碼'
|
||||
ja: 'Bark サーバー基本認証パスワード'
|
||||
ko: 'Bark 서버 기본 인증 비밀번호'
|
||||
ru: 'Пароль базовой аутентификации Bark'
|
||||
ms: 'Kata laluan pengesahan asas Bark'
|
||||
pt-br: 'Senha de autenticação básica do Bark'
|
||||
required: false
|
||||
type: password
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: BARK_SERVER_PROXY_HEADER
|
||||
labelEn: Bark Server Proxy Header
|
||||
labelZh: Bark 服务器代理头
|
||||
label:
|
||||
en: 'Bark Server Proxy Header'
|
||||
zh: 'Bark 服务器代理头'
|
||||
zh-Hant: 'Bark 伺服器代理標頭'
|
||||
ja: 'Bark サーバー プロキシヘッダー'
|
||||
ko: 'Bark 서버 프록시 헤더'
|
||||
ru: 'Прокси-заголовок Bark'
|
||||
ms: 'Pengepala proksi Bark'
|
||||
pt-br: 'Cabeçalho de proxy do Bark'
|
||||
required: false
|
||||
type: text
|
||||
- default: "262144"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_CONCURRENCY
|
||||
labelEn: Bark Server Concurrency
|
||||
labelZh: Bark 服务器并发
|
||||
label:
|
||||
en: 'Bark Server Concurrency'
|
||||
zh: 'Bark 服务器并发'
|
||||
zh-Hant: 'Bark 伺服器並發'
|
||||
ja: 'Bark サーバー同時実行数'
|
||||
ko: 'Bark 서버 동시성'
|
||||
ru: 'Параллельность Bark'
|
||||
ms: 'Kebersamaan Bark'
|
||||
pt-br: 'Concorrência do Bark'
|
||||
required: true
|
||||
type: number
|
||||
- default: "3s"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_READ_TIMEOUT
|
||||
labelEn: Bark Server Read Timeout
|
||||
labelZh: Bark 服务器读取超时
|
||||
label:
|
||||
en: 'Bark Server Read Timeout'
|
||||
zh: 'Bark 服务器读取超时'
|
||||
zh-Hant: 'Bark 伺服器讀取逾時'
|
||||
ja: 'Bark サーバー読み取りタイムアウト'
|
||||
ko: 'Bark 서버 읽기 시간 초과'
|
||||
ru: 'Тайм-аут чтения Bark'
|
||||
ms: 'Had masa baca Bark'
|
||||
pt-br: 'Tempo limite de leitura do Bark'
|
||||
required: true
|
||||
type: text
|
||||
- default: "3s"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_WRITE_TIMEOUT
|
||||
labelEn: Bark Server Write Timeout
|
||||
labelZh: Bark 服务器写入超时
|
||||
label:
|
||||
en: 'Bark Server Write Timeout'
|
||||
zh: 'Bark 服务器写入超时'
|
||||
zh-Hant: 'Bark 伺服器寫入逾時'
|
||||
ja: 'Bark サーバー書き込みタイムアウト'
|
||||
ko: 'Bark 서버 쓰기 시간 초과'
|
||||
ru: 'Тайм-аут записи Bark'
|
||||
ms: 'Had masa tulis Bark'
|
||||
pt-br: 'Tempo limite de gravação do Bark'
|
||||
required: true
|
||||
type: text
|
||||
- default: "10s"
|
||||
edit: true
|
||||
envKey: BARK_SERVER_IDLE_TIMEOUT
|
||||
labelEn: Bark Server Idle Timeout
|
||||
labelZh: Bark 服务器空闲超时
|
||||
label:
|
||||
en: 'Bark Server Idle Timeout'
|
||||
zh: 'Bark 服务器空闲超时'
|
||||
zh-Hant: 'Bark 伺服器閒置逾時'
|
||||
ja: 'Bark サーバーアイドルタイムアウト'
|
||||
ko: 'Bark 서버 유휴 시간 초과'
|
||||
ru: 'Тайм-аут простоя Bark'
|
||||
ms: 'Had masa melahu Bark'
|
||||
pt-br: 'Tempo limite de ociosidade do Bark'
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
bark:
|
||||
image: "finab/bark-server:v2.3.9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTP}:${PANEL_APP_PORT_HTTP}"
|
||||
volumes:
|
||||
- ${DATA_PATH}:/data
|
||||
environment:
|
||||
- BARK_SERVER_ADDRESS=${BARK_SERVER_ADDRESS}:${PANEL_APP_PORT_HTTP}
|
||||
- BARK_SERVER_URL_PREFIX=${BARK_SERVER_URL_PREFIX}
|
||||
- BARK_SERVER_DATA_DIR=${BARK_SERVER_DATA_DIR}
|
||||
- BARK_SERVER_DSN=${BARK_SERVER_DSN}
|
||||
- BARK_SERVER_SERVERLESS=${BARK_SERVER_SERVERLESS}
|
||||
- BARK_SERVER_CERT=${BARK_SERVER_CERT}
|
||||
- BARK_SERVER_KEY=${BARK_SERVER_KEY}
|
||||
- BARK_SERVER_CASE_SENSITIVE=${BARK_SERVER_CASE_SENSITIVE}
|
||||
- BARK_SERVER_STRICT_ROUTING=${BARK_SERVER_STRICT_ROUTING}
|
||||
- BARK_SERVER_REDUCE_MEMORY_USAGE=${BARK_SERVER_REDUCE_MEMORY_USAGE}
|
||||
- BARK_SERVER_BASIC_AUTH_USER=${BARK_SERVER_BASIC_AUTH_USER}
|
||||
- BARK_SERVER_BASIC_AUTH_PASSWORD=${BARK_SERVER_BASIC_AUTH_PASSWORD}
|
||||
- BARK_SERVER_PROXY_HEADER=${BARK_SERVER_PROXY_HEADER}
|
||||
- BARK_SERVER_CONCURRENCY=${BARK_SERVER_CONCURRENCY}
|
||||
- BARK_SERVER_READ_TIMEOUT=${BARK_SERVER_READ_TIMEOUT}
|
||||
- BARK_SERVER_WRITE_TIMEOUT=${BARK_SERVER_WRITE_TIMEOUT}
|
||||
- BARK_SERVER_IDLE_TIMEOUT=${BARK_SERVER_IDLE_TIMEOUT}
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
bentopdf:
|
||||
image: "ghcr.io/alam00000/bentopdf-simple:2.8.8"
|
||||
image: "ghcr.io/alam00000/bentopdf-simple:2.8.10"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
Regular → Executable
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
server:
|
||||
image: "ghcr.io/bisq-network/bisq2-api:2.1.12.1@sha256:79fb71d64d23863c8f48d484a9d84754dae40e12cb395bca348f17dcec46b297"
|
||||
image: "ghcr.io/bisq-network/bisq2-api:2.1.13.0@sha256:caeebd10b6e232ea8567941e4c6594b4000b5771c9e53cef25cf9b9766d5570d"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
stop_grace_period: 1m
|
||||
@@ -38,7 +38,7 @@ services:
|
||||
createdBy: "Apps"
|
||||
|
||||
web:
|
||||
image: "ghcr.io/bisq-network/bisq2-api-web-ui:2.1.12.1@sha256:3819d97d98b12fc4ea7253c1da69ca201b85d500e36c992b8bb71173500036a5"
|
||||
image: "ghcr.io/bisq-network/bisq2-api-web-ui:2.1.13.0@sha256:9f818767031aeef0ae6018dfd1c02dd0fad392207013e4a6b6a12f6161f6fd27"
|
||||
container_name: ${CONTAINER_NAME}-web
|
||||
restart: unless-stopped
|
||||
network_mode: "service:server"
|
||||
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
blade-of-agony:
|
||||
image: "linuxserver/blade-of-agony:3.1.20261008"
|
||||
image: "linuxserver/blade-of-agony:3.1.20261015"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
PANEL_APP_PORT_HTTPS=41002
|
||||
HTTP_PWD=replace-with-a-random-value
|
||||
SHM_SIZE=1024m
|
||||
APP_DATA_DIR=./data
|
||||
CONTAINER_NAME=
|
||||
@@ -0,0 +1,69 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 41002
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTPS
|
||||
labelEn: HTTPS Port
|
||||
labelZh: HTTPS 端口
|
||||
label:
|
||||
en: HTTPS Port
|
||||
zh: HTTPS 端口
|
||||
zh-Hant: HTTPS 連接埠
|
||||
ja: HTTPS ポート
|
||||
ko: HTTPS 포트
|
||||
ru: Порт HTTPS
|
||||
ms: Port HTTPS
|
||||
pt-br: Porta HTTPS
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: HTTP_PWD
|
||||
labelEn: Access Password
|
||||
labelZh: 访问密码
|
||||
label:
|
||||
en: Access Password
|
||||
zh: 访问密码
|
||||
zh-Hant: 存取密碼
|
||||
ja: アクセスパスワード
|
||||
ko: 접속 비밀번호
|
||||
ru: Пароль доступа
|
||||
ms: Kata Laluan Akses
|
||||
pt-br: Senha de Acesso
|
||||
random: true
|
||||
required: true
|
||||
rule: paramComplexity
|
||||
type: password
|
||||
- default: 1024m
|
||||
edit: true
|
||||
envKey: SHM_SIZE
|
||||
labelEn: Shared Memory Size
|
||||
labelZh: 共享内存大小
|
||||
label:
|
||||
en: Shared Memory Size
|
||||
zh: 共享内存大小
|
||||
zh-Hant: 共享記憶體大小
|
||||
ja: 共有メモリサイズ
|
||||
ko: 공유 메모리 크기
|
||||
ru: Размер общей памяти
|
||||
ms: Saiz Memori Dikongsi
|
||||
pt-br: Tamanho da Memória Compartilhada
|
||||
required: true
|
||||
type: text
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori Data
|
||||
pt-br: Diretório de Dados
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
blender-kasm:
|
||||
image: "kasmweb/blender:1.19.0-rolling-weekly@sha256:798d98be65e7d3d1a663174b4d129983ad7124637e873c284e004685505c924a"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTPS}:6901"
|
||||
environment:
|
||||
- VNC_PW=${HTTP_PWD}
|
||||
shm_size: ${SHM_SIZE}
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- >-
|
||||
curl --insecure --fail --silent --show-error
|
||||
--user "kasm_user:$$VNC_PW"
|
||||
https://127.0.0.1:6901/
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
start_period: 90s
|
||||
retries: 5
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}:/home/kasm-user"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
data_raw="${APP_DATA_DIR:-}"
|
||||
if [[ -z "$data_raw" ]]; then
|
||||
data_raw="$(read_env_value APP_DATA_DIR)"
|
||||
fi
|
||||
data_raw="${data_raw:-./data}"
|
||||
|
||||
[[ "$data_raw" != /* ]] || {
|
||||
printf '%s\n' 'APP_DATA_DIR must be a relative path' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
data_dir="$(realpath -m -- "$ROOT_DIR/${data_raw#./}")"
|
||||
case "$data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR must remain inside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p -- "$data_dir"
|
||||
resolved_data_dir="$(realpath -e -- "$data_dir")"
|
||||
case "$resolved_data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR resolves outside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
chown 1000:1000 -- "$resolved_data_dir"
|
||||
chmod 0700 -- "$resolved_data_dir"
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Preserve APP_DATA_DIR so uninstall does not destroy user files.
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
"$(dirname "$0")/init.sh"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
blender-kasm:
|
||||
image: "kasmweb/blender:1.19.0-rolling-weekly@sha256:c81407b3d67751fba307181294967a850ade0280faef0ebafaa60535fb5773ec"
|
||||
image: "kasmweb/blender:1.19.0-rolling-weekly@sha256:798d98be65e7d3d1a663174b4d129983ad7124637e873c284e004685505c924a"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
PANEL_APP_PORT_HTTPS=41003
|
||||
HTTP_PWD=replace-with-a-random-value
|
||||
SHM_SIZE=1024m
|
||||
APP_DATA_DIR=./data
|
||||
CONTAINER_NAME=
|
||||
@@ -0,0 +1,69 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 41003
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTPS
|
||||
labelEn: HTTPS Port
|
||||
labelZh: HTTPS 端口
|
||||
label:
|
||||
en: HTTPS Port
|
||||
zh: HTTPS 端口
|
||||
zh-Hant: HTTPS 連接埠
|
||||
ja: HTTPS ポート
|
||||
ko: HTTPS 포트
|
||||
ru: Порт HTTPS
|
||||
ms: Port HTTPS
|
||||
pt-br: Porta HTTPS
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: HTTP_PWD
|
||||
labelEn: Access Password
|
||||
labelZh: 访问密码
|
||||
label:
|
||||
en: Access Password
|
||||
zh: 访问密码
|
||||
zh-Hant: 存取密碼
|
||||
ja: アクセスパスワード
|
||||
ko: 접속 비밀번호
|
||||
ru: Пароль доступа
|
||||
ms: Kata Laluan Akses
|
||||
pt-br: Senha de Acesso
|
||||
random: true
|
||||
required: true
|
||||
rule: paramComplexity
|
||||
type: password
|
||||
- default: 1024m
|
||||
edit: true
|
||||
envKey: SHM_SIZE
|
||||
labelEn: Shared Memory Size
|
||||
labelZh: 共享内存大小
|
||||
label:
|
||||
en: Shared Memory Size
|
||||
zh: 共享内存大小
|
||||
zh-Hant: 共享記憶體大小
|
||||
ja: 共有メモリサイズ
|
||||
ko: 공유 메모리 크기
|
||||
ru: Размер общей памяти
|
||||
ms: Saiz Memori Dikongsi
|
||||
pt-br: Tamanho da Memória Compartilhada
|
||||
required: true
|
||||
type: text
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori Data
|
||||
pt-br: Diretório de Dados
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
brave-kasm:
|
||||
image: "kasmweb/brave:1.19.0-rolling-weekly@sha256:7572468fa4752180aa800bc49b4c9aa3858a0a8de1c4dcbfafeb499e090bf7d1"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTPS}:6901"
|
||||
environment:
|
||||
- VNC_PW=${HTTP_PWD}
|
||||
shm_size: ${SHM_SIZE}
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- >-
|
||||
curl --insecure --fail --silent --show-error
|
||||
--user "kasm_user:$$VNC_PW"
|
||||
https://127.0.0.1:6901/
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
start_period: 90s
|
||||
retries: 5
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}:/home/kasm-user"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
data_raw="${APP_DATA_DIR:-}"
|
||||
if [[ -z "$data_raw" ]]; then
|
||||
data_raw="$(read_env_value APP_DATA_DIR)"
|
||||
fi
|
||||
data_raw="${data_raw:-./data}"
|
||||
|
||||
[[ "$data_raw" != /* ]] || {
|
||||
printf '%s\n' 'APP_DATA_DIR must be a relative path' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
data_dir="$(realpath -m -- "$ROOT_DIR/${data_raw#./}")"
|
||||
case "$data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR must remain inside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p -- "$data_dir"
|
||||
resolved_data_dir="$(realpath -e -- "$data_dir")"
|
||||
case "$resolved_data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR resolves outside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
chown 1000:1000 -- "$resolved_data_dir"
|
||||
chmod 0700 -- "$resolved_data_dir"
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Preserve APP_DATA_DIR so uninstall does not destroy user files.
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
"$(dirname "$0")/init.sh"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
brave-kasm:
|
||||
image: "kasmweb/brave:1.19.0-rolling-weekly@sha256:bff2fa3b2ff73ed0fc70a7f61661918090165fc528a68e7ffd509bbf05ae91b3"
|
||||
image: "kasmweb/brave:1.19.0-rolling-weekly@sha256:7572468fa4752180aa800bc49b4c9aa3858a0a8de1c4dcbfafeb499e090bf7d1"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
brave:
|
||||
image: "linuxserver/brave:1.97.56"
|
||||
image: "linuxserver/brave:1.97.59"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -9,6 +9,8 @@ services:
|
||||
volumes:
|
||||
- "${DATA_PATH}:/var/opt/bytebase"
|
||||
init: true
|
||||
environment:
|
||||
PG_URL: "postgresql://${PANEL_DB_USER}:${PANEL_DB_USER_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${PANEL_DB_NAME}"
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "--fail", "http://localhost:5678/healthz", "||", "exit", "1"]
|
||||
interval: 5m
|
||||
@@ -18,9 +20,7 @@ services:
|
||||
- "/var/opt/bytebase"
|
||||
- "--port"
|
||||
- "8080"
|
||||
- "--pg"
|
||||
- "postgresql://${PANEL_DB_USER}:${PANEL_DB_USER_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${PANEL_DB_NAME}"
|
||||
image: bytebase/bytebase:3.23.1
|
||||
image: bytebase/bytebase:3.24.0
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
CONTAINER_NAME="bytebase"
|
||||
PANEL_APP_PORT_HTTP="40171"
|
||||
PANEL_DB_NAME="bytebase"
|
||||
POSTGRES_HOST="postgres"
|
||||
PANEL_DB_USER_PASSWORD="password_xxJdZD"
|
||||
POSTGRES_PORT="5432"
|
||||
PANEL_DB_USER="postgres"
|
||||
DATA_PATH="./data"
|
||||
@@ -0,0 +1,120 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: POSTGRES_HOST
|
||||
key: postgresql
|
||||
labelEn: Postgres database Service
|
||||
labelZh: Postgres数据库服务
|
||||
label:
|
||||
en: 'Postgres database Service'
|
||||
zh: 'Postgres数据库服务'
|
||||
zh-Hant: 'Postgres 資料庫服務'
|
||||
ja: 'Postgres データベースサービス'
|
||||
ko: 'Postgres 데이터베이스 서비스'
|
||||
ru: 'Сервис базы данных Postgres'
|
||||
ms: 'Perkhidmatan Pangkalan Data Postgres'
|
||||
pt-br: 'Serviço de Banco de Dados Postgres'
|
||||
required: true
|
||||
type: service
|
||||
- default: "5432"
|
||||
edit: true
|
||||
envKey: POSTGRES_PORT
|
||||
labelEn: Postgres database Service Port
|
||||
labelZh: Postgres数据库服务端口
|
||||
label:
|
||||
en: 'Postgres database Service Port'
|
||||
zh: 'Postgres数据库服务端口'
|
||||
zh-Hant: 'Postgres 資料庫服務埠'
|
||||
ja: 'Postgres データベースサービスポート'
|
||||
ko: 'Postgres 데이터베이스 서비스 포트'
|
||||
ru: 'Порт сервиса базы данных Postgres'
|
||||
ms: 'Port Perkhidmatan Pangkalan Data Postgres'
|
||||
pt-br: 'Porta do Serviço de Banco de Dados Postgres'
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: bytebase
|
||||
edit: true
|
||||
envKey: PANEL_DB_NAME
|
||||
labelEn: Database
|
||||
labelZh: 数据库名
|
||||
label:
|
||||
en: 'Database'
|
||||
zh: '数据库名'
|
||||
zh-Hant: '數據庫名'
|
||||
ja: 'データベース'
|
||||
ko: '데이터베이스'
|
||||
ru: 'База данных'
|
||||
ms: 'Pangkalan Data'
|
||||
pt-br: 'Banco de Dados'
|
||||
required: true
|
||||
rule: paramCommon
|
||||
type: text
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: PANEL_DB_USER
|
||||
labelEn: User
|
||||
labelZh: 数据库用户
|
||||
label:
|
||||
en: 'User'
|
||||
zh: '数据库用户'
|
||||
zh-Hant: '數據庫用戶'
|
||||
ja: 'ユーザー'
|
||||
ko: '사용자'
|
||||
ru: 'Пользователь'
|
||||
ms: 'Pengguna'
|
||||
pt-br: 'Usuário'
|
||||
required: true
|
||||
rule: paramCommon
|
||||
type: text
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: PANEL_DB_USER_PASSWORD
|
||||
labelEn: Password
|
||||
labelZh: 数据库用户密码
|
||||
label:
|
||||
en: 'Password'
|
||||
zh: '数据库用户密码'
|
||||
zh-Hant: '數據庫用戶密碼'
|
||||
ja: 'パスワード'
|
||||
ko: '비밀번호'
|
||||
ru: 'Пароль'
|
||||
ms: 'Kata laluan'
|
||||
pt-br: 'Senha'
|
||||
required: true
|
||||
rule: paramCommon
|
||||
type: password
|
||||
- default: 40171
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTP
|
||||
labelEn: Port
|
||||
labelZh: 端口
|
||||
label:
|
||||
en: 'Port'
|
||||
zh: '端口'
|
||||
zh-Hant: '埠'
|
||||
ja: 'ポート'
|
||||
ko: '포트'
|
||||
ru: 'Порт'
|
||||
ms: 'Port'
|
||||
pt-br: 'Porta'
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: DATA_PATH
|
||||
labelEn: Data storage folder
|
||||
labelZh: 数据存放文件夹
|
||||
label:
|
||||
en: 'Data storage folder'
|
||||
zh: '数据存放文件夹'
|
||||
zh-Hant: '資料存放資料夾'
|
||||
ja: 'データ保存フォルダー'
|
||||
ko: '데이터 저장 폴더'
|
||||
ru: 'Папка хранения данных'
|
||||
ms: 'Folder storan data'
|
||||
pt-br: 'Pasta de armazenamento de dados'
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,29 @@
|
||||
services:
|
||||
bytebase:
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTP}:8080"
|
||||
volumes:
|
||||
- "${DATA_PATH}:/var/opt/bytebase"
|
||||
init: true
|
||||
environment:
|
||||
PG_URL: "postgresql://${PANEL_DB_USER}:${PANEL_DB_USER_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${PANEL_DB_NAME}"
|
||||
healthcheck:
|
||||
test: ["CMD", "curl", "--fail", "http://localhost:5678/healthz", "||", "exit", "1"]
|
||||
interval: 5m
|
||||
timeout: 60s
|
||||
command:
|
||||
- "--data"
|
||||
- "/var/opt/bytebase"
|
||||
- "--port"
|
||||
- "8080"
|
||||
image: bytebase/bytebase:3.24.0
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
calibre:
|
||||
image: "linuxserver/calibre:9.15.0"
|
||||
image: "linuxserver/calibre:9.16.0"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
centrifugo:
|
||||
image: "centrifugo/centrifugo:v6.9.7"
|
||||
image: "centrifugo/centrifugo:v6.10.1"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
certd:
|
||||
image: "greper/certd:1.45.0"
|
||||
image: "greper/certd:1.45.5"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
chatgpt-on-wechat:
|
||||
image: "zhayujie/chatgpt-on-wechat:2.2.0"
|
||||
image: "zhayujie/chatgpt-on-wechat:2.2.1"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
chatwoot:
|
||||
image: "chatwoot/chatwoot:v4.18.0-ce"
|
||||
image: "chatwoot/chatwoot:v4.19.0-ce"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
depends_on:
|
||||
@@ -49,7 +49,7 @@ services:
|
||||
createdBy: "Apps"
|
||||
|
||||
chatwoot-sidekiq:
|
||||
image: "chatwoot/chatwoot:v4.18.0-ce"
|
||||
image: "chatwoot/chatwoot:v4.19.0-ce"
|
||||
container_name: ${CONTAINER_NAME}-sidekiq
|
||||
restart: always
|
||||
depends_on:
|
||||
|
||||
@@ -3,7 +3,7 @@ networks:
|
||||
external: true
|
||||
services:
|
||||
chrome:
|
||||
image: "linuxserver/chrome:155.0.8059"
|
||||
image: "linuxserver/chrome:156.0.8078"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
PANEL_APP_PORT_HTTPS=41004
|
||||
HTTP_PWD=replace-with-a-random-value
|
||||
SHM_SIZE=1024m
|
||||
APP_DATA_DIR=./data
|
||||
CONTAINER_NAME=
|
||||
@@ -0,0 +1,69 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 41004
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTPS
|
||||
labelEn: HTTPS Port
|
||||
labelZh: HTTPS 端口
|
||||
label:
|
||||
en: HTTPS Port
|
||||
zh: HTTPS 端口
|
||||
zh-Hant: HTTPS 連接埠
|
||||
ja: HTTPS ポート
|
||||
ko: HTTPS 포트
|
||||
ru: Порт HTTPS
|
||||
ms: Port HTTPS
|
||||
pt-br: Porta HTTPS
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ""
|
||||
edit: true
|
||||
envKey: HTTP_PWD
|
||||
labelEn: Access Password
|
||||
labelZh: 访问密码
|
||||
label:
|
||||
en: Access Password
|
||||
zh: 访问密码
|
||||
zh-Hant: 存取密碼
|
||||
ja: アクセスパスワード
|
||||
ko: 접속 비밀번호
|
||||
ru: Пароль доступа
|
||||
ms: Kata Laluan Akses
|
||||
pt-br: Senha de Acesso
|
||||
random: true
|
||||
required: true
|
||||
rule: paramComplexity
|
||||
type: password
|
||||
- default: 1024m
|
||||
edit: true
|
||||
envKey: SHM_SIZE
|
||||
labelEn: Shared Memory Size
|
||||
labelZh: 共享内存大小
|
||||
label:
|
||||
en: Shared Memory Size
|
||||
zh: 共享内存大小
|
||||
zh-Hant: 共享記憶體大小
|
||||
ja: 共有メモリサイズ
|
||||
ko: 공유 메모리 크기
|
||||
ru: Размер общей памяти
|
||||
ms: Saiz Memori Dikongsi
|
||||
pt-br: Tamanho da Memória Compartilhada
|
||||
required: true
|
||||
type: text
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori Data
|
||||
pt-br: Diretório de Dados
|
||||
required: true
|
||||
type: text
|
||||
@@ -0,0 +1,35 @@
|
||||
services:
|
||||
chromium-kasm:
|
||||
image: "kasmweb/chromium:1.19.0-rolling-weekly@sha256:2f3826c2714850f2fd58523c384f7fa6811492f087e29131a328b29dcc2a244e"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- 1panel-network
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTPS}:6901"
|
||||
environment:
|
||||
- VNC_PW=${HTTP_PWD}
|
||||
shm_size: ${SHM_SIZE}
|
||||
cap_drop:
|
||||
- ALL
|
||||
security_opt:
|
||||
- no-new-privileges:true
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD-SHELL
|
||||
- >-
|
||||
curl --insecure --fail --silent --show-error
|
||||
--user "kasm_user:$$VNC_PW"
|
||||
https://127.0.0.1:6901/
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
start_period: 90s
|
||||
retries: 5
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}:/home/kasm-user"
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd -P)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
data_raw="${APP_DATA_DIR:-}"
|
||||
if [[ -z "$data_raw" ]]; then
|
||||
data_raw="$(read_env_value APP_DATA_DIR)"
|
||||
fi
|
||||
data_raw="${data_raw:-./data}"
|
||||
|
||||
[[ "$data_raw" != /* ]] || {
|
||||
printf '%s\n' 'APP_DATA_DIR must be a relative path' >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
data_dir="$(realpath -m -- "$ROOT_DIR/${data_raw#./}")"
|
||||
case "$data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR must remain inside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
mkdir -p -- "$data_dir"
|
||||
resolved_data_dir="$(realpath -e -- "$data_dir")"
|
||||
case "$resolved_data_dir" in
|
||||
"$ROOT_DIR"/*) ;;
|
||||
*)
|
||||
printf '%s\n' 'APP_DATA_DIR resolves outside the application version directory' >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
chown 1000:1000 -- "$resolved_data_dir"
|
||||
chmod 0700 -- "$resolved_data_dir"
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# Preserve APP_DATA_DIR so uninstall does not destroy user files.
|
||||
@@ -0,0 +1,4 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
"$(dirname "$0")/init.sh"
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
chromium-kasm:
|
||||
image: "kasmweb/chromium:1.19.0-rolling-weekly@sha256:f76e81f05197ec4684e4f3062a5af148bd50816cfee8f47b9abfe55bd044a399"
|
||||
image: "kasmweb/chromium:1.19.0-rolling-weekly@sha256:2f3826c2714850f2fd58523c384f7fa6811492f087e29131a328b29dcc2a244e"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
claper:
|
||||
image: "ghcr.io/claperco/claper:3.1.0@sha256:26afc860d5f6518a1445a2a1099954f5853ffcad45e73d167cd92be29d4299a7"
|
||||
image: "ghcr.io/claperco/claper:3.1.2@sha256:7df61dd04ffecfed17b7d7004e12504e52e340a33334a4ef9f34f4bf88dbb7f9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -9,7 +9,7 @@ services:
|
||||
volumes:
|
||||
- "${DATA_PATH}:/opt/cloudbeaver/workspace"
|
||||
tty: true
|
||||
image: dbeaver/cloudbeaver:26.2.2
|
||||
image: dbeaver/cloudbeaver:26.2.3
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
codex2api:
|
||||
image: "ghcr.io/james-6-23/codex2api:3.0.7@sha256:18020db0336b6d2cb082f8fe9190cf6cad3ba3f5c020630e0bfc6c7cd8f3716d"
|
||||
image: "ghcr.io/james-6-23/codex2api:3.0.8@sha256:7a8bb243071abb3718c825c091fcca5eeacda8e4b697e4116ca36240a1e4a49a"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
security_opt:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
commafeed:
|
||||
image: athou/commafeed:7.3.2-h2
|
||||
image: athou/commafeed:7.4.0-h2
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
copyparty:
|
||||
image: "ghcr.io/9001/copyparty-ac:1.20.24"
|
||||
image: "ghcr.io/9001/copyparty-ac:1.20.26"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
user: "1000:1000"
|
||||
Executable → Regular
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
cpa-manager-plus:
|
||||
image: "seakee/cpa-manager-plus:v1.14.4"
|
||||
image: "seakee/cpa-manager-plus:v1.14.9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTP}:18317"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
PANEL_APP_PORT_HTTP=18317
|
||||
APP_DATA_DIR=./data
|
||||
CPA_MANAGER_ADMIN_KEY=
|
||||
USAGE_COLLECTOR_MODE=auto
|
||||
USAGE_CORS_ORIGINS=*
|
||||
CONTAINER_NAME=cpa-manager-plus
|
||||
@@ -0,0 +1,92 @@
|
||||
additionalProperties:
|
||||
formFields:
|
||||
- default: 18317
|
||||
edit: true
|
||||
envKey: PANEL_APP_PORT_HTTP
|
||||
labelEn: Web Port
|
||||
labelZh: Web 访问端口
|
||||
label:
|
||||
en: Web Port
|
||||
zh: Web 访问端口
|
||||
zh-Hant: Web 存取埠
|
||||
ja: Web ポート
|
||||
ko: Web 포트
|
||||
ru: Веб-порт
|
||||
ms: Port Web
|
||||
pt-br: Porta Web
|
||||
required: true
|
||||
rule: paramPort
|
||||
type: number
|
||||
- default: ./data
|
||||
edit: true
|
||||
envKey: APP_DATA_DIR
|
||||
labelEn: Data Directory
|
||||
labelZh: 数据目录
|
||||
label:
|
||||
en: Data Directory
|
||||
zh: 数据目录
|
||||
zh-Hant: 資料目錄
|
||||
ja: データディレクトリ
|
||||
ko: 데이터 디렉터리
|
||||
ru: Каталог данных
|
||||
ms: Direktori Data
|
||||
pt-br: Diretório de Dados
|
||||
required: true
|
||||
type: text
|
||||
- default: ''
|
||||
edit: true
|
||||
envKey: CPA_MANAGER_ADMIN_KEY
|
||||
labelEn: Admin Key
|
||||
labelZh: 管理员密钥
|
||||
label:
|
||||
en: Admin Key
|
||||
zh: 管理员密钥
|
||||
zh-Hant: 管理員密鑰
|
||||
ja: 管理者キー
|
||||
ko: 관리자 키
|
||||
ru: Ключ администратора
|
||||
ms: Kunci Pentadbir
|
||||
pt-br: Chave de Admin
|
||||
required: false
|
||||
type: password
|
||||
- default: auto
|
||||
edit: true
|
||||
envKey: USAGE_COLLECTOR_MODE
|
||||
labelEn: Collector Mode
|
||||
labelZh: 采集模式
|
||||
label:
|
||||
en: Collector Mode
|
||||
zh: 采集模式
|
||||
zh-Hant: 採集模式
|
||||
ja: 収集モード
|
||||
ko: 수집 모드
|
||||
ru: Режим сбора
|
||||
ms: Mod Pengumpulan
|
||||
pt-br: Modo de Coleta
|
||||
required: true
|
||||
type: select
|
||||
values:
|
||||
- label: auto
|
||||
value: auto
|
||||
- label: subscribe
|
||||
value: subscribe
|
||||
- label: http
|
||||
value: http
|
||||
- label: resp
|
||||
value: resp
|
||||
- default: '*'
|
||||
edit: true
|
||||
envKey: USAGE_CORS_ORIGINS
|
||||
labelEn: CORS Origins
|
||||
labelZh: CORS 来源
|
||||
label:
|
||||
en: CORS Origins
|
||||
zh: CORS 来源
|
||||
zh-Hant: CORS 來源
|
||||
ja: CORS オリジン
|
||||
ko: CORS Origin
|
||||
ru: Источники CORS
|
||||
ms: Origin CORS
|
||||
pt-br: Origens CORS
|
||||
required: false
|
||||
type: text
|
||||
@@ -0,0 +1,38 @@
|
||||
services:
|
||||
cpa-manager-plus:
|
||||
image: "seakee/cpa-manager-plus:v1.14.9"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
ports:
|
||||
- "${PANEL_APP_PORT_HTTP}:18317"
|
||||
environment:
|
||||
- HTTP_ADDR=0.0.0.0:18317
|
||||
- USAGE_DB_PATH=/data/usage.sqlite
|
||||
- CPA_MANAGER_DATA_KEY_PATH=/data/data.key
|
||||
- CPA_MANAGER_ADMIN_KEY=${CPA_MANAGER_ADMIN_KEY:-}
|
||||
- USAGE_COLLECTOR_MODE=${USAGE_COLLECTOR_MODE}
|
||||
- USAGE_RESP_QUEUE=usage
|
||||
- USAGE_RESP_POP_SIDE=right
|
||||
- USAGE_BATCH_SIZE=100
|
||||
- USAGE_POLL_INTERVAL_MS=500
|
||||
- USAGE_QUERY_LIMIT=50000
|
||||
- USAGE_CORS_ORIGINS=${USAGE_CORS_ORIGINS}
|
||||
volumes:
|
||||
- "${APP_DATA_DIR}:/data"
|
||||
healthcheck:
|
||||
test:
|
||||
- CMD
|
||||
- wget
|
||||
- -qO-
|
||||
- http://127.0.0.1:18317/health
|
||||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 3
|
||||
labels:
|
||||
createdBy: Apps
|
||||
networks:
|
||||
- 1panel-network
|
||||
restart: unless-stopped
|
||||
|
||||
networks:
|
||||
1panel-network:
|
||||
external: true
|
||||
Executable
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
DATA_DIR="${APP_DATA_DIR:-$(read_env_value APP_DATA_DIR)}"
|
||||
DATA_DIR="${DATA_DIR:-./data}"
|
||||
if [[ "$DATA_DIR" != /* ]]; then
|
||||
DATA_DIR="$ROOT_DIR/${DATA_DIR#./}"
|
||||
fi
|
||||
mkdir -p "$DATA_DIR"
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
docker-compose down --volumes
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
ENV_FILE="${ENV_FILE:-$ROOT_DIR/.env}"
|
||||
|
||||
read_env_value() {
|
||||
local key="$1"
|
||||
[[ -f "$ENV_FILE" ]] || return 0
|
||||
local value
|
||||
value="$(sed -n "s/^${key}=//p" "$ENV_FILE" | tail -n 1)"
|
||||
case "$value" in
|
||||
\"*\") value="${value#\"}"; value="${value%\"}" ;;
|
||||
\'*\') value="${value#\'}"; value="${value%\'}" ;;
|
||||
esac
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
DATA_DIR="${APP_DATA_DIR:-$(read_env_value APP_DATA_DIR)}"
|
||||
DATA_DIR="${DATA_DIR:-./data}"
|
||||
if [[ "$DATA_DIR" != /* ]]; then
|
||||
DATA_DIR="$ROOT_DIR/${DATA_DIR#./}"
|
||||
fi
|
||||
mkdir -p "$DATA_DIR"
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
cpa-usage-keeper:
|
||||
image: ghcr.io/willxup/cpa-usage-keeper:v1.15.10
|
||||
image: ghcr.io/willxup/cpa-usage-keeper:v2.0.0
|
||||
container_name: ${CONTAINER_NAME}
|
||||
ports:
|
||||
- ${PANEL_APP_PORT_HTTP}:8080
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
dagu:
|
||||
image: "ghcr.io/dagucloud/dagu:2.18.2"
|
||||
image: "ghcr.io/dagucloud/dagu:2.22.0"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: always
|
||||
networks:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
daily-stock-analysis:
|
||||
image: "zhulinsen/daily_stock_analysis:v3.31.0"
|
||||
image: "zhulinsen/daily_stock_analysis:v3.33.0"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
labels:
|
||||
createdBy: "Apps"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
services:
|
||||
dailytxt:
|
||||
image: "phitux/dailytxt:2.6.3"
|
||||
image: "phitux/dailytxt:2.6.4"
|
||||
container_name: ${CONTAINER_NAME}
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user