年末年始の休みの時に構築した、新自宅サーバ。
使用用途は主にファイルサーバで、
テスト用のWordPressもインストールしてあります。

ファイルサーバのファイル転送には、主にsambaを使用しますが
一部、WebDAVも使用します。

これにより、外出先から自宅のファイルにアクセスできたり
iPhoneから、写真をファイルサーバにアップロードする事ができます。

WebDAVはSSLを利用するので証明書をLet's Encryptで取得しています。

Let's Encryptはサーバ構築時には導入していて、
cronで20日に自動更新する設定にしていました。

しかし、20日に更新に失敗したメールが届いたので
再度確認してみました。

Let's Encrypt証明書の更新で問題が発生

virtualenvが原因でLet's Encryptが更新できない

自動更新失敗した時の、メールにはこのように書かれていました。

Upgrading certbot-auto 0.20.0 to 0.21.0...
Replacing certbot-auto...
Creating virtual environment...
/usr/bin/certbot-auto: 966: /usr/bin/certbot-auto: virtualenv: not found

念のため、SSHで実行してみてダメでした。
試しにブートストラップを無視してもダメでした。
/usr/bin/certbot-auto renew --force-renew --no-bootstrap

virtualenvが原因

コマンドラインでの更新時でも、
Creating virtual environment...
で止まり、エラーが出ます。

検索しましたが日本語ではなかなか出なかったので
英語での検索で見つかりました。

setuptools pkg_resources pip wheel failed with error code 2
SSL添加失败,求教军哥!

問題の切り分け

この問題は、virtualenvが複数インストールされている事で発生します。

そこで、Ubuntuで動いているファイルサーバでは、
このコマンドで確認しました。

dpkg -l|grep virtualenv

すると、なぜか3種類も入っていました。

ii python-virtualenv 15.0.1+ds-3ubuntu1 all Python virtual environment creator
ii python3-virtualenv 15.0.1+ds-3ubuntu1 all Python virtual environment creator
ii virtualenv 15.0.1+ds-3ubuntu1 all Python virtual environment creator

dpkg はDebianのパッケージ管理システムなので
ディストリビューションに合わせて、変更して下さい。

対処法

複数のvirtualenvが競合していることが原因なので
一旦、すべてのvirtualenvをアンインストールしてから、再インストールします。

apt-get purge python-virtualenv python3-virtualenv virtualenv
pip install virtualenv

これで、SSHで試しましたが、Let's Encryptの更新ができるようになりました。

あとがき

今回のサーバは、Ubuntuなので
ディストリビューションによりコマンドが使えない可能性があります。

また、この方法で出来なかったり、何か不具合が発生しても知りません。
自己責任でお願いします。