「Googleレンズと連携したレシート管理のプロトタイプ(3)」で紹介したように、レシートデータをローカルのMySQLデータベースに保存しました。
今回、ローカルのMySQLサーバーに保存したのですが、これをパブリックなネットワークにあるデータベースに変更しようと思いました。
私はXFree(無料レンタルサーバー)のアカウントを持っているので、レンタルサーバーのMySQLサーバーに変更する試みをしました。
なお、動作するプログラムは、サーバーサイドプログラムではなく、ローカルパソコンで動くPythonプログラムからデータベースに接続しようという試みです。
結論からいうと、それはできないようです。
Googleレンズと連携したレシート管理のプロトタイプ(2)のサンプルコードのホストをMySQLサーバーのIPアドレスまたはURLに変更し、userとpasswordはMySQLサーバー側で設定したものに変更し、databaseもサーバー側で作成したものに変更しました。
#
# データベース接続情報を設定
#
db_config = {
"host": "■■■.■■■.■■■.■■■",
"user": "sampleuser",
"password": "samplepass",
"database": "sampledb"
}
変更後、実行すると次のエラーになりました。
Error: ‘2003 (HY000): Can’t connect to MySQL server on ‘■■■.■■■.■■■.■■■:3306′ (10060)’
コマンドラインから次のように入力して実行しても同じエラーになりました。
mysql -h ■■■.■■■.■■■.■■■ -u sampleuser -p -P 3306 sampledb;
ホスト名、ユーザー名、データベース名は正しく設定されています。
私の方はクライアントになる訳ですが、ブロックをかけるような設定はしていません。
原因をいろいろ調べた結果、これが原因だろうというものがありました。(おそらく)
原因は、MySQLデータベースサーバーへの接続を許可するIPアドレスがプライベートアドレスになっているため、と思われます。
どのIPアドレスをMySQLサーバーに接続を許可するかという設定はmy.cnfファイルにあります。
Linuxの場合、 /etc/my.cnfまたは/etc/mysql/my.cnfにあります。
(Windows: C:\ProgramData\MySQL\MySQL Server 5.7\my.ini12)
この設定がXFreeの場合、以下のようになっています。(なっているハズ)
[mysqld]
bind-address = 127.0.0.1
または、
[mysqld]
bind-address = localhost
この設定は、XFreeのMySQLサーバーへの接続は、ローカル(=サーバー自身)からしかアクセスができないというものです。
127.0.0.1やlocalhostは、ループバックアドレスといって、NIC(ネットワークインターフェースカード)に到達した信号が折り返して自分自身に戻ってくるという、特殊なアドレスです。
つまり、自分自身としか通信できないアドレスです。
外部のネットワークからMySQLサーバーにアクセスするためには、設定を次のように変更する必要があります。
[mysqld]
bind-address = 0.0.0.0
しかし、my.cnfの設定は、管理者権限が必要で、XFreeの利用者には権限が与えられていません。
つまり、私には設定を変更する権限がありません。
したがって、
「ローカルパソコン上で動作するプログラムは、レンタルサーバーのMySQLに接続はできない」
とう結論です。
この問題を解決するためにはサーバーサイドで動作するプログラムにする必要があります。
セキュリティ上、この結論は当然と言えるでしょう。
ただ、今回の「Googleレンズと連携したレシート管理」プログラムをサーバーサイドプログラムにするのは躊躇してしまいます。
とりあえずレシートデータをデータベースに登録して、その後にゆっくりとSQLを使ってデータ分析をするという使い方を想定しています。
レシートデータの入力が簡単にできて、データベースに登録できれば良いので、スタンドアローン型のプログラムとしてレシート管理プログラムを作っていくことになりそうです。