共有レンタルサーバーのサムネイル

共有レンタルサーバー

CI/CDからlftpでレンタルサーバーに出力ファイルを同期する

公開日: 2020.12.11

CI/CDからlftpでレンタルサーバーに出力ファイルを同期する方法をまとめました。この方法を使えば、レンタルサーバーをサーバーレスのような感覚で使うことが出来るようになります。

編集ノート: SERVERSUSでは、パートナーリンクからコミッションを得ています。コミッションが記事の意見や、サービスの評価に影響を与えることはありません。

SPAサイト・静的サイトの配信にレンタルサーバーは最適

レンタルサーバーは、クラウドサーバーと比較しても静的ファイルを配信するサーバーとしてはコスパに非常に優れています。レスポンスも高速でしかも低額&定額です。

しかし、レンタルサーバーではPHPの利用を前提にしているため、React.jsやVue.jsなどのSPAフレームワーク、Gatsby.jsやHUGOといった静的サイトジェネレータが利用できません。

今回は、ビルドの部分をCI/CDに任せて、完成物をlftpでレンタルサーバーにrsync的に同期する方法で、サーバーレスの感覚でレンタルサーバーを利用してみます。

手順

lftpの設定ファイルを作成する

lftpでは、ファイルの同期にレンタルサーバーのFTPアカウントを利用します。FTPログイン情報はコマンドに直接記述もできますが、今回はlftpの設定ファイルに記述して利用します。

必要なのは、

  • FTPアカウント
  • FTPログインパスワード
  • FTPサーバー(IPアドレスでも可)

の3点です。

取得したら、lftp.datというファイルを作成します。

open -u FTPアカウント,FTPログインパスワード FTPサーバー
mirror -R -p --delete --log=lftp.log 元ディレクトリ FTP先ディレクトリ
echo end
close
quit

ファイル中の「元ディレクトリ」はCI/CDが生成したファイルの出力先を指定します。「FTP先ディレクトリ」は、そのファイルをアップロードしたいレンタルサーバーのディレクトリを指定します。

なお、「FTP先ディレクトリ」はFTPログインした際にFTPサーバー側から指定のルートを返すことがあるので、通常のFTPクライアントで接続した時のデフォルトの表示パスからの相対パスを指定します。

例えば、/home/user/hogehoge/www/がデフォルトのパスで/home/user/hogehoge/www/example.comにファイルを展開したいのであれば、「FTP先ディレクトリ」はexample.comでOKです。

なお、パブリックレポジトリのプロジェクトではこの方法を取らないでください。FTPのログイン情報が世界中に公開されてしまいます。パブリックプロジェクトの場合は、設定ファイルを使わずに環境変数を使いましょう。

CI/CDのビルド設定をする

続いてCI/CDのビルド設定をしていきます。今回はGitlabで静的サイトジェネレータ・HUGOを使う例で見ていきます。

image: registry.gitlab.com/pages/hugo

variables:
  GIT_SUBMODULE_STRATEGY: recursive
pages:
  before_script:
    - apk add lftp
  script:
  - hugo
  - touch lftp.log
  - lftp -f lftp.dat
  artifacts:
    paths:
    - public
  only:
  - master

ポイントは「before_script」でlftpをインストールして、hugoコマンドでサイトをビルドした後にlftpで同期をしている点です。

lftpコマンドは引数「f」で設定ファイルを読み込むので、先ほど作成したlftp.datをロードさせます。

lftpコマンドの直前のlftp.logはlftpのログファイルです。gitの管理下においても良いですが、プロジェクトの作成時には不要なファイルなので、CI/CD上で作成して書き込むようにしています。何かエラーが起こった際は、CI/CDからlftp.logを表示するようにすれば原因が掴めます。

実際に実行してみる

では、この設定でレポジトリにプッシュして、実際に動くかを確認しましょう。

Running with gitlab-runner 13.6.0 (8fa89735)
  on docker-auto-scale ed2dce3a
Preparing the "docker+machine" executor
00:07
Using Docker executor with image registry.gitlab.com/pages/hugo:0.73.0 ...
Authenticating with credentials from job payload (GitLab Registry)
Pulling docker image registry.gitlab.com/pages/hugo:0.73.0 ...
Using docker image sha256:be21610c0570fa582ea060a2d86b4fe2920e0a9e9fa2564b17e5fc46a0a40b32 for registry.gitlab.com/pages/hugo:0.73.0 with digest registry.gitlab.com/pages/hugo@sha256:514d25a0341944e440df1d7e78aac1310d07d3b90fc8e478c38b01fe04391443 ...
Preparing environment
00:01
Running on runner-ed2dce3a-project-23016422-concurrent-0 via runner-ed2dce3a-srm-1607601142-9b1707d3...
Getting source from Git repository
00:01
$ eval "$CI_PRE_CLONE_SCRIPT"
Fetching changes with git depth set to 50...
Initialized empty Git repository in /builds/xxxx/yyyy/.git/
Created fresh repository.
Checking out aefcf9d7 as master...
Updating/initializing submodules recursively...
Executing "step_script" stage of the job script
02:02
$ apk add lftp
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
(1/6) Installing ncurses-terminfo-base (6.2_p20201205-r0)
(2/6) Installing ncurses-libs (6.2_p20201205-r0)
(3/6) Installing readline (8.0.4-r0)
(4/6) Installing libgcc (10.2.1_pre1-r1)
(5/6) Installing libstdc++ (10.2.1_pre1-r1)
(6/6) Installing lftp (4.9.2-r0)
Executing busybox-1.31.1-r14.trigger
OK: 10 MiB in 20 packages
$ hugo
Building sites … WARNING: calling IsSet with unsupported type "string" (string) will always return false.
                   | JA  
-------------------+-----
  Pages            | 17  
  Paginator pages  |  0  
  Non-page files   |  0  
  Static files     | 11  
  Processed images |  0  
  Aliases          |  7  
  Sitemaps         |  1  
  Cleaned          |  0  
Total in 92 ms
$ touch lftp.log
$ lftp -f lftp.dat
end
Uploading artifacts for successful job
00:02
Uploading artifacts...
public: found 80 matching files and directories    
Uploading artifacts as "archive" to coordinator... ok  id=902740600 responseStatus=201 Created token=RnwV89G1
Cleaning up file based variables
00:01
Job succeeded

無事生成とアップロードができました。

なお、今回はlftpのアップロード先のレンタルサーバーにロリポップ!のレンタルサーバーを利用しました。

静的ファイルの配信にCI/CD+レンタルサーバーを使うメリットとデメリット

メリット

まず一番のメリットはホスティングのスピードが速いことです。

CD/CDに無料で付属しているホスティングサーバーは、物理サーバーが海外にあることもあってお世辞にも高速サーバーとは言えませんが、国内のレンタルサーバーは物理的な距離が近いだけでなく最近は高速化の波がきているためレスポンスが非常に高速です。

転送量という観点でも、国内レンタルサーバーは一ヶ月5TB以上というところも増えてきているので、アクセス数の多いサイトであればあるほどメリットが出てきます。

デメリット

まず一番のデメリットは有料ということでしょう。CD/CDに付属しているホスティングサーバーはほとんどが無料で利用できます。

また、サーバーとの同期がFTPなので転送速度が遅く、CI/CDのQuotaを無駄に使ってしまうのもこの方法の大きなデメリット。ファイル数にもよりますが、今回の例では概ね2分弱ビルド時間が増えてしまいました。

ただし、レンタルサーバーの場合はPHPが使えますので、lftpで全てのファイルを同期しないで成果物をzipに固めてレンタルサーバーに送って、レンタルサーバー側でzipを展開するPHPプログラムを書けば、この2分弱の余計な時間はグッと短縮できるでしょう。


CI/CDからlftpでレンタルサーバーに出力ファイルを同期する方法を見てきました。

WordPress以外の使い道があまりないと言われる国内のレンタルサーバーですが、CI/CDと組み合わせればもっといろんな使い方が出来そうですね。


価格は記載がある場合を除き、すべて税込みです。

関連キーワード

共有レンタルサーバーの新着記事

共有レンタルサーバーの新着ガイド

もっと見る