diff --git a/apps/shadps4-linuxserver/README.md b/apps/shadps4-linuxserver/README.md new file mode 100644 index 000000000..88b3c9946 --- /dev/null +++ b/apps/shadps4-linuxserver/README.md @@ -0,0 +1,64 @@ +# shadPS4 + +## 产品介绍 +shadPS4 是一个早期的 PlayStation 4 模拟器,本应用通过 LinuxServer.io 镜像提供浏览器访问的桌面环境。 + +## 主要功能 +- 通过浏览器访问 shadPS4 桌面界面。 +- 使用 `/config` 持久化用户目录、配置和游戏相关文件。 +- 通过 Basic Auth 保护 Web 桌面入口。 + +## 访问说明 +安装完成后,通过应用表单中的 HTTP 或 HTTPS 端口访问 Web 桌面,并使用安装时填写的 Basic Auth 用户名和密码登录。 + +## Introduction +shadPS4 is an early PlayStation 4 emulator. This app packages the LinuxServer.io image as a browser-accessible desktop environment. + +## Features +- Access the shadPS4 desktop from a browser. +- Persist the user home, settings, and game files under `/config`. +- Protect the Web desktop entrypoint with Basic Auth. + +## 应用简介 +shadPS4 PlayStation 4 模拟器桌面。 + +英文说明:PlayStation 4 emulator desktop maintained by LinuxServer.io. + +## 部署说明 +- 本应用使用 Docker Compose 在 1Panel 中部署。 +- 应用分类:游戏。 +- 支持架构:amd64。 +- 可选版本:`latest`。 +- 安装后按应用表单中的端口访问 Web 桌面。 + +## 端口 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| PANEL_APP_PORT_HTTP | HTTP 端口 | 3000 | 是 | +| PANEL_APP_PORT_HTTPS | HTTPS 端口 | 3001 | 是 | + +## 数据持久化 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| CONFIG_PATH | 配置文件路径 | ./data/config | 是 | + +升级或迁移前,请在 1Panel 中备份上述数据目录。 + +## 配置项 +| 变量 | 说明 | 默认值 | 必填 | +| --- | --- | --- | --- | +| TIME_ZONE | 时区 | Asia/Shanghai | 是 | +| CUSTOM_USER | Basic Auth 用户名 | admin | 是 | +| PASSWORD | Basic Auth 密码 | 随机生成 | 是 | +| LC_ALL | 桌面语言区域,例如 zh_CN.UTF-8 | zh_CN.UTF-8 | 否 | +| SHM_SIZE | 共享内存大小 | 1gb | 是 | + +## 使用说明 +- 浏览器/桌面类 LinuxServer 镜像默认无认证,本适配启用 Basic Auth,请使用 CUSTOM_USER 和 PASSWORD 登录。 +- 如需公网访问,请优先放在带强认证的反向代理之后。 +- 如需对外开放访问,请同步检查防火墙、安全组和反向代理配置。 + +## 参考资料 +- 官网: +- 文档: +- 源码: diff --git a/apps/shadps4-linuxserver/data.yml b/apps/shadps4-linuxserver/data.yml new file mode 100644 index 000000000..7921304e3 --- /dev/null +++ b/apps/shadps4-linuxserver/data.yml @@ -0,0 +1,29 @@ +name: shadPS4 +tags: +- Game +title: shadPS4 PlayStation 4 模拟器桌面 +description: shadPS4 PlayStation 4 模拟器桌面 +additionalProperties: + key: shadps4-linuxserver + name: shadPS4 + tags: + - Game + shortDescZh: shadPS4 PlayStation 4 模拟器桌面 + shortDescEn: PlayStation 4 emulator desktop maintained by LinuxServer.io + description: + en: PlayStation 4 emulator desktop maintained by LinuxServer.io + zh: shadPS4 PlayStation 4 模拟器桌面 + zh-Hant: shadPS4 PlayStation 4 模擬器桌面 + ja: LinuxServer.io が保守する PlayStation 4 エミュレーターデスクトップ + ko: LinuxServer.io에서 유지 관리하는 PlayStation 4 에뮬레이터 데스크톱 + ru: Рабочий стол эмулятора PlayStation 4, поддерживаемый LinuxServer.io + ms: Desktop emulator PlayStation 4 yang diselenggara oleh LinuxServer.io + pt-br: Desktop de emulador PlayStation 4 mantido pela LinuxServer.io + type: tool + crossVersionUpdate: true + limit: 0 + website: https://shadps4.net/ + github: https://github.com/linuxserver/docker-shadps4 + document: https://docs.linuxserver.io/images/docker-shadps4/ + architectures: + - amd64 diff --git a/apps/shadps4-linuxserver/latest/.env.sample b/apps/shadps4-linuxserver/latest/.env.sample new file mode 100644 index 000000000..309bc02dd --- /dev/null +++ b/apps/shadps4-linuxserver/latest/.env.sample @@ -0,0 +1,9 @@ +CONTAINER_NAME= +PANEL_APP_PORT_HTTP=3000 +PANEL_APP_PORT_HTTPS=3001 +CONFIG_PATH=./data/config +CUSTOM_USER=admin +PASSWORD=linuxserver-change-me +LC_ALL=zh_CN.UTF-8 +SHM_SIZE=1gb +TIME_ZONE=Asia/Shanghai diff --git a/apps/shadps4-linuxserver/latest/data.yml b/apps/shadps4-linuxserver/latest/data.yml new file mode 100644 index 000000000..8d57a1768 --- /dev/null +++ b/apps/shadps4-linuxserver/latest/data.yml @@ -0,0 +1,134 @@ +additionalProperties: + formFields: + - default: 3000 + 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: 3001 + 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 + 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: admin + edit: true + envKey: CUSTOM_USER + labelEn: Basic Auth Username + labelZh: 访问用户名(Basic Auth) + label: + en: Basic Auth Username + zh: 访问用户名(Basic Auth) + zh-Hant: 存取使用者名稱(Basic Auth) + ja: ベーシック認証ユーザー名 + ko: 기본 인증 사용자명 + ru: Имя пользователя (Basic Auth) + ms: Nama pengguna Basic Auth + pt-br: Usuario Basic Auth + required: true + type: text + - default: linuxserver-change-me + edit: true + envKey: PASSWORD + labelEn: Basic Auth Password + labelZh: 访问密码(Basic Auth) + label: + en: Basic Auth Password + zh: 访问密码(Basic Auth) + zh-Hant: 存取密碼(Basic Auth) + ja: ベーシック認証パスワード + ko: 기본 인증 비밀번호 + ru: Пароль Basic Auth + ms: Kata laluan Basic Auth + pt-br: Senha Basic Auth + random: true + required: true + rule: paramComplexity + type: password + - default: zh_CN.UTF-8 + edit: true + envKey: LC_ALL + labelEn: Desktop language locale + labelZh: 桌面语言区域 + label: + en: Desktop language locale + zh: 桌面语言区域 + zh-Hant: 桌面語言區域 + ja: デスクトップ言語ロケール + ko: 데스크톱 언어 로케일 + ru: Локаль языка рабочего стола + ms: Lokal bahasa desktop + pt-br: Localidade do idioma da area de trabalho + required: false + type: text + - default: 1gb + edit: true + envKey: SHM_SIZE + labelEn: Shared memory size + labelZh: 共享内存大小 + label: + en: Shared memory size + zh: 共享内存大小 + zh-Hant: 共享記憶體大小 + ja: 共有メモリサイズ + ko: 공유 메모리 크기 + ru: Размер общей памяти + ms: Saiz memori kongsi + pt-br: Tamanho da memoria compartilhada + 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 diff --git a/apps/shadps4-linuxserver/latest/docker-compose.yml b/apps/shadps4-linuxserver/latest/docker-compose.yml new file mode 100644 index 000000000..abe7eefd0 --- /dev/null +++ b/apps/shadps4-linuxserver/latest/docker-compose.yml @@ -0,0 +1,25 @@ +networks: + 1panel-network: + external: true +services: + shadps4: + image: "linuxserver/shadps4:latest" + container_name: ${CONTAINER_NAME} + restart: always + networks: + - 1panel-network + ports: + - "${PANEL_APP_PORT_HTTP}:3000" + - "${PANEL_APP_PORT_HTTPS}:3001" + volumes: + - "${CONFIG_PATH}:/config" + environment: + - PUID=1000 + - PGID=1000 + - TZ=${TIME_ZONE} + - CUSTOM_USER=${CUSTOM_USER} + - PASSWORD=${PASSWORD} + - LC_ALL=${LC_ALL:-zh_CN.UTF-8} + shm_size: ${SHM_SIZE} + labels: + createdBy: "Apps" diff --git a/apps/shadps4-linuxserver/latest/scripts/init.sh b/apps/shadps4-linuxserver/latest/scripts/init.sh new file mode 100755 index 000000000..e5658f096 --- /dev/null +++ b/apps/shadps4-linuxserver/latest/scripts/init.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail + +paths=( + "${CONFIG_PATH:-./data/config}" +) + +mkdir -p "${paths[@]}" +for path in "${paths[@]}"; do + case "$path" in + ./*|../*) chown -R 1000:1000 "$path" 2>/dev/null || true ;; + esac +done diff --git a/apps/shadps4-linuxserver/latest/scripts/uninstall.sh b/apps/shadps4-linuxserver/latest/scripts/uninstall.sh new file mode 100755 index 000000000..ab8a8d674 --- /dev/null +++ b/apps/shadps4-linuxserver/latest/scripts/uninstall.sh @@ -0,0 +1,2 @@ +#!/bin/bash +docker-compose down --volumes diff --git a/apps/shadps4-linuxserver/latest/scripts/upgrade.sh b/apps/shadps4-linuxserver/latest/scripts/upgrade.sh new file mode 100755 index 000000000..08cc99c3b --- /dev/null +++ b/apps/shadps4-linuxserver/latest/scripts/upgrade.sh @@ -0,0 +1,57 @@ +#!/usr/bin/env bash +set -euo pipefail + +ENV_FILE="${ENV_FILE:-./.env}" + +generate_secret() { + if [[ -r /dev/urandom ]]; then + local secret="" + local chunk="" + while [[ ${#secret} -lt 24 ]]; do + chunk="$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c $((24 - ${#secret})) || true)" + secret="${secret}${chunk}" + done + printf '%s\n' "$secret" + else + printf '%s\n' 'linuxserver-change-me' + fi +} + +ensure_env_default() { + local key="$1" + local value="$2" + local fill_empty="${3:-false}" + + if [[ ! -f "$ENV_FILE" ]]; then + echo "$ENV_FILE not found; skipped $key migration" + return + fi + + if grep -qE "^${key}=" "$ENV_FILE"; then + local current + current="$(sed -n -E "s/^${key}=//p" "$ENV_FILE" | tail -n 1)" + current="${current%\"}" + current="${current#\"}" + current="${current%'}" + current="${current#'}" + if [[ "$fill_empty" == "true" && -z "$current" ]]; then + sed -i -E "s|^${key}=.*|${key}=${value}|" "$ENV_FILE" + echo "Updated empty $key" + else + echo "$key already exists" + fi + return + fi + + printf '%s=%s\n' "$key" "$value" >> "$ENV_FILE" + echo "Added $key" +} + +if [[ -f "$ENV_FILE" ]]; then + ensure_env_default "CUSTOM_USER" "admin" true + ensure_env_default "PASSWORD" "$(generate_secret)" true + ensure_env_default "LC_ALL" "zh_CN.UTF-8" false + ensure_env_default "SHM_SIZE" "1gb" false +else + echo "$ENV_FILE not found; skipped LinuxServer environment migration" +fi diff --git a/apps/shadps4-linuxserver/logo.png b/apps/shadps4-linuxserver/logo.png new file mode 100644 index 000000000..35fff34dc Binary files /dev/null and b/apps/shadps4-linuxserver/logo.png differ