無料でブログ運用を広告無し、制限なしで可能でしょうか。答えは可能です。検索するとワードプレスなどの運用をするにはレンタルサーバーが必要です。日本の業者を探していると多数あります。
自分なりに見つけたサービス
ConoHa、エックスサーバー、ロリポップ、mixhost、さくらのレンタルサーバー、カゴヤジャパンなど
自分が使用している日本のレンタルサーバーはGMOグローバルサインのWappyだけです。株主優待で利用していますが少しだけ足が出ます。もったいないので活用しています。
本日はGoogle Cloudの無料プランのインスタンスを使用してワードプレスの環境を構築します。インスタンスはLinuxやWindowsなどの基本OSをリモートから操作することができる仮想マシンです。

ロリポップなどはワードプレスをボタン一発で作成できるので初心者でも比較的容易にサイトを立ち上げることができますが、Google CloudのようなクラウドサービスはOSから構築する必要があります。クラウドサービスには、ほかにもAWS、Azure、OCIなどがあります。
それではGoogle Cloudにインスタンスを作成しましょう。リージョンは米国の一部でしか無料枠が適用されません。ここではus-central1を選択しました。マシンの構成ではシリーズをE2、マシンタイプをe2-microにします。

ブートディスクの項目では変更ボタンをクリックします。OSはCentOS Stream 9にしました。ブートディスクの種類では初期値がバランス永続ディスクとなっています。標準永続ディスクに変更します。というのも無料枠に関する説明に30GBの標準永続ディスクと記載されていましたし、バランス永続ディスクの方が料金が高いです。

他にも設定項目が多数ありますが、一部を除いて後から変更できるのでこの設定で作成します。
インスタンスが作成できたら接続をします。Google Cloudにある機能を使用して、ブラウザによるSSH接続が出来ます。

ここではTeraTermによる接続設定をします。TeraTermの設定にある「SSH鍵生成」をクリックして鍵を作ります。初期値の状態で生成ボタンを押すだけです。

すると、公開鍵と秘密鍵を保存できるようになります。鍵のパスフレーズを入力してもいいですが、空白にしました。コメント欄には接続するユーザー名を記述します。両方の鍵を保存しておきます。

Google Cloudのブラウザ画面に戻り、インスタンスを編集します。

起動中でも一部を除いて編集することができます。下にスクロールするとSSH認証鍵を追加することができます。メモ帳などで公開鍵を開いて、その内容すべてをGoogle CloudのSSH認証鍵の項目にコピペします。公開鍵は拡張子が.pubとなっているはずです。忘れずに追加した内容を保存します。


インスタンスを過去に何回も立ち上げているのでGoogle Cloudにあるファイヤーウォールにポート番号22のトラフィックも許可してあります。これでインスタンスに接続できるはずです。TeraTermを起動します。新しい接続においてインスタンスに割り振られた外部IPアドレスをホストの項目に入力します。ユーザー名はコメントに記述した内容です。パスフレーズは設定していないので空白のままにして、認証方式で秘密鍵を使うことにします。先ほど作成した秘密鍵を読み込んできます。

接続に成功しました。ここからはLinuxの知識で操作できます。rootに切り替えて作業をします。OSがCentOSなのでSELinuxの状態を確認します。
getenforce
Enforcingとなり、文字通り施行中です。なにかインストールした時、思わぬトラブルに巻き込まれる可能性があり、解決に苦労するので、一時的に無効にします。
setenforce 0
再度、状態を確認するとPermissiveとなり無効になりました。ログ監視機能は有効になっています。
再起動後にも完全に無効にしたい場合は設定ファイルを編集します。
vi /etc/selinux/config
SELINUX=enforcingをdisableにします。記述ミスがあると再起動後にトラブルが発生する可能性があります。

次はDockerをインストールしたいのですが、検索してもあまり情報がありませんでした。そこで、CentOS stream 9ではDocker互換のPodmanをインストールします。コマンドはほとんど同じなので推奨されているこちらを導入します。Podmanとは、RedHat社が開発したコンテナ管理ツールです。OSSで公開されています。
dnf install podman
インストール完了後に状態を確認します。
systemctl status podman
○ podman.service – Podman API Service
Loaded: loaded (/usr/lib/systemd/system/podman.service; enabled; vendor pr>
Active: inactive (dead) since
アクティブでないようですので、起動します。システム起動時の設定も行います。
systemctl start podman
systemctl enable podman
これでpodmanを使用できるようになりました。
最初にやるべきでしたが忘れていました。地域や時間を日本にします。状態を確認すると日本ではありません。
localectl status
ロケールを変更します。ロケールとはコンピューティングにおいて、ユーザーの言語、地域、およびユーザーがユーザーインターフェイスに表示したい特別なバリアント設定を定義する一連のパラメーターです。
localectl set-locale LANG=ja_JP.utf8
エラーが発生しました。
Failed to issue method call: Locale ja_JP.utf8 not installed, refusing.
次のパッケージをインストールすることで解決できるようです。
dnf install glibc-langpack-ja
再度、ロケールコマンドを入力すると問題を解決できました。同じようにして現在の時間を確認してから日本時間にします。
timedatectl status
timedatectl set-timezone Asia/Tokyo
ようやく準備ができたので、Wordpressをインストールします。Podmanを使えば容易に作成できるはずです。公式ページにも記載されています。
podman run --name blog \
-p 80:80 \
-p 443:443 \
-d wordpress
? registry.access.redhat.com/wordpress:latest
registry.redhat.io/wordpress:latest
docker.io/library/wordpress:latest

上記のような表示がされたらdocker以降をコピペするか、コマンドを途中で停止して下記のように記述し直します。
podman run --name blog \
-p 80:80 \
-p 443:443 \
-d docker.io/library/wordpress:latest
また忘れなうちにファイヤーウォールを確認しておきます。ファイヤーウォールを停止するか、ポート番号80と443のトラフィックを許可しておきます。せっかくなので後者を設定します。まずは現状の設定を確認します。
firewall-cmd --list-all
SSH接続しているはずなのに、その項目がありません。デフォルトのゾーンを表示します。さらに定義されている全てのゾーンを表示します。
firewall-cmd --get-default-zone
firewall-cmd --list-all-zones
デフォルトゾーンがtrustedで、複数ゾーンが定義されているようです。SSHはexternalに追加されています。Webサーバー用にhttpとhttpsを恒久的に追加します。permanentがないとシステム再起動時に設定が元に戻ります。
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Google Cloudのブラウザ画面でも同様にこれらのトラフィックを許可しておきます。
これでブラウザでアクセスできます。ワードプレスの設定をコンテナに入って行います。
podman exec -it blog bash
コンテナに入ると丁度ワードプレス関連のファイルがあるディレクトリにいたのでサンプルのコンフィグファイルの名前を変更します。
mv wp-config-sample.php wp-config.php
エディタで編集をします。
vi wp-config.php
エディタがないのでインストールします。その前に更新をします。
apt update
しかし、エラーが発生しました。
root@1812140a4e13:/var/www/html# apt update
Err:1 http://deb.debian.org/debian bullseye InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.30.132), connection timed out
Err:2 http://deb.debian.org/debian-security bullseye-security InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:5f::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.98.132), connection timed out
Err:3 http://deb.debian.org/debian bullseye-updates InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable)
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.30.132), connection timed out
W: Failed to fetch http://deb.debian.org/debian-security/dists/bullseye-security/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:5f::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.98.132), connection timed out
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye-updates/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable)
W: Some index files failed to download. They have been ignored, or old ones used instead.
root@1812140a4e13:/var/www/html# ^C
root@1812140a4e13:/var/www/html# apt update
Err:1 http://deb.debian.org/debian bullseye InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.98.132), connection timed out
Err:2 http://deb.debian.org/debian-security bullseye-security InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.30.132), connection timed out
Err:3 http://deb.debian.org/debian bullseye-updates InRelease
Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:58::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.126.132), connection timed out
Reading package lists… Done
Building dependency tree… Done
Reading state information… Done
All packages are up to date.
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.98.132), connection timed out
W: Failed to fetch http://deb.debian.org/debian-security/dists/bullseye-security/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:2c::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.30.132), connection timed out
W: Failed to fetch http://deb.debian.org/debian/dists/bullseye-updates/InRelease Cannot initiate the connection to deb.debian.org:80 (2a04:4e42:58::644). – connect (101: Network is unreachable) Could not connect to deb.debian.org:80 (199.232.126.132), connection timed out
W: Some index files failed to download. They have been ignored, or old ones used instead.
いつもはコンテナに入って作業をしていましたが、ここは学習がてらホストとコンテナでファイルを共有する方法を試します。共有とかマウントで検索すると出てきます。マウントするべきファイルはワードプレス関連のファイル、php設定ファイル、webサーバーの設定ファイルとします。また、ホスト関連やリポジトリの記述があるディレクトリもマウントします。結局のところ、コンテナ内でアップデート可能にします。というのもMySQLに接続するクライアントをインストールする必要があるためアップデートできないと困ります。コンテナ内でファイルの場所を調べると次のようになっていました。実は次の日アップデートしたら問題なく動作しました。
php設定ファイル→/usr/local/etc/php
Webサーバー設定ファイル→/etc/apache2
ワードプレス関連ファイル→/var/www/html
リポジトリ関連のディレクトリも含め、これらをPodmanのコピーコマンドを使用して一度ホストにコンテナからディレクトリやファイルをコピーします。コンテナから出てホストで適当なディレクトリを作成してコマンドを実行します。
mkdir blog
podman cp blog:/usr/local/etc/php /root/blog/
podman cp blog:/etc/apache2 /root/blog/
podman cp blog:/var/www/html /root/blog/
podman cp blog:/etc/apt /root/blog/
podman cp blog:/etc/resolv.conf /root/blog
ホストにファイルを取り寄せたので、コンテナを停止して削除します。
podman stop blog
podman rm blog
今度はマウントできるオプションも追加してコンテナを立ち上げます。
podman run --name blog \
-p 80:80 \
-p 443:443 \
-v /root/blog/php:/usr/local/etc/php \
-v /root/blog/apache2:/etc/apache2 \
-v /root/blog/html:/var/www/html \
-v /root/blog/resolv.conf:/etc/resolv.conf \
-v /root/blog/apt:/etc/apt \
-d docker.io/library/wordpress
うまくコンテナが立ち上がったので、アップデートできるように、先ほどコンテナからコピーしたファイルであるresolv.confの内容を書き換えます。念のため、コンテナに入ってホストで変更を加えたことが反映されているか確認します。この記述でアップデート可能になりました。
nameserverのIPアドレスを8.8.8.8に変更しました。
ホストとコンテナで指定したディレクトリやファイルが共有状態にあるので、あとはホストでファイルに変更を加えればコンテナにも反映されるので、基本的にはホストにあるファイルを変更します。
このコンテナにはデータベースがないので、同様にしてコンテナを作成したいところですが、データベースが一番負荷がかかるのでAWSにあるRDSに接続することにします。そのためにはRDSに外部接続できるユーザーを作成してリモート作業できるように設定しておきます。下記の記事にて説明してあります。
再び、コンテナに入ってMySQLクライアントをインストールします。
apt install mysql-client
Package mysql-client is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
E: Package ‘mysql-client’ has no installation candidate
mysqlのクライアントはインストールできないのでmariadbのそれをインストールします。
apt install mariadb-client
インストール出来たのでRDSに接続して、データベースを作成します。
mysql -h database.cuvluie44xx8.us-east-2.rds.amazonaws.com -u admin -p
create database blog;
exit
これで設定が完了しました。ブラウザにGoogle Cloudの外部IPアドレスを入力してアクセスします。
もし、日本語環境を望む方はワードプレスを公式からダウンロードして、マウントしてあるディレクトリに展開すればOKです。
最初はファイルのアップロード制限などがあるので、マウントしたphpの設定ファイルを編集します。

ワードプレス関連のファイルやディレクトリは、この例ではhtmlというディレクトリにあるので、ここに移動して一括削除します。
rm -rf *
日本語版ワードプレスをダウンロードします。
wget https://ja.wordpress.org/latest-ja.tar.gz
wgetがないのでインストールします。
dnf install wget
ファイルをダウンロードできたら展開します。
tar zxvf latest-ja.tar.gz
展開したらwordpressというディレクトリが作成されて、その配下にファイルやディレクトリが存在している状態です。これではアクセスできないのですべて移動します。作成されたwordpressというディレクトリに移動します。そこですべて所定の場所に移動します。
mv *.* /root/blog/html
mv * /root/blog/html
空になったディレクトリとダウンロードしたファイルを削除します。
cd /root/blog/html
rm -rf wordpress
rm latest-ja.tar.gz
先ほどと同様にしてデータベースを作成し、ワードプレスのコンフィグファイルを編集してアクセスします。