プライベートなPyPIを持つ

プライベートなPyPIを持つことができれば、自分専用や、社内専用のライブラリをpipでインストールできるので、とても便利でしょう。 そのようにライブラリを共有する方法について、GitHubなどを使ってもできると4月に 書いていました 。今回はこれを、プライベートなPyPIを持つことによって実現する手順を記します。

どのパッケージで実現するのか

PyPIでいくつか実装を見つけることができます。探せばもっと多くの実装が見つかるでしょう。今回はpypiserverを使います。開発が続いていること、Python3に対応していること、認証が使えることがポイントです。ただし、認証については、nginxなどにより、外部から提供することも可能なはずです。

セットアップ方法

依存パッケージのインストール(apt)

今回の環境はUbuntu 16.04です。

# 依存パッケージをインストールします。
sudo apt-get update
sudo apt-get install -y virtualenvwrapper apache2-utils python3-dev

依存パッケージのインストール(Python)

# virtualenvwrapperを使うために、bashの設定を読み直します。
source ~/.bashrc
mkvirtualenv -p /usr/bin/python3 pypi

# passlibは認証のため
pip install uwsgi 'pypiserver[passlib]'

Basic認証のために暗号化されたパスワードを作成

htpasswd -cs htpasswd.txt ユーザ名

アップロードしたパッケージを保存するディレクトリを作成

mkdir packages

pypiserverの起動スクリプトを作成

ここでは、 pypi.py とします。下記のiniファイルと整合性が取れていれば、名前はなんでも構いません。

#!/usr/bin/env python3
import pypiserver


application = pypiserver.app(
    root="./packages",
    password_file="./htpasswd.txt",
    authenticated=['update', 'download', 'list']
)

uwsgiに渡す設定です。ここでは uwsgi.ini とします。これもuwsgiに渡すので、読み替えていただければ名前はなんでも構いません。 ログの位置も適当なので、ログを置きたい場所に書き換えてください。

[uwsgi]
socket = ./sock
pidfile = ./pid
daemonize = ./log
master = 1
file = pypi.py
http = :8080
processes = 4
threads = 4
home = /home/ubuntu/.virtualenvs/pypi

起動してブラウザで動作していることを確認します。

uwsgi uwsgi.ini

ブラウザでアクセスして、pypi serverが動いていることを確認します。 http://username:password@localhost:8080 にアクセスすると、このようなページが表示されるはずです。

pypiserver

もしページが表示されないようなら、 log ファイルを確認してください。

Nginxなどを通して、SSLを使わないと安全ではありませんが、それはこのブログポストの範囲外と考えますので省略します。

アップロード方法・インストール方法

この項目については、Pythonが公式にドキュメントを持っています。 http://docs.python.jp/3.5/distutils/packageindex.html#additional-command-options

pip経由でのインストールでは、 -ipypi.python.org の代わりを、 --extra-index-url では pypi.python.org に加えて別のindexを使用するように指定できます。

pip install -i http://username:password@localhost:8080/simple/ package_name

アップロードのために、このファイルを ~/.pypirc として置きます。公式のpypiのアカウントを持っていない場合はpypiの部分は無視してください。

[distutils]
index-servers =
  pypi
  private

[pypi]
username: foo
password: bar

[private]
repository: http://localhost:8080
username: username
password: password

これで、 -r でアップロード先を指定すると、公式のPyPIにアップロードするのと同じようにアップロードできます。

python3 setup.py sdist upload -r private

コメント

2015 - 2017 (c) 成瀬基樹