English Polski Deutsch Français Italiano Nederlands Svenska 繁體中文 · Markdown

Bucket & Code Server IDE ユーザーガイド

Bucket & Code Server IDE(QPKG bucketvs)は、ソースコードとファイルを QNAP NAS に保管し、その NAS でソフトウェアをビルドします。独自の Web サーバー、ツール、アカウントを備えています。

このガイドでは、NAS 上で動作しているパッケージについて説明します。

目次

NAS で動くもの

構成要素役割待ち受け先
nginxLAN からの唯一の入口。パネルを配信し、各パスをそのモジュールへ渡します9950(HTTP)、9951(HTTPS)
bvsdほかのすべてのプロセスを起動・監視し、アカウントと設定を保持し、ジョブと cron ジョブを実行し、パネルに応答します/usr/bin/bucketvs/var/run/ 内の 2 つの Unix ソケット
Git(Forgejo)Web インターフェース付きの Git ホスティング/usr/bin/bucketvs/var/run/forgejo/ 内の Unix ソケットと、SSH 経由の Git 用の 9952
SVN と Bucket(httpd)Subversion リポジトリと、履歴付きの WebDAV フォルダー127.0.0.1:9961。ほかのプログラムが使っている場合は次の空きポート
エディター(code-server)ブラウザーで動く VS Code。アカウントごとに 1 インスタンス/usr/bin/bucketvs/var/run/ide/ 内のアカウントごとの Unix ソケット
CIForgejo Actions のランナー独自のポートはありません。モジュールが有効な間は nginx がランナー用に 127.0.0.1:9960 で待ち受けます。ほかのプログラムが 9960 を使っている場合は次の空きポートを使います

コア(nginx、bvsd、パネル、cron ジョブ、ツールチェーン)は常に動作しています。Git、CI、SVN と Bucket、エディターは、管理者がオン・オフを切り替えるモジュールです。NAS のどのアドレスでも、各モジュールはそれぞれのパス(/git/、/svn/、/bucket/、/ide/)で応答します。パネルは /、このガイドは /guide/ にあります。

パッケージの動作中、プログラムは /usr/bin/bucketvs/bin にあります。パッケージが保持するもの(アカウント、設定、リポジトリ、環境、ログ)はすべて、データボリューム上の 1 つのフォルダー、つまりデータフォルダーに置かれます。

パッケージのインストール

パッケージには QTS 6.0 または QuTS hero 6.0 以降と、x86_64 または ARM 64 ビットの NAS が必要です。パッケージはアーキテクチャーごとに 1 つあります(bucketvs_<バージョン>_x86_64.qpkg、bucketvs_<バージョン>_arm_64.qpkg)。コード署名されているので、App Center からインストールしてください(パッケージを掲載しているリポジトリから、またはダウンロードしたファイルで 手動インストール)。App Center が署名を確認するので、有効な署名のないアプリを許可する必要はありません。

インストールでは、サービスユーザー bucketvs(Forgejo と httpd 用)とインストールフォルダーへのリンク /usr/bin/bucketvs が作成され、bvsd が起動します。システムログにデータフォルダーが記録されます。

データフォルダーの初期位置

最初の起動時のデータフォルダーは、パッケージをインストールしたボリューム上の BucketVS です。たとえば /share/CACHEDEV1_DATA/BucketVS(QTS)や /share/ZFS2_DATA/BucketVS(QuTS hero)です。あとからパネルで別のボリュームへ移動できます(データフォルダーの移動)。

パッケージはデータフォルダーの場所を /etc/config/bucketvs-data-root に記録します。このファイルはパッケージを削除しても残ります。パッケージを削除してもデータフォルダーとこのファイルは残るので、削除後に再インストールすると同じデータと同じアカウントで起動します。起動が、存在しないフォルダーに左右されることはありません。データフォルダーがなくなっている場合(削除した、ディスクを交換した、またはそのときボリュームがオフラインだった)、起動はパッケージのボリュームに BucketVS を作ります。同じ名前のフォルダーがすでにある場合を除いてこのフォルダーは新しく作られ、新しいフォルダーでは最初のサインインで管理者のパスワードを設定します。これは再インストール後にも、インストール済みのパッケージにも、NAS の起動時にも当てはまります。システムログには警告が記録され、.prev ファイルに古いパスが残ります。/etc/config/bucketvs-data-root.prev と、インストール済みのパッケージではインストールフォルダーの etc/data-root.prev です。古いフォルダーがその時だけオフラインだったボリュームにあった場合は、ボリュームをオンラインに戻し、パッケージを停止し、そのファイルをインストールフォルダーの etc/data-root(例: /share/CACHEDEV1_DATA/.qpkg/bucketvs/etc/data-root)に上書きコピーしてから、パッケージを起動してください。古いデータで再び動きます。

App Center からパネルを開く

App Center でパッケージの 開く を押すと、ポート 9950(HTTP)または 9951(HTTPS)でパネルが開きます。パネルでポートを変更した場合(ポート)、パッケージは次回の起動時に新しいポートを App Center に伝えます。

SSH セッションからの自動起動の設定

App Center でパッケージのスイッチがオンの間、NAS は起動時にパッケージを起動します。NAS 上の SSH セッションでは、管理者としてサービススクリプトで同じスイッチを設定できます。

/etc/init.d/bucketvs.sh disable   # 次回の起動を拒否します(NAS の起動時も)
/etc/init.d/bucketvs.sh enable    # NAS の起動時に再びパッケージを起動します

どちらのコマンドもスイッチ(/etc/config/qpkg.conf の Enable)だけを書き込み、設定した内容を表示して、同じ行をシステムログに記録します。実行中のパッケージは disable の後も動き続け、enable は何も起動しません。起動と停止は start と stop で行います。パッケージが無効の間、start は拒否されます。status は bvsd が動いているかを示します。

最初のサインイン

パネルを https://<NAS のアドレス>:9951/ または http://<NAS のアドレス>:9950/ で開きます。HTTPS のアドレスは最初は自己署名証明書を使うので、デバイスがその証明書を信頼するまでブラウザーは警告を表示します。フィンガープリントの確認方法は証明書の節を参照してください。

新しいインストールにはアカウントがありません。最初の管理者にパスワードが設定されるまで、パネルはアカウント administrator 用の画面「管理者パスワードを設定」だけを表示します。パスワードを 2 回入力してください。10 文字以上、72 バイト以下です。保存するとアカウントが作成され、サインインした状態になります。

パッケージ起動 アカウントなし; 管理者パスワードを設定 60 分間、ローカルネットワークのみ; administrator がサインイン; App Center でパッケージを再起動: 新たに 60 分の受付時間

NAS 上の SSH セッションで /usr/bin/bucketvs/bin/bvs user password administrator を実行すると、まだアカウントがない場合はアカウントが作成され、ランダムなパスワードが表示されます。その後、最初のサインインでパネルが自分のパスワードの設定を求めます(管理者が締め出されたとき)。

最初のサインインの後、概要ページにはコアだけが動いていると表示されます。各モジュールのタイルには、そのモジュールでできることと、Git をオンにする のようなオンにするボタンがあります。必要なものをオンにしてください(モジュール)。

パネルでの作業

パネルはコードエディターのように動作します。各ページはタブで開き、コマンドパレットから名前でページやアクションを呼び出せます。

アカウント

パネルには独自のアカウントがあります。QTS のアカウントではサインインできません。

ロール

ロールできること
viewerパネルの閲覧。バックアップ、ストレージ、ユーザー、ログの各ページは管理者専用です。Forgejo ではリポジトリの作成・フォーク・インポートも、組織の作成も、プッシュもできません。権限のある SVN リポジトリとバケットを読み取れますが、どれにも書き込めません
memberviewer が読めるものを読み、さらに書き込みます。書き込み権限を与えられた Git リポジトリにプッシュし、読み書き権限のある SVN リポジトリとバケットに書き込み、そこでファイルの古いバージョンを復元します。Forgejo ではリポジトリの作成・フォーク・インポートも組織の作成もできず、developer より下のロールのアカウントが所有または管理するリポジトリにはプッシュできず、CI モジュールが有効な間は Actions がオンのリポジトリにもプッシュできません。エディター、cron ジョブ、ビルドは使えません
developerさらにエディターを開き、インストール済みツールチェーンの bvs use 行を読み、自分の cron ジョブを作成・変更・実行し、アプリを作成・ビルドし、リポジトリにパッケージを公開し(掲載するのは管理者)、カーネルモジュールをチェックし、CI モジュールが有効な間は NAS 上でワークフローが実行される Git リポジトリを作成できます
adminすべて。アカウント、設定、ストレージ、ネットワーク、モジュール、ツールチェーン、環境、すべての cron ジョブ、アプリの有効化、カーネルモジュールのロード、リポジトリへのパッケージの掲載

developer ロールは NAS 上の root と同じです。cron コマンドは root として実行され、エディターのターミナルも同様です。CI モジュールが有効な間は、プッシュできるリポジトリのワークフローも root で実行されます。NAS の admin パスワードを渡してもよい相手にだけ付与してください。リポジトリに書き込むだけの人には member ロールで十分です。

アカウント では、各自が自分のロールとそのロールでできることを確認でき、このセクションへのリンクもあります。ロールを超えるページには必要なロールが表示され、管理者だけが変更できるものは、表示される場所でそう示されます。ネットワーク、Git、CI の設定は、それ以外のロールには値として表示され、空の値は「未設定」と表示されます。

ワークフローは NAS 上で root として実行されるため、bvsd は member または viewer が所有するか書き込めるすべての Git リポジトリで Actions をオフにしておきます。そのようなアカウントにリポジトリへの書き込み権限を与えると、1 分以内にそのリポジトリの Actions がオフになり、Git ページには管理者向けにそのリポジトリが一覧表示されます。そこで Actions を使うには、まず Forgejo でその書き込み権限を外すか、そのようなアカウントが所有するリポジトリを developer のアカウントに移してください。

アカウントの作成と変更

管理者はユーザーページでアカウントを管理します。

パスワードとセッション

誤ったパスワード

プロキシの背後では、プロキシが報告するアドレスが数えられますが、それはプロキシが信頼するプロキシである場合だけです。そうでない場合、すべてのクライアントがプロキシ自身のアドレスとして数えられ、誰かが 5 回パスワードを間違えると全員が 15 分間締め出されます。

2 要素認証

各アカウントは「アカウント」で自分で有効にします。認証アプリで QR コードを読み取り(またはキーを入力し)、アプリに表示される 6 桁のコードを入力します。以後、サインインではパスワードのあとにコードが求められます。

API トークン

スクリプトや CI は、パスワードの代わりに API トークンを使います。「アカウント」の「新しいトークン」で作成します。

管理者が締め出されたとき

NAS の管理者は、NAS 上の SSH セッションから任意のアカウントをリセットできます。bvs コマンドは、root だけが開けるソケット(/usr/bin/bucketvs/var/run/bvsd-cli.sock、モード 600)で bvsd と通信します。

/usr/bin/bucketvs/bin/bvs user list
/usr/bin/bucketvs/bin/bvs user password administrator
/usr/bin/bucketvs/bin/bvs user totp-reset administrator
/usr/bin/bucketvs/bin/bvs user unlock administrator

このソケット上のリクエストはすべて組み込み管理者 cli として動作し、データフォルダーの log/audit.log に記録されます。これらのコマンドには bvsd が動作している必要があります。

データフォルダー

データフォルダーは、パッケージが保持するものをすべて収めるフォルダーです。そのパスは /usr/bin/bucketvs/etc/data-root の 1 行です。ストレージページに、パスと、それが置かれたボリュームとその空き容量が表示されます。

bvsd は、データフォルダーが実際のボリューム上のフォルダーである場合にだけ起動します。パッケージの起動処理は先にこれを確認し、存在しないフォルダーや tmpfs、ramfs 上のフォルダーの場合は、データフォルダーの初期位置のとおり、インストール先のボリュームに新しいデータフォルダーを作ります。オフラインのボリュームはマウントポイントを NAS の RAM 上の空フォルダーとして残すため、そこに書いた設定は次の再起動で消えてしまうからです。bvsd 自体がこのようなフォルダーを拒否するのは手動で起動したときだけで、その理由は QTS のシステムログに記録されます。

bvsd が各プロセスに与えるもの

QTS は /tmp を小さな RAM ディスクに、/root を再起動で空になる RAM ディスクに置いています。そのため bvsd が起動するすべてのプロセス(モジュールのプログラム、cron ジョブ、インストール)は、一時ファイルとホームフォルダーをデータフォルダー内に持ちます。

変数値
HOME<データフォルダー>/home/<ユーザー>
TMPDIR<データフォルダー>/tmp
XDG_CACHE_HOME、XDG_CONFIG_HOMEそのホーム内の .cache と .config
npm_config_cacheそのホーム内の .npm
PATH~/.local/bin、~/.npm-global/bin、次にパッケージの bin、sbin、node/bin、次にシステムのフォルダー
SSL_CERT_FILE、GIT_SSL_CAINFO、CURL_CA_BUNDLEパッケージの CA バンドル /usr/bin/bucketvs/etc/ssl/cacert.pem
TZQTS で設定された NAS のタイムゾーン
SHELL、EDITORパッケージの bash と nano
LANG、LESSCHARSETC.UTF-8 と utf-8。日本語などを含むファイル名がそのまま表示されます

データフォルダーの移動

ストレージページでは、データフォルダー全体を /share 配下の別のフォルダーへ移動できます。共有フォルダーまたはボリュームを選ぶと、その中の新しいフォルダー BucketVS にデータが入ります。フォルダーそのものを使うには、BucketVS という名前の空フォルダーを開きます。共有フォルダーは QTS(コントロールパネル、共有フォルダー)で作成します。共有フォルダーやボリュームの中では、このページで新しいフォルダーを作成できます。選択画面は現在データがある場所で開き、そのことを表示します。そこから移動先の共有フォルダーまたはボリュームを開いてください。

移動を始める前に、ページは移動先を確認し、拒否する理由をすべて表示します。

移動先を再確認 空き容量: データ + 10 %; モジュールを停止 パネルは動作を継続; コピー rsync -aHAX --numeric-ids; コピーを検証 ファイル、バイト数、所有者、モード、時刻、 最大 1000 ファイルの sha256; データフォルダーを切り替え /usr/bin/bucketvs/etc/data-root; bvsd が新しいルートで再起動 モジュールを起動; 古いコピーは MOVED-TO 付きで残る 削除するまで; 古いルートを引き続き使用 モジュールを再起動

移動中は次のようになります。

切り替え後、bvsd は停止し、新しいルートで自身を再起動します。そのため数秒間パネルが使えなくなります。

移動に失敗した場合は、古いデータフォルダーが引き続き使われ、モジュールが再起動します。ジョブのエラーには、何が失敗したか、コピーがどうなったかが示されます。

古いコピーと残りのコピー

移動が成功すると、古いデータフォルダーは MOVED-TO という名前のファイル付きで元の場所に残ります。何もそれを使いません。ストレージページの「古いコピーを削除」で削除でき、「このコピーを削除」で失敗した移動の残りのコピーを削除できます。どちらの削除も 1 つのファイルシステム内で行われ、リンクをたどることはありません。マウントポイントや共有フォルダー自体のフォルダーは、中身を空にしたうえで残されます。

ネットワーク

ネットワークページには、ポート、平文の HTTP の扱い、モジュールのホスト名、信頼するプロキシ、公開 URL、証明書があります。保存すると、変更に必要なものが再起動され、その一覧が表示されます。

ポート

設定既定値内容
HTTPS9951TLS 経由のパネルとモジュール
HTTP9950平文の HTTP 経由のパネルとモジュール
SSH 経由の Git9952SSH 経由の Git
クローン URL の SSH ポート0SSH のクローンアドレスに表示されるポート。0 は上の SSH ポートを意味します。ルーターが別のポートを NAS に転送している場合に設定します。
クローン URL の SSH ホスト空SSH のクローンアドレスに表示される名前またはアドレス。空のときは Git のホスト名、なければ公開 URL のホスト、それもなければ NAS の LAN アドレスです。Cloudflare Tunnel で公開した名前には、LAN アドレスと SSH 経由の Git のポートを使います。DNS のみの名前か、ルーターが SSH ポートを転送している場合はルーターのアドレスを設定します。

ポートは 1024~65535 で、互いに異なる必要があります。127.0.0.1 上のモジュール用ポート(9960 と 9961)は拒否されます。ほかのプログラムが 9960 や 9961 を使っているために httpd や CI ランナーのサーバーが代わりに使っているポートも拒否されます(メッセージにそのポートが示されます)。新しいポートを使えなかったために保存後も nginx が古いポートのままの場合は、通知で理由が示されます。NAS に IPv6 がある場合、nginx は IPv6 でも待ち受けます。

平文の HTTP

サインインページは、平文の HTTP で開かれたときに警告を表示します。この場合、パスワードは読み取れる状態でネットワークを流れます。

証明書

最初の起動時に、bvsd は次の名前に対する自己署名証明書(ECDSA P-256)を作成します。

有効期間は 825 日で、手動で信頼した証明書であっても Apple のデバイスが受け入れる上限です。bvsd は起動時と 1 日 1 回証明書を確認し、残りが 30 日以下になったとき、名前の組み合わせが変わったとき、鍵が一致しないときに新しい証明書を作成します。新しい証明書を作成すると通知が送られます。ネットワークページには、名前、有効期間、SHA-256 フィンガープリントが表示されます。デバイスで信頼する前にフィンガープリントを照合してください。

「独自の証明書を追加」では、PEM 形式の証明書チェーンとその秘密鍵を登録します。

証明書と鍵はデータフォルダーの etc/tls/ にモード 600 で保存されます。アップロードした証明書が期限切れになったり、これらの確認を通らなくなったりすると、nginx は代わりに自己署名証明書を使い、通知で理由を伝えます。アップロードした証明書の残りが 30 日以下になった場合も通知が送られます。「新しい自己署名証明書」は新しい自己署名のペアを作成し、そちらに切り替えます。

プロキシ経由で接続するクライアントに見えるのは、この証明書ではなくプロキシの証明書です。

ネットワークページの 証明書をダウンロード は、パネルが提供している証明書を鍵なしで <名前>.crt として保存します。デバイスの信頼された証明書に追加すると、そのデバイスのブラウザーがパネルを信頼します。エディターの拡張機能のビューにはこれが必要です(拡張機能)。新しい自己署名証明書は、あらためて信頼する必要があります。

信頼するプロキシ

NAS の前に置いたプロキシのアドレス(例: 192.168.1.5)など、IP アドレスまたは CIDR 範囲のリストです。TCP 接続がこれらのいずれかから来たリクエストに限り、nginx は次の値を採用します。

それ以外のアドレスからのリクエストはクライアントから直接来たものとして扱われ、nginx はその X-Forwarded-* ヘッダーを自分の値で置き換えます。範囲を指定すると、その中のすべてのホストが信頼され、どのホストもクライアントのアドレスとスキームを設定できるようになります。プロキシ自身のアドレスを指定してください。すべてのアドレスを含む範囲(0.0.0.0/0、::/0)は拒否されます。

公開 URL

https://git.example.com のように、パスを含まないアドレスだけを指定します。どのリンクがこの URL で始まるかは、各モジュールの節に記載しています。

リバースプロキシ(Plesk)の背後で使う

一般的な構成では、公開証明書を持つプロキシで TLS を終端し、プロキシから LAN 上のポート 9950 へ平文の HTTP で接続します。以下の例では、公開名に bvs.example.com、NAS に 192.168.1.20、Plesk サーバーに 192.168.1.5 を使います。実際の値に置き換えてください。

ブラウザー、git、WebDAV クライアント; Plesk の nginx bvs.example.com 公開証明書; NAS 上の nginx 192.168.1.20; / パネル、/api/ bvsd; /git/, /svn/, /bucket/, /ide/; SSH 経由の git

NAS 側

  1. ネットワークページで、Plesk サーバーのアドレス(NAS から見えるアドレス)を信頼するプロキシに追加します。
  2. 平文の HTTP は「そのまま提供」のままで構いません。Plesk サーバーを信頼するプロキシにすれば、「HTTPS にリダイレクト」でも動作します。

Plesk 側

ドメインの「Apache & nginx の設定」の「追加 nginx ディレクティブ」欄(英語の画面では「Additional nginx directives」)に、次のディレクティブを入力します。

location ~ ^/ {
    proxy_pass http://192.168.1.20:9950;
    proxy_http_version 1.1;

    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # WebSocket: エディターとそのターミナル
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;

    # 大きなプッシュとアップロード: サイズ制限なし、ストリーミング、1 時間の無通信を許容
    client_max_body_size 0;
    proxy_request_buffering off;
    proxy_buffering off;
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
}

location ~ ^/ は正規表現の location です。nginx は一致する正規表現を通常の location /(Plesk が独自に書き込むもの)より優先するので、このブロックがサイトのすべてのパスを処理し、パスなしの proxy_pass はリクエストのパスをそのまま渡します。同じ設定ページで「nginx で静的ファイルを直接配信する」をオフにしてください。オンのままだと、Plesk は .js、.css、画像ファイルへのリクエストにドメイン自身のフォルダーから応答し、パネルが読み込まれません。

ドメインのホスティング設定で、HTTP から HTTPS への SEO に配慮した恒久的な 301 リダイレクトをオンにします(英語の画面では「Permanent SEO-safe 301 redirect from HTTP to HTTPS」)。追加 nginx ディレクティブは、ポート 80 の平文の HTTP のサイトにも適用されます。リダイレクトがないとサイトはそこでも応答し、パスワードが暗号化されずにインターネットを流れます。

各行が必要な理由は次のとおりです。

ディレクティブないと起きること
Host $http_hostNAS 上の nginx は Host でサーバーブロックを選ぶので、モジュールのホスト名が一致しなくなります。bvsd はページの Origin と Host をポートも含めて比較するので、パネルでの変更がすべて 403 csrf で失敗します。$host では 443 以外の公開ポートが落ち、同じように失敗します。
X-Forwarded-Forすべてのクライアントが Plesk サーバーとして数えられ、1 人が 5 回パスワードを間違えると全員が 15 分間締め出されます
X-Forwarded-Proto $schemeセッション Cookie に Secure が付かず、「HTTPS にリダイレクト」モードではすべてのリクエストが公開名のポート 9951 に送られます
Upgrade、Connectionエディターのページは開きますが、エディターとそのターミナルが接続されません
client_max_body_size 0、proxy_request_buffering off、タイムアウト大きなプッシュやアップロードにプロキシ自身のサイズ制限とタイムアウトが適用されます

X-Forwarded-For と X-Forwarded-Proto が有効なのは、Plesk サーバーが信頼するプロキシに含まれている場合だけです。含まれていない場合、NAS 上の nginx はこれらを無視します。

SSH 経由の Git

HTTP プロキシは SSH を中継しません。SSH 経由の Git は、NAS のポート 9952 に直接、またはルーターの TCP ポート転送を経由して接続します。ネットワークページの「クローン URL の SSH ポート」で、クローンアドレスに表示するポートを設定し、公開名がプロキシにしか届かない場合は「クローン URL の SSH ホスト」で名前またはアドレスを設定します。

設定の確認

モジュールのホスト名

モジュールには専用のホスト名を設定できます(ネットワークページのホスト名)。その場合、nginx はそのホスト名のルートでそのモジュールだけを配信します。ホスト名は NAS、または NAS の前に置いたプロキシを指している必要があります。プロキシでは、ホスト名ごとに上と同じディレクティブを持つサイトが必要です。

モジュールホスト名のルートそのほかにあるもの
GitForgejoほかのすべての名前の /git/ は、同じパス、クエリ、ポートで Git のホスト名へ 302 を返します
エディターcode-serverパネルのサインインページと /api/。そのホスト名でサインインできます
SVN と Buckethttpdリポジトリは /svn/<名前>、バケットは /bucket/<名前> のままです

オフのモジュールは、そのパスでもホスト名でも、その旨を記した文とともに 503 を返します。

すべてのホスト名で 1 回のサインイン

セッション Cookie は、設定されたホスト名に属します。ただし、設定 network.cookie_domain がすべてのモジュールホスト名の親ドメインを指定している場合は別です。example.com を設定すると、bvs.example.com でのサインインが git.example.com と ide.example.com にも有効になります。bvsd は、パブリックサフィックス(com、com.pl、co.uk、myqnapcloud.com)、すべてのモジュールホスト名の親ではないドメイン、モジュールホスト名が 1 つも設定されていない間のすべてのドメインを拒否します。そのドメイン配下のすべてのサイトが Cookie を受け取るので、できるだけ狭い共通の親ドメインを設定してください。

この設定はネットワークページには表示されません。NAS の管理者が、パッケージの curl で CLI ソケット経由で設定します。

/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
  -X PUT -H 'Content-Type: application/json' \
  -d '{"network":{"cookie_domain":"example.com"}}' \
  http://bvsd/api/v1/settings

空の値("")にすると、Cookie は再びホスト名ごとになります。

インターネットへの公開(Cloudflare Tunnel)

公開 ページ(管理、管理者のみ)は、DNS を Cloudflare に置いているドメインの名前で、パッケージをインターネットに公開します。パッケージに含まれる cloudflared が NAS から Cloudflare へ接続するので、ルーターのポートを開ける必要はなく、名前の証明書は Cloudflare が持ちます。すべてのリクエストはパッケージの nginx を通ります。パネルとその API にはサインインが必要で、アカウントなしで開けるのは公開したもの(公開リポジトリ、その Web ビュー、パッケージリポジトリ)だけです。

名前には 2 種類あり、それぞれ最大 1 つです。

種類例提供するもの
メインのホスト名code.example.comパネルとその API、/git/ の Forgejo、/svn-web/ と /bucket-web/ の Web 表示、/repo/ のパッケージリポジトリ(読み取りのみ)、ガイド。/svn/ と /bucket/ はそこでは 404 を返し、/ide/ もエディターを公開するまで 404 です(下記)
パッケージ用のホスト名qpkg.example.comほかの NAS の App Center 向けに /repo/ の GET と HEAD のみ。それ以外はすべて 404 を返します

トークンに必要なもの

dash.cloudflare.com(My Profile、API Tokens)で、名前のゾーンに対して次の権限を持つ API トークンを作成します。

パッケージはトークンを NAS 上の root だけが読めるファイルに保存し、二度と表示しません。

トークンに Client IP Address Filtering がある場合は、NAS の公開アドレスを IPv4 と IPv6 の両方とも入れてください。NAS は IPv6 アドレスを持っていると IPv6 で Cloudflare に接続します。そうしないと公開ページは token_ip_filter で拒否し、Cloudflare から見えたアドレスを示します。

公開する

名前とトークンを入力し、公開 を押します。パッケージはまず Cloudflare ですべてを確認し、確認に失敗した場合は Cloudflare 側で何も変更しません。メッセージには直すべき点が示されます。

その後、トンネルを作成し(名前を指定しなければ bucketvs-<NAS 名>。Cloudflare にその名前のトンネルが残っていれば引き継ぎます)、プロキシされた CNAME レコードで各名前をトンネルに向け、キャッシュルールを追加して cloudflared を起動します。同じ値で 再公開 しても何も変わりません。公開 URL(ネットワーク)をメインのホスト名の https:// アドレスに設定すると、Forgejo のリンクと HTTPS のクローンアドレスにその名前が使われます。両者が異なる間は、ページがそのことを知らせます。

SSH 経由の Git はトンネルを通りません。Cloudflare が公開した名前に運ぶのは HTTP だけです。そのため SSH のクローンアドレスは、パネルでも Forgejo 自身のクローン欄でも、NAS の LAN アドレスとその SSH 経由の Git のポート(9952)になり、Git ページと概要には「SSH でのクローンはローカルネットワークで使えます。インターネットからは HTTPS でクローンしてください。」と表示されます。インターネットから SSH を使うには、ルーターで SSH ポートを転送し、クローン URL の SSH ホスト(ネットワーク)をルーターの公開アドレスか、それを指す DNS のみの名前に設定します。ルーターが別のポートを使う場合は クローン URL の SSH ポート も設定します。

メインのホスト名の /ide/ は、管理者が 公開 ページで エディターをメインのホスト名に公開 をオンにするまで 404 を返します。エディターのターミナルは NAS の root シェルで、インターネットからそこに開発者または管理者としてサインインした人は誰でも使えるため、先にそれらのアカウントで 2 要素認証を有効にしてください。スイッチがオンのとき、エディターは LAN と同じサインインを通り、ポートプロキシ(/ide/proxy/<port>/)はそこではオフのままで、Cloudflare はそのページをキャッシュしません。オンの間、概要には インターネット上のエディター と表示されます。

CI モジュールがオンの間、この Forgejo の任意のリポジトリへプッシュされたワークフローは、インターネットからでも LAN からでも、NAS 自身のランナーによって NAS 上で root として実行されます。エディターのターミナルと同じ権限です。公開 ページの インターネットから届く範囲 にもそう書かれています。プッシュ権限は、NAS の管理者パスワードを渡してもよい人にだけ与えてください。

キャッシュ

キャッシュのプリセット がオンのとき、Cloudflare はパッケージ(*.qpkg)を 1 年、アイコンを 1 日、repo.xml を 5 分、パネルのファイルを 1 年キャッシュします。API、Forgejo のページ、サインインページ、Web 表示は決してキャッシュしません。パッケージリポジトリに公開すると、repo.xml(と、変更されたアイコンや削除されたバージョンのファイル)が Cloudflare のキャッシュからすぐに消去されます。パッケージは自分のルールをゾーンのキャッシュルールの最後に追加し、ほかのルールは変更しません。

インターネットからのサインイン

最初のパスワードは、公開した名前からは決して設定できません。初期設定はローカルのクライアントだけを受け付けます。誤ったパスワードは、LAN と同じようにインターネットのクライアントごとに数えられます。git で Forgejo に送ったパスワードも数えられます。Forgejo のアクセストークンはこれまでどおり使えます。Cloudflare が受け付けるリクエストは 100 MB までなので、それより大きいプッシュやアップロードは LAN のアドレスを使ってください。

停止と削除

停止 は cloudflared を終了します。名前には Cloudflare 自身のエラーページが表示され、Cloudflare 側は何も変わりません。Cloudflare から削除 は、パッケージが作成した DNS レコード、キャッシュルール、トンネルを削除し(引き継いだトンネルは残ります)、トークンを破棄します。名前を公開している間は、概要ページにトンネルの状態を示す インターネット の表示が出ます。

モジュール

概要ページには、各モジュールがプロセス、メモリー、CPU とともに表示され、オン・オフを切り替えられます(管理者のみ)。オフのモジュールには、そのモジュールでできることが表示されます。管理者は、タイル、モジュール自身のページ、エディターモジュールならエディタータブにあるボタン(Git をオンにする、エディター をオンにする など)でオンにします。

状態意味
実行中モジュールのすべてのプロセスが動作しています
起動中1 秒以内に起動したプロセスがあります
一部異常再起動待ちのプロセスがある、モジュールのファイルを書き込めなかった、またはヘルスチェックに失敗しています
再起動を繰り返していますあるプロセスが 10 分以内に 5 回終了しました。bvsd は 15 分ごとに再起動し、通知が 1 回送られています
停止モジュールのプロセスが動作していません(データの移動で停止したか、起動に失敗しました)
オフモジュールはオフです

終了したプロセスは 1 秒後に再起動され、その後 2 秒、4 秒と延び、最大 60 秒になります。10 分間動作すると、待ち時間は 1 秒に戻ります。再起動を繰り返しているプロセスは、モジュールをオフにしてからオンにするとすぐに起動します。

Git

Git モジュールは Forgejo を実行します。Forgejo は、イシュー、プルリクエスト、リリース、Wiki、LFS、ミラー、Webhook を備えた git リポジトリの Web インターフェースです。管理者は、概要ページまたは Git ページの Git をオンにする でオンにします。ジョブが <データ>/forgejo に Forgejo のフォルダーとデータベースを準備し、パネルの全アカウントを Forgejo に追加して起動します。以後、Forgejo はパネルのアドレスの /git/、または Git のホスト名を設定した場合はその / で開きます(モジュールのホスト名を参照)。

Git ページの 新しいリポジトリ(リポジトリがまだない間は概要ページの Git タイルにも表示)は、Forgejo のリポジトリ作成フォームを開きます。パネルは、このボタンと リポジトリの移行またはミラー を developer ロール以上にだけ表示します。Forgejo では viewer と member はリポジトリを作成できないためです。

リポジトリとアカウント

HTTPS と SSH でのクローン

Git ページの リポジトリをクローン は、所有者とリポジトリに対する両方のコマンドを表示します。

方法アドレスサインイン
HTTPS(または HTTP)https://<NAS のアドレス>:9951/git/<所有者>/<リポジトリ>.gitパネルのユーザー名とパスワード、またはアクセストークン
SSHssh://git@<NAS のアドレス>:9952/<所有者>/<リポジトリ>.gitForgejo の 設定、SSH / GPG キー で追加した SSH 鍵

アカウントのない人にリポジトリを見せる

Git ページの 公開閲覧 をオンにすると、Forgejo にアクセスできる人は誰でも、アカウントなしで公開リポジトリを閲覧できます。Forgejo では、各リポジトリが公開か非公開かを設定します(リポジトリの 設定、公開範囲)。スイッチがオンのとき、アカウントのない訪問者は次のことができます。

非公開のリポジトリは見えないままで、そのアドレスは「見つかりません」を返します。スイッチがオンの間、Forgejo はアカウントの一覧も表示しません(探索の ユーザー タブとユーザー検索は、サインイン済みのユーザーに対してもオフになります)。そのため訪問者がアカウント名を集めることはできません。プッシュ、イシュー、プルリクエスト、設定には引き続きアカウントが必要です。スイッチがオフのときは、どのページも訪問者に最初にサインインを求めます。

リポジトリを共有するには、Forgejo でリポジトリを公開にし、公開閲覧 をオンにして、アドレスを送ります。Git のホスト名がある場合、アドレスは https://<Git のホスト名>/<所有者>/<リポジトリ> です。

新しいプロジェクト

新しいプロジェクト は、プロジェクトを何もない状態から、ビルドして発行した最初のバージョンまで、手順に沿って進めるページです。コマンドパレット(Ctrl+Shift+P、新しいプロジェクト)、エディターのサイドバーの上部、Git サイドバーのヘッダー、Git ページ、[プロジェクト]ページから専用のタブで開きます。[例]ページの エディター用プロジェクト にある例には この例からプロジェクトを作成 があります。developer ロール、Git とエディターのモジュール、Forgejo 上の自分のアカウントが必要です(Git ページに同期状態が表示されます)。Git またはエディターがオフのあいだは、ページが手順の上にそのことを示し、管理者はそこでボタン 1 つでオンにできます。

  1. テンプレート。 テンプレートはグループに分かれています。プログラム(C、CMake を使う C++、Go、Rust、Node、Python、Java)、QTS 用パッケージ(QPKG パッケージ、App Builder アプリ、ソースからのパッケージ)、カーネル(カーネルモジュール、USB シリアルドライバー ch341)、Web サイト(静的サイト:src/ のページ、public/ をビルドする Makefile、make test のリンク確認)、例です。各カードはビルドで何ができるかを示し、この NAS にまだないもの(QDK、ビルド環境、オフのモジュール)を、それを追加するページへのリンク付きで示します。
  2. 名前と公開範囲。 名前はリポジトリとフォルダー projects/<名前> の名前になり、入力中に確認されます。続いて所有者(自分のアカウント、または Forgejo でリポジトリを作成できる組織)、非公開か公開か、必要なら説明を指定します。App Builder アプリでは、元にするプリセットとターゲットを選びます。
  3. サービス(QPKG パッケージとソースからのパッケージ)。パッケージの起動と停止をブロックで組み立てます。プリセットを選び(コマンドラインツールはプログラムを /usr/bin にリンク、バックグラウンドサービスはアカウント、ボリューム上のデータフォルダー、そのアカウントでのプログラム起動、ポートの待機、タイムアウト付きの停止を追加、Web アプリは App Center の「開く」ボタンを追加、空は動詞だけ)、そのブロックを変更します。各ブロックのカードには、入力中からスクリプトに書き込まれる行が表示され、拒否された値はその欄の下に示されます。起動が App Center の Enable をオンにすることはなく、停止が Enable に触れることもありません。ブロックはあとでプロジェクトビューから変更できます。
  4. ビルド。 プロジェクトをビルドする環境です。プロジェクトごとに保持され(あとでプロジェクトビューで変更できます)、なしにするとビルドのたびに bvsd が選びます。このステップは最初に、bvsd 自身が選び bvs qbuild と CI がビルドに使う環境を示します。Ubuntu 24.04 builder、なければ Debian 12 builder、それもなければほかの Debian または Ubuntu 環境です。テンプレートの Makefile が各アプリの環境を ENV 行で指定している場合、このステップはそのことを示して環境を尋ねず、プロジェクトも環境を保持しません。ソースからのパッケージでは、スターターレシピのソースのアドレスと sha256 が仮のものであることも示します。レシピにプログラムの本当のソースとそのファイルの sha256 を書くまで、最初のビルドは失敗します。ページには CI がプッシュのたびに実行するワークフローが表示されます。作成後すぐにビルド はオフにしない限りオンですが、ソースからのパッケージでは最初はオフで、オンにすることもできます。NAS に Debian または Ubuntu の環境がない場合、このステップはそのことを示します。管理者はそこで この環境を作成 からビルド環境を作成でき、作成後はこのステップがその環境を示します。そうでなければ 作成後すぐにビルド をオフにして、プロジェクトをあとでビルドしてください。
  5. 公開(QPKG パッケージ、App Builder アプリ、Web サイトの場合):この NAS でテストデプロイ(管理者、署名済みパッケージのみ。アプリでは この NAS で有効化)、この NAS の App Center リポジトリに公開、自分の Web サーバーに公開(管理者、下の「自分の Web サーバー(Web ターゲット)」のいずれか)。保存先を追加 で新しいターゲットを保存できます。どれも任意です。公開の選択は、プロジェクトのスイッチ App Center リポジトリに公開(プロジェクトビューの[設定])の値にもなります。オンの間は、プロジェクトの CI が実行のたびにそこへ公開します。
  6. 確認 にはすべての回答と、実行される手順が並びます。プロジェクトを作成 で送信します。
  7. 進行状況 は各手順のジョブを追います。リポジトリと最初のコミット、最初のビルド、続いてテストデプロイ、App Center への公開、Web への公開を順に実行します。各行には状態とログの末尾が表示され、クリックするとログが表示されます。失敗した手順は理由を示して 再試行 を出し、後の手順は待ちます。最後に プロジェクトを開く、エディターで開く、Forgejo で開く が出ます。ページを再読み込みしたりタブに戻ったりするとジョブを読み直し、同じ手順を二度送ることはありません。ページを離れるとチェーンは止まります。プロジェクトビューにも同じ手順があります。

bvsd がプロジェクトを拒否した場合(フォルダー、アプリ、リポジトリですでに使われている名前、作成できない所有者)、ページはその回答のある手順に戻り、理由を入力欄の下に示し、ほかの回答はすべて残します。オフのモジュール(管理者はページからオンにできます)、まだない Forgejo アカウント、App Builder アプリ用の Debian または Ubuntu 環境がないことは[確認]で説明されます。

最初のジョブは次のことを行います。

CI モジュールがオンになると、ワークフローはプッシュのたびに NAS のランナーで、ワークフローに書かれた環境で実行されます。QPKG のワークフローはパッケージをパッケージリポジトリに公開します。リポジトリはコード署名されたパッケージだけを受け付けます。リポジトリ作成後に最初のコミットやそのプッシュが失敗した場合、ジョブはフォルダーを削除し、リポジトリも削除して、理由を示します。プロジェクトのスイッチ App Center リポジトリに公開 がオフの間は、ワークフローの bvs repo publish は公開せずに通知を出し、実行はそのまま続きます。

プロジェクトビュー

データフォルダーの projects/ にある各フォルダーには専用のページがあります。ウィザードで作ったプロジェクト、エディター用プロジェクトの例のコピー、そこにクローンしたリポジトリのどれでもかまいません。エディターのサイドバーの プロジェクト から、[プロジェクト]ページから、「新しいプロジェクト」の最後の プロジェクトを開く から、コマンドパレット(プロジェクト … を開く、または Ctrl+P と名前)から開きます。開発者ロールが必要です。[プロジェクト]ページのプロジェクトのメニューにも、ビルド、再ビルド、公開、Web ターゲットへの公開があります。同じメニューで、CI による App Center への公開をオンまたはオフにできます。

ページはフォルダーを読むだけで、自分からは何も変更しません。プロジェクトの種類はファイルから判断します。フォルダー名と同じ名前の App Builder のアプリ、先頭の qpkg.cfg(QPKG パッケージ)、先頭の Makefile、またはそのどれでもない場合(プロジェクトの CI ワークフローがビルドします)です。フォルダー名と同じ名前の App Builder のアプリがあっても、先頭に qpkg.cfg があるプロジェクト、または Makefile と qpkg/ の qpkg.cfg があるプロジェクトは自身のビルド方法を保ち、テストデプロイと公開は引き続きその QPKG を使います。

上部の帯には手順が並びます。実行できない手順はボタンを無効にしたまま残し、その横と帯の下に理由を表示します。 プロジェクトがまったく行えない手順は帯から外れ、その代わりに帯の下の 1 文で、プロジェクトが何を作り、ビルドの結果がどこに行くかを示します。プログラムならプロジェクトのフォルダー、カーネルモジュールなら「カーネル」ページ、App Builder のアプリだけをビルドする Makefile なら各アプリのページです。

Makefile のプロジェクトは ビルド の横でターゲットを選べます(別のものを選ばない限り make の既定、つまり最初のターゲット)。CMake のプロジェクトはビルドだけ、またはビルドしてテストを実行します。カーネルモジュールのプロジェクトは、実行中のカーネル用のカーネル工房のワークスペースでビルドし、そのビルドは管理者が行います。実行中の手順には キャンセル があり、ジョブはたいていすぐに終わります。ワークフローを実行 は、ワークフローに workflow_dispatch トリガーがあるとき、プロジェクトの CI ワークフローを手動で実行します。ない場合はボタンが無効になり、ページに理由が表示されます。 どのテンプレートのワークフローにもこのトリガーがあります。この NAS にインストール済み には、このプロジェクトのテストデプロイがインストールしたパッケージが並び、管理者には この NAS から削除 があります。プロジェクトを削除(ヘッダーのボタンの横のメニュー、または[プロジェクト]ページのプロジェクトのメニュー)は、管理者か、Forgejo のアカウントにリポジトリがある開発者が使えます。先にプロジェクト名を入力すると、フォルダーが削除され、Forgejo のリポジトリ、同名の App Builder アプリ、インストール済みのパッケージは残ります。そのあとページにリポジトリへのリンクが表示されます。

設定 には、bvsd がフォルダーの外にプロジェクト用に保持するものが表示されます。Makefile、CMake、QPKG のプロジェクトでは、ビルドと再ビルドが実行される環境が表示され、変更できます。App Builder のアプリを作ってビルドするだけの Makefile では、各アプリと、Makefile のその行が指定する環境が一覧表示されます。パッケージを作るプロジェクト、またはワークフローが bvs repo publish を実行するプロジェクトには、スイッチ App Center リポジトリに公開 があります。オンの間はプロジェクトの CI の bvs repo publish がパッケージをリポジトリに追加し、オフの間は CI の実行がその手順を通知付きで飛ばします。選択が保持されていないプロジェクト(例のコピーやクローン)ではオンです。Git には、ブランチ、最後の fetch 時点でリモートより何コミット先行・遅れているか(ページ自身は fetch しません)、最新のコミット、変更されたパスが出ます。ファイル は一度に 1 つのフォルダーを表示し、ファイルを選ぶと読めます。.qpkg はダウンロードされます。編集はエディターで行い、.git フォルダーは表示しません。

レシピ は、独自の recipes/ フォルダーを持つプロジェクトで、そのアプリが使うレシピを一覧にします。各レシピにはバージョン、ライブラリのレシピと同じ名前ならそれが置き換えるライブラリのバージョン、その下にレシピの検査で見つかったこと(ファイルと行)が表示されます。bvsd が除外したレシピには理由付きの行があり、同じ理由で除外されたものが 3 つを超えると、残りは 1 行で数えられます。recipes フォルダー全体について検査で見つかったことには専用の行があります。クリックするとレシピのフォルダーをエディターで開きます。メニューでは、NAS のターミナルで同じ検査を実行するコマンド(プロジェクトのフォルダーを付けた bvs recipe lint)もコピーできます。プロジェクトの recipes がリンク、ファイル、bvsd が読めないフォルダー、リンクだけのフォルダーの場合もこのカードが表示され、レシピを読まない理由が示されます。

サービスとパッケージ(QPKG パッケージ、またはソースからのパッケージのように qpkg/ にパッケージを持つ Makefile プロジェクト)には、パッケージの起動・停止スクリプトのブロック、qpkg.cfg の項目(パッケージ)、そこから書き出したファイル(スクリプト)があります。保存は各ファイルの差分を表示してから、プロジェクトのリポジトリにコミットします。その間にプロジェクトが変わっていたら、プランを作り直します。手動で編集はブロックを無効にし、スクリプトはエディターで編集します。ブロックを再び接続は、書き直しで置き換わる内容を表示します。ライブラリーを更新は、この Bucket & Code Server IDE の bvs-qpkg.sh を差分とともにパッケージに入れます。ブロック以前に作ったプロジェクトには このスクリプトにブロックを使う があります。

バージョン には切り替え先の一覧があり、このバージョンに切り替え で切り替えます。

バージョン切り替えで行うこと
build/ 内の .qpkg、または App Builder のエクスポートそのファイルのテストデプロイ(管理者)
App Builder のビルド有効化(管理者)。App Builder が保持するビルドは 1 つです
パッケージリポジトリのバージョン掲載バージョンにする(管理者)
git タグフォルダーにタグをチェックアウト

クリックするとバージョンを選べます。そのメニューからは、テストデプロイ、公開、Web ターゲットへの公開、.qpkg のダウンロードもできます。タグは detached HEAD としてチェックアウトされ、Git カードの main に戻る でブランチに戻ります。フォルダーにコミットしていない変更があるあいだは切り替えは拒否され、メッセージに変更が一覧されます。先にエディターでコミットするか stash してください。2 つのバージョンにチェックを入れて 2 つを比較 を押すと、一方にあって他方にないファイルと、変更されたファイルが一覧されます。タグ同士やパッケージ同士は内容で比較し、パッケージとコミットはサイズだけで比較します。[パッケージ]ページでは、管理者がリポジトリのバージョンをこの NAS にインストールすることもできます(この NAS にインストール、テストデプロイと同じ確認付き)。

自分の Web サーバー(Web ターゲット)

Web ターゲットは、管理者がパッケージや Web サイトを自分の Web サーバーに公開する先です。この NAS のフォルダー(QTS の Web Server が配信する QTS の Web 共有、またはほかの共有フォルダー)か、rclone のリモート(SFTP、FTP、WebDAV、S3。バックアップの rclone.conf で設定)で、それを配信する公開アドレスを持ちます。[公開]ページの Web ターゲット にあり、保存先を追加、変更、削除、テスト があります。テストは小さなファイルをコピーし、公開アドレスから取得して、また削除します。

フォルダーのターゲットは、共有フォルダー内の専用フォルダー(/share/Web/mysite。共有フォルダー全体やボリュームは不可)で、データフォルダーの外にあります。Web サイトの公開では、サイトにもうないものをターゲットから削除するためです。アドレスは http:// か https:// で始まり、ユーザー名やパスワードは含めません。

公開のたびに、公開アドレスからファイルを読み戻します。パッケージは .qpkg とその .sha256 を sha256 で、Web サイトは index.html をバイト単位で比較します。アドレスがコピーしたものを配信していない場合、ジョブは web_check: と両方の値を示して失敗します。

CI ランナー

CI モジュールは Forgejo Actions を実行します。リポジトリの .forgejo/workflows/ にあるワークフローファイルが、何かがプッシュされたときにランナーで実行されます。Git モジュールが必要です。管理者が モジュール、CI、有効にする でオンにします。ジョブは NAS 自身のランナーを Forgejo に登録し、Actions を有効にして Forgejo を再起動し、ランナーを起動します。ランナーが Forgejo に接続できた時点でジョブは終わります。

NAS 上のランナー

外部ランナー

ほかの場所にあるビルドマシン(サーバー、VM)も、この Forgejo からジョブを受け取れます。CI ページの 外部ランナーを登録 で、管理者が名前を付けると、Linux x86_64 用と aarch64 用のコマンドが表示されます。コマンドは forgejo-runner 13.2.0 を code.forgejo.org からダウンロードして sha256 を確認し、ランナーのトークンを runner-token(所有者だけが読める)に保存し、ラベル linux-amd64(または linux-arm64)でランナーを起動します。ランナーはすぐに一覧に表示され、コマンドが実行されるまではオフラインです。トークンが表示されるのはこのときだけです。このようなランナーは、自分のマシン上で、起動したユーザーとしてジョブを実行し、Forgejo の公開アドレスに接続します。

SVN と Bucket

SVN と Bucket モジュールは、Subversion リポジトリを /svn/<名前> で、バケットを /bucket/<名前> で配信します。バケットはネットワークドライブ(WebDAV)で、保存したファイルがすべてリビジョンになるので、ファイルの以前のバージョンをいつでも読んだり戻したりできます。管理者が モジュール でモジュールをオンにすると、SVN と Bucket ページで両方の作成、一覧表示、削除ができます。

SVN リポジトリ

svn checkout "https://<NAS のアドレス>:9951/svn/<名前>"
svn commit -m "…"

ページには、リポジトリのアドレスを含むチェックアウトコマンドが表示されます。プロキシの背後ではアドレスは公開 URL に従い、SVN のホスト名がある場合はそのホスト名の /svn/<名前> になります。リポジトリの 履歴 にはリビジョンが一覧表示されます。ファイルは任意のリビジョンで読むことができ、別のリビジョンと比較し、新しいリビジョンとして戻すこともできます(このバージョンを復元、読み書き権限のあるアカウント)。

バケット

WebDAV クライアントとその制限

クライアント接続方法注意
macOS の Finder移動、サーバへ接続、https://<NAS のアドレス>:9951/bucket/<名前>Finder は書き込み中のファイルをロックします。バケットは WebDAV のロックに応答します
rclonevendor = other とバケットのアドレスを指定した webdav リモートスクリプトでのコピーに向いています
davfs2(Linux)mount -t davfs https://<NAS のアドレス>:9951/bucket/<名前> /mnt/<フォルダー>パネルのユーザー名と、パスワードまたはアプリパスワード
Cyberduck、WinSCPポート 9951、パス /bucket/<名前> への WebDAV(HTTPS)接続
curlcurl -T file -u <ユーザー> https://<NAS のアドレス>:9951/bucket/<名前>/file1 回のアップロードで 1 リビジョン(または 2 つ、上記参照)
Windows エクスプローラーネットワーク ドライブの割り当てWindows の WebClient は、Windows が信頼する証明書を使った HTTPS でしかパスワードを送りません。実際の証明書を持つプロキシの背後にバケットを置いてください(リバースプロキシの背後)。自己署名証明書では足りません

アカウントのない人にリポジトリやバケットを見せる

管理者は、SVN と Bucket ページの行にあるスイッチ(Web 公開)で、SVN リポジトリやバケットを公開できます。アドレスを知っている人は誰でも、アカウントなしでブラウザーから閲覧できます。

アドレス表示されるもの
https://<NAS のアドレス>:9951/svn-web/<名前>/SVN リポジトリ
https://<NAS のアドレス>:9951/bucket-web/<名前>/バケット

行の Web で表示 リンクでそのページが開きます。ページは最新または以前のリビジョンのファイルとフォルダーを一覧表示し、テキストファイルを行番号付きで(1 MiB まで)、または画像を表示し、各ファイルをダウンロードできるようにします。履歴 には、作成者、メッセージ、変更されたファイル付きでリビジョンが表示されます。リビジョンのページには、そのリビジョンで変更された各ファイルの差分が表示されます(1 MiB 以下のファイル 20 個まで。それ以外はリンク)。任意のファイルを 2 つのリビジョン間で比較できます。

エディターと AI ツール

エディターモジュールは、developer と admin の各アカウントに、ブラウザーで動く VS Code(code-server)を提供します。管理者が モジュール でオンにします。各アカウントには専用のインスタンスがあり、アカウントがエディターを開くと起動し、通信のない状態がしばらく続くと停止します。

エディターのターミナルは NAS 上の root シェルです。 QTS では、Forgejo と httpd を除くパッケージのプロセスが admin(uid 0)として動作します。NAS の admin パスワードを渡してもよい相手にだけ developer ロールを付与してください。

エディターを開く

エディターは自分のページにだけ応答します。別のページがアカウントのセッションを使って送る WebSocket、フォーム、スクリプトの リクエストは、別のサイトからでも NAS の別のポートからでも 403 となり、インスタンスは起動しません。そのため別のページが Ports ビューの背後にある開発サーバーに届くこともありません。

拡張機能

Claude Code、Gemini CLI、Codex CLI

[エディター設定]ページの AI コマンドラインツール で、各アカウントは次のツールを自分用にインストール、更新、削除します。

ツールインストール方法コマンド
Claude CodeAnthropic のインストーラー(claude.ai/install.sh)、失敗した場合は npmclaude
Gemini CLInpm install -g @google/gemini-cligemini
Codex CLInpm install -g @openai/codexcodex

AI アシスタントとのコーディング

新しいプロジェクト が作るすべてのプロジェクトには、AI アシスタント向けのスキルが入ります。.claude/skills/qnap-dev/ と、それを指す AGENTS.md です。スキルは英語で、QNAP NAS に関するあらゆることのガイドラインを含みます。シェルから見た NAS の姿(RAM ディスク上のルート、BusyBox、systemd もパッケージマネージャーもないこと、getcfg と setcfg)、ストレージとパス、このパッケージでのビルド・署名・公開の方法(bvs env run、bvs ldd、bvs qbuild、App Builder、カーネル工房、パッケージリポジトリ)、ポート、バックアップ、そして NAS 上での apt や App Center で未署名アプリを許可することなど、提案してはいけないことです。ハードウェアトークンでの署名はサポートもテストもされていないとはっきり書いています。

ツールチェーンと環境

ツールチェーンページは、NAS でソフトウェアをビルドするのに必要なものをダウンロードします。

種類内容例
ルートファイルシステム環境に展開する Linux システムDebian 12 と 13、Ubuntu 22.04 と 24.04、Alpine 3.22
クロスツールチェーン別のプロセッサー向けにビルドするコンパイラーaarch64、x86-64、armv7 向けの Bootlin ツールチェーン(glibc または musl)
ランタイム言語またはビルドツールPython、Go、Node.js、Zig、Rust、CMake、Ninja、Java(JDK)
QNAPQNAP 独自のツールQDK 2.5.0(bvs qbuild と QPKG としてエクスポート用)
カーネルソースカーネル工房用の Linux カーネルツリーkernel.org の Linux 6.6.129、QNAP による QTS 5.2.3 の GPL カーネル公開物

別のプロセッサー向けの項目は隠れています。「ほかのプロセッサー用の項目を表示」で一覧に出ますが、インストールはできません。Bootlin のツールチェーンは x86_64 で動作するので、ARM の NAS にはクロスツールチェーンがありません。

カタログ

パッケージには組み込みのカタログがあります。https://pub.qnaputilities.com/bucketvs/catalog.json にある署名付きのリモートカタログは、新しいパッケージなしで項目を追加できます。bvsd がリモートカタログを使うのは、その ed25519 署名がパッケージに組み込まれた鍵と一致し、使用中のカタログより古くない場合だけです。「カタログを更新」ですぐに取得でき、組み込みの cron ジョブ「ツールチェーンカタログの更新」が毎日 04:15 に取得します。

インストールと削除

インストールは管理者の作業で、進行状況はジョブページに表示されます。

  1. アーカイブをデータフォルダーの toolchains/cache/ にダウンロードします。中断したダウンロードは、インストールを再開すると続きから再開します。
  2. sha256 をカタログと照合します。一致しない場合はファイルを削除します。
  3. クロスツールチェーンやランタイムは toolchains/<kind>/<id> に展開し、アーカイブを削除します。ルートファイルシステムやカーネルソースはアーカイブのまま残り、各環境やカーネルのワークスペースがそれぞれコピーを展開します。QNAP は GPL カーネル公開物を 2 つに分けて公開しているので、両方をダウンロードし、それぞれの sha256 で確認してから結合します。

ボリュームがいっぱいの場合、インストールは「no space left on」とボリュームのマウントポイントを示して失敗します。

「削除」はインストール済みの項目を削除します。ルートファイルシステムから作った環境はコピーなので残ります。

ツールチェーンやランタイムを使う

bvs use <id> は、インストール済みのクロスツールチェーンやランタイムをシェルで使えるようにする export 行(PATH など)を出力します。

eval "$(bvs use bootlin-aarch64-glibc-stable)"

ツールチェーンページにも、インストール済みの各項目について同じ行が「bvs use」の下に表示されます。

環境

環境は、ルートファイルシステムからデータフォルダーの envs/<名前> に展開された Linux システムです。変更可能で、Debian や Ubuntu の環境では apt install build-essential が動作し、インストールしたものはそこに残ります。

環境の中では次のようになります。

シェルからは次のように操作します(例では bvs を名前で呼んでいます。パッケージの動作中は、cron ジョブでも NAS 上の SSH セッションでもこの名前で呼べます)。

bvs env list
bvs env create deb12 --from debian-12-x86_64
bvs env shell deb12
bvs env run deb12 -- make -C /projects/hello

bvs env shell と bvs env run は、実行したフォルダーで始まります。データフォルダーの projects/ 配下のフォルダーは、環境内の /projects 配下の同じフォルダーです。それ以外のフォルダー(CI ジョブのチェックアウト、共有内のフォルダー)は /work にマウントされ、コマンドはそこで始まります。/ から実行すると /projects で始まります。

bvs qbuild で QPKG をビルドする

bvs qbuild は、実行したフォルダー(新しいプロジェクトの QPKG テンプレートが作るような、qpkg.cfg のあるフォルダー)から QPKG をビルドします。QNAP の qbuild を Debian または Ubuntu の環境の中で実行します。qbuild はシステムのプログラムをフルパスで呼び出すので、環境の中ではそのパスが NAS 自身のプログラムではなく環境のプログラムを指します。パッケージはフォルダーの build/ に作られます。

bvs tc install qdk-2.5.0-x86_64      # 最初に 1 回。ARM の NAS では qdk-2.5.0-aarch64
cd /share/CACHEDEV1_DATA/BucketVS/projects/MyTool
bvs qbuild                           # --env <名前> で環境を選ぶ

環境 ubuntu2404-builder(例「Ubuntu 24.04 builder」)、なければ debian12-builder、それもなければ別の Debian または Ubuntu の環境を使い、その中に rsync が必要です。足りないものがあれば停止し、それを追加するコマンドを示します。たとえば bvs env run ubuntu2404-builder -- apt-get install -y rsync です。bvs qbuild のあとの引数は qbuild に渡されます。フォルダーにファイル certificate と private_key(必要なら ca_certs も)がない限り、パッケージはコード署名されません。ある場合は QDK の qbuild が openssl で署名するので、環境に openssl が必要です。これらのファイルは git に入れないでください。

環境には独自のファイルとツールがあります。環境内のものはすべて root として動作し、NAS 上のすべてのプロセスが見え、NAS のネットワークを使います。

QPKG のコード署名

App Center はインストール時にパッケージのコード署名を確認します。署名には、QNAP が発行したコード署名証明書が必要です。bvs qbuild は最初の行で 3 つのケースのどれかを示します。たとえば bvs: code signing, case 1 (a certificate as files): … です。

ケースフォルダーにあるもの何が起きるか
1、ファイルとしての証明書certificate と private_key、必要なら ca_certs(チェーン)qbuild が openssl でパッケージに署名します。環境には openssl と bsdextrautils が必要です
2、ハードウェアトークン上の証明書certificate_hsmサポート外で未テスト: bvs qbuild は何もビルドする前に止まります
3、証明書なしこれらのファイルはどれもないパッケージは未署名でビルドされます

App Builder

App Builder は、選んだプログラムを環境の中で 1 つのフォルダー、つまりアプリのプレフィックス(既定は /usr/app/my_app_prefix)にコンパイルします。

アプリ の 例 タブには、すぐ使えるアプリ、環境、CI ワークフロー、cron ジョブ、エディター用プロジェクトがあります。カードの コードを見る は、使う前に例が作るものを表示します(どのロールでも使えます)。エディター用プロジェクトのファイル、ワークフローファイル、cron ジョブのコマンド、アプリならビルド順のレシピと各レシピの build.sh と recipe.json です。ビューアーは読み取り専用でテキストファイルを表示します。環境にはファイルがないため、そのカードにこのボタンはありません。例を使うには developer ロールが、環境には admin ロールが必要です。developer には環境のカードに この例を使う は表示されません。

レシピ

各プログラムはレシピからビルドします。レシピには、sha256 付きのソース、依存するレシピ、環境に必要なビルドツール、結果が動くことを確かめるチェック(bin/bash --version など)が記述されています。ライブラリ(zlib、openssl、ncurses、readline など)、シェル(bash、zsh、busybox)、ツール(coreutils、curl、git、jq、rsync、tmux、htop、nano など)、サーバー(nginx、redis、openssh、dropbear)、言語(lua)のレシピがあります。

レシピの更新

新しいレシピや更新されたレシピは、pub.qnaputilities.com から署名付きのカタログとしても届くため、次の Bucket & Code Server IDE のリリースを待たずに NAS に届きます。bvsd は 1 日に 1 回、新しいカタログがないか確認します。署名が bvsd に組み込まれた 鍵と一致し、すべてのファイルがカタログの一覧と一致し、レシピがパッケージに同梱のものより新しい場合にだけ使います。 チェックに失敗したカタログは使われません。カタログの使用中は、新しいアプリのレシピ一覧で、カタログが持ち込んだレシピに カタログで追加 または カタログで更新 の印が付きます。

アプリページの レシピライブラリ カードには、ビルドが使うライブラリ (パッケージのバージョン付きの パッケージのライブラリ、またはカタログのバージョン付きの カタログ) と、最後のチェックとその結果が表示されます。 管理者にはボタンが 2 つあります (2 つ目はカタログの使用中だけ表示されます)。

切り替えた後の再ビルドでは、ファイルが変わっていないレシピはすべて再利用されます。bvsd はビルドのたびにカタログの ファイルをもう一度チェックします。NAS 上でファイルが変わっていた場合、ビルドは何も実行せずに止まり、以後は一つ前の カタログかパッケージのライブラリが使われます。

アプリのビルド

アプリ、新しいアプリ(developer ロール)では、名前、プレフィックス(別のものを選ばなければ /usr/app/<名前>)、アプリをビルドする環境(Debian または Ubuntu の環境。例ギャラリーで「Ubuntu 24.04 builder」を作れ、ページはこれを最初に選びます)、ターゲット(この NAS のアーキテクチャー、またはクロスビルドとして aarch64 か armv7)、アプリが動く NAS のモデル、リンク方式、レシピを指定します。依存するレシピはビルド順に追加されます。

アプリは、独自の recipes/ フォルダーを持つ 1 つのプロジェクトのレシピも使えます。パッケージ の手順で プロジェクトのレシピ からそのプロジェクトを選びます。プロジェクトのレシピは一覧の先頭に、プロジェクト名の下で プロジェクト の印付きで並び、その後にライブラリのレシピが続きます。ライブラリのレシピと同じ名前のプロジェクトのレシピは、このアプリではそのレシピを置き換え、置き換えるライブラリのバージョンを表示します。プロジェクトが除外するレシピは、理由とともに示されます。選んだレシピがプロジェクトの一覧にない場合は、選択欄の下にその名前が示され、アプリから除外されます。そのレシピを含む一覧を選ぶと元に戻ります。アプリのページにはプロジェクト名が表示され、開発者はその名前からプロジェクトビューを開けます。viewer には、アプリの前回のビルドのレシピが、そのログに記された順に、それぞれの状態とログ付きで表示されます。最初のビルドの前には表示する順序がありません。

リンク方式はそれぞれカードになっていて、プログラムがライブラリを見つける場所の図、その方式のサイズ、更新、アプリの動作場所についてのコスト、対応するレシピが示されます。レシピを選ぶ前は、カードはレシピライブラリ全体を数えます。最初の手順に戻ると、ビルドのレシピを数えます。静的アプリでは、静的リンクできないレシピをどうするか(bundle でビルドするか、除外するか)を選びます。

Qt のビルドは Qt 自身のツール(moc、rcc、翻訳用の Linguist の lrelease)を実行します。そのためクロスビルドでは、Qt のレシピ(qtbase、qttools)がまずこれらのツールをこの NAS 向けにプレフィックス配下の host/ へビルドし、その後でターゲット向けの Qt をビルドします。Qt を使ってビルドするレシピは、そこにあるツールを実行します。ターゲット上で host/ を実行するものはありません。host/ はアプリのビルドの一部なので、アーカイブと QPKG としてエクスポート にも含まれます。

独自のレシピ

レシピライブラリにプログラムのレシピがないときは、プロジェクトが独自のレシピを持てます。レシピはプロジェクトの recipes/ フォルダーにライブラリと同じ形式で置き、そのプロジェクトを指定したアプリだけがビルドします。パッケージは次の 5 つの手順で作れます。

  1. プロジェクトを作る。 新しいプロジェクト でテンプレート Package from source(ソースからのパッケージ)を選ぶと、プロジェクト名のスターターレシピ、2 つのアプリ(この NAS のプロセッサー用と、x86_64 の NAS ではクロスビルドになる aarch64 用)の Makefile、サービス の手順で作ったパッケージの起動・停止スクリプトを含むフォルダーができます。
  2. レシピを書く。 エディターの New recipe は、同じスターターレシピから別のレシピを追加します(エディターを開く)。recipe.json にプログラムの本当のソースのアドレスとその sha256 を入れ(エディターのターミナルで curl -fsSL <アドレス> | sha256sum を実行すると値が表示されます)、ビルドの手順を build.sh に書きます。レシピのフォルダーに置けるのは recipe.json、build.sh、recipe.json が指定する vendor ファイルだけなので、パッチはヒアドキュメントとして build.sh に入れます。
  3. 検査する。 レシピのファイルを保存するたびにプロジェクトのレシピが検査され、結果が Problems ビューに表示されます。ターミナルの make lint と プロジェクトビュー の レシピ カードも同じ結果を示します。検査は recipe.json を読み、build.sh を bash -n で構文解析するだけで、レシピを実行することはありません。
  4. ビルドする。 プロジェクトビューの ビルド は、2 つのアプリがなければ作り、順にビルドします。ビルドはプロジェクトのレシピを開始時に 1 回だけ読むので、あとで保存したファイルは次のビルドで使われます。ライブラリのレシピと同じ名前のプロジェクトのレシピは、このプロジェクトのアプリでだけそのレシピを置き換え、ビルドのログにそのことが記されます。
  5. パッケージにしてインストールする。 エディターのターミナルで make qpkg を実行すると、各アプリの最新の成功したビルドがツールチェーンの QDK でパッケージにまとめられ、成功したビルドのないアプリは除外されます。コード署名のファイルが qpkg.cfg の隣の qpkg/ か、QPKG_CERT_DIR が指すフォルダーにあれば、パッケージは署名されます(QPKG のコード署名)。プロジェクトビューの テストデプロイ(admin)でこの NAS にインストールできます。

プロジェクトのレシピには次の決まりがあります。

アプリが動く NAS のモデル

glibc に対してビルドしたプログラムは、プログラムが求める最も新しいバージョン以上の glibc を持つ NAS でだけ起動します。パッケージは、動作するすべての NAS(QTS 6.0、QuTS hero 6.0 以降)に glibc 2.39 以降があることを前提にしています。これがパッケージの glibc の下限です。2.39 は Ubuntu 24.04 と QuTS hero 6.0.1 の glibc で、このファームウェア自身の /lib/libc.so.6 から読み取りました。QNAP は glibc のバージョンを公表しておらず、QNAP のリリースノートに QTS 6.0 は載っていません。QTS 6.1.0 と QuTS hero 6.1.0 のテスト用 NAS は 2.43 です。

新しいアプリと 変更 の 動作先 で、次の 2 つから選びます。

クロスビルド(aarch64 または armv7)は常にすべての NAS 向けです。選んだ環境の glibc がアプリの許す範囲を超えると、新しいアプリが警告します。ビルドのたびに bvsd は、各プログラムと各ライブラリが求める glibc のバージョンを読み取ります。クロスビルドでも同じです。上限を超えるファイルがあるとビルドは失敗し、修正方法が示されます。別の環境(別の環境を選ぶ)、リンク方式 static、または この NAS 専用でビルド です。アプリのページには成功した最新のビルドが必要とする glibc が表示され、依存関係 タブには上限を超える各ファイルが一覧されます。

NAS 上では bvs tree-deps <プレフィックス> --tree <フォルダー> --glibc-max 2.39 が、任意のアプリのツリーに同じチェックを実行します。

NAS でアプリを有効化する

有効化(管理者)は、プレフィックスをアプリの成功した最新のビルドへのリンクにします。これでアプリのプログラムが NAS 上で /usr/app/<名前>/bin から動作します。有効化は自分が作成したもの以外を置き換えることはありません。プレフィックスの場所にフォルダー、ファイル、別のリンクがある場合は、理由を示して拒否します。QTS のシステムディスクは起動のたびに再構築されるので、パッケージは起動のたびにリンクを作り直します。無効化(管理者)はリンクを削除します。アプリを削除すると、先に無効化してから 7 日間ゴミ箱に移します。developer がアプリを削除できるのは、アプリが有効でない間だけです。別のアーキテクチャー向けにビルドしたアプリはここでは有効化できません。そのアーキテクチャーの NAS 用にアーカイブをダウンロードしてください。

アプリをエクスポートする

QPKG としてエクスポート(管理者)は、成功した最新のビルドを独立した QPKG にまとめます。この QPKG は、このパッケージのない別の NAS にアプリをインストールします。この NAS 専用でビルドしたアプリは拒否され、ビルドのプログラムが 2.39 より新しい glibc を必要とする場合はまとめる前に止まります(アプリが動く NAS のモデルを参照)。QDK が必要です。ツールチェーンページの QNAP タブで「QNAP QDK 2.5.0」をインストールしてください。QDK がインストールされるまでボタンは表示されず、アプリのページに入手先が示されます。エクスポートは、bvs qbuild と同じようにアプリの環境の中で qbuild を実行します。ビルドのたびにその環境に rsync がインストールされます。古いバージョンのパッケージで最後にビルドしたアプリでは、拒否のメッセージに rsync を追加するコマンドが示されます。エクスポートしたパッケージは、起動時にプレフィックスのリンクを作り、停止時に削除します。コード署名はされていません。ジョブのログはケース 3 と示し、ボタンの下の行も同じことを示します。SSH セッションでは、/etc/init.d/<名前>.sh disable と enable で、エクスポートしたパッケージの App Center のスイッチを設定できます。プレフィックスのリンクはそのまま残ります。エクスポートしたパッケージは起動のたびに、アプリの bin と sbin を SSH ログインの PATH の NAS 自身のコマンドの後ろに加える行を /etc/profile と /root/.profile に追加します。admin にも、ログインできるほかのアカウントにも効きます。削除するとその行も取り除かれます。

パッケージリポジトリ

このパッケージは App Center のリポジトリを持っています。そこに公開した QPKG パッケージは、ほかの NAS の App Center から、ほかのリポジトリのアプリと同じようにインストールできます。

カーネル工房

カーネル工房は、NAS で動いているカーネル用のカーネルモジュールをビルドし、それぞれをそのカーネルと照合してからロードします。QNAP は現在のカーネルのソースを公開していません(GPL の公開物は QTS 5.2.3 まで)。そのため工房は、動作中のカーネルが自分自身について示す情報を読み取り、それに合うようにカーネルツリーを設定します。

必要なもの

プロファイル

bvs kernel profile は、動作中のカーネルについて次の情報を表示します。リリース(6.6.129-qnap)、QNAP がビルドに使ったコンパイラー、QNAP 自身のモジュールの vermagic、それらのモジュール内の struct module のサイズと init、exit の位置、モジュールに署名が必要かどうか、そしてカーネルツリーを合わせるために設定する項目です。

ワークスペース

bvs kernel prepare は、動作中のカーネルのワークスペースをデータフォルダーの kernels/<release> に作ります。

  1. カタログにあるこのバージョン用のカーネルソース(bvs kernel sources)を使います。QNAP が GPL ツリーを公開していればそれを、なければ kernel.org のツリーを使います。後者には QNAP 独自の変更が含まれません。--source で別のものを選べます。
  2. ツリーを設定します。QNAP のツリーならこの機種用の QNAP の設定で、そうでなければプロファイルの設定で行います。--option NAME=m でドライバーなどの設定を追加できます。
  3. モジュールをビルドできるようツリーを準備します(--full を付けるとカーネル全体をビルドします。はるかに時間がかかりますが、チェックでカーネルのエクスポートシンボルを確認できるようになります)。
  4. ツリーが動作中のカーネルのリリースとまったく同じものをビルドすることを確認します。

これはジョブページでジョブとして実行されます。prepare が失敗した場合は、前回のツリーが残ります。

モジュールをビルドする

ビルドで作られたモジュールは kernels/<release>/modules/ に保存されます。QNAP がこのカーネル用に同梱しているモジュールは保存されません。ロードされるのは QNAP 自身のコピーのままです。bvs kernel make --build-only はそこに何も保存せず、モジュールはビルドした場所に残ります。新しいプロジェクトのカーネルテンプレートの CI ワークフローは、この方法でビルドします。

チェックとロード

bvs kernel check <module> は、モジュールを動作中のカーネルと比較します。vermagic、struct module のサイズとその中の init と exit の位置(QNAP 自身のモジュールと比較)、署名が必要かどうか、依存するモジュール、必要なすべてのシンボルです。各指摘には、何が合わないか、どうすればよいかが示されます。終了ステータス 3 は、そのモジュールをロードしてはいけないことを意味します。

bvs kernel load <module> はチェックをもう一度実行してから、依存するモジュール(NAS にある QNAP のもの、または自分のもの)を先にロードし、続いてそのモジュールをロードします。チェックでエラーがあるモジュールは決してロードされません。bvs kernel unload <module> はモジュールを取り除きます。使用中のモジュールはロードされたままです。ロードとアンロードはすべて log/kernel-modules.log に記録されます。

QNAP のカーネルはデータシンボルを一覧にしていないので、チェックでは jiffies のようなシンボルを調べられず、警告として示します。そのどれかが欠けていると、カーネルはロード時にモジュールを拒否します。

アプリ内のモジュール

アプリはワークスペースのモジュールを指定できます。アプリを有効化すると、リンクを作る前にそれらがロードされます。パッケージが起動するたびに、パネルが使えるようになってから再びロードされます。ロードがまだ続いているときはカーネルページに表示されます。無効化すると先にアンロードされます。使用中のモジュールがあると、アプリは有効のままになります。

QTS のアップデートで別のカーネルになった場合は、新しいカーネルのワークスペースでモジュールをビルドし直す必要があります。別のデータフォルダーに復元した場合も同じです。kernels/ はバックアップに含まれません。

パネルでは

カーネル ページには、動作中のカーネルのプロファイル、カタログのカーネルソース、ワークスペースとそのモジュールが表示されます。管理者はここでワークスペースを準備し(ソース、環境、追加の設定、カーネル全体をビルドするかどうか)、プロジェクトフォルダーやツリーのディレクトリからモジュールをビルドします。どちらもジョブとして実行されます。チェック(developer)は各指摘を修正方法とともに表示します。ロード と アンロード(管理者)は bvs kernel load と unload と同じことを行い、拒否されたロードでは止めたチェックの内容が表示されます。データフォルダー配下の任意の .ko ファイルを、パスを指定してチェックできます。

cron ジョブと操作

ジョブページには 2 つの一覧があります。スケジュールジョブ(cron)と、操作(インストールや移動など bvsd が実行する長いジョブ)です。

スケジュールジョブ

developer は自分のジョブを作成・変更でき、管理者はすべてのジョブを変更できます。ジョブには次の項目があります。

各ジョブは直近 100 回の実行を、出力の末尾(4 KB)とともに保持します。実行の完全なログは 30 日間保存されます。

ジョブは所有者に代わって root で実行され、所有者のホームフォルダーが HOME になります。そのため、所有者が有効な developer または admin である間だけ実行されます。所有者が無効、または member か viewer ロールの間は、ジョブの各時刻が、理由を示すスキップした実行として記録されます(例:「its owner ola is disabled」)。今すぐ実行 も同じ理由で拒否されます。通知は送られません。所有者が無効にされたとき、または developer より下のロールにされたときに実行中だったものは停止されます。アカウントが再び有効になるか、再び developer になると、ジョブはまた実行されます。アカウントを削除すると、そのジョブも削除されます。組み込みジョブは、アカウントがどうなっても実行されます。

コマンドが終了しても、コマンドがバックグラウンドで起動したプロセスは動き続けます。タイムアウト、ジョブの削除、パッケージの停止の際には、実行のプロセスグループ全体に SIGTERM が送られ、5 秒後に SIGKILL が送られます。

時計が切り替わる夜(夏時間)には、ジョブは Debian の cron の規則に従います。分または時のフィールドの先頭が * のジョブ(*/N も含む)、@hourly、@every は経過時間に従います。秋には繰り返される 1 時間の両方で実行され、春には飛ばされた 1 時間の分は実行されません。そのほかのジョブは、それぞれの時刻に 1 回ずつ実行されます。繰り返される 1 時間にある時刻は 1 回だけ実行され、飛ばされた 1 時間にある時刻は切り替えの直後に実行されます。

サインインしたすべてのアカウント(viewer も)が、ジョブのコマンドと実行の出力を読めます。パスワードやトークンはコマンドに 書かず、root だけが読める <data>/etc 配下のファイル(chmod 600)から読み込ませてください。

組み込みジョブ

ジョブ実行時刻内容
メンテナンス毎日 03:30データフォルダーの tmp/ から 10 日間変更のないものを削除し、10 MB を超えた log/audit.log をローテーションします
ゴミ箱を空にする毎日 03:45データフォルダーの trash/ に移されてから 7 日を過ぎたもの(削除したアカウントのホームフォルダーなど)を削除します
ツールチェーンカタログの更新毎日 04:15署名付きのツールチェーンカタログを取得します
nginx のログのローテーション毎時 7 分nginx-access.log や nginx-error.log が 20 MB を超えたら .1 に名前を変え(古いファイルは 5 つ保持)、nginx にログを開き直させます

管理者は、組み込みジョブのスケジュール、タイムアウト、実行中の扱い、通知を変更し、オフにできます。名前とコマンドは変わりません。

操作

インストール、環境のジョブ、データの移動、モジュールのオンは操作として実行されます。一覧には直近 50 件が新しい順に、進行状況とログ付きで表示されます。操作とそのログは 30 日間保存されます。パッケージの停止時に実行中だった操作は interrupted と表示されます。developer は自分の操作を、管理者はどの操作でもキャンセルできます。

バックアップ

バックアップ ページ(管理者)では、何を、いつバックアップし、コピーをどこに送り、いくつ残すかを設定します。今すぐバックアップ でいつでもバックアップを実行できます。新しいインストールではスケジュールバックアップはオフです。スケジュールバックアップ をオンにすると、既定では毎日バックアップが実行されます(組み込みの cron ジョブ backup)。直近 7 日、4 週、6 か月のそれぞれについて最新の実行を残し、成功した最新の実行は常に残します。バックアップ、検証、復元、削除は同時に 1 つだけ実行されます。

同じ日の 2 回の実行は 1 日分として数えます。新しいほうが終わると、その日の前の実行は削除されます。そのため、午後に 今すぐバックアップ を実行すると、その朝の予定された実行が置き換えられます。その朝の状態が必要な場合は、先に実行を別の場所にコピーしてください。

バックアップの内容

1 回の実行は、すべてのファイルを sha256 とともに記載した manifest.json を含むフォルダー <データ>/backups/<id>/ です。

部分内容
設定etc/: 設定、アカウント、TOTP のシークレット、TLS 鍵、バックアップ用の鍵
GitForgejo のダンプ: リポジトリ、Wiki、LFS オブジェクト、添付ファイル、データベース
SVN、バケット各リポジトリのコピー。差分で作成し、コピー済みのリビジョンは再びコピーしません
VS Code の設定各アカウントの VS Code の設定、キーバインド、スニペット、拡張機能の一覧(拡張機能のファイルは含みません。拡張機能ビューから再インストールされます)
環境ツールチェーンの環境(既定ではオフ。作り直せるため)
プロジェクト各プロジェクトフォルダー。Git の履歴とまだコミットしていないファイルを含み、node_modules は除きます
HOME フォルダー各アカウントの HOME フォルダー。キャッシュと AI ツール自体のインストールは除きます(それぞれのインストールボタンで戻せます)
App Builder各アプリの設定とビルド履歴。アプリのファイルはビルドで作り直されます
パッケージリポジトリ公開したパッケージ、そのアイコン、App Center が読むインデックス

この 4 つはページでのチェックにかかわらず、すべてのバックアップに含まれます。前回のバックアップから変わっていないフォルダーは、そのバックアップのコピーにリンクされ、容量を使いません。

実行が見えるようになるのは、すべての部分が書き込まれ確認されたあとです。失敗やボリュームの容量不足の場合は、未完成のフォルダーが削除され、以前の実行はそのまま残ります。検証 は実行全体を読み直します。各アーカイブの sha256、全リビジョンの svnadmin verify、各リポジトリの git fsck、Forgejo のデータベースの整合性チェックです。

保存先

各実行はページ上のすべての保存先にコピーされます。

NAS の外に出るコピー(rsync、rclone)は暗号化が必要です。NAS の外に出るコピーを暗号化する をオンにし、鍵を作成 を押します。コピーは age で鍵の公開側に対して暗号化されます。秘密側は一度だけ表示され、bvsd は保持しません。これがないと、この NAS を含めどの NAS も暗号化されたコピーを復元できません。この NAS とは別の場所に保管してください。新しい鍵を作ると、それ以降の実行はその鍵で暗号化されます。古いコピーには古い秘密鍵が必要です。

失敗した保存先は実行の結果に示されますが、実行自体は有効なままです。

rclone.conf にはリモートの認証情報が入っています。コピーや テスト がそれを使う前に、bvsd はそれ(とバックアップ鍵)を root だけが読めるように(モード 600)し、そうでなかった場合はジョブのログにそう記録します。

復元

実行の 復元 は、すべて、1 つのリポジトリ(SVN リポジトリ、バケット、Git リポジトリ)、または 1 つのプロジェクトフォルダーを元に戻します。

通知

bvsd はすべての通知を QTS のシステムログに書き込みます。shoutrrr の URL を使って、チャットやメールのサービス(Telegram、Discord、Slack、メール、汎用 Webhook など)にも送れます。

通知タイミングURL へのスイッチ
ジョブの失敗失敗時に通知するジョブの cron 実行が失敗またはタイムアウトした。操作が失敗したnotify.on_job_failure
バックアップすべてのバックアップ、検証、復元の結果(成功したものも)。開始できなかった予定のバックアップnotify.on_backup
再起動の繰り返しプロセスが再起動を繰り返し始めたnotify.on_crashloop
証明書アップロードした証明書の残りが 30 日以下になった。nginx が自己署名証明書に戻った。新しい自己署名証明書を作成したnotify.on_cert_expiry
システム起動時に設定が拒否された、未完了のデータ移動が見つかった、残っていたプロセスを終了した、設定ファイルを書き込めなかった常に送信

URL とスイッチは、システムページの 通知 にあります。スイッチは既定でオンです。管理者はそこで変更します。ほかのアカウントに見えるのはスイッチと各 URL のスキームだけです。URL の残りの部分にはトークンが含まれるからです。NAS の管理者は CLI ソケット経由で設定することもできます。

/usr/bin/bucketvs/bin/curl --unix-socket /usr/bin/bucketvs/var/run/bvsd-cli.sock \
  -X PUT -H 'Content-Type: application/json' \
  -d '{"notify":{"shoutrrr_urls":["telegram://<token>@telegram?chats=<chat id>"]}}' \
  http://bvsd/api/v1/settings

ログとサポートバンドル

各ログはデータフォルダーの log/<name>.log です。bvsd と、bvsd が監視する各プロセスのログは 20 MB でローテーションされ、古いファイルは 5 つ保持されます。nginx-access.log と nginx-error.log にも同じ上限があり、bvsd の起動時と、ジョブ「nginx のログのローテーション」によって毎時確認されるので、1 時間分の通信量までは 20 MB を超えることがあります。ジョブ「メンテナンス」は、10 MB を超えた audit.log をローテーションし、古いファイルを 3 つ保持します。ログページ(管理者)は、任意のログの最後の行を表示し、絞り込み、新しい行を届いた順に追いかけます。

ログ書き込むもの
bvsdbvsd 自身: 起動、停止、適用した設定、問題
nginxnginx 自身の出力
nginx-access、nginx-errorすべてのリクエストと nginx のエラー
auditCLI ソケット上のすべてのリクエスト
モジュールのプロセスごとに 1 つ各モジュールのプログラム

システムページには、バージョン、プラットフォーム、タイムゾーン、bvsd が監視するすべてのプロセスが表示されます。「サポートバンドルをダウンロード」(管理者)は、バグ報告用のアーカイブを 1 つ作成します。

パスワード、セッション、トークン、鍵は一切含みません。

アップデート

bvsd は起動時と 24 時間ごとに https://pub.qnaputilities.com/bucketvs/latest.json を読みます。そこに新しいバージョンがあれば、システムページにそのバージョンが、フィードにあるリンクとともに表示されます。bvsd は新しいバージョンを知らせるだけで、パッケージをダウンロードしたりインストールしたりはしません。確認に失敗しても、パネルには何も変化はありません。

新しいバージョンのインストール

新しいパッケージを、App Center から、または 手動インストール で、古いパッケージの上にインストールします。インストールは bvsd を停止し、プログラムファイルを置き換えて再起動します。データフォルダー、設定、アカウント、すべてのリポジトリは残り、パネルのセッションもそのままです。エディターのインスタンスは bvsd とともに停止するので、エディターで開いていたターミナルは終了します。インスタンスは、そのアカウントがエディターを開くと再び起動します。

ポート 6050、6051、6052 を使っていたバージョンから。 以前のビルドは 6050(HTTP)、6051(HTTPS)、6052(SSH 経由の Git)で待ち受けていました。新しいバージョンの最初の起動で、これらはそれぞれ 9950、9951、9952 に移され、そのことが通知されます。自分で選んだポートはそのままです。古いポートを指しているものを変更してください。ブックマーク、6050 への Plesk プロキシ、ssh://git@<NAS>:6052/… のような git のリモート(git remote set-url)です。

削除、再インストール、壊れたパッケージ

パッケージを削除しても、再インストールしても、パッケージが壊れても、作業内容は残ります。作成したものはすべてデータフォルダーにあります。アカウントと設定、Git と SVN のリポジトリ、バケット、プロジェクトフォルダー、HOME フォルダー、VS Code の設定と拡張機能、App Builder のアプリ、環境、パッケージリポジトリ、バックアップです。インストールフォルダー(<ボリューム>/.qpkg/bucketvs)にあるのは、プログラムとデータフォルダーを指す 1 つのファイルだけです。

ディスクの故障は別の問題です。データフォルダーは NAS 自身のディスクにあります。バックアップは別のマシンに保管してください(バックアップ)。どのバックアップにも、プロジェクトフォルダー、HOME フォルダー、App Builder の設定、パッケージリポジトリが含まれます。

bvs コマンド

bvs はパッケージのコマンドラインで、/usr/bin/bucketvs/bin にあります。cron ジョブを含め、bvsd が起動するすべてのプロセスの PATH に含まれています。パッケージの動作中は /usr/bin/bvs がこのコマンドへのリンクになるため、NAS 上の SSH セッションでも名前で呼び出せます。パッケージを停止すると、このリンクは削除されます。

CLI ソケットで bvsd と通信するコマンドは、ソケットが root 専用なので root が必要です。user、jobs、そして bvsd の動作中は tc install、tc remove、env create、clone、export、delete です。env shell、env run、qbuild も bvs-chroot を起動するので root が必要です。ほかのユーザーで実行すると、ソケットが必要なコマンドは「bvsd's CLI socket … is open to root only: run bvs as root」で停止します。

bvs env list
bvs env create <name> --from <rootfs-id> [--package <name>]...
bvs env shell <name>
bvs env run <name> -- <command> [<arg>...]
bvs env clone <name> <new-name>
bvs env export <name>
bvs env delete <name>
bvs tc list
bvs tc install <id>
bvs tc remove <id>
bvs use <id>
bvs jobs
bvs user list
bvs user password <name>
bvs user totp-reset <name>
bvs guide [--path] [en|pl|de|fr|it|nl|sv|ja|zh-TW]
bvs qbuild [--env <name>] [<qbuild argument>...]
bvs kernel profile [--json]
bvs kernel sources
bvs kernel prepare [--source <id>] [--env <name>] [--option NAME=VALUE]... [--full]
bvs kernel make [--project <folder> | --dir <tree directory>] [--build-only] [<target>...]
bvs kernel check <file.ko | module>
bvs kernel load <module>
bvs kernel unload <module>

ファイルとフォルダー

パス内容
/usr/bin/bucketvsパッケージのプログラム(インストールフォルダーへのリンク)
/usr/bin/bucketvs/etc/data-rootデータフォルダーのパス
/usr/bin/bucketvs/var/run/bvsd.sockパネルの API ソケット(nginx が使用)
/usr/bin/bucketvs/var/run/bvsd-cli.sockbvs コマンドのソケット(root 専用)
<データフォルダー>/etc/設定、アカウント、セッション、トークン、証明書、生成された nginx.conf(シークレットはモード 600)
<データフォルダー>/log/ログ
<データフォルダー>/tmp/各プロセスの一時ファイル
<データフォルダー>/home/<ユーザー>/各アカウントのホームフォルダー
<データフォルダー>/jobs/操作、cron ジョブとその実行、ログ
<データフォルダー>/toolchains/ダウンロードキャッシュ、インストール済みのツールチェーンとランタイム、エクスポート
<データフォルダー>/envs/環境
<データフォルダー>/projects/ワークスペース。環境内では /projects として見えます
<データフォルダー>/trash/削除したもの。7 日間保持します

モジュールはそれぞれ独自のフォルダーを追加します。その場所は各モジュールの節に記載しています。