Files
blog/posts/bb18d851/index.html
biss cdf41750e2 Merge pull request 'Configure Renovate' (#1) from renovate/configure into master
Reviewed-on: #1
··[CST 2026-02-22 Sunday 19:37:28]
2026-02-22 19:37:28 +08:00

685 lines
92 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>为1Panel添加自己想要的应用 | Bi's Blog</title><meta name="author" content="biss"><meta name="copyright" content="biss"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta name="description" content="记录一下自己为1Panel贡献自己应用的经历 预准备 Fork仓库 🪧引用站外地址,不保证站点的可用性和安全性 1Panel appstore 仓库 1panel appstore 把仓库fork到自己的仓库 pull 1git clo">
<meta property="og:type" content="article">
<meta property="og:title" content="为1Panel添加自己想要的应用">
<meta property="og:url" content="https://blog.biss.click/posts/bb18d851/index.html">
<meta property="og:site_name" content="Bi's Blog">
<meta property="og:description" content="记录一下自己为1Panel贡献自己应用的经历 预准备 Fork仓库 🪧引用站外地址,不保证站点的可用性和安全性 1Panel appstore 仓库 1panel appstore 把仓库fork到自己的仓库 pull 1git clo">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://pic.biss.click/image/fa0178dd-b1f6-48eb-8690-42faf26c9f52.webp">
<meta property="article:published_time" content="2025-08-19T02:43:16.000Z">
<meta property="article:modified_time" content="2026-02-22T11:37:10.097Z">
<meta property="article:author" content="biss">
<meta property="article:tag" content="1panel">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://pic.biss.click/image/fa0178dd-b1f6-48eb-8690-42faf26c9f52.webp"><script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "为1Panel添加自己想要的应用",
"url": "https://blog.biss.click/posts/bb18d851/",
"image": "https://pic.biss.click/image/fa0178dd-b1f6-48eb-8690-42faf26c9f52.webp",
"datePublished": "2025-08-19T02:43:16.000Z",
"dateModified": "2026-02-22T11:37:10.097Z",
"author": [
{
"@type": "Person",
"name": "biss",
"url": "https://blog.biss.click"
}
]
}</script><link rel="shortcut icon" href="/images/Bi.ico"><link rel="canonical" href="https://blog.biss.click/posts/bb18d851/index.html"><link rel="preconnect" href="//unpkg.com"><link rel="preconnect" href="//busuanzi.ibruce.info"><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://unpkg.com/@fortawesome/fontawesome-free/css/all.min.css"><link rel="stylesheet" href="https://unpkg.com/node-snackbar/dist/snackbar.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://unpkg.com/@fancyapps/ui/dist/fancybox/fancybox.css" media="print" onload="this.media='all'"><script>
(() => {
const saveToLocal = {
set: (key, value, ttl) => {
if (!ttl) return
const expiry = Date.now() + ttl * 86400000
localStorage.setItem(key, JSON.stringify({ value, expiry }))
},
get: key => {
const itemStr = localStorage.getItem(key)
if (!itemStr) return undefined
const { value, expiry } = JSON.parse(itemStr)
if (Date.now() > expiry) {
localStorage.removeItem(key)
return undefined
}
return value
}
}
window.btf = {
saveToLocal,
getScript: (url, attr = {}) => new Promise((resolve, reject) => {
const script = document.createElement('script')
script.src = url
script.async = true
Object.entries(attr).forEach(([key, val]) => script.setAttribute(key, val))
script.onload = script.onreadystatechange = () => {
if (!script.readyState || /loaded|complete/.test(script.readyState)) resolve()
}
script.onerror = reject
document.head.appendChild(script)
}),
getCSS: (url, id) => new Promise((resolve, reject) => {
const link = document.createElement('link')
link.rel = 'stylesheet'
link.href = url
if (id) link.id = id
link.onload = link.onreadystatechange = () => {
if (!link.readyState || /loaded|complete/.test(link.readyState)) resolve()
}
link.onerror = reject
document.head.appendChild(link)
}),
addGlobalFn: (key, fn, name = false, parent = window) => {
if (!true && key.startsWith('pjax')) return
const globalFn = parent.globalFn || {}
globalFn[key] = globalFn[key] || {}
globalFn[key][name || Object.keys(globalFn[key]).length] = fn
parent.globalFn = globalFn
}
}
const activateDarkMode = () => {
document.documentElement.setAttribute('data-theme', 'dark')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
}
}
const activateLightMode = () => {
document.documentElement.setAttribute('data-theme', 'light')
if (document.querySelector('meta[name="theme-color"]') !== null) {
document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
}
}
btf.activateDarkMode = activateDarkMode
btf.activateLightMode = activateLightMode
const theme = saveToLocal.get('theme')
theme === 'dark' ? activateDarkMode() : theme === 'light' ? activateLightMode() : null
const asideStatus = saveToLocal.get('aside-status')
if (asideStatus !== undefined) {
document.documentElement.classList.toggle('hide-aside', asideStatus === 'hide')
}
const detectApple = () => {
if (/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)) {
document.documentElement.classList.add('apple')
}
}
detectApple()
})()
</script><script>const GLOBAL_CONFIG = {
root: '/',
algolia: undefined,
localSearch: undefined,
translate: {"defaultEncoding":2,"translateDelay":0,"msgToTraditionalChinese":"繁","msgToSimplifiedChinese":"簡"},
highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":200,"highlightFullpage":true,"highlightMacStyle":false},
copy: {
success: '复制成功',
error: '复制失败',
noSupport: '浏览器不支持'
},
relativeDate: {
homepage: false,
post: false
},
runtime: '',
dateSuffix: {
just: '刚刚',
min: '分钟前',
hour: '小时前',
day: '天前',
month: '个月前'
},
copyright: undefined,
lightbox: 'fancybox',
Snackbar: {"chs_to_cht":"已切换为繁体中文","cht_to_chs":"已切换为简体中文","day_to_night":"已切换为深色模式","night_to_day":"已切换为浅色模式","bgLight":"#49b1f5","bgDark":"#1f1f1f","position":"bottom-left"},
infinitegrid: {
js: 'https://unpkg.com/@egjs/infinitegrid/dist/infinitegrid.min.js',
buttonText: '加载更多'
},
isPhotoFigcaption: false,
islazyloadPlugin: false,
isAnchor: false,
percent: {
toc: true,
rightside: false,
},
autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
title: '为1Panel添加自己想要的应用',
isHighlightShrink: false,
isToc: true,
pageType: 'post'
}</script><link rel="stylesheet" href="/css/shuoshuo.css"><link rel="stylesheet" href="/css/shuoshuoshouye.css"><link rel="stylesheet" href="/css/nav.css"><link rel="stylesheet" href="/css/style.css"><link rel="stylesheet" href="/css/poem.css"><link rel="stylesheet" href="/css/swiper.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/npm/instantsearch.css/themes/reset-min.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/gh/bishshi/welcomemessage/welcome.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/gh/bishshi/sidecalendar/calendar.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/gh/bishshi/rightmenu/rightmenu.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/gh/bishshi/webfont/font.css"><link rel="stylesheet" href="https://cdn.jsdmirror.com/npm/aplayer/dist/APlayer.min.css" media="all" onload="this.media=&quot;all&quot;"><!-- hexo injector head_end start --><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.4.5/css/swiper.min.css" media="print" onload="this.media='all'"><link rel="stylesheet" href="https://cdn1.tianli0.top/npm/hexo-butterfly-swiper/lib/swiperstyle.css" media="print" onload="this.media='all'"><!-- hexo injector head_end end --><style type="text/css">
.spoiler {
display: inline;
}
p.spoiler {
display: flex;
}
.spoiler a {
pointer-events: none;
}
.spoiler-blur, .spoiler-blur > * {
transition: text-shadow .5s ease;
}
.spoiler .spoiler-blur, .spoiler .spoiler-blur > * {
color: rgba(0, 0, 0, 0);
background-color: rgba(0, 0, 0, 0);
text-shadow: 0 0 10px grey;
cursor: pointer;
}
.spoiler .spoiler-blur:hover, .spoiler .spoiler-blur:hover > * {
text-shadow: 0 0 5px grey;
}
.spoiler-box, .spoiler-box > * {
transition: color .5s ease,
background-color .5s ease;
}
.spoiler .spoiler-box, .spoiler .spoiler-box > * {
color: black;
background-color: black;
text-shadow: none;
}</style><meta name="generator" content="Hexo 8.1.1"><link rel="alternate" href="/atom.xml" title="Bi's Blog" type="application/atom+xml">
</head><body><div class="bg-animation" id="web_bg" style="background-image: url(/images/background.png);"></div><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img text-center"><img src="https://free.picui.cn/free/2025/08/10/689845496a283.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"></div><div class="site-data text-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">30</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">10</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 存档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/shuoshuo/"><i class="fa-fw fa-regular fa-comment"></i><span> 说说</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="post" id="body-wrap"><header class="post-bg fixed" id="page-header" style="background-image: url(https://pic.biss.click/image/fa0178dd-b1f6-48eb-8690-42faf26c9f52.webp);"><nav id="nav"><span id="blog-info"><div id="ls-menu-container"><i class="fas fa-fingerprint"></i><div id="ls-menu-panel"><div class="ls-section"><div class="ls-title">😀 个人网站</div><div class="ls-grid"><a href="/"><i class="fas fa-rss"></i> 个人博客</a><a target="_blank" rel="noopener" href="https://github.com/bishshi"><i class="fab fa-github"></i> Github</a></div></div><div class="ls-section"><div class="ls-title">😎 常用服务</div><div class="ls-grid"><a target="_blank" rel="noopener" href="https://git.biss.click/biss"><i class="fas fa-code"></i> 代码仓库</a><a target="_blank" rel="noopener" href="https://mm.biss.click"><i class="fas fa-pen-nib"></i> 日常yy</a><a target="_blank" rel="noopener" href="https://statstic.biss.click"><i class="fas fa-users"></i> 访客统计</a><a target="_blank" rel="noopener" href="https://pic.biss.click"><i class="fas fa-image"></i> 图床</a><a target="_blank" rel="noopener" href="https://chat.biss.click"><i class="fas fa-robot"></i> AI网站</a><a target="_blank" rel="noopener" href="https://git.biss.click"><i class="fas fa-code-branch"></i> 代码仓库</a></div></div><div class="ls-section"><div class="ls-title">🛸 实用工具</div><div class="ls-grid"><a target="_blank" rel="noopener" href="https://cover.biss.click"><i class="fas fa-palette"></i> 封面设计</a><a target="_blank" rel="noopener" href="https://doc.biss.click"><i class="fas fa-file"></i> 文档服务</a><a target="_blank" rel="noopener" href="https://doc.biss.click"><i class="fas fa-server"></i>服务监测</a><a target="_blank" rel="noopener" href="https://typesense.biss.click"><i class="fas fa-magnifying-glass"></i> 搜索后端</a></div></div></div></div><a class="nav-site-title" href="/"><span class="site-name">Bi's Blog</span></a></span><a class="nav-page-title" href="javascript:void(0);" onclick="btf.scrollToDest(0, 500)"><span class="site-name">为1Panel添加自己想要的应用</span></a><div id="nav-right"><div id="menus"><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 首页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 存档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page" href="/shuoshuo/"><i class="fa-fw fa-regular fa-comment"></i><span> 说说</span></a></div><div class="menus_item"><a class="site-page" href="/link/"><i class="fa-fw fas fa-link"></i><span> 友链</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div><div id="random-post-button"><a class="site-page social-icon" id="random-post-link" href="javascript:void(0);" onclick="randomPost()"><i class="fas fa-solid fa-shuffle"></i></a></div><div id="search-button"><a class="site-page social-icon search-typesense-trigger"><i class="fas fa-search fa-fw"></i></a></div><div id="toggle-menu"><span class="site-page"><i class="fas fa-bars fa-fw"></i></span></div></div></nav><div id="post-info"><h1 class="post-title">为1Panel添加自己想要的应用</h1><div id="post-meta"><div class="meta-firstline"><span class="post-meta-date"><i class="far fa-calendar-alt fa-fw post-meta-icon"></i><span class="post-meta-label">发表于</span><time class="post-meta-date-created" datetime="2025-08-19T02:43:16.000Z" title="发表于 2025-08-19 10:43:16">2025-08-19</time><span class="post-meta-separator">|</span><i class="fas fa-history fa-fw post-meta-icon"></i><span class="post-meta-label">更新于</span><time class="post-meta-date-updated" datetime="2026-02-22T11:37:10.097Z" title="更新于 2026-02-22 19:37:10">2026-02-22</time></span><span class="post-meta-categories"><span class="post-meta-separator">|</span><i class="fas fa-inbox fa-fw post-meta-icon"></i><a class="post-meta-categories" href="/categories/technology/">技术</a></span></div><div class="meta-secondline"><span class="post-meta-separator">|</span><span class="post-meta-wordcount"><i class="far fa-file-word fa-fw post-meta-icon"></i><span class="post-meta-label">总字数:</span><span class="word-count">1.9k</span><span class="post-meta-separator">|</span><i class="far fa-clock fa-fw post-meta-icon"></i><span class="post-meta-label">阅读时长:</span><span>8分钟</span></span><span class="post-meta-separator">|</span><span id="" data-flag-title=""><i class="far fa-eye fa-fw post-meta-icon"></i><span class="post-meta-label">浏览量:</span><span id="twikoo_visitors"><i class="fa-solid fa-spinner fa-spin"></i></span></span></div></div></div></header><main class="layout" id="content-inner"><div id="post"><article class="container post-content" id="article-container"><div class="ai-summary"><div class="ai-explanation" style="display: block;" data-summary="为1Panel添加自己想要的应用">AI正在绞尽脑汁想思路ING···</div><div class="ai-title"> <div class="ai-title-left"> <i class="fa-brands fa-slack"></i><div class="ai-title-text">BiのAI摘要</div></div><div class="ai-tag" id="ai-tag">HunYuan-Lite</div></div></div><div id="post-outdate-notice" data="{&quot;limitDay&quot;:365,&quot;messagePrev&quot;:&quot;It has been&quot;,&quot;messageNext&quot;:&quot;days since the last update, the content of the article may be outdated.&quot;,&quot;postUpdate&quot;:&quot;2026-02-22 19:37:10&quot;}" hidden=""></div><p>记录一下自己为1Panel贡献自己应用的经历</p>
<h1 id="预准备"><a href="#预准备" class="headerlink" title="预准备"></a>预准备</h1><ol>
<li>Fork仓库 <div class="liushen-tag-link"><a class="tag-Link" target="_blank" href="/go.html?u=aHR0cHM6Ly9naXRodWIuY29tLzFQYW5lbC1kZXYvYXBwc3RvcmU" rel="external nofollow noopener noreferrer">
<div class="tag-link-tips">🪧引用站外地址,不保证站点的可用性和安全性</div>
<div class="tag-link-bottom">
<div class="tag-link-left" style="background-image: url(https://pic.biss.click/image/ed410d4e-d3f8-4b26-8840-50dd58f7dc4e.webp);"></div>
<div class="tag-link-right">
<div class="tag-link-title">1Panel appstore 仓库</div>
<div class="tag-link-sitename">1panel appstore</div>
</div>
<i class="fa-solid fa-angle-right"></i>
</div>
</a></div>
把仓库fork到自己的仓库</li>
<li>pull <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> -b dev https://&lt;your-github-username&gt;/appstore</span><br></pre></td></tr></tbody></table></figure>
创建新分支 <figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> appstore</span><br><span class="line">git checkout -b app/&lt;app-name&gt;</span><br></pre></td></tr></tbody></table></figure></li>
</ol>
<h1 id="创建文件"><a href="#创建文件" class="headerlink" title="创建文件"></a>创建文件</h1><h2 id="文件目录"><a href="#文件目录" class="headerlink" title="文件目录"></a>文件目录</h2><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">├──halo // 以 halo 的 key 命名 ,下面解释什么是 key </span><br><span class="line"> ├── logo.png // 应用 logo , 最好是 180 * 180 px 不要超过 10 KB </span><br><span class="line"> ├── data.yml // 应用声明文件</span><br><span class="line"> ├── README.md // 应用的 README</span><br><span class="line"> ├── 2.2.0 // 应用版本 注意不要以 v 开头</span><br><span class="line">&nbsp;&nbsp; ├── data.yml // 应用的参数配置,下面有详细介绍</span><br><span class="line">&nbsp;&nbsp; ├── data // 挂载出来的目录 </span><br><span class="line"> | ├── scripts // 脚本目录 存放 init.sh upgrade.sh uninstall.sh</span><br><span class="line">&nbsp;&nbsp; └── docker-compose.yml // docker-compose 文件</span><br><span class="line"> └── 2.3.2</span><br><span class="line"> ├── data.yml</span><br><span class="line"> ├── data</span><br><span class="line"> └── docker-compose.yml</span><br></pre></td></tr></tbody></table></figure>
<h2 id="应用声明文件data-yml"><a href="#应用声明文件data-yml" class="headerlink" title="应用声明文件data.yml"></a>应用声明文件<code>data.yml</code></h2><p>本文件主要用于声明应用的一些信息</p>
<figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">additionalProperties:</span> <span class="comment">#固定参数</span></span><br><span class="line"> <span class="attr">key:</span> <span class="string">halo</span> <span class="comment">#应用的 key ,仅限英文,用于在 Linux 创建文件夹</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">Halo</span> <span class="comment">#应用名称</span></span><br><span class="line"> <span class="attr">tags:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">WebSite</span> <span class="comment">#应用标签,可以有多个,请参照下方的标签列表 </span></span><br><span class="line"> <span class="attr">description:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Powerful</span> <span class="string">and</span> <span class="string">easy-to-use</span> <span class="string">open</span> <span class="string">source</span> <span class="string">website</span> <span class="string">builder</span></span><br><span class="line"> <span class="attr">zh:</span> <span class="string">强大易用的开源建站工具</span> <span class="comment">#应用中文描述不要超过30个字</span></span><br><span class="line"> <span class="attr">zh-Hant:</span></span><br><span class="line"> <span class="attr">ja:</span> </span><br><span class="line"> <span class="attr">ms:</span> </span><br><span class="line"> <span class="attr">pt-br:</span> </span><br><span class="line"> <span class="attr">ru:</span> </span><br><span class="line"> <span class="attr">ko:</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">website</span> <span class="comment">#应用类型,区别于应用分类,只能有一个,请参照下方的类型列表</span></span><br><span class="line"> <span class="attr">crossVersionUpdate:</span> <span class="literal">true</span> <span class="comment">#是否可以跨大版本升级</span></span><br><span class="line"> <span class="attr">limit:</span> <span class="number">0</span> <span class="comment">#应用安装数量限制0 代表无限制</span></span><br><span class="line"> <span class="attr">website:</span> <span class="string">https://halo.run/</span> <span class="comment">#官网地址</span></span><br><span class="line"> <span class="attr">github:</span> <span class="string">https://github.com/halo-dev/halo</span> <span class="comment">#github 地址 </span></span><br><span class="line"> <span class="attr">document:</span> <span class="string">https://docs.halo.run/</span> <span class="comment">#文档地址</span></span><br></pre></td></tr></tbody></table></figure>
<h2 id="应用标签-tags-字段"><a href="#应用标签-tags-字段" class="headerlink" title="应用标签 - tags 字段"></a>应用标签 - tags 字段</h2><table>
<thead>
<tr>
<th>key</th>
<th>name</th>
</tr>
</thead>
<tbody><tr>
<td>WebSite</td>
<td>建站</td>
</tr>
<tr>
<td>Server</td>
<td>Web 服务器</td>
</tr>
<tr>
<td>Runtime</td>
<td>运行环境</td>
</tr>
<tr>
<td>Database</td>
<td>数据库</td>
</tr>
<tr>
<td>Tool</td>
<td>工具</td>
</tr>
<tr>
<td>CI/CD</td>
<td>CI/CD</td>
</tr>
<tr>
<td>Local</td>
<td>本地</td>
</tr>
</tbody></table>
<h1 id="应用类型-type-字段"><a href="#应用类型-type-字段" class="headerlink" title="应用类型 - type 字段"></a>应用类型 - type 字段</h1><table>
<thead>
<tr>
<th>type</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>website</td>
<td>website 类型在 1Panel 中支持在网站中一键部署,wordpress halo 都是此 type</td>
</tr>
<tr>
<td>runtime</td>
<td>mysql openresty redis 等类型的应用</td>
</tr>
<tr>
<td>tool</td>
<td>phpMyAdmin redis-commander jenkins 等类型的应用</td>
</tr>
</tbody></table>
<h1 id="应用参数配置文件-data-yml"><a href="#应用参数配置文件-data-yml" class="headerlink" title="应用参数配置文件 data.yml"></a>应用参数配置文件 data.yml</h1><p>(注意区分于应用主目录下面的 <code>data.yaml</code></p>
<p>本文件主要用于生成安装时要填写的 form 表单,在应用版本文件夹下面 可以无表单,但是需要有这个 data.yml文件并且包含 formFields 字段</p>
<p>以安装 halo 时的 form 表单 为例</p>
<p>如果要生成上面的表单,需要这么填写 <code>data.yml</code></p>
<figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">additionalProperties:</span> <span class="comment">#固定参数</span></span><br><span class="line"> <span class="attr">formFields:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">""</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_HOST</span> <span class="comment">#docker-compose 文件中的参数</span></span><br><span class="line"> <span class="attr">key:</span> <span class="string">mysql</span> <span class="comment">#依赖应用的 key , 例如 mysql</span></span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Database</span> <span class="string">Service</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">データベースサービス</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Perkhidmatan</span> <span class="string">Pangkalan</span> <span class="string">Data</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Serviço</span> <span class="string">de</span> <span class="string">Banco</span> <span class="string">de</span> <span class="string">Dados</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Сервис</span> <span class="string">базы</span> <span class="string">данных</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">데이터베이스</span> <span class="string">서비스</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库服务</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">數據庫</span> <span class="string">服務</span></span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> <span class="comment">#是否必填</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">service</span> <span class="comment">#如果需要依赖其他应用,例如数据库,使用此 type </span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">halo</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_NAME</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Database</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">データベース</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Pangkalan</span> <span class="string">Data</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Banco</span> <span class="string">de</span> <span class="string">Dados</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">База</span> <span class="string">данных</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">데이터베이스</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库名</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">資料庫名稱</span></span><br><span class="line"> <span class="attr">random:</span> <span class="literal">true</span> <span class="comment">#是否在 default 文字后面,增加随机字符串</span></span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramCommon</span> <span class="comment">#校验规则</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">text</span> <span class="comment">#需要手动填写的,使用此 type</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">halo</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_USER</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">User</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">ユーザー</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Pengguna</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Usuário</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Пользователь</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">사용자</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库用户</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">資料庫使用者</span></span><br><span class="line"> <span class="attr">random:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramCommon</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">text</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">halo</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_USER_PASSWORD</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Password</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">パスワード</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Kata</span> <span class="string">laluan</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Senha</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Пароль</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">비밀번호</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库用户密码</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">資料庫使用者密碼</span> </span><br><span class="line"> <span class="attr">random:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramComplexity</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">password</span> <span class="comment">#密码字段使用此 type</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">admin</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">HALO_ADMIN</span> </span><br><span class="line"> <span class="attr">labelEn:</span> <span class="string">Admin</span> <span class="string">Username</span> </span><br><span class="line"> <span class="attr">labelZh:</span> <span class="string">超级管理员用户名</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramCommon</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">text</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="string">http://localhost:8080</span> </span><br><span class="line"> <span class="attr">edit:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">HALO_EXTERNAL_URL</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">External</span> <span class="string">URL</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">外部URL</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">URL</span> <span class="string">Luaran</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">URL</span> <span class="string">Externa</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Внешний</span> <span class="string">URL</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">외부</span> <span class="string">URL</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">外部访问地址</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">外部訪問地址</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramExtUrl</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">text</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">default:</span> <span class="number">8080</span> </span><br><span class="line"> <span class="attr">edit:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_APP_PORT_HTTP</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Port</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">ポート</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Port</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Porta</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Порт</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">포트</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">端口</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string"></span></span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">rule:</span> <span class="string">paramPort</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">number</span> <span class="comment">#端口使用此 type </span></span><br></pre></td></tr></tbody></table></figure>
<h2 id="关于端口字段:"><a href="#关于端口字段:" class="headerlink" title="关于端口字段:"></a>关于端口字段:</h2><p><code>PANEL_APP_PORT_HTTP</code><code>web</code> 访问端口的优先使用此 <code>envKey</code><br><code>envKey</code> 中包含 <code>PANEL_APP_PORT</code> 前缀会被认定为端口类型,并且用于安装前的端口占用校验。注意:端口需要是外部端口</p>
<h2 id="关于-type-字段:"><a href="#关于-type-字段:" class="headerlink" title="关于 type 字段:"></a>关于 type 字段:</h2><table>
<thead>
<tr>
<th>type</th>
<th>说明</th>
</tr>
</thead>
<tbody><tr>
<td>service</td>
<td>type: service 如果该应用需要依赖其他组件,如 mysql redis 等,可以通过 key: mysql 定义依赖的名称,在创建应用时会要求先创建依赖的应用。</td>
</tr>
<tr>
<td>password</td>
<td>type: password 敏感信息,如密码相关的字段会默认不显示明文。</td>
</tr>
<tr>
<td>text</td>
<td>type: text 一般内容,比如数据库名称,默认明文显示。</td>
</tr>
<tr>
<td>number</td>
<td>type: number 一般用在端口相关的配置上,只允许输入数字。</td>
</tr>
</tbody></table>
<p>简单的例子</p>
<figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># type: service定义一个 mysql 的 service 依赖。</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">child:</span> </span><br><span class="line"> <span class="attr">default:</span> <span class="string">""</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_HOST</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">service</span> </span><br><span class="line"> <span class="attr">default:</span> <span class="string">mysql</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_TYPE</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Database</span> <span class="string">Service</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">データベースサービス</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Perkhidmatan</span> <span class="string">Pangkalan</span> <span class="string">Data</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Serviço</span> <span class="string">de</span> <span class="string">Banco</span> <span class="string">de</span> <span class="string">Dados</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Сервис</span> <span class="string">баз</span> <span class="string">данных</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">데이터베이스</span> <span class="string">서비스</span> </span><br><span class="line"> <span class="attr">zh-hant:</span> <span class="string">資料庫服務</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库服务</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">apps</span> </span><br><span class="line"> <span class="attr">values:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">MySQL</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">mysql</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">MariaDB</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">mariadb</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># type: password</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">default:</span> <span class="string">word</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">PANEL_DB_USER_PASSWORD</span> </span><br><span class="line"> <span class="attr">labelEn:</span> <span class="string">Database</span> <span class="string">Password</span> </span><br><span class="line"> <span class="attr">labelZh:</span> <span class="string">数据库密码</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Database</span> <span class="string">Password</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">データベースのパスワード</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Kata</span> <span class="string">Laluan</span> <span class="string">Pangkalan</span> <span class="string">Data</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Senha</span> <span class="string">do</span> <span class="string">Banco</span> <span class="string">de</span> <span class="string">Dados</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Пароль</span> <span class="string">базы</span> <span class="string">данных</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">데이터베이스</span> <span class="string">비밀번호</span> </span><br><span class="line"> <span class="attr">zh-hant:</span> <span class="string">資料庫密碼</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库密码</span> </span><br><span class="line"> <span class="attr">random:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">password</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># type: text</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">default:</span> <span class="string">""</span> </span><br><span class="line"> <span class="attr">edit:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">REDIS_HOST</span> </span><br><span class="line"> <span class="attr">key:</span> <span class="string">redis</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">service</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Redis</span> <span class="string">Service</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">Redis</span> <span class="string">サービス</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Perkhidmatan</span> <span class="string">Redis</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Serviço</span> <span class="string">Redis</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Сервис</span> <span class="string">Redis</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">Redis</span> <span class="string">서비스</span> </span><br><span class="line"> <span class="attr">zh-Hant:</span> <span class="string">Redis</span> <span class="string">服務</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">Redis</span> <span class="string">服务</span></span><br><span class="line"> </span><br><span class="line"><span class="comment"># type: number</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">default:</span> <span class="string">""</span> </span><br><span class="line"> <span class="attr">edit:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">DBHUB_DB_PORT</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">text</span> </span><br><span class="line"> <span class="attr">label:</span> </span><br><span class="line"> <span class="attr">en:</span> <span class="string">Database</span> <span class="string">Port</span> </span><br><span class="line"> <span class="attr">ja:</span> <span class="string">データベースのポート</span> </span><br><span class="line"> <span class="attr">ms:</span> <span class="string">Pangkalan</span> <span class="string">Data</span> <span class="string">Port</span> </span><br><span class="line"> <span class="attr">pt-br:</span> <span class="string">Porta</span> <span class="string">do</span> <span class="string">Banco</span> <span class="string">de</span> <span class="string">Dados</span> </span><br><span class="line"> <span class="attr">ru:</span> <span class="string">Порт</span> <span class="string">базы</span> <span class="string">данных</span> </span><br><span class="line"> <span class="attr">ko:</span> <span class="string">데이터베이스</span> <span class="string">포트</span> </span><br><span class="line"> <span class="attr">zh-hant:</span> <span class="string">資料庫端口</span> </span><br><span class="line"> <span class="attr">zh:</span> <span class="string">数据库端口</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># type: select</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">default:</span> <span class="string">"ERROR"</span> </span><br><span class="line"> <span class="attr">envKey:</span> <span class="string">LOG_LEVEL</span> </span><br><span class="line"> <span class="attr">required:</span> <span class="literal">true</span> </span><br><span class="line"> <span class="attr">type:</span> <span class="string">select</span> </span><br><span class="line"> <span class="attr">values:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">DEBUG</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">"DEBUG"</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">INFO</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">"INFO"</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">WARNING</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">"WARNING"</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">ERROR</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">"ERROR"</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="attr">label:</span> <span class="string">CRITICAL</span> </span><br><span class="line"> <span class="attr">value:</span> <span class="string">"CRITICAL"</span></span><br></pre></td></tr></tbody></table></figure>
<p>rule 字段目前支持的几种校验</p>
<table>
<thead>
<tr>
<th>rule</th>
<th>规则</th>
</tr>
</thead>
<tbody><tr>
<td>paramPort</td>
<td>用于限制端口范围为 1-65535</td>
</tr>
<tr>
<td>paramExtUrl</td>
<td>格式为 http(s)://(域名/ip):(端口)</td>
</tr>
<tr>
<td>paramCommon</td>
<td>英文、数字、.-和_,长度2-30</td>
</tr>
<tr>
<td>paramComplexity</td>
<td>支持英文、数字、.%@$!&amp;~_-,长度6-30特殊字符不能在首尾</td>
</tr>
</tbody></table>
<p>应用 <code>docker-compose.yml</code> 文件</p>
<p><code>${PANEL_APP_PORT_HTTP} </code>类型的参数,都在 <code>data.yml</code> 中有声明</p>
<figure class="highlight yml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">version:</span> <span class="string">"3"</span> </span><br><span class="line"><span class="attr">services:</span> </span><br><span class="line"> <span class="attr">halo:</span> </span><br><span class="line"> <span class="attr">image:</span> <span class="string">halohub/halo:2.2.0</span> </span><br><span class="line"> <span class="attr">container_name:</span> <span class="string">${CONTAINER_NAME}</span> <span class="string">//</span> <span class="string">固定写法,勿改</span></span><br><span class="line"> <span class="attr">restart:</span> <span class="string">always</span> </span><br><span class="line"> <span class="attr">networks:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">1panel-network</span> <span class="string">//</span> <span class="string">1Panel</span> <span class="string">创建的应用都在此网络下</span></span><br><span class="line"> <span class="attr">volumes:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">./data:/root/.halo2</span> </span><br><span class="line"> <span class="attr">ports:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">${PANEL_APP_PORT_HTTP}:8090</span> </span><br><span class="line"> <span class="attr">command:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--spring.r2dbc.url=r2dbc:pool:${HALO_PLATFORM}://${PANEL_DB_HOST}:${HALO_DB_PORT}/${PANEL_DB_NAME}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--spring.r2dbc.username=${PANEL_DB_USER}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--spring.r2dbc.password=${PANEL_DB_USER_PASSWORD}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--spring.sql.init.platform=${HALO_PLATFORM}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--halo.external-url=${HALO_EXTERNAL_URL}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--halo.security.initializer.superadminusername=${HALO_ADMIN}</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">--halo.security.initializer.superadminpassword=${HALO_ADMIN_PASSWORD}</span> </span><br><span class="line"> <span class="attr">labels:</span> </span><br><span class="line"> <span class="attr">createdBy:</span> <span class="string">"Apps"</span> </span><br><span class="line"> </span><br><span class="line"><span class="attr">networks:</span> </span><br><span class="line"> <span class="attr">1panel-network:</span> </span><br><span class="line"> <span class="attr">external:</span> <span class="literal">true</span></span><br></pre></td></tr></tbody></table></figure>
<h2 id="脚本"><a href="#脚本" class="headerlink" title="脚本"></a>脚本</h2><p>1Panel 在 安装之前、升级之前、卸载之后支持执行 .sh 脚本<br>分别对应 init.sh upgrade.sh uninstall.sh<br>存放目录(以halo为例) : halo/2.2.0/scripts</p>
<h1 id="本地测试"><a href="#本地测试" class="headerlink" title="本地测试"></a>本地测试</h1><p>将应用目录上传到 1Panel 的 /opt/1panel/resource/apps/local 文件夹下<br>注意:/opt 为 1Panel 默认安装目录,请根据自己的实际情况修改<br>上传完成后,目录结构如下</p>
<figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">├──halo </span><br><span class="line"> ├── logo.png </span><br><span class="line"> ├── data.yml</span><br><span class="line"> ├── README.md </span><br><span class="line"> ├── 2.2.0 </span><br><span class="line"> ├── data.yml </span><br><span class="line"> ├── data </span><br><span class="line"> └── docker-compose.yml</span><br></pre></td></tr></tbody></table></figure>
<p>在 1Panel 应用商店中,点击更新应用列表按钮同步本地应用</p>
<p>v1.2 版本及之前版本的本地应用,请参考这个文档修改</p>
<h1 id="提交文件"><a href="#提交文件" class="headerlink" title="提交文件"></a>提交文件</h1><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">"Add my-app"</span></span><br><span class="line">git push origin dev</span><br></pre></td></tr></tbody></table></figure>
<h1 id="提交-Pull-Request"><a href="#提交-Pull-Request" class="headerlink" title="提交 Pull Request"></a>提交 Pull Request</h1><p>在你的仓库点击 Pull requests 菜单<br>点击 New pull request ,填写标题和描述<br>选择由你的分支提交到 1Panel-dev/appstore</p>
</article><div class="post-copyright"><div class="post-copyright__author"><span class="post-copyright-meta"><i class="fas fa-circle-user fa-fw"></i>文章作者: </span><span class="post-copyright-info"><a href="https://blog.biss.click">biss</a></span></div><div class="post-copyright__type"><span class="post-copyright-meta"><i class="fas fa-square-arrow-up-right fa-fw"></i>文章链接: </span><span class="post-copyright-info"><a href="https://blog.biss.click/posts/bb18d851/">https://blog.biss.click/posts/bb18d851/</a></span></div><div class="post-copyright__notice"><span class="post-copyright-meta"><i class="fas fa-circle-exclamation fa-fw"></i>版权声明: </span><span class="post-copyright-info">本博客所有文章除特别声明外,均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> 许可协议。转载请注明来源 <a href="https://blog.biss.click" target="_blank">Bi's Blog</a></span></div></div><div class="tag_share"><div class="post-meta__tag-list"><a class="post-meta__tags" href="/tags/1panel/">1panel</a></div><div class="post-share"><style>#web-share-btn {
background: var(--btn-bg);
color: var(--btn-color);
border: none;
padding: 0.5rem 1rem;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
}
#web-share-btn:hover {
background: var(--btn-hover-color);
}
</style><div id="web-share-component"><button id="web-share-btn" title="分享本文"><i class="fas fa-share-alt"></i><span> 分享</span></button></div><script>(() => {
const setupWebShare = () => {
const btn = document.getElementById('web-share-btn')
if (!btn) return
// 点击事件处理
btn.addEventListener('click', async () => {
if (navigator.share) {
try {
await navigator.share({
title: '为1Panel添加自己想要的应用',
text: '...',
url: window.location.href
})
} catch (err) {
console.log('分享取消或失败', err)
}
} else {
// 降级处理:比如弹出提示或复制链接
const shareData = window.location.href
navigator.clipboard.writeText(shareData).then(() => {
btf.snackbarShow('系统不支持分享,已将链接复制到剪贴板')
})
}
})
}
// 考虑到 Butterfly 的 Pjax 跳转,需要重新绑定
setupWebShare()
document.addEventListener('pjax:complete', setupWebShare)
})()</script></div></div><nav class="pagination-post" id="pagination"><a class="pagination-related" href="/posts/3a26a97a/" title="为博客添加CMS系统"><img class="cover" src="https://pic.biss.click/image/883c5377-2b3d-4f7f-ba4f-1600e9c91b90.webp" onerror="onerror=null;src='/img/404.jpg'" alt="cover of previous post"><div class="info"><div class="info-1"><div class="info-item-1">上一篇</div><div class="info-item-2">为博客添加CMS系统</div></div><div class="info-2"><div class="info-item-1">序言因为喜欢wordpress之类动态博客的在线编辑功能但是又不想抛弃hexo特别是这个花里胡哨的模板所以想着给博客添加一个cms系统在搜索一番后发现这种CMS系统叫无头CMS然后找到一个很好的系统sveltia-cms 🪧引用站外地址,不保证站点的可用性和安全性 sveltia-cms sveltia 安装安装包在博客根目录下运行npm i @sveltia/cms 创建必要文件然后在博客source目录下创建admin目录并在其下新建index.html 123456789101112&lt;!doctype html&gt;&lt;html&gt;&lt;head&gt; &lt;meta charset="utf-8" /&gt; &lt;meta name="viewport" content="width=device-width, init...</div></div></div></a><a class="pagination-related" href="/posts/ce1ec3fe/" title="使用GitHub推送Hexo到服务器"><img class="cover" src="https://pic.biss.click/image/e0a08509-dea4-4af7-bafa-c81ca9d1cf8d.webp" onerror="onerror=null;src='/img/404.jpg'" alt="cover of next post"><div class="info text-right"><div class="info-1"><div class="info-item-1">下一篇</div><div class="info-item-2">使用GitHub推送Hexo到服务器</div></div><div class="info-2"><div class="info-item-1">1panel没有宝塔的webhook功能之前一直使用在服务器上建立裸仓库直接推送到服务器的方法。现在找到一种新的方法。 建立GitHub仓库因为服务器部署在香港可以直连GitHub国内可以使用gitee或者GitHub镜像加速。 在本地安装git 打开git bash配置用户名和邮箱 12git config --global user.name "yourname"git config --global user.email "youremail" 可以使用 git config list查看当前所有的配置 在github上创建自己的账号在自己的电脑和服务器上 创建SSH Key a:打开Git Bash输入pwd查看当前路径 b.输入ssh-keygen -t rsa C “youremail@example.com” (输入完毕后程序同时要求输入一个密语字符串(passphrase)空表示没有密语。接着会让输入2次口令(password)空表示没有口令。3次回车即可完成当前步骤) 在Git...</div></div></div></a></nav><hr class="custom-hr"><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div></div><div class="comment-wrap"><div><div id="twikoo-wrap"></div></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info text-center"><div class="avatar-img"><img src="https://free.picui.cn/free/2025/08/10/689845496a283.png" onerror="this.onerror=null;this.src='/img/friend_404.gif'" alt="avatar"></div><div class="author-info-name">biss</div><div class="author-info-description"></div><div class="site-data"><a href="/archives/"><div class="headline">文章</div><div class="length-num">30</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">10</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">5</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/bishshi"><i class="fab fa-github"></i><span>Follow Me</span></a><div class="card-info-social-icons"><a class="social-icon" href="https://github.com/bishshi" target="_blank" title="Github"><i class="fab fa-github" style="color: #24292e;"></i></a><a class="social-icon" href="mailto:bishsh2006@gmail.com" target="_blank" title="Email"><i class="fas fa-envelope" style="color: #4a7dbe;"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content"></div><div id="welcome-ip-location-info"></div></div><div class="card-widget" id="card-poem"><div id="poem_sentence"></div><div id="poem_info"><div id="poem_dynasty"></div><div id="poem_author"></div></div></div><script src="https://cdn.liumingye.cn/npm/js-heo@1.0.11/poem/jinrishici.js" charset="utf-8"></script><script type="text/javascript">jinrishici.load(function(result) {
var sentence = document.querySelector("#poem_sentence")
var author = document.querySelector("#poem_author")
var dynasty = document.querySelector("#poem_dynasty")
var sentenceText = result.data.content
sentenceText = sentenceText.substr(0, sentenceText.length - 1);
sentence.innerHTML = sentenceText
dynasty.innerHTML = result.data.origin.dynasty
author.innerHTML = result.data.origin.author + '《' + result.data.origin.title + '》'
});</script><div class="sticky_layout"><div class="card-widget" id="card-toc"><div class="item-headline"><i class="fas fa-stream"></i><span>目录</span><span class="toc-percentage"></span></div><div class="toc-content"><ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#%E9%A2%84%E5%87%86%E5%A4%87"><span class="toc-number">1.</span> <span class="toc-text">预准备</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%88%9B%E5%BB%BA%E6%96%87%E4%BB%B6"><span class="toc-number">2.</span> <span class="toc-text">创建文件</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95"><span class="toc-number">2.1.</span> <span class="toc-text">文件目录</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%BA%94%E7%94%A8%E5%A3%B0%E6%98%8E%E6%96%87%E4%BB%B6data-yml"><span class="toc-number">2.2.</span> <span class="toc-text">应用声明文件data.yml</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%BA%94%E7%94%A8%E6%A0%87%E7%AD%BE-tags-%E5%AD%97%E6%AE%B5"><span class="toc-number">2.3.</span> <span class="toc-text">应用标签 - tags 字段</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%BA%94%E7%94%A8%E7%B1%BB%E5%9E%8B-type-%E5%AD%97%E6%AE%B5"><span class="toc-number">3.</span> <span class="toc-text">应用类型 - type 字段</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%BA%94%E7%94%A8%E5%8F%82%E6%95%B0%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6-data-yml"><span class="toc-number">4.</span> <span class="toc-text">应用参数配置文件 data.yml</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%85%B3%E4%BA%8E%E7%AB%AF%E5%8F%A3%E5%AD%97%E6%AE%B5%EF%BC%9A"><span class="toc-number">4.1.</span> <span class="toc-text">关于端口字段:</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E5%85%B3%E4%BA%8E-type-%E5%AD%97%E6%AE%B5%EF%BC%9A"><span class="toc-number">4.2.</span> <span class="toc-text">关于 type 字段:</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E8%84%9A%E6%9C%AC"><span class="toc-number">4.3.</span> <span class="toc-text">脚本</span></a></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%9C%AC%E5%9C%B0%E6%B5%8B%E8%AF%95"><span class="toc-number">5.</span> <span class="toc-text">本地测试</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%8F%90%E4%BA%A4%E6%96%87%E4%BB%B6"><span class="toc-number">6.</span> <span class="toc-text">提交文件</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E6%8F%90%E4%BA%A4-Pull-Request"><span class="toc-number">7.</span> <span class="toc-text">提交 Pull Request</span></a></li></ol></div></div><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/posts/5785bd01/" title="新年快乐!">新年快乐!</a><time datetime="2026-02-13T22:56:18.000Z" title="发表于 2026-02-14 06:56:18">2026-02-14</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/7e921903/" title="添加网站左上角菜单"><img src="https://pic.biss.click/image/a40baba1-b296-4b3b-a781-da45bffb1b95.webp" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="添加网站左上角菜单"></a><div class="content"><a class="title" href="/posts/7e921903/" title="添加网站左上角菜单">添加网站左上角菜单</a><time datetime="2026-02-09T23:11:14.000Z" title="发表于 2026-02-10 07:11:14">2026-02-10</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/d2c8521/" title="将博客仓库转移到gitea"><img src="https://pic.biss.click/image/f9767ecf-b8de-461b-8e62-8f7444297ea6.webp" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="将博客仓库转移到gitea"></a><div class="content"><a class="title" href="/posts/d2c8521/" title="将博客仓库转移到gitea">将博客仓库转移到gitea</a><time datetime="2026-02-07T04:30:39.000Z" title="发表于 2026-02-07 12:30:39">2026-02-07</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/34725d47/" title="安装gitea"><img src="https://pic.biss.click/image/961bc881-cb0a-4ab7-ace5-9990e71c30a0.webp" onerror="this.onerror=null;this.src='/img/404.jpg'" alt="安装gitea"></a><div class="content"><a class="title" href="/posts/34725d47/" title="安装gitea">安装gitea</a><time datetime="2026-02-06T22:32:04.000Z" title="发表于 2026-02-07 06:32:04">2026-02-07</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/posts/f287c563/" title="添加typesense搜索">添加typesense搜索</a><time datetime="2026-02-05T05:14:16.000Z" title="发表于 2026-02-05 13:14:16">2026-02-05</time></div></div></div></div></div></div></main><footer id="footer"><div class="footer-other"><div class="footer-copyright"><span class="copyright">©&nbsp;2025 - 2026 By biss</span><span class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></span></div><div class="footer_custom_text"><p> <a style="margin-inline:5px" target="_blank" href="https://hexo.io/zh-cn/"><img src="https://img.shields.io/badge/Frame-Hexo-blue?style=flat&amp;logo=hexo" title="hexo 8.1"></a> <a style="margin-inline:5px" target="_blank" href="https://butterfly.js.org"><img src="https://img.shields.io/badge/Theme-Butterfly-pink?style=flat" title="butterfly主题"></a> <a style="margin-inline:5px" target="_blank" href="https://creativecommons.org/licenses/by-nc-sa/4.0/"><img src="https://img.shields.io/badge/Copyright-BY--NC--SA-red?style=flat&amp;logo=alchemy" title="CC BY-NC-SA 4.0"></a> </p></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="readmode" type="button" title="阅读模式"><i class="fas fa-book-open"></i></button><button id="translateLink" type="button" title="简繁转换"></button><button id="darkmode" type="button" title="日间和夜间模式切换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><button class="close" id="mobile-toc-button" type="button" title="目录"><i class="fas fa-list-ul"></i></button><a id="to_comment" href="#post-comment" title="前往评论"><i class="fas fa-comments"></i></a><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="/js/utils.js"></script><script src="/js/main.js"></script><script src="/js/tw_cn.js"></script><script src="https://unpkg.com/@fancyapps/ui/dist/fancybox/fancybox.umd.js"></script><script src="https://unpkg.com/node-snackbar/dist/snackbar.min.js"></script><div class="js-pjax"><script>(() => {
const loadMathjax = () => {
if (!window.MathJax) {
window.MathJax = {
loader: {
load: [
// Four font extension packages (optional)
//- '[tex]/bbm',
//- '[tex]/bboldx',
//- '[tex]/dsfont',
'[tex]/mhchem'
],
paths: {
'mathjax-newcm': '[mathjax]/../@mathjax/mathjax-newcm-font',
//- // Four font extension packages (optional)
//- 'mathjax-bbm-extension': '[mathjax]/../@mathjax/mathjax-bbm-font-extension',
//- 'mathjax-bboldx-extension': '[mathjax]/../@mathjax/mathjax-bboldx-font-extension',
//- 'mathjax-dsfont-extension': '[mathjax]/../@mathjax/mathjax-dsfont-font-extension',
'mathjax-mhchem-extension': '[mathjax]/../@mathjax/mathjax-mhchem-font-extension'
}
},
output: {
font: 'mathjax-newcm',
},
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
tags: 'none',
packages: {
'[+]': [
'mhchem'
]
}
},
chtml: {
scale: 1.1
},
options: {
enableMenu: true,
menuOptions: {
settings: {
enrich: false // Turn off Braille and voice narration text automatic generation
}
},
renderActions: {
findScript: [10, doc => {
for (const node of document.querySelectorAll('script[type^="math/tex"]')) {
const display = !!node.type.match(/; *mode=display/)
const math = new doc.options.MathItem(node.textContent, doc.inputJax[0], display)
const text = document.createTextNode('')
node.parentNode.replaceChild(text, node)
math.start = {node: text, delim: '', n: 0}
math.end = {node: text, delim: '', n: 0}
doc.math.push(math)
}
}, '']
}
}
}
const script = document.createElement('script')
script.src = 'https://unpkg.com/mathjax/tex-mml-chtml.js'
script.id = 'MathJax-script'
script.async = true
document.head.appendChild(script)
} else {
MathJax.startup.document.state(0)
MathJax.texReset()
MathJax.typesetPromise()
}
}
btf.addGlobalFn('encrypt', loadMathjax, 'mathjax')
window.pjax ? loadMathjax() : window.addEventListener('load', loadMathjax)
})()</script><script>(() => {
const applyThemeDefaultsConfig = theme => {
if (theme === 'dark-mode') {
Chart.defaults.color = "rgba(255, 255, 255, 0.8)"
Chart.defaults.borderColor = "rgba(255, 255, 255, 0.2)"
Chart.defaults.scale.ticks.backdropColor = "transparent"
} else {
Chart.defaults.color = "rgba(0, 0, 0, 0.8)"
Chart.defaults.borderColor = "rgba(0, 0, 0, 0.1)"
Chart.defaults.scale.ticks.backdropColor = "transparent"
}
}
// Recursively traverse the config object and automatically apply theme-specific color schemes
const applyThemeConfig = (obj, theme) => {
if (typeof obj !== 'object' || obj === null) return
Object.keys(obj).forEach(key => {
const value = obj[key]
// If the property is an object and has theme-specific options, apply them
if (typeof value === 'object' && value !== null) {
if (value[theme]) {
obj[key] = value[theme] // Apply the value for the current theme
} else {
// Recursively process child objects
applyThemeConfig(value, theme)
}
}
})
}
const runChartJS = ele => {
window.loadChartJS = true
Array.from(ele).forEach((item, index) => {
const chartSrc = item.firstElementChild
const chartID = item.getAttribute('data-chartjs-id') || ('chartjs-' + index) // Use custom ID or default ID
const width = item.getAttribute('data-width')
const existingCanvas = document.getElementById(chartID)
// If a canvas already exists, remove it to avoid rendering duplicates
if (existingCanvas) {
existingCanvas.parentNode.remove()
}
const chartDefinition = chartSrc.textContent
const canvas = document.createElement('canvas')
canvas.id = chartID
const div = document.createElement('div')
div.className = 'chartjs-wrap'
if (width) {
div.style.width = width
}
div.appendChild(canvas)
chartSrc.insertAdjacentElement('afterend', div)
const ctx = document.getElementById(chartID).getContext('2d')
const config = JSON.parse(chartDefinition)
const theme = document.documentElement.getAttribute('data-theme') === 'dark' ? 'dark-mode' : 'light-mode'
// Set default styles (initial setup)
applyThemeDefaultsConfig(theme)
// Automatically traverse the config and apply dual-mode color schemes
applyThemeConfig(config, theme)
new Chart(ctx, config)
})
}
const loadChartJS = () => {
const chartJSEle = document.querySelectorAll('#article-container .chartjs-container')
if (chartJSEle.length === 0) return
window.loadChartJS ? runChartJS(chartJSEle) : btf.getScript('https://unpkg.com/chart.js/dist/chart.umd.js').then(() => runChartJS(chartJSEle))
}
// Listen for theme change events
btf.addGlobalFn('themeChange', loadChartJS, 'chartjs')
btf.addGlobalFn('encrypt', loadChartJS, 'chartjs')
window.pjax ? loadChartJS() : document.addEventListener('DOMContentLoaded', loadChartJS)
})()</script><script>(() => {
const isShuoshuo = GLOBAL_CONFIG_SITE.pageType === 'shuoshuo'
const option = null
const getCount = () => {
const countELement = document.getElementById('twikoo-count')
if(!countELement) return
twikoo.getCommentsCount({
envId: 'https://comment.biss.click',
region: '',
urls: [window.location.pathname],
includeReply: false
}).then(res => {
countELement.textContent = res[0].count
}).catch(err => {
console.error(err)
})
}
const init = (el = document, path = location.pathname) => {
twikoo.init({
el: el.querySelector('#twikoo-wrap'),
envId: 'https://comment.biss.click',
region: '',
onCommentLoaded: () => {
btf.loadLightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)'))
},
...option,
path: isShuoshuo ? path : (option && option.path) || path
})
isShuoshuo && (window.shuoshuoComment.destroyTwikoo = () => {
if (el.children.length) {
el.innerHTML = ''
el.classList.add('no-comment')
}
})
}
const loadTwikoo = (el, path) => {
if (typeof twikoo === 'object') setTimeout(() => init(el, path), 0)
else btf.getScript('https://unpkg.com/twikoo/dist/twikoo.all.min.js').then(() => init(el, path))
}
if (isShuoshuo) {
'Twikoo' === 'Twikoo'
? window.shuoshuoComment = { loadComment: loadTwikoo }
: window.loadOtherComment = loadTwikoo
return
}
if ('Twikoo' === 'Twikoo' || !false) {
if (false) btf.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo)
else loadTwikoo()
} else {
window.loadOtherComment = loadTwikoo
}
})()</script></div><script src="/js/random.js"></script><script src="/js/shuoshuoshouye.js"></script><script src="/js/ai-summary.js"></script><script src="/js/typesense-search.js"></script><script src="/js/statistic.js"></script><script src="/js/footer.js" <script=""></script><script src="https://cdn.jsdmirror.com/npm/echarts@4.9.0/dist/echarts.min.js"></script><script src="https://cdn.jsdmirror.com/npm/aplayer/dist/APlayer.min.js"></script><script src="https://cdn.jsdmirror.com/npm/meting/dist/Meting.min.js"></script><script src="https://cdn.jsdmirror.com/gh/bishshi/welcomemessage/txmap.js"></script><script src="https://cdn.jsdmirror.com/gh/bishshi/rightmenu@1.2/rightmenu.js"></script><script src="https://cdn.jsdmirror.com/gh/bishshi/sidecalendar/calendar.js"></script><script src="https://cdn.jsdmirror.com/npm/chinese-lunar@0.1.4/lib/chinese-lunar.js"></script><script src="https://cdn.jsdmirror.com/npm/instantsearch.js@4.56.0"></script><script src="https://cdn.jsdmirror.com/npm/typesense-instantsearch-adapter@2.7.0/dist/typesense-instantsearch-adapter.min.js"></script><script src="https://unpkg.com/pjax/pjax.min.js" defer="defer"></script><script>document.addEventListener('DOMContentLoaded', () => {
const pjaxSelectors = ["head > title","#config-diff","#body-wrap","#rightside-config-hide","#rightside-config-show",".js-pjax"]
window.pjax = new Pjax({
elements: 'a:not([target="_blank"])',
selectors: pjaxSelectors,
cacheBust: false,
analytics: false,
scrollRestoration: false
})
const triggerPjaxFn = (val) => {
if (!val) return
Object.values(val).forEach(fn => {
try {
fn()
} catch (err) {
console.debug('Pjax callback failed:', err)
}
})
}
document.addEventListener('pjax:send', () => {
// removeEventListener
btf.removeGlobalFnEvent('pjaxSendOnce')
btf.removeGlobalFnEvent('themeChange')
// reset readmode
const $bodyClassList = document.body.classList
if ($bodyClassList.contains('read-mode')) $bodyClassList.remove('read-mode')
triggerPjaxFn(window.globalFn.pjaxSend)
})
document.addEventListener('pjax:complete', () => {
btf.removeGlobalFnEvent('pjaxCompleteOnce')
document.querySelectorAll('script[data-pjax]').forEach(item => {
const newScript = document.createElement('script')
const content = item.text || item.textContent || item.innerHTML || ""
Array.from(item.attributes).forEach(attr => newScript.setAttribute(attr.name, attr.value))
newScript.appendChild(document.createTextNode(content))
item.parentNode.replaceChild(newScript, item)
})
triggerPjaxFn(window.globalFn.pjaxComplete)
})
document.addEventListener('pjax:error', e => {
if (e.request.status === 404) {
true
? pjax.loadUrl('/404.html')
: window.location.href = e.request.responseURL
}
})
})</script><script async="" data-pjax="" src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script></div><div class="js-pjax" id="rightMenu"><div class="rightMenu-group rightMenu-small"><a class="rightMenu-item" href="javascript:window.history.back();"><i class="fa fa-arrow-left"></i></a><a class="rightMenu-item" href="javascript:window.history.forward();"><i class="fa fa-arrow-right"></i></a><a class="rightMenu-item" href="javascript:window.location.reload();"><i class="fa fa-refresh"></i></a><a class="rightMenu-item" href="javascript:window.scrollTo(0, 0);"><i class="fa fa-arrow-up"></i></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-text"><a class="rightMenu-item" href="javascript:rmf.copySelect();"><i class="fa fa-copy"></i><span>复制</span></a><a class="rightMenu-item" href="javascript:rmf.searchinThisPage();"><i class="fas fa-search"></i><span>站内搜索</span></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-too"><a class="rightMenu-item" href="javascript:window.open(window.getSelection().toString());window.location.reload();"><i class="fa fa-link"></i><span>转到链接</span></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-paste"><a class="rightMenu-item" href="javascript:rmf.paste()"><i class="fa fa-copy"></i><span>粘贴</span></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-post"><a class="rightMenu-item" href="javascript:rmf.copyWordsLink()"><i class="fa fa-link"></i><span>复制本文地址</span></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-to"><a class="rightMenu-item" href="javascript:rmf.openWithNewTab()"><i class="fa fa-window-restore"></i><span>新窗口打开</span></a><a class="rightMenu-item" href="javascript:rmf.open()"><i class="fa fa-link"></i><span>转到链接</span></a><a class="rightMenu-item" href="javascript:rmf.copyLink()"><i class="fa fa-copy"></i><span>复制链接</span></a></div><div class="rightMenu-group rightMenu-line hide" id="menu-img"><a class="rightMenu-item" href="javascript:rmf.saveAs()"><i class="fa fa-download"></i><span>保存图片</span></a><a class="rightMenu-item" href="javascript:rmf.openWithNewTab()"><i class="fa fa-window-restore"></i><span>在新窗口打开</span></a><a class="rightMenu-item" href="javascript:rmf.click()"><i class="fa fa-arrows-alt"></i><span>全屏显示</span></a><a class="rightMenu-item" href="javascript:rmf.copyLink()"><i class="fa fa-copy"></i><span>复制图片链接</span></a></div><div class="rightMenu-group rightMenu-line"><a class="rightMenu-item" href="javascript:randomPost()"><i class="fa fa-paper-plane"></i><span>随便逛逛</span></a><a class="rightMenu-item" href="javascript:rmf.switchDarkMode();"><i class="fa fa-moon"></i><span>昼夜切换</span></a><a class="rightMenu-item" href="javascript:rmf.translate();"><i class="iconfont icon-fanti"></i><span>繁简转换</span></a><a class="rightMenu-item" href="javascript:rmf.switchReadMode();"><i class="fa fa-book"></i><span>阅读模式</span></a><a class="rightMenu-item" href="javascript:pjax.loadUrl(&quot;/privacy/&quot;);"><i class="fa fa-info-circle"></i><span>隐私声明</span></a><a class="rightMenu-item" href="javascript:pjax.loadUrl(&quot;/cookie/&quot;);"><i class="fa fa-info-circle"></i><span>Cookie协议</span></a><a class="rightMenu-item" href="javascript:pjax.loadUrl(&quot;/cc/&quot;);"><i class="fa fa-info-circle"></i><span>版权声明</span></a></div></div><!-- hexo injector body_end start --><script data-pjax="">
function butterfly_swiper_injector_config(){
var parent_div_git = document.getElementById('recent-posts');
var item_html = '<div class="recent-post-item" style="height: auto;width: 100%"><div class="blog-slider swiper-container-fade swiper-container-horizontal" id="swiper_container"><div class="blog-slider__wrp swiper-wrapper" style="transition-duration: 0ms;"><div class="blog-slider__item swiper-slide" style="background:url(https://pic.biss.click/image/63a5c345-cb40-4e92-bc7b-7dc4daaf5b74.webp);border-radius:12px;opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><div class="blog-slider__content"><span class="blog-slider__code">2025-09-28</span><a class="blog-slider__title" onclick="pjax.loadUrl(&quot;posts/b57500e9/&quot;);" href="javascript:void(0);" alt="">在Openwrt上安装AdguardHome</a><div class="blog-slider__text">还不知道怎么描述哦</div></div></div><div class="blog-slider__item swiper-slide" style="background:url(https://pic.biss.click/image/961bc881-cb0a-4ab7-ace5-9990e71c30a0.webp);border-radius:12px;opacity: 1; transform: translate3d(0px, 0px, 0px); transition-duration: 0ms;"><div class="blog-slider__content"><span class="blog-slider__code">2026-02-07</span><a class="blog-slider__title" onclick="pjax.loadUrl(&quot;posts/34725d47/&quot;);" href="javascript:void(0);" alt="">安装gitea</a><div class="blog-slider__text">还不知道怎么描述哦</div></div></div></div><div class="blog-slider__pagination swiper-pagination-clickable swiper-pagination-bullets"></div><div class="swiper-button-prev"></div><div class="swiper-button-next"></div></div></div>';
console.log('已挂载butterfly_swiper')
parent_div_git.insertAdjacentHTML("afterbegin",item_html)
}
var elist = 'undefined'.split(',');
var cpage = location.pathname;
var epage = '/';
var flag = 0;
for (var i=0;i<elist.length;i++){
if (cpage.includes(elist[i])){
flag++;
}
}
if ((epage ==='all')&&(flag == 0)){
butterfly_swiper_injector_config();
}
else if (epage === cpage){
butterfly_swiper_injector_config();
}
</script><script defer="" src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/5.4.5/js/swiper.min.js"></script><script defer="" data-pjax="" src="https://npm.elemecdn.com/hexo-butterfly-swiper-lyx/lib/swiper_init.js"></script><!-- hexo injector body_end end --></body></html>