前言#
1Panel は、私が現在使用しているサーバー管理パネルで、コミュニティ版はオープンソースで無料です。全体的なパネルのデザインはシンプルで迅速で、ログイン不要で、基本的な体験では隣の宝塔よりも優れているようです。
しかし、彼が多くの初心者や一部のユーザーに好まれない理由は、アプリケーションが Docker コンテナを使用してデプロイされるためです。
Docker を使用したデプロイの欠点は、アプリケーション全体のメモリ使用量がやや高くなることと、コンテナのネットワーク設定が多くの初心者を退かせる理由です。設定がうまくいかないと、アプリケーションがデータベースに接続できなかったり、ウェブサイトのリバースプロキシが正しくないなどの問題が発生します。
しかし、Docker コンテナ化デプロイの利点も多くあります。例えば、アプリケーションの構築ステップがないため、イメージを取得した後すぐにアプリケーションを起動でき、バイナリアプリケーションファイルに近い感覚です。長時間待つ必要もなく、構築に多くのサーバー性能を必要としません。Node.js アプリケーションをデプロイする際には特に顕著です。また、設定ファイルはシンプルで、Docker Compose の設定ファイル形式を理解すればすぐに使い始められ、大規模デプロイにとって全体的な体験は非常に良好です。
もちろん、1Panel も初心者が Docker をうまく扱えない可能性があることを理解しているため、アプリケーションストアも用意されています。そこには事前に書かれた Docker Compose ファイルのテンプレートがあり、インストールをクリックするだけでワンクリックデプロイが可能で、ネットワーク設定も自動で行われます。また、自分のアプリケーションを設計してサーバーにアップロードすることもでき、ワンクリックでインストールすることもできます。これにより、1Panel 公式アプリケーションストアとサードパーティアプリケーションストアのリポジトリが登場し、リポジトリをサーバーにプルするだけで大量のアプリケーションを楽しむことができます。
実際、1Panel アプリケーションの構造は非常にシンプルで、数個のファイルだけでデプロイしたいアプリケーションを設計できます。今日はこのアプリケーションの設計方法について簡単に説明します。
注意#
注意すべきことは、1Panel アプリケーションストアの本質は実際には Docker Compose のオーケストレーションファイルのグラフィカルな表現であるため、実際にはアプリケーションが公共にアクセス可能な Docker イメージを持っている必要があります。
フォーマット#
初期化テンプレート#
1panel 1.3
以降のバージョンでは、1Panel がインストールされたサーバーで1panel app init <アプリのキー> <アプリのバージョン>
コマンドを使用してアプリテンプレートファイルを迅速に初期化できます(注意:1pctl
コマンドではありません)。
フォルダ形式#
アプリケーションのフォルダ形式は大体以下のようになります:
├──halo // アプリケーションを格納するフォルダ、ここではhaloを例にします
├── logo.png // アプリケーションのロゴ
├── 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
アプリのロゴ#
アプリケーションの概要と詳細ページに表示されるため、アプリケーションのロゴは png 形式で、縦横比は180 * 180 px
が望ましいです。アプリケーションのルートディレクトリに配置してください。例えば/halo/logo.png
のように、webp、jpg、svg などの形式は使用しないでください。
アプリ宣言ファイル#
アプリケーションの基本情報を宣言し、1Panel にアプリケーションの基本情報(名前、用途など)を知らせるためのもので、アプリケーションのルートディレクトリにあるdata.yml
ファイルに位置します。フォーマットは以下のようになります:
# 下記の部分は記入を推奨しますが、1Panelのアプリストア公式Wikiにはその用途が明記されていません
name: Halo
tags:
- 建站
title: 強大易用的開源建站工具
type: 建站
description: 強大易用的開源建站工具
# 下記の部分はアプリ宣言情報部分で、正確に記入してください!
additionalProperties: #固定パラメータ
key: halo #アプリのキー、英語のみ、Linuxでフォルダを作成するために使用
name: Halo #アプリ名
tags:
- WebSite #アプリタグ、複数可、タグリストを参照してください
shortDescZh: 強大易用的開源建站工具 #アプリの中国語説明、30字以内にしてください
shortDescEn: Powerful and easy-to-use open source website builder #アプリの英語説明
type: website #アプリの種類、アプリの分類とは異なり、1つだけです、下の種類リストを参照してください
crossVersionUpdate: true #大バージョン間のアップグレードが可能か
limit: 0 #アプリのインストール数制限、0は無制限を意味します
website: https://halo.run/ #アプリの公式ウェブサイトのアドレス
github: https://github.com/halo-dev/halo #アプリのGitHubリポジトリのアドレス
document: https://docs.halo.run/ #アプリのドキュメントのアドレス
必須のアプリ宣言情報部分について、上から下まで詳しく説明します:
key#
halo のような名前は、実際にはアプリケーションフォルダの名前です。この部分は必ずアプリケーションフォルダの名前と一致させてください。そうしないと、アプリケーションが正常にデプロイされません。
name#
アプリケーションの名前部分で、1Panel ストアのリストやアプリ詳細の上部に表示されます。記入することでアプリケーションの認識度が向上します。
tags#
アプリケーションのタグで、アプリケーションがアプリストアで所属するカテゴリを決定します。複数記入可能です。
タグリストとその対応するカテゴリは以下の通りです:
値 | 所属カテゴリ | 値 | 所属カテゴリ | 値 | 所属カテゴリ |
---|---|---|---|---|---|
WebSite | 建站 | Storage | 云存储 | 邮件服务 | |
Server | Web 服务器 | AI | AI / 大模型 | Game | 休闲游戏 |
Runtime | 运行环境 | BI | BI | ||
Database | 数据库 | Security | 安全 | ||
Tool | 实用工具 | DevTool | 开发工具 | ||
DevOps | DevOps | Middleware | 中间件 | ||
Local | 本地 | Media | 多媒体 |
shortDescZh/En#
アプリケーションの中国語 / 英語の説明で、アプリストアリストやアプリ詳細ページの上部でアプリケーションを迅速に紹介するために使用します。長すぎないように(中国語は 30 字以内)。
type#
アプリケーションの用途分類で、ここで主に 1Panel がアプリケーションをどう扱うかを決定します。例えば、website
タイプのアプリは、そのウェブサイト機能でワンクリックでリバースプロキシやドメインの割り当てができます。
値 | 説明 |
---|---|
website | website はウェブアプリケーションタイプで、ウェブサイトでワンクリックデプロイとリバースプロキシをサポートします。WordPress と Halo はこのタイプです。 |
runtime | mysql openresty redis などのタイプのアプリで、アプリケーションの重要な実行環境に傾いています。 |
tool | phpMyAdmin redis-commander jenkins などのタイプのアプリで、アプリケーションのメンテナンスツールなどに傾いています。 |
crossVersionUpdate#
アプリケーションが大バージョン間でアップグレードできるかどうかを決定します。一般的には可能です。
limit#
このアプリケーションを最大で何個デプロイできるかを決定します。一般的には0
で無制限ですが、一部のアプリケーションは確かに重複インストールできないものがあります。例えば、Openresty のようなリバースプロキシサービスです。
website#
アプリケーションの公式ウェブサイトのアドレスですが、すべてのアプリケーションに公式ウェブサイトがあるわけではありません。もし本当にない場合は、アプリの GitHub リポジトリのアドレスを記入してください。本質的には連絡先アドレスです。
github#
アプリケーションの GitHub リポジトリのアドレスで、1Panel アプリストアに提出されるアプリケーションはすべてオープンソースアプリケーションであるため、一般的にはこのようなオープンソースアドレスがあります。ローカルでカスタマイズする場合は状況に応じてください。
document#
アプリケーションの使用文書のアドレスで、必要に応じて記入してください。すべてのアプリケーションに完璧な使用文書があるわけではありません。
アプリパラメータ設定ファイル#
これはdata.yml
でもありますが、アプリケーションのバージョン番号ディレクトリ内にあります。アプリ宣言ファイルと混同しないでください。
このファイルは、インストール時に記入する必要があるフォームを生成するために主に使用されます。アプリケーションバージョンフォルダの下にはフォームがなくても構いませんが、この data.yml ファイルが必要で、formFields フィールドを含む必要があります。
@1Panel アプリストアリポジトリ公式 Wiki
Halo のフォームの例:
このようなフォームを生成するには、アプリパラメータ設定ファイルを次のように記入する必要があります(公式 Wiki の例から):
additionalProperties: #固定パラメータ
formFields:
- default: ""
envKey: PANEL_DB_HOST #docker-composeファイルのパラメータ
key: mysql #依存アプリのキー、例えばmysql
labelEn: Database Service #英語のラベル
labelZh: 数据库服务 #中国語のラベル
required: true #必須かどうか
type: service #他のアプリに依存する場合、例えばデータベースの場合、このタイプを使用
- default: halo
envKey: PANEL_DB_NAME
labelEn: Database
labelZh: 数据库名
random: true #デフォルトの文字の後にランダムな文字列を追加するか
required: true
rule: paramCommon #検証ルール
type: text #手動で記入する必要がある場合、このタイプを使用
- default: halo
envKey: PANEL_DB_USER
labelEn: User
labelZh: 数据库用户
random: true
required: true
rule: paramCommon
type: text
- default: halo
envKey: PANEL_DB_USER_PASSWORD
labelEn: Password
labelZh: 数据库用户密码
random: true
required: true
rule: paramComplexity
type: password #パスワードフィールドはこのタイプを使用
- default: admin
envKey: HALO_ADMIN
labelEn: Admin Username
labelZh: 超级管理员用户名
required: true
rule: paramCommon
type: text
- default: halo
envKey: HALO_ADMIN_PASSWORD
labelEn: Admin Password
labelZh: 超级管理员密码
random: true
required: true
rule: paramComplexity
type: password
- default: http://localhost:8080
edit: true
envKey: HALO_EXTERNAL_URL
labelEn: External URL
labelZh: 外部访问地址
required: true
rule: paramExtUrl
type: text
- default: 8080
edit: true
envKey: PANEL_APP_PORT_HTTP
labelEn: Port
labelZh: 端口
required: true
rule: paramPort
type: number #ポートはこのタイプを使用
目が回りそうですね。ここでこの内容を分解して説明します:
- default: ""
envKey: PANEL_DB_HOST #docker-composeファイルのパラメータ
key: mysql #依存アプリのキー、例えばmysql
labelEn: Database Service #英語のラベル
labelZh: 数据库服务 #中国語のラベル
required: true #必須かどうか
type: service #他のアプリに依存する場合、例えばデータベースの場合、このタイプを使用
dafault#
アプリケーションのこの変数値のデフォルト形式で、何を設定するかによってアプリケーションの設定変数がデフォルトで何が記入されるかが決まります。例えば、このアプリケーションのデフォルトのフロントエンドサイトをexample.com
に設定したい場合、ここに記入すれば、アプリケーションはデフォルトでexample.com
をフロントエンドのデフォルトサイト値として設定します。
envKey#
アプリケーションの compose オーケストレーションファイルの環境変数設定部分に対応します。例えばenvironment
の下の値ですが、実際には簡単に言うと、変数値をファイルに渡すことです。例えばHOST
変数は compose ファイル内で${HOST}
を通じて参照できます。理解しやすいですね。
以下の Halo の例での参照:
services:
halo:
image: halohub/halo:2.2.0
container_name: ${CONTAINER_NAME}
restart: always
networks:
- 1panel-network
volumes:
- ./data:/root/.halo2
ports:
- ${PANEL_APP_PORT_HTTP}:8090
command:
- --spring.r2dbc.url=r2dbc:pool:${HALO_PLATFORM}://${PANEL_DB_HOST}:${HALO_DB_PORT}/${PANEL_DB_NAME}
- --spring.r2dbc.username=${PANEL_DB_USER}
- --spring.r2dbc.password=${PANEL_DB_USER_PASSWORD}
- --spring.sql.init.platform=${HALO_PLATFORM}
- --halo.external-url=${HALO_EXTERNAL_URL}
- --halo.security.initializer.superadminusername=${HALO_ADMIN}
- --halo.security.initializer.superadminpassword=${HALO_ADMIN_PASSWORD}
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true
key#
これは 1Panel の公式 Wiki の例に登場しますが、実際には彼らはこの書き方を廃止したようです。一部のアプリは他のサービスに依存する場合があります。例えば Halo は MySQL データベースに依存します。この場合、ここに記入すればそれを参照できます。1Panel が提供するこの例は少し古いので、以下の形式を使用して外部データベースを参照することをお勧めします:
- child:
default: ""
envKey: PANEL_DB_HOST
required: true
type: service
default: mysql
envKey: PANEL_DB_TYPE
labelEn: Database Service
labelZh: 数据库服务
required: true
type: apps
values:
- label: MySQL
value: mysql
- label: MariaDB
value: mariadb
これにより、アプリケーションにデータベースを接続する方法を選択できますが、私もこれについてはあまり理解していません。実際に書く際には、他の実装済みの外部データベース接続アプリの例を Ctrl+C でコピーするのが良い方法かもしれません。
labelEn/Zh#
これはあまり多くの説明は必要ないと思います。すでに上で明確に書かれています。アプリケーションのこの項目の中英文の説明です。
required#
この変数値が必須かどうかを決定します。true
の場合、記入しないとインストールを続行できません。状況に応じてこの項目を決定できます。
type#
見た目は表が明確ですが、実際に書くのはかなり面倒なものです。自分で表を参照して確認してください。私もこの点については非常に頭を悩ませています。おおよそ、この設定はアプリケーションの設定変数が何を記入できるかを決定します。
値 | 説明 |
---|---|
service | type: service このアプリが他のコンポーネント(mysql、redis など)に依存する場合、 key: mysql で依存の名前を定義できます。アプリケーションを作成する際に、依存アプリを先に作成する必要があります。 |
password | type: password 機密情報、パスワード関連のフィールドはデフォルトで明文表示されません。 |
text | type: text 一般的な内容、例えばデータベース名、デフォルトで明文表示されます。 |
number | type: number 一般的にポート関連の設定に使用され、数字のみを入力できます。 |
select | type: select オプション、例えば true , false 、ログレベルなど。 |
公式が提供する下記の例を参照して確認してください:
# type: service、mysqlのservice依存を定義します。
- default: ""
envKey: DB_HOST
key: mysql
labelEn: Database Service
labelZh: 数据库服务
required: true
type: service
# type: password
- default: Np2qgqtiUayA857GpuVI0Wtg
edit: true
envKey: DB_PASSWORD
labelEn: Database password
labelZh: 数据库密码
required: true
type: password
# type: text
- default: 192.168.100.100
disabled: true.
envKey: REDIS_HOST
labelEn: Redis host
labelZh: Redis 主机
type: text
# type: number
- default: 3306
disabled: true
envKey: DB_PORT
labelEn: Database port
labelZh: 数据库端口
rule: paramPort
type: number
# type: select
- default: "ERROR"
envKey: LOG_LEVEL
labelEn: Log level
labelZh: 日志级别
required: true
type: select
values:
- label: DEBUG
value: "DEBUG"
- label: INFO
value: "INFO"
- label: WARNING
value: "WARNING"
- label: ERROR
value: "ERROR"
- label: CRITICAL
value: "CRITICAL"
rule#
上記の例の一部に登場しますが、主にユーザーがこの項目の形式を正しく記入しているかを検証します。例えば、特定のユーザーがポート設定にドメイン名を記入するのを防ぐために、このrule
はこの記入欄に特定の形式を強制することになります。
値 | ルール |
---|---|
paramPort | ポート範囲を 1-65535 に制限するために使用 |
paramExtUrl | 形式は http (s)://(ドメイン / IP):(ポート) |
paramCommon | 英語、数字、.- と_、長さ 2-30 |
paramComplexity | 英語、数字、.%@$!&~_-, 長さ 6-30、特殊文字は先頭または末尾に使用できません |
アプリ Compose ファイル#
アプリケーションバージョン番号ディレクトリ内のdocker-compose.yml
ファイルに位置し、フォーマット要件があります。以下は例です。
例ファイル#
services:
ghost:
container_name: ${CONTAINER_NAME}
restart: always
networks:
- 1panel-network
ports:
- "${PANEL_APP_PORT_HTTP}:2368"
volumes:
- ./data:/var/lib/ghost/content
environment:
- database__client=${PANEL_DB_TYPE}
- database__connection__host=${PANEL_DB_HOST}
- database__connection__user=${PANEL_DB_USER}
- database__connection__password=${PANEL_DB_USER_PASSWORD}
- database__connection__database=${PANEL_DB_NAME}
- database__connection__port=${PANEL_DB_PORT}
- url=${GHOST_EXTERNAL_URL}
image: ghost:5.96.2
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true
要求#
- ヘッダーに
version
の変数がないことを確認し、削除してください。 - アプリケーションの
container_name
を定義する必要があり、後ろには必ず${CONTAINER_NAME}
を記入してください。これにより、1Panel がインストール時に正しく設定できます。 - アプリケーションのネットワークを
1panel-network
に設定する必要があります。これにより、アプリケーション同士が正常に接続できます。一部のサードパーティアプリストアではこの点があまり重視されていないことがありますが、状況に応じてこの点も考慮することをお勧めします。 - ポート
ports
の設定も必ずデフォルトの${PANEL_APP_PORT_HTTP}:8090
の形式で設定してください。これにより、1Panel がアプリケーションのオープンポートを正しく設定できます。 - ファイルの末尾も例ファイルと同様に、
networks
設定を記入してください。直接Ctrl+C
でコピーしても構いません。 - アプリケーションの
image
イメージタグは、フォルダに表示されるバージョン番号と一致させる必要があります。例えば、このバージョン番号フォルダが5.96.2
と書かれている場合、そのファイル内部のimage
タグもそう書かなければなりません。そうしないと、アプリケーションの検出やインストールの更新に影響を与えます! - 上記の
labels
タグを記入することを忘れないでください。直接Ctrl+C
でコピーしても構いません。もちろん、これは必須項目ではなく、あくまで規範です。 - アプリケーションの再起動関連を定義することを忘れないでください。例えば
always
など、これによりアプリケーションが問題に遭遇した際に復元できます(雲)。
スクリプト#
イントロダクション#
1Panel は、インストール前、アップグレード前、アンインストール後に.sh スクリプトを実行することをサポートしています。
それぞれ init.sh、upgrade.sh、uninstall.sh に対応します。
保存ディレクトリ(halo の例): halo/2.2.0/scripts
ローカルテスト#
リリース前に、必ず自分がインストールした 1Panel のサーバーでテストを行い、正常にインストールできるか確認することを強くお勧めします。
アプリケーションディレクトリを 1Panel の/opt/1panel/resource/apps/local
フォルダにアップロードしてください。
注意:/opt
は 1Panel のデフォルトインストールディレクトリです。実際の状況に応じて変更してください。
アップロードが完了したら、ディレクトリ構造は以下のようになります:
├──halo
├── logo.png
├── data.yml
├── README.md
├── 2.2.0
├── data.yml
├── data
└── docker-compose.yml
1Panel アプリストアで、アプリケーションリストを更新するボタンをクリックしてローカルアプリケーションを同期します。
まとめ#
テストが正常に行われた後、公式リポジトリやサードパーティアプリストアリポジトリに提出することができます。または、自分で使用することもできますが、私はやはり共有の精神に基づいて、公式または他のサードパーティアプリストアリポジトリに提出することをお勧めします。
公式の要求と拒否率は比較的高いですが、一般的にはサードパーティリポジトリに提出するのも良い選択です。ここでは、私が知っている現在のリポジトリをいくつか挙げます:
- AuroraStarTeam/1panel-app-store、私が所属する個人組織の極光星が管理しており、理念はクリーンで整然としていますが、個人の経験はあまり豊富ではありません。
- okxlin/appstore、人気があり、最も古いサードパーティストアリポジトリで、多くのアプリがありますが、少し混乱しています。
参考文書:#
この文は Mix Space によって xLog に同期更新されました。 原始リンクは https://www.sotkg.com/posts/site/1panel-appstore-main