Mikuの鬆

Mikuの鬆

心有多宽,世界就有多远

1Panelアプリストアのサードパーティプログラムを作成する

前言#

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 <アプリのkey> <アプリのバージョン>コマンドを使用してアプリテンプレートファイルを迅速に初期化できます(注意: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   #アプリのkey、英語のみ、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云存储Email邮件服务
ServerWeb 服务器AIAI / 大模型Game休闲游戏
Runtime运行环境BIBI
Database数据库Security安全
Tool实用工具DevTool开发工具
DevOpsDevOpsMiddleware中间件
Local本地Media多媒体

shortDescZh/En#

アプリケーションの中国語 / 英語説明で、アプリがアプリストアリストやアプリ詳細ページの上部で素早く紹介されるためのもので、長すぎないように(中国語は 30 字以内)。

type#

アプリケーションの用途分類で、ここで主に 1Panel がアプリケーションをどのように扱うかを決定します。例えば、websiteタイプはそのウェブサイト機能でワンクリックでリバースプロキシを行い、ドメインを割り当てることができます。

説明
websitewebsite はウェブアプリケーションタイプで、ウェブサイトでワンクリックデプロイとリバースプロキシをサポートし、WordPress や Halo もこのタイプです
runtimemysql openresty redis などのタイプのアプリケーションで、アプリケーションの重要な実行環境に傾いています
toolphpMyAdmin redis-commander jenkins などのタイプのアプリケーションで、アプリケーションのメンテナンスツールなどに傾いています

crossVersionUpdate#

アプリケーションが大バージョン間でアップグレードできるかどうかを決定します。一般的には可能です。

limit#

このアプリケーションが最大で何個デプロイできるかを決定します。一般的には0で無制限ですが、一部のアプリケーションは確かに重複インストールできません。例えば Openresty のようなリバースプロキシサービスです。

website#

アプリケーションの公式ウェブサイトのアドレスですが、すべてのアプリケーションに公式ウェブサイトがあるわけではありません。もし本当にない場合は、アプリの GitHub リポジトリのアドレスを記入してください。本質的には連絡先アドレスです。

github#

アプリケーションの GitHub リポジトリのアドレスで、本質的に 1Panel アプリストアに提出されるアプリケーションはすべてオープンソースアプリケーションであるため、一般的にはこのようなオープンソースアドレスがあります。ローカルでカスタマイズする場合は状況に応じて行ってください。

document#

アプリケーションの使用ドキュメントのアドレスで、必要に応じて記入してください。すべてのアプリケーションに完璧な使用ドキュメントがあるわけではありません。

アプリパラメータ設定ファイル#

これはdata.ymlでもありますが、アプリケーションのバージョン番号ディレクトリの下にあります。アプリ宣言ファイルと混同しないでください。

このファイルは主にインストール時に記入する必要があるフォームを生成するために使用されます。アプリケーションバージョンフォルダの下にはフォームがなくても構いませんが、この data.yml ファイルが必要で、formFields フィールドを含む必要があります。
@1Panel アプリストアリポジトリ公式 Wiki

Halo のフォームを例にとります:

Halo インストールフォームの例(1Panel 公式アプリストアリポジトリから)
このようなフォームを生成するには、アプリパラメータ設定ファイルを次のように記入する必要があります(公式 Wiki の例から):

additionalProperties:  #固定パラメータ
    formFields:  
        - default: ""  
          envKey: PANEL_DB_HOST  #docker-composeファイルのパラメータ
          key: mysql  #依存アプリのkey、例えばmysql
		  labelEn: Database Service  #英語のラベル
		  labelZh: 数据库服务  #中国語のラベル
		  required: true  #必須かどうか
          type: service  #他のアプリに依存する場合、例えばデータベース、これを使用 
        - default: halo  
          envKey: PANEL_DB_NAME  
          labelEn: Database  
          labelZh: 数据库名  
          random: true  #default文字の後にランダム文字列を追加するか
          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 #ポートにはこのtypeを使用 

目が回るように見えますが、これを分解して説明します:

		- default: ""  
		  envKey: PANEL_DB_HOST  #docker-composeファイルのパラメータ
          key: mysql  #依存アプリのkey、例えば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#

見た目は表が明確ですが、実際に書くのはかなり頭が痛いものです。自分で表を参照して確認してください。私自身もこの項目については非常に頭を悩ませています。おおよそ、この設定はアプリケーションの設定変数が何を入力できるかを決定します。

説明
servicetype: service 他のコンポーネント(mysql、redis など)に依存する場合、key: mysql で依存の名前を定義できます。アプリケーションを作成する際に、依存アプリを先に作成する必要があります。
passwordtype: password 機密情報、パスワード関連のフィールドはデフォルトで平文を表示しません。
texttype: text 一般的な内容、例えばデータベース名、デフォルトで平文表示。
numbertype: number 一般的にポート関連の設定に使用され、数字のみを入力できます。
selecttype: select オプション、例えば truefalse、ログレベルなど。
公式が提供する下記の例を参照して確認してください:
# 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

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。