Blog

MacからSSHでXserverへ接続し、GitHubからWebサイトを取得するまで

Webサイトの更新作業を効率化するため、MacからSSHでXserverへ接続し、最終的にGitHubのリポジトリをXserverへ取得できる環境を整えました。

今回は、実際に遭遇したエラーと原因の切り分けも含めてまとめます。なお、サーバーID、ユーザー名、IPアドレス、秘密鍵名などはすべて一般化しています。

1. XserverでSSHを有効にする

最初にXserverのサーバーパネルからSSHを有効にします。

“`text

サーバーパネル

→ SSH設定

→ SSH設定をON

“`

XserverではSSH接続に通常の22番ではなく、`10022`番ポートを使用します。

また、公開鍵認証用の鍵ペアを生成し、秘密鍵をMac側へ保存しておきます。秘密鍵は外部へ公開してはいけません。

2. MacのSSH設定を書く

Macの`~/.ssh/config`にXserverへの接続設定を書きます。

“`sshconfig

Host xserver

HostName example.xserver.jp

User サーバーID

Port 10022

IdentityFile ~/.ssh/xserver.key

IdentitiesOnly yes

AddKeysToAgent yes

UseKeychain yes

“`

ここで重要なのは`User`です。Macのユーザー名ではなく、Xserverで確認できる正しい「サーバーID」を指定します。

サーバーIDはxserverアカウントから確認します。サーバーパネルではないので注意が必要です。

https://www.xserver.ne.jp/support/faq/service_missing_member_id.php

`Host xserver`は自分で決める接続名なので、設定後は長い接続コマンドを書かずに次のように接続できます。

“`bash

ssh xserver

“`

3. 秘密鍵にパスフレーズがある場合

秘密鍵作成時にパスフレーズを設定していても、`~/.ssh/config`へパスフレーズそのものを書く必要はありません。むしろ平文で書くべきではありません。

Macでは次のように鍵をキーチェーンへ登録できます。

“`bash

ssh-add –apple-use-keychain ~/.ssh/xserver.key

“`

`AddKeysToAgent yes`と`UseKeychain yes`を設定しておけば、毎回パスフレーズを入力する手間も減らせます。

秘密鍵のアクセス権も確認しておきます。

“`bash

chmod 600 ~/.ssh/xserver.key

“`

4. 接続しても何も起きないように見える場合

最初に困ったのが、`ssh xserver`を実行しても長い間何も表示されない状態でした。

このような場合は詳細ログを表示します。

“`bash

ssh -vvv -o ConnectTimeout=10 xserver

“`

今回、最初に確認できたのは次のようなエラーでした。

“`text

connect to address xxx.xxx.xxx.xxx port 10022: Operation timed out

“`

これは秘密鍵による認証以前に、SSHの10022番ポートへ到達できていないことを意味します。

この段階では、秘密鍵を何度変更しても解決しません。次の項目を確認します。

– Xserver側でSSHがONになっているか

– ホスト名が正しいか

– ポートが`10022`になっているか

– VPNやネットワーク側で10022番ポートが遮断されていないか

– Xserver側のアクセス制限に該当していないか

ポートへの疎通は次のように確認できます。

“`bash

nc -vz -w 10 example.xserver.jp 10022

“`

5. ホスト名の指定を間違えない

SSHではホスト名の形式を間違えると、次のようなエラーになります。

“`text

Could not resolve hostname …: nodename nor servname provided, or not known

“`

これは認証エラーではなく、指定したホスト名をDNSで解決できない状態です。

Xserverのサーバーパネルに表示される正確な「ホスト名」や「サーバーID」を確認して設定することが重要です。似たドメイン名を推測して入力しない方が安全です。

6. `Permission denied (publickey…)`まで進んだ

ネットワーク側の問題を解決すると、今度は次のエラーが表示されました。

“`text

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

“`

これは先ほどのタイムアウトとは意味が違います。

サーバーには到達できており、公開鍵認証の段階で拒否されているということです。この場合は次を確認します。

– SSH設定の`User`が正しいサーバーIDか

– `IdentityFile`がXserver用の正しい秘密鍵か

– その秘密鍵とXserver側に登録された公開鍵がペアになっているか

使用中の設定は次のコマンドでも確認できます。

“`bash

ssh -G xserver | grep -E ‘^(hostname|user|port|identityfile) ‘

“`

今回の原因は、最終的に`User`へ指定していたサーバーIDの間違いでした。正しいサーバーIDへ修正するとSSHでログインできました。

エラーメッセージを見ることで、「ネットワークの問題」と「認証の問題」を分けて考えることが大切だと分かりました。

7. XserverからGitHubを利用する

MacからXserverへSSH接続できたら、次はXserverからGitHubへアクセスできるようにします。

ここで注意したいのは、次の2つのSSH接続は別物だという点です。

“`text

Mac → Xserver

Xserver → GitHub

“`

MacからXserverへログインできても、XserverからGitHubへ自動的に接続できるわけではありません。

Xserver上でGitHub用のSSH鍵を作る場合は、例えば次のようにします。

“`bash

ssh-keygen -t ed25519 -C “xserver-github”

“`

公開鍵を確認します。

“`bash

cat ~/.ssh/id_ed25519.pub

“`

表示された公開鍵だけをGitHubへ登録します。秘密鍵`id_ed25519`は絶対にGitHubやブログなどへ掲載しません。

GitHub側ではSSHキーの設定画面から公開鍵を登録し、その後Xserverから接続テストを行います。

“`bash

ssh -T git@github.com

“`

認証できれば、GitHubからSSH方式でcloneできる状態になります。

8. public_htmlがまだGit管理されていない場合

すでに稼働している`public_html`へ、いきなりGitHubの内容を上書きするのは危険です。

GitHubには存在しない`.htaccess`、アップロード画像、サーバー固有の設定ファイルなどがある可能性があるためです。

そのため、まず別の作業ディレクトリへcloneします。

“`bash

cd ~

mkdir -p git-work

cd git-work

git clone git@github.com:GitHubユーザー名/リポジトリ名.git

“`

clone後に確認します。

“`bash

cd リポジトリ名

git status

git remote -v

“`

この段階では、公開中のサイトとGitHubから取得したコードは別々です。

“`text

公開中のWebサイト

~/対象ドメイン/public_html

GitHubからcloneしたコード

~/git-work/リポジトリ名

“`

両者のファイルや設定を確認してから、`public_html`をGit管理する構成へ移行するのが安全です。

9. Git管理へ移行した後の更新

`public_html`を正しくGit管理できる状態へ移行すれば、今後はSSHでXserverへ入り、対象ディレクトリで次のように更新できます。

“`bash

git status

git branch –show-current

git pull origin main

“`

ただし、本番サーバーで直接ファイルを修正している場合は、`git pull`の前に必ず`git status`を確認します。ローカル変更が残ったままpullすると競合する可能性があるためです。

まとめ

今回の作業で特に重要だったのは、SSHのエラーを一括りにしないことでした。

`Operation timed out`なら、まずネットワーク・ポート・Xserver側のSSH設定を疑います。

`Could not resolve hostname`なら、ホスト名を確認します。

`Permission denied (publickey…)`なら、すでにサーバーには到達しているため、サーバーID・秘密鍵・公開鍵の組み合わせを確認します。

今回は最終的にサーバーIDの指定ミスを修正することでログインできました。

SSH接続が一度安定すれば、CursorなどのエディタからRemote SSHでXserverを操作したり、GitHubを利用して更新作業を効率化したりできるようになります。手作業でファイルをアップロードする運用から、Gitを使った更新へ移行する第一歩として有効だと思います。


一つ前の記事 Manage Customers and Visit History on a Map: What Is the “Mr. Sales” Customer Management App?