惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
Microsoft Security Blog
Microsoft Security Blog
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Last Week in AI
Last Week in AI
罗磊的独立博客
腾讯CDC
云风的 BLOG
云风的 BLOG
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
U
Unit 42
I
InfoQ
D
DataBreaches.Net
Blog — PlanetScale
Blog — PlanetScale
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
美团技术团队
IT之家
IT之家
Stack Overflow Blog
Stack Overflow Blog
F
Fortinet All Blogs
GbyAI
GbyAI
S
SegmentFault 最新的问题

Anyeの小站

PlayGuard,让你的播放器老实点! Peg - 命令行便签 · 把终端输出钉上布告板 2025 年终总结:折腾不止,热情常青 告别公网暴露风险:mTLS助你构建家里云安全边界 🚀 0 代码部署:Halo 博客与企业门户系统 B站跟随系统深色模式脚本——让你的B站体验更丝滑 【1024抽奖】EdgeOne下线源站防护?这个办法更简单! 全新!Edge 还是卸载不掉?来试试这个! 混元模型玩家必看:CNB API 不限量调用! Next Terminal 实战:内网无密码安全登录 用了 EdgeOne 降本增效,源站却可能裸奔? 降本增效!上云真香! 在线重装 Proxmox VE SSL证书申请老出问题?这套组合直接帮你搞定! 🌐 森屿云:让数字化转型像呼吸一样自然 1Panel v2 首发体验(alpha) Vscode/Code-Server 安装中文包——CI/CD DockerHub Mirror 终极解决方案——零成本,速度超快! 本地跑不动 QwQ?快用 CNB,免费运行满血 QwQ! Docker Push 巨慢?Skopeo 来拯救 2024 年终总结:与 17170 位读者相遇的旅程 云厂 200Mbps 小鸡,家里云的希望 Halo 插件 thyuu-embed 主题样式注入模板 Windows 11 卸载 Edge 小破站 6 级萌新前来挑战硬核会员,答题分享 手机系统杂谈 1Panel 自建邮局 - Docker Mailserver 1Panel 推送 SSL 证书到阿里云、腾讯云 整了几个简洁的单页,欢迎来扒 1Panel 部署 Logto 对接自有平台
1Panel 应用商店如何上架应用
Anye · 2025-09-15 · via Anyeの小站
  • Anonymous User

菜单

Anye

Anye

发布于 2025-09-15 / 1,639 阅读

前言

本文作为一篇对于 1Panel 应用商店应用的详细开发文档,修复了官方文档久久不更新的BUG,同时可以将本文内容喂给 AI 以获得较为完美的 AI 协作。

准备工作

  1. 确保您的应用程序符合 1Panel 应用商店的上架要求,具体要求请参考 应用上架前提
  2. 准备好应用的相关信息,包括名称、描述、图标等。
  3. 确保您的应用可以在 1Panel 环境中正常运行。

文件夹格式

├── halo                // 应用根目录
    ├── logo.png        // 应用 logo , 最好是 180 * 180 px,不要超过 10 KB
    ├── data.yml        // 应用声明文件
    ├── README.md       // 应用的 README
    ├── 2.2.0           // 应用版本,注意不要以 v 开头
    │   ├── data.yml    // 应用的参数配置,下面有详细介绍
    │   ├── data        // 挂载出来的目录(非必须)
    │   ├── scripts     // 脚本目录 存放 init.sh、upgrade.sh、uninstall.sh(非必须)
    │   └── docker-compose.yml // docker-compose 文件
    └── 2.3.2
        ├── data.yml
        ├── data
        └── docker-compose.yml

应用声明文件 data.yml 说明

# === 官方应用商店兼容字段(上架官方商店必填,其余情况选填) ===
# https://apps.fit2cloud.com/1panel
# 显示名称
name: Halo
# 分类标签
tags: 建站
# 副标题
title: 强大易用的开源建站工具
# 应用描述
description: 强大易用的开源建站工具

# === 以下为 1Panel 应用商店解析的数据结构,必须保留此结构 ===
additionalProperties:
  # === 必填字段 ===
  # 应用程序唯一标识符,用于系统内部识别及创建文件夹,仅限英文(必填)
  key: halo
  # 应用程序显示名称(必填)
  name: Halo
  # 应用程序类型(必填)
  # 可选值: website: 网站应用,支持在1Panel中一键部署,如 Wordpress、Halo等
  #        runtime: 运行时环境,如 MySQL、Redis、OpenResty 等
  #        tool: 工具类应用,大部分应用不属于上述两类的,可归为工具类,如 FileBrowser、phpMyAdmin 等
  type: website
  # 分类标签数组,用于应用商店分类显示(必填),可选值可见:https://github.com/1Panel-dev/appstore/blob/dev/data.yaml
  tags:
    - Website

  # === 描述信息字段(选填,建议填写)===
  # 中英文描述,建议20-30个字符,v1 版本格式
  shortDescZh: 强大易用的开源建站工具
  shortDescEn: Powerful and easy-to-use open source website builder
  # 多语言描述,建议20-30个字符,v2 版本格式
  description:
    # 简体中文
    zh: 强大易用的开源建站工具
    # 繁体中文
    zh-hant: 強大易用的開源建站工具
    # 英文
    en: A powerful and easy-to-use open source website building tool
    # 日语
    ja: 強力で使いやすいオープンソースのウェブサイト構築ツール
    # 马来语
    ms: Alat pembinaan laman web sumber terbuka yang kuat dan mudah digunakan
    # 巴西葡萄牙语
    pt-br: Uma ferramenta de construção de sites de código aberto poderosa e fácil de usar
    # 俄语
    ru: Мощный и удобный инструмент с открытым исходным кодом для создания веб-сайтов
    # 韩语
    ko: 강력하고 사용하기 쉬운 오픈소스 웹사이트 구축 도구
    # 土耳其语
    tr: Güçlü ve kullanımı kolay açık kaynaklı web sitesi oluşturma aracı

  # === 功能配置字段(选填)===
  # 是否支持跨版本更新,默认false
  crossVersionUpdate: true
  # 安装数量限制,0表示无限制,默认0
  limit: 0
  # 推荐级别,数值越小越推荐,用于应用商店排序,默认9999
  recommend: 5

  # === 链接信息字段(选填)===
  # 官方网站链接,必须是有效的 HTTP/HTTPS URL
  website: https://halo.run/
  # GitHub 仓库链接,必须是有效的HTTP/HTTPS URL
  github: https://github.com/halo-dev/halo
  # 文档链接,必须是有效的HTTP/HTTPS URL
  document: https://docs.halo.run/

  # === 系统要求字段(选填)===
  # 内存要求(MB),用于系统资源检查和用户提示
  # 常见值:512, 1024, 2048, 4096
  memoryRequired: 1024
  # 支持的 CPU 架构数组
  # 可选值:amd64, arm64, armv7, ppc64le, s390x, riscv64
  architectures:
    - amd64
    - arm64
    - ppc64le
    - s390x
  # 是否需要GPU支持,默认false
  gpuSupport: false

  # === 版本兼容性字段(选填)===
  # 最低面板版本要求,0表示无要求,默认0
  # 示例:1.0, 1.5, 2.0
  version: 0
  # 废弃版本标记,0表示未废弃,默认0,若不为 0,则与当前系统版本号对比,若大于等于该版本号,则不出现在应用商店中
  deprecated: 0

README.md 编写要求

## 基本结构规范

## 产品介绍

用一句或一段话简要介绍应用的主要功能和用途。

## 默认账户信息

如果应用有默认登录凭据,应在文件开头明确标注。

## 主要功能

使用 "## 主要功能" 或 "## 关键特性" 作为二级标题,然后用项目符号列表详细描述各项功能。

### 分类组织

对于复杂功能,使用三级标题进行分类组织,每个分类下用项目符号详细说明。

## 配置和使用说明

### 注意事项

重要的使用注意事项应放在显眼位置,使用 "## 注意事项" 标题。

### 配置步骤

详细的配置说明应使用清晰的步骤格式,包含具体的命令和路径。代码示例应使用适当的语法高亮。

项目应提供中英文两个版本的 README 文件,分别命名为 README.md(中文)和 README_en.md(英文)。

命令和配置示例应使用适当的代码块格式,并标注语言类型以获得正确的语法高亮。

应用的参数配置 data.yml 说明

版本目录下的 data.yml 文件用于定义应用程序特定版本的安装参数和表单字段配置。

基本结构如下:

# === 配置文件说明 ===
# 路径:应用程序版本目录下(如 1.0.0/data.yml)
# 用途:定义对应版本应用的安装参数及表单字段配置,支撑 1Panel 平台安装流程的参数解析与用户交互

# === 核心数据结构(必须保留)===
additionalProperties:
  # 用户安装应用时需填写的配置参数列表
  formFields:
    # ------------------------------
    # 基础演示字段(通用文本输入示例)
    # ------------------------------
    - type: "text" # 字段类型:text(通用文本) / password(敏感密码) / select(下拉选择) / service(服务选择) / number(数字输入)
      labelZh: "演示标签" # 中文显示标签(必填)
      labelEn: "Demo Label" # 英文显示标签(必填)
      # 多语言标签配置(可选,建议补充以支持多语言环境)
      label:
        zh: "演示标签"
        zh-hant: "示範標籤"
        en: "Demo Label"
        ja: "デモラベル"
        ms: "Label Demo"
        pt-br: "Rótulo de Demonstração"
        ru: "Демо Метка"
        ko: "데모 라벨"
        tr: "Demo Etiketi"
      # 多语言描述说明(可选,用于解释字段用途)
      description:
        zh: "这是一个演示标签,用于展示通用文本字段的配置格式"
        zh-hant: "這是一個示範標籤,用於展示通用文字欄位的設定格式"
        en: "This is a demo label to show the configuration format of general text fields"
        ja: "これは汎用テキストフィールドの設定形式を示すデモラベルです"
        ms: "Ini adalah label demo untuk menunjukkan format konfigurasi medan teks umum"
        pt-br: "Este é um rótulo de demonstração para mostrar o formato de configuração de campos de texto geral"
        ru: "Это демонстрационная метка для отображения формата конфигурации общих текстовых полей"
        ko: "일반 텍스트 필드의 구성 형식을 보여주기 위한 데모 라벨입니다"
        tr: "Genel metin alanlarının yapılandırma formatını göstermek için bir demo etiketidir"
      required: true # 是否为必填项(必填)
      envKey: "APP_NAME" # 环境变量键名(必填,不可包含空格,用于关联 Docker Compose 配置)
      default: "demo" # 默认值(可选)
      edit: false # 是否允许用户修改该字段
      random: false # 是否在默认值后追加随机字符串
      rule: "paramCommon" # 输入验证规则(可选):paramPort(端口1-65535) / paramExtUrl(URL格式) / paramCommon(英文/数字/.-_,2-30位) / paramComplexity(含特殊字符,6-30位,首尾非特殊字符)

    # ------------------------------
    # 常用功能字段配置示例
    # ------------------------------
    # 1. 应用 HTTP 端口配置(数字输入类型)
    # 有 web 访问端口的优先使用此 envKey: PANEL_APP_PORT_HTTP
    # envKey 中包含 PANEL_APP_PORT 前缀会被认定为端口类型,并且用于安装前的端口占用校验。
    - type: "number"
      labelZh: "HTTP 端口"
      labelEn: "HTTP Port"
      label:
        zh: "HTTP 端口"
        zh-hant: "HTTP 埠"
        en: "HTTP Port"
        ja: "HTTPポート"
        ms: "Port HTTP"
        pt-br: "Porta HTTP"
        ru: "Порт HTTP"
        ko: "HTTP 포트"
        tr: "HTTP bağlantı noktası"
      description:
        zh: "设置应用的 HTTP 访问端口,有效范围:1-65535"
        zh-hant: "設定應用程式的 HTTP 存取埠,有效範圍:1-65535"
        en: "Set the HTTP access port for the application, valid range: 1-65535"
        ja: "アプリケーションのHTTPアクセスポートを設定します。有効範囲:1-65535"
        ms: "Tetapkan port akses HTTP untuk aplikasi, julat sah: 1-65535"
        pt-br: "Defina a porta de acesso HTTP para o aplicativo, intervalo válido: 1-65535"
        ru: "Установите порт HTTP-доступа для приложения, допустимый диапазон: 1-65535"
        ko: "애플리케이션의 HTTP 접근 포트를 설정합니다. 유효 범위: 1-65535"
        tr: "Uygulama için HTTP erişim bağlantı noktasını ayarlayın, geçerli aralık: 1-65535"
      required: true
      envKey: "PANEL_APP_PORT_HTTP" # 关联 Docker Compose 的 HTTP 端口配置键名
      default: 8080 # 默认端口(常用Web应用端口)
      edit: true # 允许用户根据服务器端口占用情况修改
      rule: "paramPort" # 强制端口格式验证

    # 2. 数据库服务配置(支持多类型数据库选择)
    - type: "apps" # 服务类型:仅用于数据库选择(主选类型+子选实例)
      labelZh: "数据库服务"
      labelEn: "Database Service"
      label:
        zh: "数据库服务"
        zh-hant: "資料庫服務"
        en: "Database Service"
        ja: "データベースサービス"
        ms: "Perkhidmatan Pangkalan Data"
        pt-br: "Serviço de Banco de Dados"
        ru: "Сервис баз данных"
        ko: "데이터베이스 서비스"
        tr: "Veritabanı Hizmetleri"
      description:
        zh: "选择应用依赖的数据库类型及对应服务实例(需提前在 1Panel 中部署数据库服务)"
        zh-hant: "選擇應用程式依賴的資料庫類型及對應服務實例(需提前在 1Panel 中部署資料庫服務)"
        en: "Select the database type and corresponding service instance that the application depends on (deploy the database service in 1Panel in advance)"
        ja: "アプリケーションが依存するデータベースの種類と対応するサービスインスタンスを選択します(事前に1Panelでデータベースサービスをデプロイする必要があります)"
        ms: "Pilih jenis pangkalan data dan contoh perkhidmatan yang bergantung kepada aplikasi (perlu menyebarkan perkhidmatan pangkalan data dalam 1Panel terlebih dahulu)"
        pt-br: "Selecione o tipo de banco de dados e a instância de serviço correspondente da qual o aplicativo depende (implante o serviço de banco de dados no 1Panel com antecedência)"
        ru: "Выберите тип базы данных и соответствующий экземпляр службы, от которых зависит приложение (расположите службу базы данных в 1Panel заранее)"
        ko: "애플리케이션이 의존하는 데이터베이스 유형 및 해당 서비스 인스턴스를 선택합니다 (1Panel에서 미리 데이터베이스 서비스를 배포해야 함)"
        tr: "Uygulamanın bağımlı olduğu veritabanı türünü ve ilgili hizmet örneğini seçin (önceden 1Panel'de veritabanı hizmetini dağıtmanız gerekiyor)"
      required: true
      envKey: "PANEL_DB_TYPE" # 数据库类型环境变量键名(如 postgresql/mysql/mariadb)
      default: "postgresql" # 默认数据库类型(PostgreSQL 兼容性更优)
      edit: false # 固定数据库类型,不允许用户修改
      # 可选数据库类型列表
      values:
        - label: "PostgreSQL"
          value: "postgresql"
        - label: "MySQL"
          value: "mysql"
        - label: "MariaDB"
          value: "mariadb"
      # 数据库实例选择子配置
      child:
        type: "service" # 子字段类型:服务实例选择
        envKey: "PANEL_DB_HOST" # 数据库主机地址环境变量键名
        required: true # 必须选择具体实例
        default: "" # 无默认值,强制用户选择

    # 3. 数据库名称配置
    - type: "text"
      labelZh: "数据库名称"
      labelEn: "Database Name"
      label:
        zh: "数据库名称"
        zh-hant: "資料庫名稱"
        en: "Database Name"
        ja: "データベース名"
        ms: "Nama Pangkalan Data"
        pt-br: "Nome do Banco de Dados"
        ru: "Имя базы данных"
        ko: "데이터베이스 이름"
        tr: "Veritabanı Adı"
      description:
        zh: "应用所需的数据库名称,将自动创建(遵循英文/数字/.-_ 命名规则)"
        zh-hant: "應用程式所需的資料庫名稱,將自動建立(遵循英文/數字/.-_ 命名規則)"
        en: "The database name required by the application, which will be created automatically (follow the naming rule: English/numbers/.-_)"
        ja: "アプリケーションに必要なデータベース名で、自動的に作成されます(命名規則:英語/数字/.-_ に準拠)"
        ms: "Nama pangkalan data yang diperlukan oleh aplikasi, akan dibuat secara automatik (ikut peraturan penamaan: Bahasa Inggeris/nombor/.-_)"
        pt-br: "O nome do banco de dados necessário para o aplicativo, que será criado automaticamente (siga a regra de nomenclatura: Inglês/números/.-_)"
        ru: "Имя базы данных, необходимое для приложения, будет создано автоматически (соблюдайте правило именования: английский/цифры/.-_)"
        ko: "애플리케이션에 필요한 데이터베이스 이름으로, 자동으로 생성됩니다 (영문/숫자/.-_ 명명 규칙 준수)"
        tr: "Uygulama için gerekli veritabanı adı, otomatik olarak oluşturulur (İngilizce/sayılar/.-_ adlandırma kuralını izleyin)"
      required: true
      envKey: "PANEL_DB_NAME"
      default: ""
      edit: false # 自动生成,不允许用户修改
      random: true # 在默认值后追加随机字符串,避免重复
      rule: "paramCommon" # 强制通用命名规则验证

    # 4. 数据库用户配置
    - type: "text"
      labelZh: "数据库用户"
      labelEn: "Database User"
      label:
        zh: "数据库用户"
        zh-hant: "資料庫用戶"
        en: "Database User"
        ja: "データベースユーザー"
        ms: "Pengguna Pangkalan Data"
        pt-br: "Usuário do Banco de Dados"
        ru: "Пользователь базы данных"
        ko: "데이터베이스 사용자"
        tr: "Veritabanı Kullanıcısı"
      description:
        zh: "应用访问数据库的专用用户,将自动创建(权限绑定对应数据库)"
        zh-hant: "應用程式存取資料庫的專用使用者,將自動建立(權限繫結對應資料庫)"
        en: "Dedicated user for the application to access the database, which will be created automatically (permissions bound to the corresponding database)"
        ja: "アプリケーションがデータベースにアクセスするための専用ユーザーで、自動的に作成されます(対応するデータベースにアクセス権が設定されます)"
        ms: "Pengguna khusus untuk aplikasi mengakses pangkalan data, akan dibuat secara automatik (izin terikat pada pangkalan data yang sepadan)"
        pt-br: "Usuário dedicado para o aplicativo acessar o banco de dados, que será criado automaticamente (permissões vinculadas ao banco de dados correspondente)"
        ru: "Выделенный пользователь для доступа приложения к базе данных, будет создан автоматически (права привязаны к соответствующей базе данных)"
        ko: "애플리케이션이 데이터베이스에 접근하기 위한 전용 사용자로, 자동으로 생성됩니다 (해당 데이터베이스에 권한 바인딩)"
        tr: "Uygulamanın veritabanına erişmesi için özel kullanıcı, otomatik olarak oluşturulur (ilgili veritabanına izin bağlama)"
      required: true
      envKey: "PANEL_DB_USER"
      default: ""
      edit: false
      random: true
      rule: "paramCommon"

    # 5. 数据库密码配置(敏感信息)
    - type: "password" # 密码类型:输入内容隐藏显示
      labelZh: "数据库密码"
      labelEn: "Database Password"
      label:
        zh: "数据库密码"
        zh-hant: "資料庫密碼"
        en: "Database Password"
        ja: "データベースパスワード"
        ms: "Kata Laluan Pangkalan Data"
        pt-br: "Senha do Banco de Dados"
        ru: "Пароль базы данных"
        ko: "데이터베이스 비밀번호"
        tr: "Veritabanı Parolası"
      description:
        zh: "数据库用户的访问密码,自动生成高强度随机密码(无需手动输入)"
        zh-hant: "資料庫使用者的存取密碼,自動生成高強度隨機密碼(無需手動輸入)"
        en: "Access password for the database user, automatically generate a high-strength random password (no manual input required)"
        ja: "データベースユーザーのアクセスパスワードで、高強度のランダムパスワードが自動生成されます(手動入力不要)"
        ms: "Kata laluan akses untuk pengguna pangkalan data, automatik menjana kata laluan rawak berketahanan tinggi (tidak perlu memasukkan secara manual)"
        pt-br: "Senha de acesso para o usuário do banco de dados, gera automaticamente uma senha aleatória de alta segurança (não é necessário digitar manualmente)"
        ru: "Пароль доступа для пользователя базы данных, автоматически генерируется сложный случайный пароль (ручной ввод не требуется)"
        ko: "데이터베이스 사용자의 접근 비밀번호로, 고강도 랜덤 비밀번호가 자동 생성됩니다(수동 입력 불필요)"
        tr: "Veritabanı kullanıcısı için erişim parolası, yüksek güvenlikli rastgele parola otomatik olarak oluşturulur (elle giriş gerekmez)"
      required: true
      envKey: "PANEL_DB_USER_PASSWORD"
      default: ""
      edit: false
      random: true # 强制生成随机密码,提升安全性

    # 6. Redis 缓存服务配置(单一服务选择)
    - type: "service" # 服务类型:用于缓存服务(Redis/Memcached等)选择
      key: "redis" # 依赖服务标识:创建应用前需先部署 Redis 服务
      labelZh: "Redis 缓存服务"
      labelEn: "Redis Cache Service"
      label:
        zh: "Redis 服务"
        zh-hant: "Redis 服務"
        en: "Redis Service"
        ja: "Redis サービス"
        ms: "Perkhidmatan Redis"
        pt-br: "Serviço Redis"
        ru: "Сервис Redis"
        ko: "Redis 서비스"
        tr: "Redis Hizmeti"
      description:
        zh: "选择应用依赖的 Redis 服务实例(需提前在 1Panel 中部署 Redis)"
        zh-hant: "選擇應用程式依賴的 Redis 服務實例(需提前在 1Panel 中部署 Redis)"
        en: "Select the Redis service instance that the application depends on (deploy Redis in 1Panel in advance)"
        ja: "アプリケーションが依存するRedisサービスインスタンスを選択します(事前に1PanelでRedisをデプロイする必要があります)"
        ms: "Pilih contoh perkhidmatan Redis yang bergantung kepada aplikasi (perlu menyebarkan Redis dalam 1Panel terlebih dahulu)"
        pt-br: "Selecione a instância do serviço Redis da qual o aplicativo depende (implante o Redis no 1Panel com antecedência)"
        ru: "Выберите экземпляр службы Redis, от которого зависит приложение (расположите Redis в 1Panel заранее)"
        ko: "애플리케이션이 의존하는 Redis 서비스 인스턴스를 선택합니다 (1Panel에서 미리 Redis를 배포해야 함)"
        tr: "Uygulamanın bağımlı olduğu Redis hizmet örneğini seçin (önceden 1Panel'de Redis'i dağıtmanız gerekiyor)"
      required: true
      envKey: "REDIS_HOST" # Redis 主机地址环境变量键名
      default: ""
      edit: false # 仅允许选择已部署实例,不允许手动输入

docker-compose.yml 说明

版本目录下的 docker-compose.yml 文件用于定义应用程序的容器化部署配置。 一般来说,对于大多数应用,可以参考以下示例进行编写:

# 网络配置:复用 1Panel 平台统一网络,实现容器间互联互通
networks:
  1panel-network:
    external: true # 声明使用已存在的外部网络(由 1Panel 自动创建)

services:
  # Halo 主服务配置(服务名可根据实际需求自定义)
  halo:
    container_name: ${CONTAINER_NAME} # 容器名称,固定写法,多容器时可加后缀区分,如 ${CONTAINER_NAME}-db
    image: halohub/halo-pro:2.21.8 # 容器镜像
    restart: always # 重启策略
    networks:
      - 1panel-network # 加入 1Panel 统一网络,支持与数据库、缓存等服务通信
    volumes:
      # 数据卷挂载:将容器数据目录映射到宿主机,实现数据持久化
      - ./data:/root/.halo2
    ports:
      # 端口映射:将宿主机端口(由 1Panel 配置的 HTTP 端口)映射到容器内默认端口 8090
      - ${PANEL_APP_PORT_HTTP}:8090
    healthcheck:
      test:
        ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]
      interval: 30s
      timeout: 5s
      retries: 5
      start_period: 30s
    command:
      # 数据库连接配置(通过环境变量注入,与 1Panel 安装表单参数关联)
      - --spring.r2dbc.url=r2dbc:pool:${PANEL_DB_TYPE}://${PANEL_DB_HOST}:${PANEL_DB_PORT}/${PANEL_DB_NAME}
      - --spring.r2dbc.username=${PANEL_DB_USER} # 数据库用户名
      - --spring.r2dbc.password=${PANEL_DB_USER_PASSWORD} # 数据库密码
      - --spring.sql.init.platform=${PANEL_DB_TYPE} # 数据库平台类型(适配 MySQL/PostgreSQL 等)
      # Halo 核心配置
      - --halo.external-url=${HALO_EXTERNAL_URL} # Halo 外部访问地址(用于生成链接、回调等)
    environment:
      - JVM_OPTS=
    labels:
      createdBy: "Apps" # 1Panel 应用市场识别标签(固定写法,不可修改,用于平台管理)

对于现有的 docker-compose.yml 文件,为确保其能在 1Panel 平台正常运行,可根据以下要点进行检查和调整:

  1. 网络配置:确保包含 networks 部分,并正确引用 1panel-network 外部网络。1Panel 平台所有应用默认部署在该统一网络下,若缺失此配置,应用将无法与数据库、Redis 等依赖服务(同样部署在该网络)进行内部通信,可能导致连接失败。

  2. 容器名称与环境变量

    • 容器名称需使用 ${CONTAINER_NAME} 变量(固定写法),该值由 1Panel 自动生成并注入,确保多应用部署时容器名称不冲突;若为多容器应用(如应用+数据库),可在变量后加后缀(如 ${CONTAINER_NAME}-db)区分。
    • 与 1Panel 安装表单关联的参数(如端口、数据库信息、访问地址等),需使用对应环境变量(如 ${PANEL_APP_PORT_HTTP} ${PANEL_DB_HOST}),变量名需与 data.ymlformFieldsenvKey 完全一致,否则参数无法正常传递。
  3. 数据持久化配置:核心数据目录需通过 volumes 挂载到宿主机(如示例中 ./data:/root/.halo2)。1Panel 平台会将 ./data 映射到宿主机的应用专属数据目录(由平台统一管理),若缺失此配置,容器删除或重建时,应用数据(如配置、内容、日志等)将全部丢失。

  4. 标签配置:必须保留 labels: createdBy: "Apps" 配置(固定写法,不可修改)。该标签是 1Panel 识别应用为“应用市场应用”的核心标识,缺失后平台将无法对应用进行统一管理。

脚本文件说明

1Panel 支持三种标准的应用程序生命周期脚本:

  • init.sh: 应用程序初始化脚本,在应用程序首次安装时执行
  • upgrade.sh: 应用程序升级脚本,在应用程序版本升级过程中执行,具体在升级任务的执行阶段
  • uninstall.sh: 应用程序卸载脚本,在应用程序被删除时执行

data 目录说明

有些应用在挂载数据卷时,可能需要预置一些初始数据文件(如配置文件、模板文件等)。在这种情况下,可以将这些预置数据文件放在版本目录下的 data 目录中,同时在 docker-compose.yml 中将 data 目录挂载到容器的相应路径。当然,如果你想要提交到 git 仓库,对于空文件夹,可以在 data 目录下放置一个 .gitkeep 文件,以确保该目录被版本控制系统跟踪。

本地测试

将应用目录上传到安装有 1Panel 服务器的的 /opt/1panel/resource/apps/local 文件夹下,然后在 1Panel 应用商店中点击 同步本地应用,选择“本地应用”分类,即可看到该应用,点击安装即可进行测试。

最后

提交一个 Pr,完事