April 3, 2025

CentOS 7にPython3.13とPython 3.12をuvでインストール

CentOS 7は2024年6月30日にEoLを迎えたので、速やかにOSを移行するのがベストだけど、様々な事情でまだOSを変えられない場合にCentOS 7に Python 3.13 や Python 3.12 をインストールして延命できるかやってみた。

uv 素晴らしい。

用意したもの

  • CentOS 7.9 amd64(x86_64) を最小構成でセットアップした Proxmox VE 上のVM

手順

uv を全ユーザー用にインストール

過去の手順の「uvを全ユーザー用にインストール」のとおり

uv で全ユーザー用に Python をインストール

  1. CentOS 7 の Python は 2.7.5 なので表示されない
    $ uv python list
    cpython-3.14.0a6+freethreaded-linux-x86_64-gnu    <download available>
    cpython-3.14.0a6-linux-x86_64-gnu                 <download available>
    cpython-3.13.2+freethreaded-linux-x86_64-gnu      <download available>
    cpython-3.13.2-linux-x86_64-gnu                   <download available>
    cpython-3.12.9-linux-x86_64-gnu                   <download available>
    cpython-3.11.11-linux-x86_64-gnu                  <download available>
    cpython-3.10.16-linux-x86_64-gnu                  <download available>
    cpython-3.9.21-linux-x86_64-gnu                   <download available>
    cpython-3.8.20-linux-x86_64-gnu                   <download available>
    cpython-3.7.9-linux-x86_64-gnu                    <download available>
    
  2. sudo の secure_path に追加 CentOS 7 は sudo の secure_path に /usr/local/bin が含まれていないので追加する
    ついでに /usr/local/sbin も
    /usr/local 以下は root しか書けないし、AmazonLinux 2023 や Debian 12 では最初から含まれているから問題ないでしょう sudo visudo コマンドで追加
    これを
    Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
    

    こうする

    Defaults    secure_path = /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    

    PATHと同じで左から順に探すから、/usr/local/を先に書いておく

  3. secure_path への追加を確認
    $ sudo -l
    既定値のエントリと照合中 (ユーザー名 nissy) (ホスト名 djangocms-cent7):
        !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin,    env_reset, env_keep="COLORS DISPLAY
        HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG    LC_ADDRESS LC_CTYPE",
        env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep   +="LC_MONETARY LC_NAME LC_NUMERIC
        LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET    XAUTHORITY",
        secure_path=/usr/local/sbin\:/usr/local/bin\:/sbin\:/bin\:/usr/sbin\:/usr/bin
       
    ユーザー nissy は djangocms-cent7 上で コマンドを実行できます
        (ALL) ALL
    
  4. -i オプションで全ユーザーがアクセスできるディレクトリに 3.13 をインストール
    $ sudo uv python install 3.13 -i /opt/uv-python/
    Installed Python 3.13.2 in 3.66s
     + cpython-3.13.2-linux-x86_64-gnu
    
  5. ついでに Python 3.12 もインストールしてみる
    $ sudo uv python install 3.12 -i /opt/uv-python/
    Installed Python 3.12.9 in 4.33s
     + cpython-3.12.9-linux-x86_64-gnu
    
  6. alternativesで切り替えられるように登録する
    $ sudo alternatives --install /usr/local/bin/python3.13 python3.13 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13 2
    $ sudo alternatives --install /usr/local/bin/python3.12 python3.12 /opt/uv-python/cpython-3.12.9-linux-x86_64-gnu/bin/python3.12 9
    $ alternatives --list | grep python3
    python3.13      auto    /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/bin/python3.13
    python3.12      auto    /opt/uv-python/cpython-3.12.9-linux-x86_64-gnu/bin/python3.12 
    
  7. 確認
    $ uv python list
    cpython-3.14.0a6+freethreaded-linux-x86_64-gnu    <download available>
    cpython-3.14.0a6-linux-x86_64-gnu                 <download available>
    cpython-3.13.2+freethreaded-linux-x86_64-gnu      <download available>
    cpython-3.13.2-linux-x86_64-gnu                   /usr/local/bin/python3.13 -> /etc/alternatives/   python3.13
    cpython-3.13.2-linux-x86_64-gnu                   <download available>
    cpython-3.12.9-linux-x86_64-gnu                   /usr/local/bin/python3.12 -> /etc/alternatives/   python3.12
    cpython-3.12.9-linux-x86_64-gnu                   <download available>
    cpython-3.11.11-linux-x86_64-gnu                  <download available>
    cpython-3.10.16-linux-x86_64-gnu                  <download available>
    cpython-3.9.21-linux-x86_64-gnu                   <download available>
    cpython-3.8.20-linux-x86_64-gnu                   <download available>
    cpython-3.7.9-linux-x86_64-gnu                    <download available>
    
    $ which python3.12
    /usr/local/bin/python3.12
    $ which python3.13
    /usr/local/bin/python3.13
    

OpenSSLバージョン確認

  1. OS標準の Python 2.7.5 ではEoLを過ぎたバージョンのOpenSSL
    $ env python -V
    Python 2.7.5
    $ env python -c 'import ssl; print(ssl.OPENSSL_VERSION)'
    OpenSSL 1.0.2k-fips  26 Jan 2017
    
  2. uvでインストールした Python 3.13.2 では、現行のLTS版の3.0.16
    素晴らしい
    $ env python3.13 -V
    Python 3.13.2
    $ env python3.13 -c 'import ssl; print(ssl.OPENSSL_VERSION)'
    OpenSSL 3.0.16 11 Feb 2025
    
    $ strings /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/lib/libpython3.13.so.1.0 | grep    '^OpenSSL 3'
    OpenSSL 3.0.16 11 Feb 2025
    
    $ ls -lh /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/lib/libpython3.13.so.1.0
    -rwxr-xr-x. 1 root root 37M  4月  3 18:42 /opt/uv-python/cpython-3.13.2-linux-x86_64-gnu/lib/   libpython3.13.so.1.0
    

Django CMS 4.1.5 を試す

証明書更新

証明書更新

$ sudo curl -o /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem https://curl.se/ca/cacert.pem
$ sudo ln -sf /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/cert.pem

CentOS 7 の証明書は古いし、EoLを過ぎていて ca-certificate パッケージを更新しても最新にならず以下のエラーが出るから手動で更新しておく。

$ djangocms mysite

Clone template using django-admin
django-admin startproject "mysite" --template https://github.com/django-cms/cms-template/archive/4.1.tar.gz
CommandError: couldn't download URL https://github.com/django-cms/cms-template/archive/4.1.tar.gz to 4.1.tar.gz: <urlopen
error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1028)>

Django CMS インストール

  1. uv が使う Python のバージョンを確認
    [nissy@djangocms-cent7 ~]$ uv python find
    /usr/local/bin/python3.13
    

    pin で切り替えもできる

    [nissy@djangocms-cent7 ~]$ uv python pin 3.13
    Updated `.python-version` from `3.12` -> `3.13`
    
  2. 仮想環境作成
    djangocms コマンドの途中で pip が必要だから --seed オプションを付けて入れておく
    [nissy@djangocms-cent7 ~]$ uv venv --seed ~/venvs/djangodms
    Using CPython 3.13.2 interpreter at: /usr/local/bin/python3.13
    Creating virtual environment with seed packages at: venvs/djangodms
     + pip==25.0.1
    Activate with: source venvs/djangodms/bin/activate
    
  3. 仮想環境に入る
    [nissy@djangocms-cent7 ~]$ source ~/venvs/djangodms/bin/activate
    (djangodms) [nissy@djangocms-cent7 ~]$
    
  4. uv pip で django-cmsをインストール
    (djangodms) [nissy@djangocms-cent7 ~]$ uv pip install django-cms
    Using Python 3.13.2 environment at: venvs/djangodms
    Resolved 11 packages in 705ms
    Prepared 11 packages in 1.51s
    Installed 11 packages in 1.21s
     + asgiref==3.8.1
     + django==5.2
     + django-classy-tags==4.1.0
     + django-cms==4.1.5
     + django-formtools==2.5.1
     + django-sekizai==4.1.0
     + django-treebeard==4.7.1
     + djangocms-admin-style==3.3.1
     + packaging==24.2
     + setuptools==78.1.0
     + sqlparse==0.5.3
    
  5. ディレクトリ作成
    (djangodms) [nissy@djangocms-cent7 ~]$ mkdir -p ~/webapps/djangocms
    
  6. サイト作成
    (djangodms) [nissy@djangocms-cent7 ~]$ djangocms mysite ~/webapps/djangocms
       
    Clone template using django-admin
    django-admin startproject "mysite" --template https://github.com/django-cms/cms-template/archive/ 4.1.tar.gz --directory "/home/nissy/webapps/djangocms"
    cd "/home/nissy/webapps/djangocms"
       
    Install requirements in /home/nissy/webapps/djangocms/requirements.in
    python -m pip install -r "/home/nissy/webapps/djangocms/requirements.in"
       
    Run migrations
    python -m manage migrate
       
    Create superuser
    python -m manage createsuperuser
    Username (leave blank to use 'nissy'):
    Email address:
    Password:
    Password (again):
    Superuser created successfully.
       
    Check installation
    python -m manage cms check
       
    ***************************************
    django CMS 4.1.5 installed successfully
    ***************************************
       
    Congratulations! You have successfully installed django CMS,
    the lean enterprise content management powered by Django!
       
    Now, to start the development server first go to your newly
    created project and then call the runserver management command:
    $ cd /home/nissy/webapps/djangocms
    $ python -m manage runserver
       
    Learn more at https://docs.django-cms.org/
    Join the django CMS Discord Server at https://discord-main-channel.django-cms.org
       
    Enjoy!
    
  7. Django CMS 実行
    (djangodms) [nissy@djangocms-cent7 ~]$ cd ~/webapps/djangocms
    (djangodms) [nissy@djangocms-cent7 ~]$ python -m manage runserver
    
  8. Django CMS にアクセス
    TCP:8000 を SSH ローカル転送して http://127.0.0.1:8000 にWebブラウザでアクセスし、python -m manage createsuperuser で作成したユーザーとパスワードでログインする

CentOS 7 でも Python 3.13 をインストールして Django CMS 4.1.5 を起動できた!

© 2020 nissy-lab.com