Ubuntu Weekly Recipe

第489回 ARM向けバックポートリポジトリをaptlyで作る

この記事を読むのに必要な時間:およそ 6 分

Nginxを用いて外部からアクセスできるようにする

ここまでの状態だとローカルファイルシステム上にパッケージディレクトリが配置されているだけです。リポジトリとして運用するためには,これを外部からHTTPでアクセスできるようにしなくてはなりません。といっても難しい話ではなく,他の静的なコンテンツと同様にたとえばHTTPサーバーを使って見えるようにするだけです。

たとえばNginxを使う場合,次のような内容の設定ファイルを/etc/nginx/sites-avialable/aptlyとして用意し,/etc/nginx/sites-enabled/からシンボリックリンクをはることになるでしょう。server_name部分をリポジトリのドメイン名にしておきます。またautoindex onにしておくことで,リポジトリのディレクトリの中身の構造が見えるので何かあったときにユーザーにとっては便利です。ちなみにReleaseファイルなどからリポジトリに属するパッケージファイルのパスを辿れるため,リポジトリ上のパッケージのパスが見えてはいけない場合は別途何らかの対策が必要になります。もちろん単にアクセスするユーザーを制限したい場合は,Basic認証などの手法を使うというのもひとつの手です。

server {
       listen 80;
       listen [::]:80;

       server_name aptly.example.com;

       root /srv/aptly;

       location / {
               autoindex on;
       }
}

設定したらsudo service nginx configtestsudo systemctl restart nginxなどで設定のチェックとサーバーの再起動を行いましょう。ブラウザーでアクセスできることを確認したら,サーバー側の設定は完了です。

クライアント側ではリポジトリの公開鍵とURLを登録します。リポジトリの公開鍵は,aptlyを実行するユーザーがあらかじめエクスポートしておき,何らかの信頼できる経路でクライアント側がそれを取得できるようにしておきます。

$ gpg --export --armor --output aptly.asc aptly@example.com

一般的には上記ファイルをHTTPS経由で取得できる場所に置いておきます。もしくは鍵サーバー上に公開鍵を登録しておき,その鍵IDのみHTTPS上に記載するというのもひとつの手です。PPAなどはUbuntuの鍵サーバー上に公開鍵を登録し,HTTPS経由で鍵IDを取得する流れになっています。

あとはこのリポジトリ鍵を登録し,sources.listを設定します。ここでaptlyが動いているマシンのアドレスをaptly.example.comだとしています。

$ sudo apt-key add aptly.asc
$ echo "deb http://aptly.example.com/ xenial-backports main" | sudo tee /etc/apt/sources.list.d/aptly.list
$ sudo apt update
$ sudo apt policy tmux

先程登録したtmuxのバックポートパッケージのバージョンが表示されたら成功です。

パッケージのアップロードを簡単にする

パッケージをビルドするマシン(sbuildなどを実行するマシン)と公開するマシン(aptlyを実行するマシン)が異なる場合,.changesファイルをはじめとしたビルドした成果物を公開するマシンにコピーする必要があります。このときdputコマンドを使うと手間が省けて便利です。dputはDebianパッケージのメンテナーが新しいパッケージをアップロードキューに送ったり,UbuntuでもPPAでビルドキューに送る場合に使われています。

dput自体は必要なファイルを指定したサーバーに送るだけの単なるPythonスクリプトであり,/etc/dput.cfもしくは~/.dput.cfで設定すれば,簡単に任意のアップロードサーバーを追加できます。

たとえばaptly.example.comの/srv/aptly/queue/ディレクトリに,aptlyユーザーでscpを使ってポート2222を経由してアップロードするなら次のような設定になります。

[aptly]
login                   = aptly
fqdn                    = aptly.example.com
method                  = scp
ssh_config_options      =
  Port 2222
incoming                = /srv/aptly/queue
allow_dcut              = 1

dputコマンドに「対象マシン名」.changesファイルを指定すればアップロードできます。

$ dput aptly tmux_2.5-3build1~ubuntu16.04.1_source.changes
Checking signature on .changes
(中略)
Good signature on /home/shibata/backport/sign/tmux_2.5-3build1~ubuntu16.04.1.dsc.
Package includes an .orig.tar.gz file although the debian revision suggests
that it might not be required. Multiple uploads of the .orig.tar.gz may be
rejected by the upload queue management software.
Uploading to aptly (via scp to aptly.example.com):
tmux_2.5-3build1~ubuntu16.04.1.dsc                                                                           100% 2060     3.3MB/s   00:00
tmux_2.5.orig.tar.gz                                                                                         100%  465KB  62.9MB/s   00:00
tmux_2.5-3build1~ubuntu16.04.1.debian.tar.xz                                                                 100%   12KB  17.7MB/s   00:00
tmux_2.5-3build1~ubuntu16.04.1_source.changes                                                                100% 7162    12.4MB/s   00:00
Successfully uploaded packages.

署名済みかどうかもチェックしてくれるので便利です。ちなみにローカルで一度アップロードするとchangesファイル名.対象マシン名.uploadというファイルが作られて,多重アップロードを抑止します。もし同じファイルを強制的に再アップロードしたい場合は--forceオプションを付けてください。

aptly側でsystemd.timerやcronなどを利用して定期的に/srv/aptly/queueをチェックするようにしておけば,ローカル側からのアップロード処理だけで新しいリポジトリの公開までを自動化できます。もちろんaptlyのREST APIなどを用いてCIを間に挟むことも可能です。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member株式会社 創夢所属。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入