27749
チーム内で使うための debian のレポジトリを作成したく、  
<https://wiki.debian.org/HowToSetupADebianRepository> をみていました。  
いくつもツールが存在しているようで、どれを使ったかいいかが自明ではありません。

以下の要件があった場合に、適したツールはどれですか？

  1. ubuntu 上の apt-get だけでインストール可能
  2. 少量のシェルスクリプト(のパッケージ)を配布する予定
  3. できる限り簡単にスクリプト (が入った deb パッケージ) をデプロイできる
CC BY-SA 3.0
2016-05-27T07:15:33.070
25217
2016-07-20T06:29:15.107
754
question
ubuntu debian apt
チーム内 debian レポジトリを作成するのに適したツールは？
[こちらの記事](https://wiki.debian.org/SettingUpSignedAptRepositoryWithReprepro)のように
reprepro で署名付きの APT リポジトリを作るのがおすすめかと思います。私自身はこれにリポジトリ専用の GnuPG
ホームを使う、出力ディレクトリを分けるといった変更を加えて利用していますのでそれを説明します。

最初に reprepro と gnupg をインストールします。

```

    $ sudo apt install reprepro gnupg
    
```

次に reprepro のベースディレクトリ (ここでは ~/reprepro とします) を決め、その下に設定と出力と GnuPG
のディレクトリを作ります。

```

    $ mkdir ~/reprepro
    $ mkdir ~/reprepro/conf
    $ mkdir ~/reprepro/out
    $ mkdir -m 0700 ~/reprepro/gnupg
    
```

`~/reprepro/gnupg/gpg.conf` には推奨の暗号設定を書いておきます。

```

    # Prioritize stronger algorithms for new keys.
    default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 BZIP2 ZLIB ZIP Uncompressed
    # Use a stronger digest than the default SHA1 for certifications.
    cert-digest-algo SHA512
    
```

GnuPG ホームを `~/reprepro/gnupg` に設定して秘密鍵を生成します。基本的にデフォルト設定で、無期限、パスフレーズなしとします。ユーザ
ID には "My Repository Manager" といった適当な名前をつけるだけで十分です。

```

    $ gpg --homedir ~/reprepro/gnupg --gen-key
    gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    gpg: 鍵リング「/home/yaegashi/reprepro/gnupg/secring.gpg」ができました
    gpg: 鍵リング「/home/yaegashi/reprepro/gnupg/pubring.gpg」ができました
    ご希望の鍵の種類を選択してください:
       (1) RSA と RSA (デフォルト)
       (2) DSA と Elgamal
       (3) DSA (署名のみ)
       (4) RSA (署名のみ)
    選択は? 
    RSA 鍵は 1024 から 4096 ビットの長さで可能です。
    鍵長は? (2048) 
    要求された鍵長は2048ビット
    鍵の有効期限を指定してください。
             0 = 鍵は無期限
          <n>  = 鍵は n 日間で期限切れ
          <n>w = 鍵は n 週間で期限切れ
          <n>m = 鍵は n か月間で期限切れ
          <n>y = 鍵は n 年間で期限切れ
    鍵の有効期間は? (0) 
    (null)は無期限です
    これで正しいですか? (y/N) y
    
    あなたの鍵を同定するためにユーザIDが必要です。
    このソフトは本名、コメント、電子メール・アドレスから
    次の書式でユーザIDを構成します:
        "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
    
    本名: My Repository Manager
    電子メール・アドレス: 
    コメント: 
    次のユーザIDを選択しました:
        "My Repository Manager"
    
    名前(N)、コメント(C)、電子メール(E)の変更、またはOK(O)か終了(Q)? O
    秘密鍵を保護するためにパスフレーズがいります。
    
    パスフレーズを必要としないようですが、おそらくそれは良くない考えです!
    続けますが、パスフレーズを設定することを検討ください。パスフレーズは、
    このプログラムの"--edit-key"オプションでいつでも変更できます。
    
    たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
    す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
    成器に十分なエントロピーを供給する機会を与えることができます。
    
    十分な量の乱数が得られません。OSがもっとエントロピーを収集できるよう、
    何かほかの作業をしてください! (あと225バイト要ります)
    ....+++++
    .+++++
    たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
    す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
    成器に十分なエントロピーを供給する機会を与えることができます。
    
    十分な量の乱数が得られません。OSがもっとエントロピーを収集できるよう、
    何かほかの作業をしてください! (あと84バイト要ります)
    .......+++++
    
    十分な量の乱数が得られません。OSがもっとエントロピーを収集できるよう、
    何かほかの作業をしてください! (あと128バイト要ります)
    ..+++++
    gpg: /home/yaegashi/reprepro/gnupg/trustdb.gpg: 信用データベースができました
    gpg: 鍵90813A1Cを究極的に信用するよう記録しました
    公開鍵と秘密鍵を作成し、署名しました。
    
    gpg: 信用データベースの検査
    gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、PGP信用モデル
    gpg: 深さ: 0  有効性:   1  署名:   0  信用: 0-, 0q, 0n, 0m, 0f, 1u
    pub   2048R/90813A1C 2016-05-28
          フィンガー・プリント = B026 6D92 23A9 E77D CB56  CC47 846A 24E9 9081 3A1C
    uid                  My Repository Manager
    sub   2048R/EAC6CAF7 2016-05-28
    
```

生成された鍵 ID (`90813A1C` など) は署名に使いますので覚えておいてください。リポジトリ利用者向けに公開鍵をファイルにエクスポートして
`~/reprepro/out` ディレクトリに置いておきます。

```

    $ gpg --homedir ~/reprepro/gnupg --armor --export 90813A1C > ~/reprepro/out/repository.key
    
```

`~/reprepro/conf/options` ファイルにデフォルトのオプションを書きます。

```

    outdir +b/out
    gnupghome +b/gnupg
    
```

`~/reprepro/conf/distributions` ファイルにディストリビューションの定義を書きます。ここでは sid (unstable) と
xenial (stable) を定義しています。

```

    Origin: My Origin
    Label: My Label
    Description: My Repository
    Suite: unstable
    Codename: sid
    Architectures: i386 amd64 source
    Components: main universe multiverse
    SignWith: 90813A1C
    
    Origin: My Origin
    Label: My Label
    Description: My Repository
    Suite: stable
    Codename: xenial
    Architectures: i386 amd64 source
    Components: main universe multiverse
    AlsoAcceptFor: unstable
    SignWith: 90813A1C
    
```

詳しい reprepro
の設定については[マニュアル](http://manpages.ubuntu.com/manpages/xenial/man1/reprepro.1.html)を参照してください。

ここまで準備ができたらリポジトリにパッケージをインポートできます。例えば <https://chrome.google.com> からダウンロードした
google-chrome-stable の deb ファイルは次のように includedeb コマンドで取り込めます。

```

    $ cd ~/reprepro
    $ reprepro -V includedeb stable ~/google-chrome-stable_current_amd64.deb 
    Created directory "./db"
    /home/yaegashi/google-chrome-stable_current_amd64.deb: component guessed as 'main'
    Created directory "./out"
    Created directory "./out/pool"
    Created directory "./out/pool/main"
    Created directory "./out/pool/main/g"
    Created directory "./out/pool/main/g/google-chrome-stable"
    Exporting indices...
    Created directory "./out/dists"
    Created directory "./out/dists/xenial"
    Created directory "./out/dists/xenial/main"
    Created directory "./out/dists/xenial/main/binary-i386"
    Created directory "./out/dists/xenial/main/binary-amd64"
    Created directory "./out/dists/xenial/main/source"
    Created directory "./out/dists/xenial/universe"
    Created directory "./out/dists/xenial/universe/binary-i386"
    Created directory "./out/dists/xenial/universe/binary-amd64"
    Created directory "./out/dists/xenial/universe/source"
    Created directory "./out/dists/xenial/multiverse"
    Created directory "./out/dists/xenial/multiverse/binary-i386"
    Created directory "./out/dists/xenial/multiverse/binary-amd64"
    Created directory "./out/dists/xenial/multiverse/source"
    Successfully created './out/dists/xenial/Release.gpg.new'
    Successfully created './out/dists/xenial/InRelease.new'
    
```

自分でビルドしたパッケージの場合は、生成された .changes ファイルを include
コマンドに渡すことで、バイナリ・ソースの両パッケージファイルすべてを適切に処理することが可能です。

```

    $ cd ~/reprepro
    $ reprepro -V include sid ~/debian/hello_2.10-1_amd64.changes 
    Created directory "./out/pool/main/h"
    Created directory "./out/pool/main/h/hello"
    Exporting indices...
    Created directory "./out/dists/sid"
    Created directory "./out/dists/sid/main"
    Created directory "./out/dists/sid/main/binary-i386"
    Created directory "./out/dists/sid/main/binary-amd64"
    Created directory "./out/dists/sid/main/source"
    Created directory "./out/dists/sid/universe"
    Created directory "./out/dists/sid/universe/binary-i386"
    Created directory "./out/dists/sid/universe/binary-amd64"
    Created directory "./out/dists/sid/universe/source"
    Created directory "./out/dists/sid/multiverse"
    Created directory "./out/dists/sid/multiverse/binary-i386"
    Created directory "./out/dists/sid/multiverse/binary-amd64"
    Created directory "./out/dists/sid/multiverse/source"
    Successfully created './out/dists/sid/Release.gpg.new'
    Successfully created './out/dists/sid/InRelease.new'
    
```

最後に `~/reprepro/out` ディレクトリを適当な web サーバで公開すれば完成です。

```

    $ sudo apt install nginx
    $ sudo ln -s ~/reprepro/out /var/www/html/ubuntu
    
```

このリポジトリを利用するには、まず利用するホストでリポジトリの公開鍵をインポートします。

```

    $ curl -s http://server/ubuntu/repository.key | sudo apt-key add -
    OK
    $ sudo apt-key list
    /etc/apt/trusted.gpg
    --------------------
    pub   1024D/437D05B5 2004-09-12
    uid                  Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
    sub   2048g/79164387 2004-09-12
    
    pub   4096R/C0B21F32 2012-05-11
    uid                  Ubuntu Archive Automatic Signing Key (2012) <ftpmaster@ubuntu.com>
    
    pub   4096R/EFE21092 2012-05-11
    uid                  Ubuntu CD Image Automatic Signing Key (2012) <cdimage@ubuntu.com>
    
    pub   1024D/FBB75451 2004-12-30
    uid                  Ubuntu CD Image Automatic Signing Key <cdimage@ubuntu.com>
    
    pub   2048R/90813A1C 2016-05-28
    uid                  My Repository Manager
    sub   2048R/EAC6CAF7 2016-05-28
    
```

`/etc/apt/sources.list` などに apt-line を追加します。

```

    deb http://server/ubuntu xenial main universe multiverse
    
```

`apt update` してエラーが出なければ、あとは `apt install` でパッケージをインストールできます。

```

    $ sudo apt update
    $ sudo apt install google-chrome-stable
    
```
CC BY-SA 3.0
2016-05-28T04:53:19.943
25238
2016-05-28T05:12:03.847
2016-05-28T05:12:03.847
9873
9873
25217
answer
deb-s3はいかがでしょうか？  
<https://github.com/krobertson/deb-s3>

以下のようにpackage uploadを実行することで必要であれば自動でrepositoryが作成され、利用を開始できます

```

    $ deb-s3 upload --bucket my-bucket my-deb-package-1.0.0_amd64.deb
    
```

deb-s3はrepositoryのhostingにAmazon S3を利用するもので、サーバーの管理や冗長性の確保などについてS3に任せることができます
CC BY-SA 3.0
2016-07-20T06:29:15.107
27749
2016-07-20T06:29:15.107
12841
25217
answer