👋

AIを利用して知識ゼロからPythonでシステム構築をする その1 - サーバー構築編 -

2023/09/04に公開

サーバー構築編

前提知識と仕様

  • PHPやJavaを用いたWebアプリケーションの開発経験はあるが、Pythonは全く触った経験無し
  • さくらのレンタルサーバ スタンダードを契約済み
  • 問い合わせは基本的に無料で利用できるChatGPT3.5を利用
  • できる限りAIを利用して構築(使用技術等は自分で決定し、随時記載)

User

PythonでWebアプリケーションを作成します。
はじめに何からすればいいですか?

ChatGPT

PythonでWebアプリケーションを作成する際の基本的な手順は次のとおりです:

  1. Webフレームワークの選択: Pythonには様々なWebフレームワークがあります。一般的な選択肢としてはDjango、Flask、FastAPIなどがあります。プロジェクトの要件や目標に応じて最適なフレームワークを選びましょう。

  2. 開発環境のセットアップ: Pythonの開発には、Pythonのバージョン管理ツールであるpipを使用してパッケージをインストールすることが一般的です。また、IDE(統合開発環境)やテキストエディタを選んでセットアップしましょう。人気のある選択肢としてはVisual Studio Code、PyCharm、Sublime Textなどがあります。

  3. プロジェクトのセットアップ: 選んだフレームワークに応じて、プロジェクトをセットアップします。フレームワークの公式ドキュメントに従って、プロジェクトの初期化や必要なファイルやフォルダの作成を行いましょう。

  4. ルーティングとビューの作成: Webアプリケーションでは、URLとアクセスされたときに実行されるコード(ビュー)を関連付ける必要があります。フレームワークのルーティング機能を使用して、URLとビューのマッピングを設定します。

  5. テンプレートの作成: Webアプリケーションでは、動的なHTMLページを生成するためにテンプレートエンジンを使用します。テンプレートエンジンは、HTMLテンプレート内に変数や制御フローを埋め込むための仕組みです。フレームワークのドキュメントに従ってテンプレートを作成しましょう。

  6. データベースの設計と統合: もしWebアプリケーションがデータベースを使用する場合、データベースの設計と統合を行う必要があります。フレームワークのORM(Object-Relational Mapping)機能やクエリビルダを使用してデータベースとのやり取りを行います。

  7. ユーザー認証とセキュリティ: もしユーザー認証やセッション管理が必要な場合、フレームワークが提供する認証機能やセキュリティ機能を利用して実装します。

  8. 静的ファイルの処理: CSS、JavaScript、画像などの静的ファイルを提供する必要がある場合、フレームワークの静的ファイルの処理機能を使用して設定します。

  9. テスト: Webアプリケーションの品質を確保するために、ユニットテストや統合テストを実施しましょう。フレームワークが提供するテストツールやライブラリを使用すると便利です。

  10. デプロイ: Webアプリケーションを本番環境にデプロイする準備を行います。サーバーのセットアップ、ドメイン名の取得、SSL証明書の設定など、必要な手順を実行しましょう。

これらは基本的な手順ですが、プロジェクトの規模や要件によって追加の手順が必要になる場合もあります。フレームワークのドキュメントやチュートリアルを参考にしながら進めると良いでしょう。


追加仕様

  • フレームワークはFlaskを使ってみることとする

User

さくらのレンタルサーバーでFlaskを利用して開発します。
サーバーの設定はどうすればいいですか?

ChatGPT

さくらのレンタルサーバーでFlaskを利用するためには、以下の手順を実行する必要があります:

  1. サーバーにログイン: SSHを使用してさくらのレンタルサーバーにログインします。提供されたユーザー名とパスワードを使用してログインします。

  2. Pythonのインストール: サーバーにPythonをインストールする必要があります。さくらのレンタルサーバーは通常、Pythonがプリインストールされている場合がありますが、最新のバージョンが必要な場合は自分でインストールする必要があります。

    サーバーにPythonがインストールされているかどうかを確認するには、ターミナルでpython --versionコマンドを実行してバージョンが表示されるかどうかを確認します。インストールされていない場合は、さくらのレンタルサーバーのマニュアルやサポートドキュメントを参照して、Pythonをインストールしてください。

  3. 仮想環境の作成: プロジェクトごとに独立した仮想環境を作成することをおすすめします。仮想環境を作成することで、プロジェクトの依存関係を管理しやすくなります。

    仮想環境を作成するには、まずvirtualenvツールをインストールします。ターミナルで以下のコマンドを実行します:

    pip install virtualenv
    

    その後、プロジェクトのディレクトリに移動し、仮想環境を作成します:

    virtualenv myenv
    

    これにより、myenvという名前の仮想環境が作成されます。

  4. 仮想環境をアクティベート: 仮想環境を使用するためには、アクティベートする必要があります。ターミナルで以下のコマンドを実行します:

    source myenv/bin/activate
    

    これにより、プロンプトの先頭に(myenv)が表示され、仮想環境がアクティブになります。

  5. Flaskのインストール: 仮想環境がアクティブな状態で、Flaskをインストールします。ターミナルで以下のコマンドを実行します:

    pip install flask
    

    Flaskがインストールされます。

  6. Flaskアプリケーションの作成: 任意のディレクトリにFlaskアプリケーションのソースコードを作成します。通常、FlaskアプリケーションはPythonファイルとテンプレート、静的ファイル(CSS、JavaScriptなど)から構成されます。

  7. アプリケーションの実行: Flaskアプリケーションを実行するには、ターミナルで以下のコマンドを実行します:

    flask run --host=0.0.0.0 --port=8000
    

    これにより、Flaskアプリケーションが指定したポート(ここでは8000)で実行されます。

以上の手順に従うと、さくらのレンタルサーバーでFlaskを利用したWebアプリケーションの開発が始められます。注意点としては、公開するポートやドメイン名、SSL証明書の設定など、セキュリティとネットワークの設定も適切に行う必要があります。さくらのレンタルサーバーのマニュアルやサポートドキュメントを参照し、必要な設定を行ってください。


ここで問題発生

% pip install virtualenv
pip: Command not found.

User

pip install virtualenvとすると pip: Command not found. となりました

ChatGPT

さくらのレンタルサーバーで pip コマンドが見つからない場合、Pythonのパッケージ管理ツールである pip が正しくインストールされていない可能性があります。以下の手順で pip をインストールすることができます:

  1. easy_install コマンドを使用して pip をインストールします。ターミナルで以下のコマンドを実行します:

    easy_install pip
    

    easy_install はPythonパッケージのインストールツールであり、通常はPythonの標準モジュールとしてインストールされています。

  2. pip コマンドがインストールされたかどうかを確認するために、以下のコマンドを実行します:

    pip --version
    

    バージョン情報が表示されれば、pip が正常にインストールされています。

もし easy_install コマンドも見つからない場合、さくらのレンタルサーバーでPythonのパッケージ管理ツールを利用するためには、サーバーに管理者権限が必要な場合があります。サーバーの管理者に連絡し、必要なパッケージ管理ツールのインストールについて相談してみてください。

別の方法として、さくらのレンタルサーバーでは pyenv というツールを使用してPythonのバージョン管理を行うこともできます。pyenv を使用すると、特定のPythonバージョンに関連付けられた pip コマンドが利用可能になります。詳細な手順については、さくらのレンタルサーバーのドキュメントやサポートを参照してください。


再び問題発生

% easy_install pip
easy_install: Command not found.

この後、ChatGPTとBardに問い合わせて実行しようとするがうまくいかずAIだけですることを断念。
まず、Pythonははじめからインストールされているが、その使い方が全くわからない。
以下は色々とコマンドを叩いてみた履歴

% python --version
Python 3.8.12
% pip install virtualenv
pip: Command not found.
% easy_install pip
easy_install: Command not found.
% pip --version
pip: Command not found.
% pyenv
pyenv: Command not found.
% python --version
Python 3.8.12
% easy_install pip
easy_install: Command not found.
% easy_install 
easy_install: Command not found.

色々と調べたらよくわからないけど.pydistutils.cfgが必要?
(結果としてこれが問題となって失敗したのでこれは不要)

% ~/.pydistutils.cfg
/home/XXX/.pydistutils.cfg: Command not found.
% vi ~/.pydistutils.cfg

[install]
user=1

下記、URLを元に.cshrcを設定
https://qiita.com/peace098beat/items/de9fdadfc4128e99bca6

% vi .cshrc
〜(略)〜

# https://qiita.com/peace098beat/items/de9fdadfc4128e99bca6
# Setting for pyenv
# *****************
if ( -e $HOME/.pyenv/bin/pyenv ) then
        echo '>> Exist pyenv'
        # pyenv\xe3\x81\xae\xe3\x83\xab\xe3\x83\xbc\xe3\x83\x88\xe3\x83\x91\xe3\x82\xb9\xe3\x82\x92\xe8\xa8\xad\xe5\xae\x9a
        setenv PYENV_ROOT $HOME/.pyenv
        # pyenv\xe3\x81\xae\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xac\xe3\x82\xaf\xe3\x83\x88\xe3\x83\xaa\xe3\x82\x92PATH\xe3\x81\xab\xe8\xbf\xbd\xe5\x8a\xa0
        setenv PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH
        # \xe3\x83\x87\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xab\xe3\x83\x88\xe3\x83\x86\xe3\x83\xb3\xe3\x83\x9d\xe3\x83\xa9\xe3\x83\xaa\xe3\x83\x87\xe3\x82\xa3\xe3\x83\xac\xe3\x82\xaf\xe3\x83\x88\xe
3\x83\xaa\xe3\x82\x92~/tmp\xe3\x81\xab\xe5\xa4\x89\xe6\x9b\xb4
        setenv TMPDIR $HOME/tmp
        # pyenv\xe3\x81\xae\xe5\x86\x8d\xe8\xb5\xb7\xe5\x8b\x95
        pyenv rehash
else
        echo '>> NO INSTALL pyenv'

反映

% source $HOME/.cshrc
>> Exist pyenv

色々と試行錯誤しながらコマンドをたたく(無駄なこともあるかもしれなけどログとして残す)

% easy_install --prefix=~/.local pip
easy_install: Command not found.
% git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
Cloning into '/home/XXX/.pyenv/plugins/pyenv-virtualenv'...
remote: Enumerating objects: 2242, done.
remote: Counting objects: 100% (171/171), done.
remote: Compressing objects: 100% (110/110), done.
remote: Total 2242 (delta 92), reused 115 (delta 54), pack-reused 2071
Receiving objects: 100% (2242/2242), 637.32 KiB | 14.48 MiB/s, done.
Resolving deltas: 100% (1512/1512), done.
% pyenv virtualenv
pyenv-virtualenv: no virtualenv name given.
% pyenv -v
pyenv 2.3.20-3-g38ac7472
% pyenv virtualenv 3.8.12 3.8.12-flask
pyenv-virtualenv: `3.8.12' is not installed in pyenv.
Run `pyenv install 3.8.12' to install it.

pyenvでインストールすればOKなのか?ということで実行するがBUILD FAILEDでうまくいかない

% pyenv install 3.8.12
WARNING: Please make sure you remove any previous custom paths from your /home/XXX/.pydistutils.cfg file.
Downloading Python-3.8.12.tar.xz...
-> https://www.python.org/ftp/python/3.8.12/Python-3.8.12.tar.xz
Installing Python-3.8.12...
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
〜(略)〜
done
pkg: Unable to open '/usr/local/etc/pkg/repos//sakura-repo.conf':Permission denied
pkg: No packages installed
pkg: Unable to open '/usr/local/etc/pkg/repos//sakura-repo.conf':Permission denied
pkg: No packages installed

BUILD FAILED (FreeBSD 13.0 using python-build 2.3.20-3-g38ac7472)
〜(略)〜

ここから長い戦いがはじまる。
Permission deniedとなっているのでこれが問題ありそうと調べるが何もでてこない。
ビルドログを見てもさっぱりわからない。
バージョンが違うのかと思い、別のバージョンでも試すがダメ

% pyenv install 3.7.11
〜(略)〜
BUILD FAILED (FreeBSD 13.0 using python-build 2.3.20-3-g38ac7472)
〜(略)〜

何度もいろんなバージョンをinstallしてBUILD FAILEDを見てがっかりして諦めそうになるを数十回、繰り返していたが、installコマンドの直後にWARNINGが出ていることに気づく

% pyenv install 3.7.6
WARNING: Please make sure you remove any previous custom paths from your /home/XXX/.pydistutils.cfg file.

ここではじめて.pydistutils.cfgが邪魔していることに気づき削除してinstall

% rm /home/XXX/.pydistutils.cfg
% pyenv install 3.7.6
Downloading Python-3.7.6.tar.xz...
-> https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tar.xz
Installing Python-3.7.6...
pkg: Unable to open '/usr/local/etc/pkg/repos//sakura-repo.conf':Permission denied
pkg: No packages installed
pkg: Unable to open '/usr/local/etc/pkg/repos//sakura-repo.conf':Permission denied
pkg: No packages installed
Installed Python-3.7.6 to /home/XXX/.pyenv/versions/3.7.6

はじめてinstallに成功(Permission deniedは問題ないらしい)
ようやく問題を解決したのでvirtualenv myenvを実行

% virtualenv myenv
created virtual environment CPython3.7.6.final.0-64 in 525ms
  creator CPython3Posix(dest=/home/XXX/myenv, clear=False, no_vcs_ignore=False, global=False)
  seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=/home/XXX/.local/share/virtualenv)
    added seed packages: pip==23.1.2, setuptools==67.8.0, wheel==0.40.0
  activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivator

再び問題発生

ChatGPTどおりにコマンドを叩いてもエラーになる。

% source myenv/bin/activate
Missing '}'.

早々に諦めて以前も参考にした下記サイトをベースに構築
https://qiita.com/peace098beat/items/de9fdadfc4128e99bca6

% pyenv virtualenv 3.9.6 3.9.6-flask
Looking in links: /home/XXX/tmp/tmpbw6l4ghl
Requirement already satisfied: setuptools in /home/XXX/.pyenv/versions/3.9.6/envs/3.9.6-flask/lib/python3.9/site-packages (56.0.0)
Requirement already satisfied: pip in /home/XXX/.pyenv/versions/3.9.6/envs/3.9.6-flask/lib/python3.9/site-packages (21.1.3)
% pyenv local 3.9.6-flask
% pip install Flask
Collecting Flask
  Downloading Flask-2.3.2-py3-none-any.whl (96 kB)
     |████████████████████████████████| 96 kB 16.6 MB/s 
Collecting blinker>=1.6.2
  Downloading blinker-1.6.2-py3-none-any.whl (13 kB)
Collecting Werkzeug>=2.3.3
  Downloading Werkzeug-2.3.6-py3-none-any.whl (242 kB)
     |████████████████████████████████| 242 kB 99.6 MB/s 
Collecting importlib-metadata>=3.6.0
  Downloading importlib_metadata-6.7.0-py3-none-any.whl (22 kB)
Collecting itsdangerous>=2.1.2
  Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting Jinja2>=3.1.2
  Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
     |████████████████████████████████| 133 kB 49.5 MB/s 
Collecting click>=8.1.3
  Downloading click-8.1.3-py3-none-any.whl (96 kB)
     |████████████████████████████████| 96 kB 14.1 MB/s 
Collecting zipp>=0.5
  Using cached zipp-3.15.0-py3-none-any.whl (6.8 kB)
Collecting MarkupSafe>=2.0
  Downloading MarkupSafe-2.1.3.tar.gz (19 kB)
Using legacy 'setup.py install' for MarkupSafe, since package 'wheel' is not installed.
Installing collected packages: zipp, MarkupSafe, Werkzeug, Jinja2, itsdangerous, importlib-metadata, click, blinker, Flask
    Running setup.py install for MarkupSafe ... done
Successfully installed Flask-2.3.2 Jinja2-3.1.2 MarkupSafe-2.1.3 Werkzeug-2.3.6 blinker-1.6.2 click-8.1.3 importlib-metadata-6.7.0 itsdangerous-2.1.2 zipp-3.15.0
WARNING: You are using pip version 21.1.3; however, version 23.1.2 is available.
You should consider upgrading via the '/home/XXX/.pyenv/versions/3.9.6/envs/3.9.6-flask/bin/python3.9 -m pip install --upgrade pip' command.

WARNINGが出ているのでpip upgrade

% pip install --upgrade pip
Requirement already satisfied: pip in /home/XXX/.pyenv/versions/3.9.6/envs/3.9.6-flask/lib/python3.9/site-packages (21.1.3)
Collecting pip
  Using cached pip-23.1.2-py3-none-any.whl (2.1 MB)
Installing collected packages: pip
  Attempting uninstall: pip
    Found existing installation: pip 21.1.3
    Uninstalling pip-21.1.3:
      Successfully uninstalled pip-21.1.3
Successfully installed pip-23.1.2

プロジェクトの作成

% mkdir ~/www/flask-cgi-test
% mkdir ~/www/flask-cgi-test/hello
% cd ~/www/flask-cgi-test/hello

.htaccess

% vi .htaccess

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask-cgi-test/hello/index.cgi/$1 [QSA,L]

appFlask.py

% vi appFlask.py

# coding: utf-8
 
from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def index():
    return "Hello!"
 
if __name__ == '__main__':
    app.run()

index.cgi

% vi index.cgi

#!/home/XXX/.pyenv/versions/3.9.6-flask/bin/python
 
import cgitb
cgitb.enable()
 
from wsgiref.handlers import CGIHandler
from appFlask import app
CGIHandler().run(app)

サイトのとおりに設定すると404になる。
原因はWebrootが/www/以下ではなかったため。
ファイルを全て移動して再度アクセスすると今度は500エラーとなる。
エラー内容を確認すると
suexec policy violation: see suexec log for more details: /home/XXX/www/(webroot)/flask-cgi-test/hello/index.cgi
とのエラー。これはindex.cgiの権限がないエラーのようなのでchmodを実行

% ls -la
total 20
drwxr-xr-x  2 XXX  users  512 Jun 28 20:09 .
drwxr-xr-x  3 XXX  users  512 Jun 28 20:08 ..
-rw-r--r--  1 XXX  users  116 Jun 28 20:09 .htaccess
-rw-r--r--  1 XXX  users  155 Jun 28 20:08 appFlask.py
-rw-r--r--  1 XXX  users  177 Jun 28 20:08 index.cgi
% chmod 755 index.cgi 
% ls -la
total 20
drwxr-xr-x  2 XXX  users  512 Jun 28 20:09 .
drwxr-xr-x  3 XXX  users  512 Jun 28 20:08 ..
-rw-r--r--  1 XXX  users  116 Jun 28 20:09 .htaccess
-rw-r--r--  1 XXX  users  155 Jun 28 20:08 appFlask.py
-rwxr-xr-x  1 XXX  users  177 Jun 28 20:08 index.cgi

これを実行すると無事に
Hello!
と表示

Discussion