posts
【第7回】記事の作成編 — Hugoで書いて公開するまで
(更新 )この記事を読み終えると、記事を書いて、自分のサイトに公開できるようになります。
筆者は最初、記事を書くたびに「この後なんのコマンドを打つんだっけ」と迷っていました。手順に加えて、それぞれのコマンドが何をしているのか、実際にどこでつまずいたのかもまとめます。
公開までの全体の流れ
1. 記事を書く (content/posts/ にファイルを作る)
2. 手元で確認する (hugo server)
3. 公開用に変換する (hugo)
4. サーバーに送る (scp)
5. 読み取り権限を直す (chmod) ← 実は毎回必要だった
6. Nginxに反映する (systemctl reload nginx)
番外編2でGitHub連携をすると、3〜6は git push 1回で自動になります。まずは手動で流れをつかみます。
操作手順
1. サイトのフォルダでPowerShellを開く
hugo から始まるコマンドは、すべて hugo.toml があるフォルダの中で打ちます。
一番かんたんなのは、エクスプローラーからPowerShellを開く方法です。
- エクスプローラーでサイトのフォルダ(
hugo.tomlがあるフォルダ)を開く - 上のアドレスバー(フォルダの場所が書いてあるところ)をクリックする
powershellと打ってEnterを押す
これで、最初からそのフォルダでPowerShellが開きます。cd で移動する場合はこうです。
cd "C:\Users\ユーザー名\...\mysite"
2. 記事ファイルを作る
hugo new posts/my-first-post.md
content/posts/my-first-post.md ができます。ファイル名がそのままURL(/posts/my-first-post/)になるので、英数字とハイフンでつけるのがおすすめです。
3. VSCodeで書く
ファイルの先頭はこうなっています。
+++
title = "記事のタイトル"
date = 2026-09-25T10:00:00+09:00
draft = true
categories = ["beginners"]
+++
+++ で囲まれた部分を「フロントマター」と呼び、タイトルや日付などの情報を書きます。その下に本文を書きます。見出しは ##、箇条書きは - です。
4. 手元で表示を確認する
hugo server -D
ブラウザで http://localhost:1313 を開きます。保存するたびに自動で更新されます。-D は、下書き(draft = true)の記事も表示する指定です。終わるときは、PowerShellをクリックしてから Ctrl + C を押します。
5. 公開する準備をする
先頭の draft = true を draft = false に変えて保存します。
6. 公開用のファイルを作る
hugo
public フォルダに公開用のファイルができます。赤い ERROR が出ていなければOKです。
7. サーバーに送る
scp -r public/* root@xxx.xxx.xxx.xxx:/var/www/yourlog/public/
たくさんのファイル名が流れて、止まったら完了です。
8. 読み取り権限を直して反映する
ssh root@xxx.xxx.xxx.xxx "chmod -R 755 /var/www/yourlog && systemctl reload nginx"
ブラウザで自分のサイトを開き、記事が出ていれば公開完了です。見た目が古いままなら Ctrl + Shift + R(キャッシュを使わずに読み込み直す)を押してください。
よく使うHugoコマンド
| コマンド | 何をするか | 使うとき |
|---|---|---|
hugo new site フォルダ名 |
新しいサイトの骨組みを作る | 最初の1回だけ |
hugo new posts/名前.md |
フロントマター付きの記事ファイルを作る | 記事を書き始めるとき |
hugo server |
手元のPCだけで見られるプレビューを動かす | 公開前に見た目を確認するとき |
hugo server -D |
下書きも含めてプレビューする | 書きかけの記事を確認するとき |
hugo |
公開用のファイルを public フォルダに作る |
サーバーに送る直前 |
hugo --minify |
hugo と同じだが、余分な空白を削って軽くする |
公開用。少しだけ表示が速くなる |
hugo server と hugo は別物
ここが一番間違えやすいところでした。
hugo server |
hugo |
|
|---|---|---|
| 役割 | 確認用のプレビュー | 公開用のファイルを作る |
| 見られる人 | 自分のPCだけ(localhost:1313) |
このコマンドだけでは誰にも見えない |
| 公開するには | このままでは公開されない | できた public をサーバーに送る |
筆者は最初、hugo server で確認して満足し、hugo を打たずに転送して「サイトが変わらない」と悩みました。確認は hugo server、公開するファイルを作るのは hugo です。何も付けない hugo は「完成品を出荷する」と覚えています。
scpは何をしているのか
手順7の scp は、毎回なんとなく打っていたのですが、分解するとこうなっています。
scp -r public/* root@xxx.xxx.xxx.xxx:/var/www/yourlog/public/
| 部分 | 意味 |
|---|---|
scp |
ファイルを安全にコピーするコマンド(Secure Copy) |
-r |
フォルダの中身をまるごとコピーする指定 |
public/* |
コピー元。手元の public フォルダの中身全部 |
root@xxx.xxx.xxx.xxx |
コピー先のユーザー名とサーバーのIPアドレス |
:/var/www/yourlog/public/ |
サーバーの中の置き場所 |
:(コロン)の前が「誰として、どのサーバーに」、後ろが「サーバーのどこに」です。
sshとscpの関係
| コマンド | できること |
|---|---|
ssh |
サーバーに入って、コマンドを打つ |
scp |
サーバーとの間で、ファイルをコピーする(入って操作はしない) |
scp は、中でSSHの仕組みをそのまま使っています。だから第5回で鍵認証にしたあとは、scp でもパスワードを聞かれません。「パスワードを聞かれずに転送が始まる」のは、鍵認証がちゃんと効いている証拠です。
実際にハマったこと:転送のたびに403
記事を送ったあと、ブラウザで開くと 403 Forbidden が出る、ということが何度もありました。最初は「最初の1回だけの不具合」だと思って chmod で直していたのですが、記事を足して scp で送り直すたびに、同じことが起きました。
原因は、送ったファイルやフォルダの読み取り権限が、Nginxから読めない状態になっていたことです。なので手順8の chmod -R 755 は、最初の1回ではなく毎回やる手順として組み込んでいます。
確認するときは、CSSファイルを直接開くと分かりやすいです。
https://(自分のドメイン)/css/style.css
CSSの中身(コード)がそのまま表示されれば正常です。403や404になったら、権限の問題が残っている合図です。
この権限の問題は、GitHub連携で自動化したあとにも形を変えてもう一度起きました。そのときの話は CSSが404になった原因はフォルダの権限だった にまとめています。
うまくいかないとき
| 起きたこと | 原因と対処 |
|---|---|
Unable to locate config file と出る |
hugo.toml があるフォルダにいない。cd し直す(一番よくあるミス) |
| 記事が表示されない | draft = true のまま、または date が未来になっている(未来の記事は公開されない) |
| 公開したのにサイトが変わらない | hugo を打たずに送った。または古い表示が残っているので Ctrl + Shift + R |
| 403 Forbidden になる | 手順8の chmod を忘れている |
| デザインが崩れる・CSSが読まれない | 権限の問題。→ CSSが404になった原因 |
| 文字化けやエラーが出る | VSCodeの右下が「UTF-8」になっているか確認。メモ帳で保存すると壊れることがある |
content にHTMLを置いたらエラーで止まった |
content は記事(Markdown)を入れる場所。HTMLのファイルはテーマの layouts に置く |
エラーが出たら、PowerShellに出た英語のメッセージをそのままコピーして検索するか、AIに聞くと早いです。ただし、IPアドレスやパスワードが写っている部分は、貼る前に必ず消してください。