这是一个适配 1Panel 商店 2.0 版本的 Docker 应用配置库。 致力于一键运行各种 Docker 应用,无需复杂配置,享受便利和高效。
| 应用 | 版本 | 描述 |
|---|---|---|
| RMQTT | 0.18.1 | 高性能分布式 MQTT 消息代理 |
| Vikunja | 2.1.0 | 开源待办事项应用 |
| Baserow | 2.1.3 | 无代码数据库构建平台 |
| Spug | 3.3.3 | 轻量级自动化运维平台 |
| Penpot | 2.13.3 | 开源设计与代码协作工具 |
├── apps/ # 应用目录
│ └── [应用名称]/ # 具体应用
│ ├── [版本号]/ # 版本目录(直接在应用目录下)
│ │ ├── docker-compose.yml
│ │ └── data.yml
│ ├── data.yml # 应用元数据
│ └── logo.png # 应用图标
├── data.yml # 商店元数据
├── README.md # 项目说明
└── LICENSE # 许可证
git clone -b main https://ghp.ci/https://github.com/60999/sc_appstore /opt/1panel/resource/apps/local/appstore-localApps
cp -rf /opt/1panel/resource/apps/local/appstore-localApps/apps/* /opt/1panel/resource/apps/local/
rm -rf /opt/1panel/resource/apps/local/appstore-localAppswget -P /opt/1panel/resource/apps/local https://ghp.ci/https://github.com/60999/sc_appstore/archive/refs/heads/main.zip
unzip -o -d /opt/1panel/resource/apps/local/ /opt/1panel/resource/apps/local/main.zip
cp -rf /opt/1panel/resource/apps/local/sc_appstore-main/apps/* /opt/1panel/resource/apps/local/
rm -rf /opt/1panel/resource/apps/local/sc_appstore-main
rm -rf /opt/1panel/resource/apps/local/main.zipgit clone -b main https://github.com/60999/sc_appstore /opt/1panel/resource/apps/local/appstore-localApps
cp -rf /opt/1panel/resource/apps/local/appstore-localApps/apps/* /opt/1panel/resource/apps/local/
rm -rf /opt/1panel/resource/apps/local/appstore-localAppswget -P /opt/1panel/resource/apps/local https://github.com/60999/sc_appstore/archive/refs/heads/main.zip
unzip -o -d /opt/1panel/resource/apps/local/ /opt/1panel/resource/apps/local/main.zip
cp -rf /opt/1panel/resource/apps/local/sc_appstore-main/apps/* /opt/1panel/resource/apps/local/
rm -rf /opt/1panel/resource/apps/local/sc_appstore-main
rm -rf /opt/1panel/resource/apps/local/main.zip如果服务器无法访问 Docker 镜像仓库,可以提前下载镜像 tar 文件,然后在服务器上加载。
在有网络的机器上下载镜像并导出:
# 拉取镜像
docker pull vikunja/vikunja:2.1.0
docker pull openspug/spug:3.3.2
docker pull baserow/baserow:2.1.3
docker pull rmqtt/rmqtt:0.18.0
# 导出镜像为 tar 文件
docker save -o vikunja.tar vikunja/vikunja:2.1.0
docker save -o spug.tar openspug/spug:3.3.2
docker save -o baserow.tar baserow/baserow:2.1.3
docker save -o rmqtt.tar rmqtt/rmqtt:0.18.0Penpot 镜像特殊说明:
Penpot 镜像托管在 ghcr.io/penpot/backend 和 ghcr.io/penpot/frontend,但需要 GitHub 认证才能拉取。解决方案:
-
使用代理:配置 Docker daemon 代理后直接拉取
# 配置代理后拉取 docker pull ghcr.io/penpot/backend:2.13.3 docker pull ghcr.io/penpot/frontend:2.13.3 docker save -o penpot-backend.tar ghcr.io/penpot/backend:2.13.3 docker save -o penpot-frontend.tar ghcr.io/penpot/frontend:2.13.3 -
使用 GitHub Token 认证:
# 创建 GitHub Personal Access Token (需要 read:packages 权限) echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin docker pull ghcr.io/penpot/backend:2.13.3 docker pull ghcr.io/penpot/frontend:2.13.3
其他注意事项:
- Spug GitHub 最新版是 v3.3.3,但 Docker Hub 只有 3.3.2
- RMQTT GitHub 最新版是 0.18.1,但 Docker Hub 只有 0.18.0
- Penpot 镜像托管在 ghcr.io,直接拉取会返回 denied,必须使用加速镜像源
- 如果 Docker Hub 镜像拉取慢,也可以使用加速镜像源:
docker.m.daocloud.io(仅对 docker.io 生效)
将 tar 文件上传到服务器,例如 /opt/images/ 目录。
# 加载所有镜像
docker load -i /opt/images/penpot-backend.tar
docker load -i /opt/images/penpot-frontend.tar
docker load -i /opt/images/vikunja.tar
docker load -i /opt/images/spug.tar
docker load -i /opt/images/baserow.tar
docker load -i /opt/images/rmqtt.tar
# 验证镜像已加载
docker images镜像加载完成后,即可在 1Panel 中正常安装应用。
各应用的安装后配置请参考对应目录下的 README.md:
| 应用 | 配置说明 |
|---|---|
| Baserow | apps/baserow/2.1.3/README.md - 访问地址配置 |
| Penpot | apps/penpot/2.13.3/README.md - 镜像获取说明 |
| Vikunja | apps/vikunja/2.1.0/README.md - 权限问题解决 |
| Spug | apps/spug/3.3.3/README.md - 管理员初始化 |
| RMQTT | apps/rmqtt/0.18.1/README.md - 端口绑定配置 |
#!/bin/bash
# 将此脚本放在镜像 tar 文件所在目录执行
IMAGE_DIR="/opt/images"
for tar_file in "$IMAGE_DIR"/*.tar; do
if [ -f "$tar_file" ]; then
echo "加载镜像: $tar_file"
docker load -i "$tar_file"
fi
done
echo "所有镜像加载完成"
docker images可在 1Panel 计划任务中添加以下脚本,实现自动更新本仓库应用。
注意:本脚本会将应用直接部署到 1Panel 本地应用目录,与其他本地应用共存。
#!/bin/bash
# ============================================
# 1Panel 应用商店更新脚本(国内网络)
# 功能:自动选择最快镜像、下载、解压、更新应用
# ============================================
# 基础配置
GITHUB_USER="60999"
GITHUB_REPO="sc_appstore"
LOCAL_DIR="/opt/1panel/resource/apps/local"
TEMP_ZIP="${LOCAL_DIR}/sc_appstore.zip"
EXTRACT_DIR="${LOCAL_DIR}/${GITHUB_REPO}-main"
# ============================================
# 代理配置(可选)
# 如需使用代理,取消注释并填写以下变量
# ============================================
# PROXY_TYPE="socks5" # 代理类型: socks5 或 http
# PROXY_HOST="127.0.0.1" # 代理地址
# PROXY_PORT="1080" # 代理端口
# PROXY_USER="" # 代理用户名(如无需认证则留空)
# PROXY_PASS="" # 代理密码(如无需认证则留空)
# 本仓库包含的应用列表
APPS=("baserow" "penpot" "rmqtt" "spug" "vikunja")
# 镜像加速域名列表
MIRROR_DOMAINS=(
"ghproxy.cn"
"mirror.ghproxy.com"
"ghp.ci"
"gh-proxy.com"
)
# ============================================
# 函数:构建代理参数
# 返回:curl 代理参数字符串
# ============================================
build_proxy_args() {
local proxy_args=""
if [ -n "$PROXY_TYPE" ] && [ -n "$PROXY_HOST" ] && [ -n "$PROXY_PORT" ]; then
local proxy_url=""
if [ -n "$PROXY_USER" ] && [ -n "$PROXY_PASS" ]; then
proxy_url="${PROXY_TYPE}://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}"
else
proxy_url="${PROXY_TYPE}://${PROXY_HOST}:${PROXY_PORT}"
fi
proxy_args="--proxy ${proxy_url}"
echo "使用代理: ${PROXY_TYPE}://${PROXY_HOST}:${PROXY_PORT}" >&2
fi
echo "${proxy_args}"
}
# ============================================
# 函数:测试 URL 是否可访问
# 返回:响应时间(毫秒),失败返回99999
# ============================================
test_url_speed() {
local test_url="$1"
local proxy_args="$2"
local start_time end_time duration
start_time=$(date +%s%3N 2>/dev/null || date +%s)000
if curl -fsSL --connect-timeout 5 --max-time 10 ${proxy_args} -o /dev/null "${test_url}" 2>/dev/null; then
end_time=$(date +%s%3N 2>/dev/null || date +%s)000
duration=$((end_time - start_time))
echo "${duration}"
else
echo "99999"
fi
}
# ============================================
# 函数:选择最佳下载源
# 优先检测 GitHub 直连,再检测镜像加速
# 输出:日志输出到stderr,返回URL到stdout
# ============================================
select_best_source() {
local zip_path="$1"
local proxy_args="$2"
local github_url="https://github.com${zip_path}"
echo "正在检测下载源..." >&2
# 优先检测 GitHub 是否可以直接访问
echo -n " 测试 GitHub 直连... " >&2
github_time=$(test_url_speed "${github_url}" "${proxy_args}")
if [ "$github_time" -lt 99999 ]; then
echo "${github_time}ms ✓" >&2
echo "使用 GitHub 直连: ${github_time}ms" >&2
echo "${github_url}"
return 0
else
echo "不可用" >&2
fi
# GitHub 不可用,检测镜像加速
echo "GitHub 直连不可用,检测镜像加速..." >&2
local fastest_domain=""
local fastest_time=99999
for domain in "${MIRROR_DOMAINS[@]}"; do
echo -n " 测试 ${domain}... " >&2
local mirror_url="https://${domain}/https://github.com${zip_path}"
time_ms=$(test_url_speed "${mirror_url}" "${proxy_args}")
if [ "$time_ms" -lt 99999 ]; then
echo "${time_ms}ms" >&2
if [ "$time_ms" -lt "$fastest_time" ]; then
fastest_time="$time_ms"
fastest_domain="$domain"
fi
else
echo "超时" >&2
fi
done
if [ -z "$fastest_domain" ]; then
echo "错误:所有下载源都不可用" >&2
echo ""
else
echo "选择最快镜像: ${fastest_domain} (${fastest_time}ms)" >&2
echo "https://${fastest_domain}/https://github.com${zip_path}"
fi
}
# ============================================
# 主流程
# ============================================
echo "============================================"
echo "开始更新 ${GITHUB_REPO} 应用商店..."
echo "============================================"
# 清理临时文件
rm -rf "${TEMP_ZIP}" "${EXTRACT_DIR}"
# 构建代理参数
PROXY_ARGS=$(build_proxy_args)
# 选择最佳下载源(优先检测 GitHub 直连)
ZIP_PATH="/${GITHUB_USER}/${GITHUB_REPO}/archive/refs/heads/main.zip"
DOWNLOAD_URL=$(select_best_source "${ZIP_PATH}" "${PROXY_ARGS}")
if [ -z "$DOWNLOAD_URL" ]; then
echo "错误:无法找到可用的下载源"
exit 1
fi
echo "下载地址: ${DOWNLOAD_URL}"
# 下载文件
echo "正在下载..."
if ! curl -fSL --connect-timeout 30 --max-time 180 --retry 3 ${PROXY_ARGS} \
-o "${TEMP_ZIP}" "${DOWNLOAD_URL}"; then
echo "错误:下载失败"
rm -rf "${TEMP_ZIP}"
exit 1
fi
# 验证文件
if ! file "${TEMP_ZIP}" | grep -q "Zip archive"; then
echo "错误:下载的文件不是有效的 zip 压缩包"
rm -rf "${TEMP_ZIP}"
exit 1
fi
FILE_SIZE=$(stat -c%s "${TEMP_ZIP}" 2>/dev/null || echo "0")
if [ "$FILE_SIZE" -lt 1000 ]; then
echo "错误:文件太小 (${FILE_SIZE} 字节),可能下载不完整"
rm -rf "${TEMP_ZIP}"
exit 1
fi
echo "下载成功,文件大小: ${FILE_SIZE} 字节"
# 解压文件
echo "正在解压..."
if ! unzip -q -o "${TEMP_ZIP}" -d "${LOCAL_DIR}/"; then
echo "错误:解压失败"
rm -rf "${TEMP_ZIP}" "${EXTRACT_DIR}"
exit 1
fi
if [ ! -d "${EXTRACT_DIR}/apps" ]; then
echo "错误:解压后找不到 apps 目录"
rm -rf "${TEMP_ZIP}" "${EXTRACT_DIR}"
exit 1
fi
# 复制商店元数据
cp -f "${EXTRACT_DIR}/data.yml" "${LOCAL_DIR}/"
# 清理旧应用目录(包括各种大小写变体)
echo "清理旧版本..."
for app in "${APPS[@]}"; do
rm -rf "${LOCAL_DIR}/${app}"
# 首字母大写
app_cap="$(echo "${app:0:1}" | tr '[:lower:]' '[:upper:]')${app:1}"
rm -rf "${LOCAL_DIR}/${app_cap}"
# 全大写
app_upper=$(echo "$app" | tr '[:lower:]' '[:upper:]')
rm -rf "${LOCAL_DIR}/${app_upper}"
done
# 安装新应用
echo "安装应用..."
for app_dir in "${EXTRACT_DIR}/apps"/*; do
if [ -d "$app_dir" ]; then
app_name=$(basename "$app_dir")
echo " - ${app_name}"
cp -rf "$app_dir" "${LOCAL_DIR}/"
fi
done
# 验证安装
echo "验证安装..."
VERIFY_FAILED=0
for app in "${APPS[@]}"; do
app_dir="${LOCAL_DIR}/${app}"
if [ ! -d "${app_dir}" ]; then
echo " 错误: ${app} 目录不存在"
VERIFY_FAILED=1
continue
fi
# 检查是否有版本目录(直接在应用目录下)
version_count=$(find "${app_dir}" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
if [ "$version_count" -eq 0 ]; then
echo " 错误: ${app} 没有版本目录"
VERIFY_FAILED=1
continue
fi
# 检查版本目录中是否有 docker-compose.yml
for ver_dir in "${app_dir}"/*; do
if [ -d "$ver_dir" ]; then
ver_name=$(basename "$ver_dir")
if [ ! -f "${ver_dir}/docker-compose.yml" ]; then
echo " 错误: ${app}/${ver_name} 缺少 docker-compose.yml"
VERIFY_FAILED=1
else
echo " ✓ ${app}/${ver_name}"
fi
fi
done
done
# 清理临时文件
rm -rf "${TEMP_ZIP}" "${EXTRACT_DIR}"
if [ $VERIFY_FAILED -eq 1 ]; then
echo "============================================"
echo "警告:部分应用验证失败,请检查日志"
echo "============================================"
else
echo "============================================"
echo "${GITHUB_REPO} 应用商店更新完成!"
echo "请在 1Panel 应用商店中刷新本地应用。"
echo "============================================"
fi#!/bin/bash
# ============================================
# 1Panel 应用商店更新脚本(国际网络)
# 功能:直接从 GitHub 克隆、更新应用
# ============================================
# 基础配置
GITHUB_USER="60999"
GITHUB_REPO="sc_appstore"
LOCAL_DIR="/opt/1panel/resource/apps/local"
TEMP_DIR="${LOCAL_DIR}/${GITHUB_REPO}_temp"
# 本仓库包含的应用列表
APPS=("baserow" "penpot" "rmqtt" "spug" "vikunja")
# ============================================
# 主流程
# ============================================
echo "============================================"
echo "开始更新 ${GITHUB_REPO} 应用商店..."
echo "============================================"
# 清理临时目录
rm -rf "${TEMP_DIR}"
# 克隆仓库
STORE_URL="https://github.com/${GITHUB_USER}/${GITHUB_REPO}"
echo "克隆地址: ${STORE_URL}"
if ! git clone -b main "${STORE_URL}" "${TEMP_DIR}"; then
echo "错误:克隆失败,请检查网络连接"
rm -rf "${TEMP_DIR}"
exit 1
fi
if [ ! -d "${TEMP_DIR}/apps" ]; then
echo "错误:克隆后找不到 apps 目录"
rm -rf "${TEMP_DIR}"
exit 1
fi
# 复制商店元数据
cp -f "${TEMP_DIR}/data.yml" "${LOCAL_DIR}/"
# 清理旧应用目录
echo "清理旧版本..."
for app in "${APPS[@]}"; do
rm -rf "${LOCAL_DIR}/${app}"
app_cap="$(echo "${app:0:1}" | tr '[:lower:]' '[:upper:]')${app:1}"
rm -rf "${LOCAL_DIR}/${app_cap}"
app_upper=$(echo "$app" | tr '[:lower:]' '[:upper:]')
rm -rf "${LOCAL_DIR}/${app_upper}"
done
# 安装新应用
echo "安装应用..."
for app_dir in "${TEMP_DIR}/apps"/*; do
if [ -d "$app_dir" ]; then
app_name=$(basename "$app_dir")
echo " - ${app_name}"
cp -rf "$app_dir" "${LOCAL_DIR}/"
fi
done
# 清理临时目录
rm -rf "${TEMP_DIR}"
echo "============================================"
echo "${GITHUB_REPO} 应用商店更新完成!"
echo "请在 1Panel 应用商店中刷新本地应用。"
echo "============================================"- 登录 1Panel 面板
- 进入 计划任务 菜单
- 点击 创建计划任务
- 配置如下:
- 任务类型:Shell 脚本
- 任务名称:更新 sc_appstore 应用商店
- 执行周期:选择合适的时间(如每天凌晨 3:00)
- 脚本内容:粘贴上述脚本
- 保存并启用任务
更新后的目录结构:
/opt/1panel/resource/apps/local/
├── data.yml # 本地应用商店元数据
├── rmqtt/ # RMQTT 应用
├── vikunja/ # Vikunja 应用
├── baserow/ # Baserow 应用
├── spug/ # Spug 应用
├── penpot/ # Penpot 应用
└── (其他应用)/ # 其他本地应用
注意:如果服务器上已有其他第三方应用,本脚本只会更新本仓库包含的应用(rmqtt、vikunja、baserow、spug、penpot),不会影响其他应用。
- 在
apps/目录下创建应用文件夹(使用小写字母) - 创建
versions/[版本号]/目录结构 - 添加
docker-compose.yml文件 - 添加
data.yml表单配置文件 - 在应用根目录添加
data.yml应用元数据 - 添加
logo.png应用图标
| 应用 | PostgreSQL | Redis |
|---|---|---|
| RMQTT | 不需要 | 不需要 |
| Vikunja | 必需 | 不需要 |
| Baserow | 必需 | 不需要 |
| Spug | 必需 | 不需要 |
| Penpot | 必需 | 必需 |
-
镜像容器适配:本项目仅针对原 docker 镜像容器运行进行针对 1Panel 应用商店的适配。我们不对任何原始镜像的有效性做出任何明示或暗示的保证或声明,并且不对使用本仓库应用所造成的任何影响负责。用户在使用本项目时应自行承担风险。
-
法律遵守:用户在使用本仓库时必须遵守所在国家与地区的法律法规。某些应用可能受到特定国家法律的限制,用户需自行了解并遵守相关法律要求。本仓库不对用户违反法律法规所产生的任何后果负责。
-
免责声明接受:用户在导入本仓库并使用其中的应用时,即表示用户已经阅读、理解并同意接受本免责声明的所有条款和条件。
MIT License