laravel のドメイン名を変更

私が作成した laravel のアプリは、画像も登録できるメモ帳のようなものです。

これはとても便利なもので、私はほぼ毎日使っています。
例えば、車のオイル交換の時期とか、同僚に教えたもらった寿司店の名前など、さまざまな検索をすることによってあらゆるデータを呼び出すことができます。

全てはデータベースに記録してあるので、キーワードを入力してから閲覧までは一瞬です。

以下の話は、xserver 上であるドメイン名で動いている laravel を、異なるドメイン名に移し替える手順です。

ドメイン名の取得

世界中どこからでも自作のアプリにアクセスするためにはドメイン名が必要です。
ドメイン名とは「moheno.site」のような文字列で、世界に1つしかないものでなければなりません。

ドメイン名は、例えば「ムームードメイン」のようなところで購入します。
高いドメイン名は「moheno.jp」のように「.jp」などがつく場合で、高いと言っても 2,300 円/年程度です。

私は1年ほど前に「moheno.site」というドメインを購入しました。
88 円/年と格安でしたが、そのドメイン名をさらに1年使うためには 3,980 円/年の費用がかかります。

ドメイン名の変更はとても面倒なので、3,980 円/年くらいだったらいいか、とも思ったのですが、おそらく次の年はもっと上がる?と考えて、タダでドメイン変更することにしました。

xserver と契約すると独自ドメインが 1 つ無料で使えるのでそれを設定することにしました。

新しいドメイン名は「moheno1.site」です。

moheno.site のアプリを moheno1.site へ

moheno1.site というドメインを xserver 上で設定し初期化すると以下のようになります。


.
├── henoheno.xsrv.jp
├── moheno.site
│   ├── htpasswd
│   ├── log
│   ├── mail
│   ├── public_html
│   ├── sample1
│   ├── script
│   └── xserver_php
└── moheno1.site

これまで稼働していたのは、「moheno.site/sample1」のアプリです。

この sample1 を moheno1.site にコピーします。

なお、自作の laravel アプリを public_html の中に入れるというネット記事がありましたが、chatGPT によると public_html に入れるの推奨されないとのこと。

xserver から ssh のキーを取得して、そのパーミッションを 600 に設定して ssh ログインします。


ssh -l henoheno -i ~/.ssh/xserver/henoheno.key henoheno.xsrv.jp -p 10022

sample1 をコピーします。


cp -r ~/moheno.site/sample1 ~/moheno1.site

moheno1.site の php を 8.1 以上にする

laravel が動くためには php 8.1 以上が必要です。

xserver のコントロールパネルから php のバージョンを変更します。

シンボリックリンクの再設定

moheno1.site にアクセスすると通常はそのサイトの public_html にアクセスしますが、それを sample1 の public に行くようにします。

シンボリックリンクを作成します。


ln -s ~/moheno1.site/sample1/public ~/moheno1.site/public_html

確認します。


cd ~/moheno1.site/public_html
ls -l

こうすると、アドレスバーに「https://moheno1.site/public」と入力すると設定した画面(私の場合はログイン画面)が表示されます。

public を削除する

「https://moheno1.site/public」でも使えるのですが、できれば「https://moheno1.site」でアクセスできた方が簡単です。

そこで、このアドレスから public を削除します。

まずは、xserver のファイルマネージャーで「moheno1.site/sample1/public/.htaccess」を編集します。これはコピーされてきたのでそのままでもいいはずですが確認します。

~/moheno1.site/sample1/public/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Send Requests To Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

そして、xserver のサーバーパネルから、.htaccess 編集を選択して、moheno1.site の .htaccess を以下のようにして確認・実行します。

~/moheno.site/myapp/.htaccess

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteRule ^(.*)$ public/$1 [L]
</IfModule>

そうすると、「https://moheno1.site」で初期画面にアクセスすることができます。

画像保存のシンボリックリンクを再設定

画像保存に関するシンボリックリンクを再設定します。

まずは確認します。


cd /home/henoheno/moheno1.site/sample1/public
ls -l

以下のようになっているはずです。


storage -> /home/henoheno/moheno.site/sample1/storage/app/public

これを削除します。


unlink storage

新しく設定します。


cd ~/moheno1.site/sample1
php artisan storage:link

データのバックアップ

以下のようなシェルスクリプトを作成します。

dbdump.sh

#!/bin/sh
period=7
dirpath='~/moheno1.site/mysql_bak'
filename=`date +%y%m%d`
mysqldump -uheno -pmoheno henomemo > $dirpath/$filename.sql
chmod 700 $dirpath/$filename.sql
oldfile=`date --date "$period days ago" +%y%m%d`
rm -f $dirpath/$oldfile.sql

これを、xserver のコントロールパネルの cron 設定で設定すればデータベースのバックアップを自動で作成できます。

NAS から xserver に ssh ログインしてデータコピー

xserver 上のデータを NAS にコピーします。

larabak.py

import os
import shutil
import paramiko
import scp

class ScpBykey():

    def __init__( self ):

        self.HOST = 'henoheno.xsrv.jp'
        self.PORT = 10022
        self.USER = 'henoheno'
        self.KEY_FILE = '/volume1/backup/laravel/.ssh/henoheno.key'
        self.PASSPHRASE = 'keyのパスワード'
        self.remote_mdeia_dir = 'moheno1.site/sample1/storage/app/public'
        self.remote_sql_dir = 'moheno1.site/mysql_bak'
        self.local_dir = '/volume1/backup/laravel_bak'
        self.ssh = ''
        self.resetDir()

    def resetDir(self):
        os.makedirs(self.local_dir, exist_ok=True)
        shutil.rmtree(self.local_dir)
        os.makedirs(self.local_dir, exist_ok=True)

    def sshcon(self):
        rsa_key = paramiko.RSAKey.from_private_key_file(self.KEY_FILE, self.PASSPHRASE)
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(self.HOST, self.PORT, self.USER, pkey=rsa_key)
        self.ssh = ssh
        self.file_down( self.remote_sql_dir )
        self.file_down( self.remote_mdeia_dir )

    def file_down( self, remotedir ):
        with scp.SCPClient(self.ssh.get_transport()) as scpc:
            try:
                scpc.get( remote_path = remotedir, local_path = self.local_dir, recursive = True)
            except:
                print('そのディレクトリは存在しません。')

if __name__ == '__main__':
    scpk = ScpBykey()
    scpk.sshcon()

NAS のタスクスケジューラで毎日実行

NAS のタスクスケジューラで毎日実行します。

以前はシェルスクリプトを作成していましたが、以下のようにユーザー指定のスクリプトに直接書いていいようです。


cd /volume1/backup/laravel
python larabak.py