FTPの手動更新をやめる|会社サイトの一部だけGitHubで自動公開した手順
会社の公式HPはそのままに、特定フォルダだけを安全に自動公開するまでの設計と作業を、実際の導入例に沿って説明します。
- 毎回FTPソフトで手動アップロードしている
- 公式HPの一部だけ更新を自動化したい
- GitHub Actionsを初めて使う
公開対象を専用フォルダに分け、接続先をそのフォルダだけに制限したFTPアカウントを作れば、公式HP全体へ触れずに自動公開できます。パスワードはGitHub Secretsへ保存し、最初は転送しないテスト、その後に本番公開という二段階で確認します。
- GitHub ActionsとFTPSで公開する仕組み
- 上書き事故と秘密情報流出を防ぐ設計
- 初心者が迷いやすい設定箇所と確認順
今回、何を自動化したの?
合同会社SaGaSの公式HP内には、「中小企業IT改善室」という独立したコンテンツがあります。今回の対象は、この改善室に当たる/lab/配下だけです。公式HP本体のファイルはGitHubへ登録せず、本番サーバーでも改善室以外へ接続できない構成にしました。
初回登録は192ファイル、約3MBです。GitHubの非公開リポジトリへ登録し、更新がmainブランチへ入った時だけGitHub Actionsが動き、暗号化されたFTPS接続で/lab/を公開します。
サイト全体を一度に自動化する必要はありません。更新頻度が高く、他の機能から独立しているフォルダだけを対象にすると、失敗した時の影響を抑えられます。
手動FTPの何が危ないの?
FTPソフトが悪いわけではありません。問題は、毎回の判断と操作を人の記憶だけに任せることです。接続先を間違える、必要なファイルを選び忘れる、古いファイルを混ぜる、どの版を公開したか分からなくなる、といった事故が起こります。
特に会社サイトでは、トップページ、問い合わせフォーム、メール設定に関係するファイルまで同じアカウントで操作できると、一つの誤操作が広い範囲へ及びます。「注意して操作する」だけでなく、そもそも対象外へ触れない権限にする方が安全です。
- 更新対象と本体サイトが同じ画面に並ぶ
- 公開前後のファイル差分を記録していない
- FTPパスワードを複数人が共有している
- 失敗時に戻す版が分からない
- アップロード完了を担当者しか確認できない
GitHubから公開される仕組みは?
GitHubは「サイトの原本と変更履歴を保管する場所」、GitHub Actionsは「決めた条件で公開作業を実行する係」です。FTPSは、FTP通信をTLSで暗号化する接続方式です。担当者は毎回サーバーへ接続せず、GitHubへ変更を送るところまで行います。
- STEP 1パソコン対象フォルダのファイルを更新
- STEP 2GitHub原本と変更履歴を保存
- STEP 3Actions安全確認後にFTPS接続
- STEP 4公開サーバー対象フォルダだけ更新
この構成なら「誰が、いつ、何を変えたか」がコミット履歴に残り、公開処理の成否もActionsの実行履歴で確認できます。公開後に問題が見つかった時は、正常だった版へ戻して再度公開できます。
自動化前に決める四つの境界
設定画面を開く前に、次の境界を紙に書くと事故を減らせます。
| 決めること | 今回の例 | 目的 |
|---|---|---|
| 保管範囲 | lab/だけ | 公式HP本体をGitHubへ入れない |
| 起動条件 | mainのlab/**変更 | 関係ない変更で公開しない |
| 接続範囲 | サーバーの/lab/だけ | 対象外を上書きできなくする |
| 秘密情報 | GitHub Secrets | コードと履歴に残さない |
事故を防ぐために、どんな設計にした?
第一に、FTPアカウントの接続先を/lab/へ限定しました。 ワークフローの設定を誤っても、そのアカウントでは公式HPの上位フォルダへ移動できません。権限を先に狭くする「最小権限」の考え方です。
第二に、ユーザー名・サーバー名・パスワードをGitHub Secretsへ登録しました。 YAMLファイルへ直接書くと、非公開リポジトリでも履歴に残ります。後から行を消しても、過去のコミットから見える可能性があります。
第三に、転送しない確認を先に実行しました。 対象ファイル、秘密情報らしい文字列、シンボリックリンク、接続方式を確認し、問題がないことを確かめてから本番転送を有効にしました。
第四に、外部ActionをコミットSHAで固定しました。 @v4のような可変タグではなく、確認した版の完全なコミットIDを指定すると、同じ設定名の参照先が変わるリスクを抑えられます。
初心者は、どの順番で設定すればいい?
一度に本番公開まで進めず、次の八段階に分けます。各段階の完了条件を確認してから次へ進むことが重要です。
- 公開対象を分離する:GitHubへ入れるフォルダと、入れない公式HP本体を分ける
- 秘密情報を検査する:パスワード、APIキー、個人情報、設定ファイルを検索する
- 非公開リポジトリへ初回登録する:既存READMEを残し、対象フォルダだけ追加する
- GitHub Desktopでクローンする:パソコン側に正しいリポジトリのコピーを作る
- 限定FTPアカウントを作る:接続先ディレクトリを公開対象へ固定する
- Repository secretsを登録する:接続情報をYAMLへ直接書かない
- 手動テストを実行する:対象と接続条件を確認し、転送前チェックを通す
- 本番公開して照合する:Actionsの成功、公開URL、ファイル件数、主要ページを確認する
ワークフローの中心部分は次のようになります。完全なテンプレートではなく、対象範囲と秘密情報の扱いを理解するための例です。接続先ディレクトリをFTPアカウント側で/lab/に固定しているため、Action側のserver-dirは./です。
name: Deploy lab only
on:
push:
branches: [main]
paths:
- "lab/**"
permissions:
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1
- name: Deploy lab through encrypted FTPS
uses: SamKirkland/FTP-Deploy-Action@3a9c65ae0fc12ac924ccef8afc26941cc43aad0b
with:
server: ${{ secrets.FTP_SERVER }}
username: ${{ secrets.FTP_USERNAME }}
password: ${{ secrets.FTP_PASSWORD }}
protocol: ftps
local-dir: ./lab/
server-dir: ./
lab/lab/になったら何が間違っている?FTPアカウントの接続先がすでに/lab/なのに、Action側でもserver-dir: ./lab/と指定すると二重になることがあります。「FTPでログインした直後の場所」を基準に考えてください。
次回からの更新作業はどう変わる?
初期設定後は、担当者がFTPソフトを開く必要はありません。パソコン側のlab/内でファイルを追加・修正し、GitHub Desktopで変更内容を確認して、分かる名前でコミットし、Push originを押します。
mainへ反映されると自動公開が始まります。GitHubのActions画面で緑のチェックになったことを確認し、公開URLを開いて、変更したページと共通部分を確認します。成功表示だけで終わらせず、実際のサイトを見るところまでが更新作業です。
担当者が行うのは、この四つです
- 01ファイルを更新
lab/の中だけを変更し、ブラウザで事前確認 - 02差分を読む
変更ファイルと削除ファイルが意図どおりか確認
- 03Commit・Push
「記事追加」ではなく内容が分かるコミット名にする
- 04公開後を確認
Actionsの成功、対象URL、スマホ表示、リンクを確認
戻す時は、GitHub上の正常だったコミットを基準に復元し、再度mainへ反映します。サーバー上のファイルだけを直接直すと、次回の自動公開で元へ戻る可能性があるため、原本は必ずGitHub側で管理します。
この方法が向くサイト・向かないサイトは?
HTML、CSS、JavaScript、画像などで構成された静的サイトや、他から独立したサブディレクトリには向いています。更新履歴を残したい、複数人で確認したい、FTP操作を減らしたい会社にも有効です。
一方、WordPressはデータベース、管理画面から追加した画像、プラグインやテーマの更新が関係します。ファイルだけをGitHubから送っても、サイト全体の状態は再現できません。予約・決済・会員機能などがある場合も、開発環境、データ移行、動作確認、切り戻しを含む別の設計が必要です。
| サイトの種類 | 適性 | 判断理由 |
|---|---|---|
| 静的な会社案内・記事サイト | 向いている | ファイルだけで表示状態を再現しやすい |
| 独立したサブディレクトリ | 向いている | 権限と公開範囲を分けやすい |
| WordPressサイト全体 | 要検討 | データベースとアップロード画像も管理が必要 |
| 予約・決済・会員サイト | 専門設計が必要 | データ整合性と停止時間の管理が必要 |
実際に迷った点と、確認する順番
GitHub Desktopの認証画面で広い権限が見える:公式のGitHub Desktopアプリで、接続するアカウントが正しいかを確認します。認証後は対象リポジトリをクローンし、別のリポジトリへ誤って追加しないよう左上のリポジトリ名を確認します。
Actionsが「Queued」のまま:これは失敗ではなく実行待ちです。まず数分待って画面を更新します。長時間変わらない時だけ、GitHub Status、同時実行中の処理、Actionsの利用制限を確認します。
緑のチェックが付いたのに表示が古い:公開URLの対象ページを直接開き、強制再読み込みを試します。その後、転送元のファイル、公開先、キャッシュの順に切り分けます。むやみに再実行すると原因が分からなくなります。
秘密情報を間違ってコミットした:ファイルから消すだけでは不十分です。まず資格情報を失効・変更し、GitHub公式手順に沿って履歴からの削除が必要か判断します。パスワードをチャット、Issue、YAML、スクリーンショットへ載せない運用が最も重要です。
よくある疑問に答えます
GitHubのリポジトリは非公開でも自動公開できますか?
できます。GitHub Actionsは非公開リポジトリでも利用できます。利用枠や料金、組織のポリシーは契約プランごとに確認してください。
FTPのパスワードはGitHub上で見えてしまいませんか?
ワークフロー本文へ直接書かず、GitHub ActionsのRepository secretsへ登録します。ただし、ログへ意図的に出力する処理や安全性の低い外部Actionには注意が必要です。
会社の公式ホームページまで上書きされませんか?
公開対象専用のFTPアカウントを作り、その接続先を対象フォルダに限定すれば、事故の影響範囲を小さくできます。ローカル側も対象フォルダだけを指定します。
WordPressにも同じ方法を使えますか?
静的ファイルの公開には向きますが、WordPressはデータベース、アップロード画像、プラグイン更新も関係します。サイト全体の更新方法としてそのまま使うのはおすすめしません。
GitHub ActionsがQueuedのままなら失敗ですか?
Queuedは実行待ちです。数分待って更新し、それでも始まらない場合はGitHub Status、同時実行数、Actionsの利用制限、ワークフロー設定を確認します。
この記事の根拠と確認範囲
2026年8月14日に、SaGaS 中小企業IT改善室の192ファイルを非公開リポジトリへ登録し、公開対象を/lab/へ限定したFTPアカウントとGitHub Actionsを設定しました。転送前テスト、本番実行、Actionsの全工程成功、公開ページの表示まで確認した実例に基づきます。アカウント名、サーバー固有のパス、パスワードなどの秘密情報は掲載していません。
参考にした公式情報
- GitHub Docs「GitHub Actionsのワークフロー構文」
- GitHub Docs「GitHub Actionsでのシークレットの使用」
- GitHub Docs「セキュリティで保護された使用」
- GitHub Docs「GitHub Desktopからのリポジトリのクローン」
- お名前.com レンタルサーバー「FTPアカウントの作成」
- FTP-Deploy-Action 公式リポジトリ
GitHub、外部Action、レンタルサーバーの仕様は変更されます。実装時は上記の公式情報と利用中サービスの最新管理画面を確認してください。
自社サイトの一部だけ、安全に更新を自動化したい方へ
現在の公開範囲、サーバー権限、バックアップ、戻し方を整理してから、影響範囲を限定した手順を設計します。
初回30分の無料相談 サーバー無料診断を使う