Spring Boot製ブログアプリの構築記録

はじめに

このブログは、Spring Bootベースで構築した技術ブログシステムです。 静的CMS的な運用を可能とするため、Markdownファイルで記事を管理し、 GitHub ActionsによりVPS環境へ自動デプロイされます。

構成上の特徴は以下の4点です。 - Spring Boot による軽量Webアプリケーション構築 - Markdownによるコンテンツ管理(CMS的運用) - GitHub Actions によるCI/CD自動化 - ConoHa VPS + Nginx によるHTTPS対応と本番運用


使用技術・構成

項目技術・サービス
WebフレームワークSpring Boot 3.5.0
ビルドツールGradle
マークアップエンジンFlexmark (Markdown to HTML)
テンプレートエンジンThymeleaf + Layout Dialect
フロント構成Bootstrap 5, Font Awesome
CI/CDGitHub Actions
ホスティングConoHa VPS(Ubuntu 22.04)
リバースプロキシNginx
HTTPS対応Let’s Encrypt (Certbot)
ドメイン管理ConoHa DNS

記事管理構成(Markdown)

記事は以下の構成で管理されます。

src/
 └─ main/
     └─ resources/
         └─ archives/
              ├─ 2025-06-01-post.md
              ├─ 2025-06-10-post.md
              └─ meta/
	              └─ index.yml

index.yml(メタ情報)

articles:
  - url: first-post
    path: ./2025-06-01-post.md
    title: 初めての記事
    date: 2025-06-01
    tags: [spring, markdown]
    show: true

記事本体(Markdown)

# 初めての記事

これはSpring BootベースのMarkdownブログの最初の記事です。

Spring Boot起動時にYAMLを読み取り、flexmark-java によってHTMLへ変換し、Thymeleafで描画します。


GitHub ActionsによるCI/CD自動化

.github/workflows/release.yml にて、タグ付きリリースと同時にVPS上へ自動デプロイされるよう構成しています。

主な処理内容:

  • ./gradlew stage により blog.jar + Markdown + Config を build/deploy/ へコピー
  • SSH接続による rsync でVPSの /opt/myapp/ にデプロイ
  • systemd経由でアプリ再起動
  • Git TagとGitHub Release作成
- name: Deploy release to VPS
  run: |
    rsync -e "ssh -i ~/.ssh/id_rsa" -av --delete \
      build/deploy/ \
      ${{ secrets.VPS_USER }}@${{ secrets.VPS_HOST }}:/opt/myapp/

Nginxによるリバースプロキシ設定

アプリ自体は8080番で起動し、Nginxでポート80/443を受け付けています。設定ファイルの一部:

server {
    listen 80;
    server_name mocktechblog.net www.mocktechblog.net;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
    }
}

HTTPS化には Certbot を使用:

sudo certbot --nginx -d mocktechblog.net -d www.mocktechblog.net

ConoHa VPS・DNS設定

ConoHaでドメインを取得後、DNS設定(Ver2.0) にて以下をAレコードで登録。

ホスト名種別値(VPSのIP)
@Axxx.xxx.xxx.xxx
wwwAxxx.xxx.xxx.xxx

ネームサーバは ns-a1.conoha.io 系に設定されていました。 CertbotにてHTTPS認証が失敗する場合、DNSの反映やNS設定を再確認してください。 自分はConoHaでドメイン取得してそのままDNSの設定してましたが、 Ver3.0ではなくVer2.0で作られてるのに気付くのに数時間悩みました。

補足:Spring Bootアプリ構成

build.gradle では、デプロイ対象を /build/deploy/ にまとめ、bootJar に合わせて archives のMarkdownファイルも同梱。

bootJar {
	archiveFileName = 'blog.jar'
	destinationDirectory = file("$buildDir/deploy")
	dependsOn copyArchivesToDeploy
}

今後の展望

  • タグ検索、記事ページングなどのUI改善
  • JavaScriptツールの公開

まとめ

静的CMSのような軽量性と、Spring Bootによる柔軟な拡張性を両立した構成でブログシステムを構築しました。詳しく書こうとするとそれだけで結構深堀出来てしまうのでそれぞれの作業はあっさり目に書いています(CDCIとかは別途markdownの更新だけ行いもの作ったり等…)。

結構業務としてSpring bootが使われている印象で、簡単に触れるわりに高品質なアプリが作れるのでこんな使い方もできるっていう一例になれればと思います。