血糖値管理のWebアプリの完成形は、家屋内のLAN環境にLinuxのWebサーバーを設置し、家屋内の各パソコン(WindowsPCとMac)からアプリを利用できることと、ルーターを介してWAN側からも利用できるようにすることです。WAN側からはスマホでの利用を想定しています。
今回は、完成形(本番環境)の構築手順や方法について、記載します。
まだ、調査段階であり、これから訂正することがあるかもしれませんが、
忘備録の意味も含めて記載しておこうと思います。
本番移行までの手順を以下の項目ごとに記述します。
① Webサーバーの構築
② ネットワーク構成
③ Apacheにリバースプロキシ―サーバーの設定
④ SQLightをMySQLに変更する
⑤ アプリの発行
⑥ デプロイ
Webサーバー(Ubuntu)の構築
LinuxはUbuntuにする予定です。
マシンは、中古の安いデスクトップパソコンを使用しようか、と考えています。
Apache、MySQLそして.NET Core ランタイムをインストールし、血糖値管理のWebアプリをデプロイします。
.NET Core ランタイムは血糖値管理アプリを動かすために必要です。
その他、SSL、SSH、SFTPなどもインストールします。
Ubuntuのインストールは以下の手順で行います。
- Ubuntuの最新版のISOファイルをインストール
https://jp.ubuntu.com/download - USB、CDもしくはDVDにISOを書き込む
- BIOSの起動
- BIOSで「起動」の優先順位を設定(USB、CD、DVDなどに設定)
- Ubuntuの起動とインストール設定
MySQLのインストールは下記サイトから行います
参考サイトUbuntu 20.04にMySQLをインストールする方法 | DigitalOcean
コンソールから次のコマンドでインストールします。
sudo apt update ←パッケージマネジャーの更新
sudo apt install mysql-server ←インストール
sudo mysql_secure_installation ←セキュリティスクリプトの実行
あとは、ユーザーの作成、データベースの作成、テーブルの作成を行います。
詳細は、別記事に掲載したいと思います。
.NET Core ランタイムのインストールは、次の手順で行います。
まず、Ubuntuのパッケージマネージャーを更新します。
sudo apt-get update
次に、.NET Coreのランタイムをインストールします。
sudo apt-get install -y dotnet-runtime-3.1
※このコマンドは、.NET Core 3.1ランタイムをインストールします。
ネットワーク構成
LAN側はWindows11パソコン、Windows10パソコン、Mac Airが有線と無線でLAN接続されています。
それぞれにプライベートIPアドレスが割り当てられています。
ルーターはWAN側のIPアドレス219...***が割り当てられています。
LAN側は、192.168.0.1が割り当てられています。
このIPアドレスは、コマンドプロンプトから以下のように入力すると取得することができます。
C:\Users\user1>tracert -d 8.8.8.8
8.8.8.8 へのルートをトレースしています。経由するホップ数は最大 30 です
1 <1 ms <1 ms <1 ms 192.168.0.1 ←ルーターのLAN側のIPアドレス
2 54 ms 14 ms 12 ms 219.***.***.1 ←ルーターのWAN側のIPアドレス
3 14 ms 14 ms 13 ms 10.***.***.67
4 18 ms 16 ms 22 ms 10.***.***.101
5 17 ms 12 ms 12 ms 10.***.***.245
6 17 ms 28 ms 17 ms 220.***.***.26
7 13 ms 13 ms 17 ms 142.***.***.52
8 20 ms 15 ms 12 ms 209.***.***.253
9 16 ms 18 ms 17 ms 142.***.***.139
10 22 ms 18 ms 12 ms 8.8.8.8 ←GoogleのパブリックDNSサーバー
トレースを完了しました。
LAN側のプライベートIPアドレスは、ルーターにより自動的に割り当てられたものです。
パソコンから以下のコマンドを入力すると、そのパソコンに割り当てられたIPアドレスを知ることができます。
C:\Users\user1>ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::c277:4db7:e635:4a06%10
IPv4 アドレス . . . . . . . . . . . .: 192.168.0.18 ←パソコンのプライベートIPアドレス
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .: fe80::217:10ff:fe93:d624%10
192.168.0.1 ← ルーターのLAN側のプライベートIPアドレス
~以下省略~
ルーターにファイアウォールの設定も行います。
ポート番号80、443、22(など)以外のポートは閉じるようにします。
最初は、LAN内だけのWebサーバーとします。
WANにするためには、原則としてグローバルIPアドレスの取得が必要になります。
また、セキュリティ対策など、安全面、運用面、技術面でハードルが高くなります。
いまのところ、WAN対応は、できたらいいな、くらいの感じです。
Apacheにリバースプロキシサーバーの設定
HTTP(ポート番号80)でリクエストをApacheが受け取ったら、Apacheはその要求をASP .NET CoreのWebアプリに転送をします。
ApacheはHTTPリクエストの処理は行わず、そのままASP.NET Coreに転送だけ行います。
処理はASP.NET CoreのWebアプリが行います。
これをリバースプロキシといい、Apaceはリバースプロキシサーバーとしての設定を行うことができます。
Ubuntuの/etc/apache2/httpd.conf ファイルに以下のように設定します。
<VirtualHost *:*>
RequestHeader set “X-Forwarded-Proto” expr=%{REQUEST_SCHEME}s
</VirtualHost>
<VirtualHost *:80>
ProxyPreserveHost On
ProxyPass / http://192.168.3.9:5000/ ←WebサーバーのプライベートIPアドレスと.NET Coreのポート番号
ProxyPassReverse / http://192.168.3.9:5000/ ←WebサーバーのプライベートIPアドレスと.NET Coreのポート番号
ErrorLog ${APACHE_LOG_DIR}/helloapp-error.log
CustomLog ${APACHE_LOG_DIR}/helloapp-access.log common
</VirtualHost>
リバースプロキシについては、この記事の最後にまとめました。
SQLiteをMySQLに変更する
この作業は開発マシン(Windows11)で行います。
開発マシンには、既にMySQLをインストールしています。
MySQLにデータベース、テーブル、ユーザーを作成
本番環境のデータベースは、MySQLを使用します。
現在、開発環境では、SQLiTeを使用してます。
開発環境も本番環境と同じMySQLにする必要があります。
このため、開発環境にMySQLをインストール(私はインストール済み)して、データベースの作成、テーブルの作成、ユーザーの作成を行います。
詳細は、別の記事に掲載したいと思います。
appsetting.jsonの変更
次に開発プロジェクトのappsetting.jsonファイルのデータベース接続情報をSQLiteからMySQLに変更します。
現在の設定
“ConnectionStrings”: {
“BGCContext”:
“Server=(localdb)\\mssqllocaldb:Databese=BGCContex-6aebee35-bede-442a-896a-efcfa237861e:Trusted_Cpnnection=True;MultipleActiveResultSets=true”
変更の設定
“ConnectionStrings”: {
“BGCContext”: “Server=localhost;Databese=BGC;UserId=User01;Password=password;“
program.csの変更
appsetting.jsonファイルに記載した「BGCContext」は接続文字列といって、Program.csでデータベース接続のために使用される名前です。
Program.csの該当コードを以下のように変更します。
現在の設定
builder.Services.AddDbContext<BGCContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString(“BGCContext”) ?? throw new InvalidOperationException(“Connection string ‘BGCContext’ not found.”)));
変更の設定
builder.Services.AddDbContext<BGCContext>(options =>
options.UseMySql(builder.Configuration.GetConnectionString(“BGCContext”) ?? throw new InvalidOperationException(“Connection string ‘BGCContext’ not found.”)));
マイグレーションを実行
パッケージ マネージャー コンソール (PMC) を使用して、データベースをマイグレーションします。
コマンド: Update-Database
アプリの発行
開発したアプリをdotnet publish –configuration Releaseコマンドで発行します。
D:\www\netcore-web>dotnet publish –configuration Release
.NET Core 向け Microsoft (R) Build Engine バージョン 16.4.0+e901037fe Copyright (C) Microsoft Corporation.All rights reserved.
D:\www\netcore-web\netcore-web.csproj の復元が 90.25 ms で完了しました。
netcore-web -> D:\www\netcore-web\bin\Release\netcoreapp3.1\netcore-web.dll
netcore-web -> D:\www\netcore-web\bin\Release\netcoreapp3.1\netcore-web.Views.dll
netcore-web -> D:\www\netcore-web\bin\Release\netcoreapp3.1\publish\ ← publish内をLinuxにコピーする
※D:\www\netcore-webは例です。
デプロイ
dotnet publish –configuration Releaseコマンドで発行したアプリ(publishiフォルダ内)をSFTPでLinuxサーバー(Ubuntu)内の所定の場所「/var/www/」以下にコピーします。
つぎにアプリケーションをデーモンとして起動する設定を行います。
アプリケーションを実行するためのサービスファイルを作成します。
このファイルには、アプリケーションの実行ファイルのパス、アプリケーションを実行するためのユーザー名、アプリケーションを実行するための環境変数などが含まれます。
サービスファイルを/etc/systemd/system/ディレクトリに配置します。
サービスを有効にします。これには、systemctl enableコマンドを使用します。
サービスを開始します。これには、systemctl startコマンドを使用します
※ここでは、概要だけにとどめ、具体的な方法は別途記載したいと思います。
リバースプロキシ
プロキシサーバーがクライアントとの間の代理を行うのに対して、リバースプロキシはWebサーバーとの間の代理を行います。
代理の内容としては、受け取ったリクエストを複数のサーバーに分散して負荷を軽減することなどが挙げられます。
今回のリバースプロキシの役割は、受け取ったリクエストに対する処理をASP.NET Core Webアプリ(ひとつのサーバー)へ転送してもらうことです。
これにより、HTTPリクエストをASP.NET Core Webアプリが処理できるようになります。
以上、調査段階のまとめです。
不足してい事柄や、間違えて捉えている点があると思うので、順次修正していきたいと思います。
追記
WANで血糖値管理アプリを使えるようにするためには、Linuxサーバー用の機器調達のほかに、グローバルIPアドレスの取得など、お金がかかります。
あまりお金を費やしたくありません。
使える金額を予算化していることや、私自身の持ち物に関してはミニマリストを目指しているので物を増やしたくないというのもあります。
何せ仕事用のPC2台、個人用のPC3台(開発PC、普段使うPC、Mac Air)が私の作業机の上を占拠している状態なのです。
(不用なものは大分処分したのですが、すぐに溜まっていくように思います。維持が難しい。)
LAN内の各パソコンから血糖値管理アプリを利用できるところから開始して、
WANはその次になるかと思います。
ただ、WAN対応にすれば、スマホで利用できるようになるため、格段に便利になります。
血糖値管理の開発は、ページング機能、CSVファイル出力機能を追加すれば、ほぼ完成です。
完成したら、開発環境のデータベースをMySQLに変更するところから手掛けたいと思います。
Linuxサーバーの構築は、その後になります。