lftpのmirrorコマンドでFTPサイトをローカル保存してGit管理する方法




はじめに

FTPサーバー上にだけWebサイトのファイルがあると、変更履歴を確認したり、修正前の状態へ戻したりできません。Git管理を始めるには、まずファイル一式をローカルへ取得する必要があります。

今回はlftpmirrorコマンドで構成を保ってサイトを取得し、Gitの初回コミットを作るまでの手順を解説します。対象環境はUbuntuまたはWSLのUbuntuです。

なお、この記事で行うのはサーバーからローカルへの初回取得です。ローカルからサーバーへのアップロードは行いません。

lftpとmirrorコマンドとは

lftpは、FTP、FTPS、SFTPなどに対応したコマンドラインツールです。mirrorコマンドを使うと、指定したディレクトリ以下をまとめて取得できます。

基本構文は次のとおりです。

mirror [オプション] [リモート側のディレクトリ] [ローカル側のディレクトリ]

通常のmirrorでは、転送元がリモート、転送先がローカルです。-Rまたは--reverseを付けると方向が逆になり、ローカルのファイルがサーバーへ送られます。今回の作業では使用しません。

lftpとGitをインストールする

Ubuntuのターミナルで次のコマンドを実行します。

sudo apt update
sudo apt install lftp git

インストール後、バージョンを確認します。

lftp --version
git --version

サイトを保存するローカルディレクトリを作る

先に保存先を作成します。ここでは~/projects/example-siteを使用します。

mkdir -p ~/projects/example-site

保存先は実際の環境に置き換え、初回は空のディレクトリを使用します。

FTPサーバーへ接続する

次のコマンドで接続します。ユーザー名とホスト名は例です。

lftp -u example-user ftp://ftp.example.com

パスワードを求められたら、その場で入力します。lftp -u ユーザー名,パスワードのようにパスワードをコマンドへ直接書くと、シェルの履歴などへ残る可能性があるため避けてください。

契約しているサーバーがSFTPやFTPSに対応している場合は、案内された接続方式を使用します。通常のFTPは通信が暗号化されないため、選べる環境ではSFTPまたはFTPSを優先します。

SSH経由でバックアップする方法を探している場合は、LinuxでSSH経由でファイルサーバーからrsyncバックアップを取る方法も参考になります。

リモートとローカルの場所を確認する

接続後、まずリモート側の公開ディレクトリへ移動します。公開ディレクトリ名はサーバーによって異なります。

cd /public_html
pwd

次に、ローカル側の保存先を指定します。

lcd /home/your-user/projects/example-site
lpwd

pwdはリモート側、lpwdはローカル側の現在地を表示します。両方のパスが意図した場所か、必ず確認してください。

dry-runで取得内容を確認する

いきなり転送せず、最初に--dry-runを付けて実行予定の処理を確認します。

mirror --dry-run --verbose . .

最初の.はリモート、2つ目はローカルの現在のディレクトリです。転送元と転送先を確認してから本番へ進みます。

mirrorでサイト全体を取得する

次のコマンドで取得します。--parallel=4は最大4ファイルを並行転送する指定です。

mirror --verbose --parallel=4 . .

転送が終わったらexitでlftpを終了し、ローカルのファイルを確認します。

exit
cd ~/projects/example-site
ls -la

.htaccessなどの隠しファイルが取得されているか、主要なディレクトリやファイル数に不自然な不足がないかも確認します。

Gitへ登録しないファイルを決める

Gitを初期化する前に、パスワードや秘密鍵、キャッシュ、アップロード画像など、履歴へ残さないファイルを確認します。WordPressサイトの場合は、たとえば次のような.gitignoreを検討します。

.env
*.log
wp-config.php
wp-content/cache/
wp-content/uploads/

wp-config.phpにはデータベースの認証情報が含まれます。誤ってGitへ追加しないでください。一方、uploadsも含めて保管したいなど、サイトによって管理対象は異なります。内容を確認せず、そのまま除外設定をコピーしないことも大切です。

Git管理を開始する

対象ファイルを整理したら、Gitを初期化します。

cd ~/projects/example-site
git init
git status

実際に追加する前に、--dry-runで対象を確認できます。

git add --dry-run .

秘密情報や不要なファイルが含まれていなければ、ステージングして初回コミットを作ります。

git add .
git status
git commit -m "Import existing site"

コミット時に名前やメールアドレスの設定を求められた場合は、表示された案内に従ってGitのユーザー情報を設定します。ここまでで、取得時点のサイトを基準として変更履歴を残せるようになります。

mirror実行時の注意点

mirrorには削除や逆方向転送に関わるオプションがあります。意味を理解せず追加しないでください。

オプション 動作と注意点
-R--reverse 転送方向を逆にし、ローカルからサーバーへ送るため今回は使わない
--delete 転送元にないファイルを転送先から削除する。通常方向ではローカルファイルが消える可能性がある
--Remove-source-files 転送後に転送元のファイルを削除するため使わない

.htaccessなどが表示されない場合は、FTPサーバーが隠しファイルを一覧に含めていない可能性があります。lftp公式マニュアルでは、その場合にset ftp:list-options -aを試す方法が案内されています。

550エラーが出る場合は、公開ディレクトリのパスや読み取り権限を確認します。TLS証明書のエラーでは、証明書検証を無効にして回避せず、ホスト名、端末時刻、サーバー証明書を確認してください。

まとめ

FTPサーバー上の既存サイトは、lftpのmirrorを使うとディレクトリ構成を保ったままローカルへ取得できます。pwdlpwdで場所を確認し、--dry-runを実行してから本番の転送へ進むのが安全です。

取得後は、秘密情報や不要なファイルを.gitignoreで除外し、git add --dry-run .で対象を確認してから初回コミットを作成します。--reverseや削除系オプションは使わず、まず「サーバーから取得して履歴管理を始める」ところまでを確実に進めましょう。

参考情報

コメント

タイトルとURLをコピーしました