Merge localApps into Renovate update

This commit is contained in:
okxlin
2026-10-26 17:26:44 +08:00
553 changed files with 13537 additions and 396 deletions
+1 -1
View File
@@ -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 -1
View File
@@ -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
+1 -1
View File
@@ -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"
+1 -1
View File
@@ -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 -1
View File
@@ -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"
@@ -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"
@@ -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 -1
View File
@@ -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:
+20
View File
@@ -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
+327
View File
@@ -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
+35
View File
@@ -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:
+2 -2
View File
@@ -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:
+3 -3
View File
@@ -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"
+8
View File
@@ -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"
+120
View File
@@ -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
+29
View File
@@ -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 -1
View File
@@ -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:
+2 -2
View File
@@ -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"
@@ -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 -1
View File
@@ -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:
+1 -1
View File
@@ -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 -1
View File
@@ -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 -1
View File
@@ -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,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"
@@ -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"
+6
View File
@@ -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
+92
View File
@@ -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
+24
View File
@@ -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
View File
@@ -0,0 +1,4 @@
#!/bin/bash
set -euo pipefail
docker-compose down --volumes
+24
View File
@@ -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,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 -1
View File
@@ -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 -1
View File
@@ -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