App Templatesを公開する

12月で一人アドベントカレンダーのようなことをやっているが、今日がこの三部作の最終日になるはずである。
今回も時系列順に見出しをつけていこうと思う:
① ChatGPTに「Custom Templates Repository 機能の廃止」を告げられる
🚨【結論(とても重要)】
⭐ Portainer CE v2.33 では、templates.json を使った Custom App Template Repository は廃止されました。
⭐ templates.json を指定してテンプレート一覧を読み込む機能は “Portainer Business Edition 限定” になりました。
つまり:
Portainer CE v2.33 では templates.json を指定する場所は存在しません。 そして templates.json を使ったテンプレート一覧読み込みはできません。
これが、画面のどこにも設定項目がなく、説明と UI が合わなかった理由の全てです。
結論から言うと私のやりたいことはもうできないというところで昨日は決着がついた。
はずだった。
② ChatGPTに「App Templatesの書き方について」質問しなおす
昨日までさんざんできないと言われた機能を別視点で質問しなおすとあっさり答えが出てきたりする。
――これは非常に期待が持てるはずだった。
ChatGPTは十分に知られている事実や、与えられたエラーをもとに正しい答えを導き出す力は強い。
だが、Portainerという良くも悪くもまだそこまで知名度のないアプリケーションの最新の書き方など知る由もないだろう。
問題なのはChatGPTは事実よりも、ユーザーに寄り添うことを優先する節がある。
語り得ぬべきことは沈黙ないし否定してほしいのだけれども、そこはLLMの弱い部分かもしれない。1
③ Giteaをパブリックに設定しなおす
そもそも私のネットワークは少々特殊で、このような構成になっている:

長らくこのような構成でやってきているので、たまに混乱することもあるがブラウザからならばドメインを指定することができる。
ただPortainerは192.168.2.0/24側のネットワークにいるので、http://192.168.2.10:3000みたいにIPアドレスを直に指定する必要がある。
こうなると当然HTTPSも指定できないので昨日のようにCustom Templateを都度設定していかなければならない。
するともうバックアップ作業は機械的に行おうと思うと大変気の遠い作業が予想されることは想像に難しくない。
④ Giteaをパブリックに設定しなおす

単純にCaddyを追加することにした。本当にただそれだけなのだが。
こうすることでどちらのネットワーク上でもhttps://gitea.example.comで直接gitリポジトリをクローンできるようになる:
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:latest
container_name: gitea
environment:
- DOMAIN=gitea.example.com
networks:
- gitea
ports:
- "3000:3000"
caddy:
image: caddy:latest
container_name: caddy
restart: always
networks:
- gitea
ports:
- "80:80"
- "443:443"
このコツはポート80、443と3000を一度にすべて公開しているということだ。
普通はコンテナのリバースプロキシを設定するとアプリケーション側の3000は必要なくなるのだが、これを消すとポート443をそのまま443で設定しないといけなくなってしまう。
GitLabのようにそう設定せざるを得ないコンテナもあるのだが、こういうフットワークの軽さがGiteaの魅力だと思う。
⑤ Portainer Templatesリポジトリを作成する
次に重要なのはGiteaに公開リポジトリを作成することである。
ここで重要なのはGitHubのようにHTTPSは認証なしでクローンを行えるように設定しなければならない。2
それからリポジトリ側でわかりやすい場所にtemplates.jsonを配置する。
ChatGPTによると必ずプロジェクトルートにtemplates.jsonでなければならないと言われたが、そんなことはなかった。
ただPortainerがJSONファイルを直接読み込めるようにhttps://gitea.example.com/infra/portainer-templates/raw/branch/master/templates.jsonという形式にする必要がある。
このときファイルの中身を次のようにする:
{
"version": "3",
"templates": [
{
"categories": [
"Express"
],
"description": "Hello world, やったね",
"title": "Dolch",
"type": 3,
"platform": "linux",
"repository": {
"url": "https://gitea.example.com/infra/portainer-templates",
"stackfile": "dolch/docker-compose.yml"
},
"name": "dolch"
}
]
}
――この正解にたどり着くのに随分苦労した。
というのもエラーは出なくて一覧が空になってしまうので何が不正解なのかがわからない。
ChatGPTはtypeは必ず"stack"を指定しろと言ってきたり、参考のファイルを与えても意見が変わらなかったり。
V2を試したり、idを加えてみたり。

というわけで最終的に表示できたので結果オーライである。
一度反映できればプッシュ直後にすぐ結果が反映できるので、やはり必須のパラメータがないと表示しないというように制御しているのだろう。
それにしても肝心のドキュメントはV2しかなく、今回のV3の内容がないようであった。
まとめ
こうして無事投げ出さずにいたらようやく自分のやりたかったことが実現できた。
正直なところこのような形で作ったとしても、結構手間のかかる作業ではあるのでもしかすると満足して使わないということも考えられる。
これまでなんとなくKamalなどに頼りっぱなしだったが、あらためてDocker Composeのデプロイも悪くないと再認識できた。
GitLabも無駄にメモリ消費量が激しすぎるし、いい加減Giteaへ本格的に移行の検討もしてみようかと思う今日この頃であった。