Skip to content

バックエンドデモ環境構築手順書

概要

本ドキュメントは、財務会計システムのバックエンドデモ環境について説明します。 デモ環境は H2 インメモリデータベースを使用し、外部データベースなしで動作する自己完結型の構成です。

デモ環境の特徴

項目 内容
データベース H2 インメモリ
データ永続性 なし(再起動でリセット)
初期データ 起動時に自動投入(勘定科目マスタ 31 件、テストユーザー 5 名)
用途 デモ、プレゼンテーション、機能確認
外部依存 なし(PostgreSQL 不要)
API ドキュメント Swagger UI(/swagger-ui.html

技術スタック

  • Java: 25
  • Spring Boot: 4.0.0
  • データベース: H2 Database(インメモリモード)
  • ORM: MyBatis
  • ビルドツール: Gradle

ローカル実行

前提条件

  • JDK 25 以上
  • Gradle 9.x(または Gradle Wrapper 使用)

起動方法

コマンドラインから起動

cd apps/backend
./gradlew bootRun --args='--spring.profiles.active=demo'

IntelliJ IDEA から起動

  1. Application.java を右クリック
  2. Run 'Application' または Debug 'Application' を選択
  3. 実行構成で VM オプションを追加:
    -Dspring.profiles.active=demo
    

または環境変数で設定:

SPRING_PROFILES_ACTIVE=demo

動作確認

起動後、以下のエンドポイントで動作確認できます。

Swagger UI(推奨)

ブラウザで以下にアクセス:

http://localhost:8080

ルート URL にアクセスすると自動的に Swagger UI にリダイレクトされます。

Swagger UI の機能: - 全 API エンドポイントの一覧と詳細 - リクエスト/レスポンスのスキーマ確認 - ブラウザから直接 API を実行・テスト - JWT 認証トークンを設定して認証付き API をテスト

ヘルスチェック

curl http://localhost:8080/api/health

ログイン API

curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username": "admin", "password": "Password123!"}'

Actuator エンドポイント

# ヘルスチェック(データベース接続状態含む)
curl http://localhost:8080/actuator/health

# アプリケーション情報
curl http://localhost:8080/actuator/info

# 環境変数
curl http://localhost:8080/actuator/env

H2 コンソール

ブラウザで以下にアクセス:

http://localhost:8080/h2-console

接続情報:

項目
JDBC URL jdbc:h2:mem:accounting_demo
User Name sa
Password (空)

設定ファイル

application-demo.yml

デモ環境専用の設定ファイルです。

spring:
  application:
    name: accounting-backend

  # Flyway 自動構成を除外(H2 では不要)
  autoconfigure:
    exclude:
      - org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration

  # H2 インメモリデータベース
  datasource:
    url: jdbc:h2:mem:accounting_demo;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=PostgreSQL
    driver-class-name: org.h2.Driver
    username: sa
    password:

  # H2 コンソール
  h2:
    console:
      enabled: true
      path: /h2-console
      settings:
        web-allow-others: true

  # SQL 初期化
  sql:
    init:
      mode: always
      schema-locations: classpath:db/schema.sql
      data-locations: classpath:db/demo-data.sql

server:
  port: ${PORT:8080}

初期データ

スキーマ(db/schema.sql)

-- 勘定科目テーブル
CREATE TABLE IF NOT EXISTS accounts (
    id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    code VARCHAR(10) NOT NULL UNIQUE,
    name VARCHAR(100) NOT NULL,
    account_type VARCHAR(20) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- ユーザーテーブル
CREATE TABLE IF NOT EXISTS users (
    id VARCHAR(36) PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    display_name VARCHAR(100) NOT NULL,
    role VARCHAR(20) NOT NULL,
    active BOOLEAN NOT NULL DEFAULT true,
    locked BOOLEAN NOT NULL DEFAULT false,
    failed_login_attempts INTEGER NOT NULL DEFAULT 0,
    last_login_at TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

デモデータ(db/demo-data.sql)

起動時に以下のデータが自動投入されます。

勘定科目マスタ:

区分 科目数
資産 10 件 現金、当座預金、売掛金、商品 等
負債 5 件 買掛金、未払金、借入金 等
純資産 2 件 資本金、利益剰余金
収益 3 件 売上高、受取利息、雑収入
費用 11 件 仕入高、給与手当、旅費交通費 等

テストユーザー:

ユーザー名 パスワード ロール 説明
admin Password123! ADMIN 管理者
manager Password123! MANAGER 経理責任者
user Password123! USER 経理担当者
viewer Password123! VIEWER 閲覧者
locked Password123! USER ロック済みユーザー(テスト用)

Heroku デプロイ

前提条件

  • Heroku CLI インストール済み
  • Heroku アカウント作成済み
  • Docker Desktop インストール済み

Dockerfile

apps/backend/Dockerfile に以下の内容が配置されています:

# ビルドステージ
FROM gradle:ubi10 AS builder
WORKDIR /app
COPY ./ ./
RUN gradle build -x test --no-daemon

# 実行ステージ
FROM eclipse-temurin:25-jre-alpine
WORKDIR /app
COPY --from=builder /app/build/libs/*.jar app.jar
EXPOSE 8080
CMD ["java", "-Dserver.port=${PORT:-8080}", "-jar", "app.jar"]

ビルドコンテキストについて:

この Dockerfile は apps/backend/ ディレクトリをビルドコンテキストとして使用します。 COPY ./ ./ でカレントディレクトリ(apps/backend/)のソースコードをコピーします。

デプロイ手順(Docker コマンド使用・推奨)

サブディレクトリに Dockerfile がある場合は、Docker コマンドで直接ビルド・プッシュする方法が確実です。

1. Heroku アプリ作成

heroku create アプリ名

2. スタックを container に設定

heroku stack:set container -a アプリ名

3. 環境変数設定

heroku config:set SPRING_PROFILES_ACTIVE=demo -a アプリ名
heroku config:set JWT_SECRET=$(openssl rand -base64 32) -a アプリ名
heroku config:set CORS_ALLOWED_ORIGINS=https://フロントエンドアプリ名.herokuapp.com -a アプリ名

環境変数一覧:

変数名 必須 説明
SPRING_PROFILES_ACTIVE Yes demo を指定
JWT_SECRET Yes JWT 署名キー(最低 32 文字)
CORS_ALLOWED_ORIGINS Yes CORS 許可オリジン(カンマ区切りで複数指定可)

注意: JWT_SECRETCORS_ALLOWED_ORIGINS は必須です。設定しないと起動時にエラーまたは CORS エラーになります。

4. Heroku Container Registry にログイン

heroku container:login

Login Succeeded と表示されれば成功です。

5. Docker ビルド

apps/backend/ をビルドコンテキストとしてビルドします:

docker build -t registry.heroku.com/アプリ名/web apps/backend

6. プッシュ

docker push registry.heroku.com/アプリ名/web

7. リリース

heroku container:release web -a アプリ名

8. 動作確認

# ログ確認
heroku logs --tail -a アプリ名

# ヘルスチェック
curl https://アプリ名.herokuapp.com/actuator/health

# Swagger UI(ブラウザでアクセス)
# https://アプリ名.herokuapp.com

Heroku デモ環境 URL:

エンドポイント URL
Swagger UI https://アプリ名.herokuapp.com/
API ヘルスチェック https://アプリ名.herokuapp.com/api/health
Actuator https://アプリ名.herokuapp.com/actuator/health

デプロイ手順(heroku.yml 使用・代替)

Git push でデプロイしたい場合は heroku.yml を使用します。

heroku.yml の設定

プロジェクトルートに heroku.yml を作成:

build:
  docker:
    web: apps/backend/Dockerfile

run:
  web: java -Dserver.port=$PORT -Dspring.profiles.active=demo -jar app.jar

重要: - Dockerfile のパスは heroku.yml からの相対パスで指定 - ビルドコンテキストは Dockerfile があるディレクトリに自動設定される - context オプションは存在しない(公式ドキュメント参照)

デプロイ実行

heroku stack:set container -a アプリ名
git push heroku main

データリセット

Dyno を再起動するとデータがリセットされ、初期データが再投入されます。

heroku restart -a アプリ名

プロファイル比較

項目 dev(開発) demo(デモ)
データベース PostgreSQL H2 インメモリ
マイグレーション Flyway SQL init
データ永続性 あり なし
外部依存 Docker 必要 不要
H2 コンソール 無効 有効
用途 開発・テスト デモ・検証

トラブルシューティング

H2 コンソールにアクセスできない

  1. spring.h2.console.enabled=true が設定されているか確認
  2. spring-boot-h2console 依存関係が含まれているか確認
  3. プロファイルが demo になっているか確認

データが初期化されない

  1. spring.sql.init.mode=always が設定されているか確認
  2. db/schema.sqldb/demo-data.sql が存在するか確認
  3. SQL 構文が H2 互換か確認

Actuator エンドポイントにアクセスできない

  1. spring-boot-starter-actuator 依存関係が含まれているか確認
  2. management.endpoints.web.exposure.include が設定されているか確認

Heroku: no basic auth credentials エラー

Docker が Heroku Container Registry にログインできていません。

# Heroku CLI 経由で認証
heroku container:login

それでも解決しない場合は、手動で認証:

# API キーを使用して手動ログイン
docker login registry.heroku.com -u _ -p $(heroku auth:token)

Heroku: WeakKeyException (JWT_SECRET)

io.jsonwebtoken.security.WeakKeyException: The specified key byte array is 0 bits

JWT_SECRET 環境変数が設定されていないか、空です。

# JWT_SECRET を設定(最低 32 文字必要)
heroku config:set JWT_SECRET=$(openssl rand -base64 32) -a アプリ名

# 設定確認
heroku config -a アプリ名

Heroku: サブディレクトリの Dockerfile を使用したい

heroku container:push--dockerfile オプションをサポートしていません。

解決策: 1. docker build apps/backend でサブディレクトリをコンテキストとしてビルド(推奨) 2. heroku.yml で Dockerfile パスを指定して Git push でデプロイ

詳細は「デプロイ手順」セクションを参照してください。

Heroku: App crashed (H10 エラー)

起動に失敗しています。ログを確認:

heroku logs --tail -a アプリ名

よくある原因: 1. JWT_SECRET が未設定 2. SPRING_PROFILES_ACTIVE=demo が未設定 3. Dockerfile の CMD が正しくない($PORT を使用しているか確認)

Heroku: CORS エラー(400 Bad Request)

フロントエンドからバックエンドへのリクエストが CORS エラーで失敗する場合:

Access to XMLHttpRequest at 'https://backend.herokuapp.com/api/auth/login'
from origin 'https://frontend.herokuapp.com' has been blocked by CORS policy

解決方法:

# CORS 許可オリジンを設定
heroku config:set CORS_ALLOWED_ORIGINS=https://フロントエンドアプリ名.herokuapp.com -a バックエンドアプリ名

# 設定確認
heroku config -a バックエンドアプリ名

複数のオリジンを許可する場合はカンマ区切りで指定:

heroku config:set CORS_ALLOWED_ORIGINS="https://frontend.herokuapp.com,http://localhost:5173,http://localhost:3000" -a バックエンドアプリ名

制約事項

制約 説明
データ非永続 アプリ再起動でデータはリセット
シングルインスタンス 複数インスタンスでのデータ共有不可
本番利用不可 あくまでデモ・検証用途
大量データ非対応 インメモリのため大量データには不向き

関連ドキュメント