こんにちは。那須野です。
生成AIの進化が急激に進み、分かる人ならコーディングが簡単にできるようになってきた昨今、WordPressのようなノーコード・・・というかローコードシステムは、サイトによっては逆に制約となって邪魔になるケースが出てきました。
「であればいっそのこと、全部、生成AIで管理すればいいのではないか?」
しかも最近は、おそらくは「悪意を持った人間たちが生成AIを駆使して成果を出してきた」結果として、企業の情報漏洩が大量発生しています。
ありとあらゆるサイトやアプリが落とされていく中で、データベースを持つ動的なサイトを運営することのリスクもそれなりに高くなっていると感じていたので、であればWordPressを静的なサイトに変える、つまり管理画面がないサイトに変えることを検討してみたくなりました。
ということで、WordPressで運用していたサイトを、"AIネイティブ"に管理できるような仕組みということで「AIネイティブ×GitHubベースのContent as Code開発基盤」を再構築してみることにしました。
ここで言う"AIネイティブ"とは何か?
この方針で考えたときに、以下のようなアーキテクチャが浮かびました。
これであれば
といった形でシンプルに運用できて、よさそうです。
なお、「AIネイティブ×GitHubベースのContent as Code開発基盤」というのはアーキテクチャの特徴を適切に表現していると思う一方で長くて呼びにくいので、以降は思想としては合っていなくもない「準静的サイト」という言葉を使いたいと思います。
ちなみに自分の場合、作業する環境は以下のとおりです。
それでは、この方向で具体的な手順を見てみましょう。
それでは具体的な手順について、備忘録的にまとめていきます。
まず、すべてのコンテンツを集約するリポジトリを新設します。明確な意図がない限りは、Privateで作成します。
ChatGPTからアクセスできるリポジトリを制限している場合、新設したリポジトリについて、ユーザーのSettings > Integrations > Applicationsから、ChatGPT Codex Connectorのリポジトリアクセスに加えます。
WordPressで管理していたコンテンツを、GitHub上に再構築します。ここで言うコンテンツとは主に
になるかなと思います。設計思想に基づいて、生成AIも使いながら具体的に設計→構築します。
GitHubアクションでサイトコンテンツを同期する先の環境としてdev, prodディレクトリを作ります。
ディレクトリは、
のように、階層を作ります。
デプロイユーザーがない場合、以下のように作成し、
|
1 2 3 4 5 6 7 8 9 10 |
# デプロイユーザー作成 sudo adduser {deploy_user_name} sudo usermod -aG apache {deploy_user_name} # デプロイユーザーの認証鍵の箱を作る sudo -u {deploy_user_name} mkdir -p /home/{deploy_user_name}/.ssh sudo -u {deploy_user_name} chmod 700 /home/{deploy_user_name}/.ssh sudo -u {deploy_user_name} touch /home/{deploy_user_name}/.ssh/authorized_keys sudo -u {deploy_user_name} chmod 600 /home/{deploy_user_name}/.ssh/authorized_keys sudo chown -R {deploy_user_name}:{deploy_user_name} /home/{deploy_user_name}/.ssh |
続いてSSHD設定にてログイン可能ユーザー(AllowUsers)に登録し、ローカルからログインできることを確認しておきます。
|
1 2 3 |
vim /etc/ssh/sshd_config sudo sshd -t sudo systemctl reload sshd |
デプロイユーザーについて、新設したサイトディレクトリに対して権限を付与します。
|
1 2 3 4 5 6 7 8 9 |
# デプロイユーザーへのサイト権限付与 sudo chown -R {deploy_user_name}:apache /var/www/html/{site_name} sudo find /var/www/html/{site_name} -type d -exec chmod 2750 {} \; # 念のため結果確認 id {deploy_user_name} ls -ld /var/www/html/{site_name} ls -ld /var/www/html/{site_name}/dev ls -ld /var/www/html/{site_name}/prod |
続いて、ローカル環境(PowerShellなど)でキーペア(公開鍵と秘密鍵)を生成します。鍵名の区切り文字はハイフンではなくアンダーバーにしておきます。
|
1 |
ssh-keygen -t ed25519 -C "{site_name}" -f {site_name_with_underbar} |
その後、VPS側に戻って、公開鍵の方を追記します。
|
1 |
sudo -u {deploy_user_name} vi /home/{deploy_user_name}/.ssh/authorized_keys |
↓追記内容
|
1 |
no-port-forwarding,no-agent-forwarding,no-X11-forwarding {secret_key_with_key_name} |
続いてGitHubリポジトリに戻り、Settings > Environmentsからdevとprodに対してそれぞれシークレットと変数を登録します。設計にもよりますが、以下のようなイメージです。
dev, prodのURLからアクセスできるように、それぞれDNS設定を行います。
現行のWordPressサイトが生きている状態なので、いったんreplace-dev.{site_url}, replace.{site_url}という移行期用URLにて設定し、問題なければ現行サイトのURLと差し替えることにします。
自分の場合、お名前.comでドメイン管理しているので、管理画面の該当ドメインを開き、ネームサーバー→ドメインDNS設定→ドメインDNS→DNSレコード設定→レコード追加にて、AレコードをサーバーのIPアドレスに向ける形で設定します。
その後、コマンドプロンプトで「nslookup {YOUR_SUB_DOMAIN}」を実行してIPアドレスが表示されることを確認します。
VPSに戻り、設定したサブドメインに対してSSL証明書を発行します。
|
1 2 3 |
sudo certbot certonly --apache -d {DEV_SITE_URL} sudo certbot certonly --apache -d {PROD_SITE_URL} sudo certbot renew --dry-run |
オンラインからdev,prodのサイトを開けるよう、バーチャルホストを設定します。現行のWordPressサイトが生きている状態なので、いったんreplace-dev.{site_url}, replace.{site_url}という移行期用URLにて設定し、問題なければ現行サイトのURLと差し替えることにします。
まずdev。
|
1 |
sudo vi /etc/httpd/conf.d/{site_name}-dev.conf |
↓追記内容
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# HTTP設定(HTTPSへリダイレクト) <VirtualHost *:80> ServerName replace-dev.{site_url} DocumentRoot /var/www/html/{site_name}/dev/public DirectoryIndex index.php ErrorLog /var/log/httpd/replace-dev.{site_name}_error_log CustomLog /var/log/httpd/replace-dev.{site_name}_access_log combined AddDefaultCharset UTF-8 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Directory "/var/www/html/{site_name}/dev/public"> AllowOverride FileInfo Options -Indexes Require all granted </Directory> </VirtualHost> # HTTPS設定 <VirtualHost *:443> ServerName replace-dev.{site_url} DocumentRoot /var/www/html/{site_name}/dev/public DirectoryIndex index.php ErrorLog /var/log/httpd/replace-dev.{site_name}_error_log CustomLog /var/log/httpd/replace-dev.{site_name}_access_log combined AddDefaultCharset UTF-8 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/replace-dev.{site_url}/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/replace-dev.{site_url}/privkey.pem SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLHonorCipherOrder on SSLCompression off SSLUseStapling on <Directory "/var/www/html/{site_name}/dev/public"> AllowOverride FileInfo Options -Indexes Require all granted </Directory> # PHP-FPM <FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch> </VirtualHost> |
続いてprod。
|
1 |
sudo vi /etc/httpd/conf.d/{site_name}.conf |
↓追記内容
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
# HTTP設定(HTTPSへリダイレクト) <VirtualHost *:80> ServerName replace.{site_url} DocumentRoot /var/www/html/{site_name}/prod/public DirectoryIndex index.php ErrorLog /var/log/httpd/replace.{site_name}_error_log CustomLog /var/log/httpd/replace.{site_name}_access_log combined AddDefaultCharset UTF-8 RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] <Directory "/var/www/html/{site_name}/prod/public"> AllowOverride FileInfo Options -Indexes Require all granted </Directory> </VirtualHost> # HTTPS設定 <VirtualHost *:443> ServerName replace.{site_url} DocumentRoot /var/www/html/{site_name}/prod/public DirectoryIndex index.php ErrorLog /var/log/httpd/replace.{site_name}_error_log CustomLog /var/log/httpd/replace.{site_name}_access_log combined AddDefaultCharset UTF-8 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/replace.{site_url}/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/replace.{site_url}/privkey.pem SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1 SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLHonorCipherOrder on SSLCompression off SSLUseStapling on <Directory "/var/www/html/{site_name}/prod/public"> AllowOverride FileInfo Options -Indexes Require all granted </Directory> # PHP-FPM <FilesMatch \.php$> SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost" </FilesMatch> </VirtualHost> |
その後、問題ないことを確認してからApacheを再起動します。
|
1 2 |
sudo apachectl configtest sudo systemctl reload httpd |
オートでVPSのdevリポジトリにはデプロイされるので、dev環境を確認し、問題なければGitHubアクションからprodに手動デプロイし、prod環境を確認します。
これで問題なければ、最終段階です。
本番URLをアクセスしたときに、WordPressサイトではなく準静的サイトにアクセスされるよう、DNS設定とバーチャルホストを再設定します。
具体的には、DNS設定のAレコードのホスト名、バーチャルホストのServerNameを書き換え、
ついでにところどころあった「replace」の文字あたりを削除します。
そして、現行サイトのバーチャルホスト設定は隔離したうえで、最後にApacheを再起動し、SSL証明書を再発行します。
|
1 2 3 4 5 6 |
sudo apachectl configtest sudo systemctl reload httpd sudo certbot certonly --apache -d {DEV_SITE_URL} sudo certbot certonly --apache -d {PROD_SITE_URL} sudo certbot renew --dry-run |
これにて完了です!
追伸:GitHubのEnvironmentsにて
を設定していたので、そのURLだけ正規版に切り替えておきます。
ということで、WordPressサイトを「AIネイティブ×GitHubベースのContent as Code開発基盤」=「準静的サイト」に移管する手順の備忘録でした。
コード自体を再構成するのは生成AIで割とスムーズにいくのですが、やはり動作確認しながら本番反映となると、DNS設定やバーチャルホストの設定あたりが負担になりますね。新規で作るのと比べても、移行は負担が5割増しくらいのイメージです。
とはいえ、これでWordPressの管理画面を見ずに生成AI経由で記事の執筆やテーマの管理、機能拡張などが自由にできるようになるので、その効果は計り知れません。
以上、この記事がいつか誰かの助けになりますように。
