<CodeLearn/>
デプロイ レッスン1

デプロイの基本

開発から本番公開までの流れを理解しよう

開発環境と本番環境

Webアプリケーション開発では、少なくとも開発環境(Development)本番環境(Production)の2つの環境を使い分けます。 大規模なプロジェクトでは、さらにステージング環境(Staging)を設けることもあります。

環境目的特徴
Development開発・テストホットリロード、詳細なエラー表示、デバッグツール
Stagingリリース前の最終確認本番に近い設定、限られたアクセス
Productionユーザーへの公開最適化済み、エラーは最小限表示、監視あり
# Next.jsの場合
# 開発モード:ホットリロード、詳細なエラー表示
npm run dev

# 本番ビルド:最適化されたコードを生成
npm run build

# 本番起動:ビルド済みコードを実行
npm run start

ビルドプロセス

ビルドとは、開発用のソースコードを本番環境で実行できる形に変換する処理です。 TypeScriptのコンパイル、JavaScriptのバンドル・ミニファイ、CSSの最適化などが行われます。

ビルドによって以下の最適化が行われます。

  • トランスパイル — TypeScript/JSXを標準JavaScriptに変換
  • バンドル — 複数ファイルをまとめて読み込みを高速化
  • ミニファイ — 空白・コメントを除去してファイルサイズ削減
  • ツリーシェイキング — 未使用コードを自動的に除外
  • コード分割 — ページごとに必要なコードだけを読み込み
# Next.jsのビルド出力例
$ npm run build

Route (app)                    Size     First Load JS
┌ ○ /                          5.2 kB        89 kB
├ ○ /about                     1.8 kB        85 kB
├ ● /blog/[slug]               3.1 kB        87 kB
└ ○ /contact                   2.4 kB        86 kB

○  (Static)   prerendered as static content
●  (SSG)      prerendered as static HTML (uses getStaticProps)

# .next/ ディレクトリにビルド成果物が生成される

環境変数

環境変数は、環境ごとに異なる設定値(APIキー、データベース接続先など)を コードの外で管理する仕組みです。秘密情報をソースコードに含めずに済むため、セキュリティ上も重要です。

# .env.local(開発環境用・Gitに含めない)
DATABASE_URL=postgresql://localhost:5432/myapp_dev
API_KEY=dev_key_12345
NEXT_PUBLIC_APP_URL=http://localhost:3000

# .env.production(本番環境用)
DATABASE_URL=postgresql://prod-server:5432/myapp
API_KEY=prod_key_secret
NEXT_PUBLIC_APP_URL=https://myapp.com

Next.jsでは、NEXT_PUBLIC_プレフィックスが付いた環境変数のみがクライアント(ブラウザ)側で使えます。 それ以外はサーバー側でのみアクセス可能です。

// サーバーサイドでのみ使える
const dbUrl = process.env.DATABASE_URL;

// クライアントサイドでも使える(NEXT_PUBLIC_プレフィックス)
const appUrl = process.env.NEXT_PUBLIC_APP_URL;

// .env.local は .gitignore に追加しておく
// .gitignore:
// .env.local
// .env*.local

ドメインとDNS

ドメインは、Webサイトの「住所」にあたるもの(例:example.com)です。DNS(Domain Name System)は、ドメイン名をサーバーのIPアドレスに変換する仕組みです。

# ドメインの仕組み
ユーザーが example.com にアクセス
  ↓
DNSサーバーに問い合わせ
  ↓
IPアドレス 93.184.216.34 を返す
  ↓
そのIPアドレスのサーバーに接続

# よく使うDNSレコード
Aレコード    : ドメイン → IPv4アドレス
AAAAレコード : ドメイン → IPv6アドレス
CNAMEレコード: ドメイン → 別のドメイン(エイリアス)
MXレコード   : メールサーバーの指定

ドメインはお名前.comGoogle DomainsCloudflareなどのレジストラで取得できます。年間数百円〜数千円程度で利用可能です。

HTTPSとSSL/TLS

HTTPSは、HTTP通信をSSL/TLSで暗号化したプロトコルです。 現代のWebサイトでは必須であり、Google検索のランキング要因にもなっています。

  • データの暗号化 — 通信内容が第三者に読み取られない
  • データの完全性 — 通信内容が改ざんされていないことを保証
  • 認証 — 接続先が正しいサーバーであることを証明

Let's Encryptを使えばSSL証明書を無料で取得できます。 Vercelやクラウドサービスでは自動的にHTTPSが設定されることが多いです。

# Let's Encrypt で証明書を取得する例(certbot)
sudo certbot --nginx -d example.com -d www.example.com

# Vercelの場合:自動でHTTPS証明書が発行される
# カスタムドメインを追加するだけでOK

# Nginx設定例(HTTPS対応)
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    location / {
        proxy_pass http://localhost:3000;
    }
}

ホスティングの種類

アプリを公開するためのホスティング方法は、用途や規模に応じていくつかの選択肢があります。

静的サイトホスティング

HTML/CSS/JSのみ。サーバー処理不要。高速で安価。

例:GitHub Pages、Netlify、Vercel(静的)、Cloudflare Pages

PaaS(Platform as a Service)

サーバー管理をプラットフォーム側に任せる。デプロイが簡単。

例:Vercel、Heroku、Railway、Render

IaaS(Infrastructure as a Service)

仮想マシンを借りてすべて自分で管理。自由度が高いが手間がかかる。

例:AWS EC2、GCE、さくらVPS、ConoHa

サーバーレス

関数単位でデプロイ。使った分だけ課金。スケーリング自動。

例:AWS Lambda、Cloudflare Workers、Vercel Edge Functions

確認クイズ

1 / 3

Next.jsで本番用の最適化されたコードを生成するコマンドはどれ?

まとめ

  • 開発環境と本番環境を分け、それぞれに適した設定を行う
  • ビルドプロセスでコードを最適化し、本番向けの成果物を生成する
  • 環境変数で秘密情報や設定値をコード外で管理する
  • ドメインとDNSでユーザーがアクセスできるURLを設定する
  • HTTPSは必須。Let's Encryptで無料取得、またはPaaSの自動設定を利用
  • ホスティング方法は用途に応じて選択する(静的/PaaS/IaaS/サーバーレス)