コース一覧
    Go実践:並行処理とWeb API
    1バイナリでデプロイ

    Go実践:並行処理とWeb API

    Goの並行処理とWeb API開発を組み合わせ、実践的なサービス構築へ進むコースです。

    1
    ゴルーチンと並行処理のさわり
    01. ゴルーチン15分
    02. チャネル20分
    03. 待ち合わせ20分
    04. 並行の落とし穴20分
    05. つくる: 並行集計20分
    06. 第7章クイズ10分
    2
    Web API(net/http)
    01. サーバーを立てる20分
    02. ハンドラ関数20分
    03. JSONを返す20分
    04. ルーティング20分
    05. 一覧API20分
    06. 詳細APIと40420分
    07. 出品API20分
    08. つくる: API主要部完成25分
    09. 第8章クイズ10分
    3
    総合制作
    01. 仕様互換を仕上げる25分
    02. Node版と差し替える25分
    03. 1バイナリでデプロイ25分
    04. 自由拡張25分
    05. 完成と次のステップ20分

    1バイナリでデプロイ

    置くだけで動く

    第1章で「1バイナリ」の話をしました。ここでそれを使います。

    プレーンテキスト

    go build -o fleama-go
    scp fleama-go server:/opt/fleama/
    ssh server /opt/fleama/fleama-go

    3行です。サーバーに Go を入れる必要も、依存を取ってくる必要もありません。

    プレーンテキスト

    Node.js  node を入れる → npm install → node_modules が数万ファイル
    Go       ファイルを1つ置く

    別の OS 向けに作る

    手元が Mac で、サーバーが Linux ということがほとんどです。Go はその場で相手向けに作れます。

    プレーンテキスト

    GOOS=linux GOARCH=amd64 go build -o fleama-go

    プレーンテキスト

    GOOS    動かす OS。linux / darwin / windows
    GOARCH  CPU の種類。amd64 / arm64

    クロスコンパイルと呼びます。他の言語では専用の環境を用意することが多い作業が、環境変数2つで済みます。

    間違えると動きません。 Mac 向けに作ったものを Linux に置くと cannot execute binary file と言われます。

    常駐させる

    そのまま実行すると、端末を閉じた時点で止まります。サーバーで動かし続けるには、OS に面倒を見てもらいます。Linux では systemd が担当します。

    プレーンテキスト

    [Unit]
    Description=fleama-go API
    
    [Service]
    ExecStart=/opt/fleama/fleama-go
    Restart=always
    User=fleama
    
    [Install]
    WantedBy=multi-user.target

    これを /etc/systemd/system/fleama-go.service に置きます。

    プレーンテキスト

    sudo systemctl daemon-reload
    sudo systemctl enable fleama-go
    sudo systemctl start fleama-go
    sudo systemctl status fleama-go

    Restart=always があるので、落ちても自動で起き上がります。enable しておくと、サーバーを再起動しても勝手に立ち上がります。

    更新するとき

    プレーンテキスト

    GOOS=linux GOARCH=amd64 go build -o fleama-go
    scp fleama-go server:/opt/fleama/fleama-go.new
    ssh server 'mv /opt/fleama/fleama-go.new /opt/fleama/fleama-go && systemctl restart fleama-go'

    新しいファイルを別名で置いてから入れ替えます。転送の途中で壊れた状態が動くのを防ぐためです。

    実行中のファイルをそのまま上書きしようとすると text file busy で拒まれることもあります。別名で置いて mv するのが確実です。

    設定は環境変数で渡す

    Go

    port := os.Getenv("PORT")
    if port == "" {
    	port = "8080"
    }
    http.ListenAndServe(":"+port, mux)

    バイナリに設定を埋め込むと、環境ごとに作り直すことになります。外から渡して、無ければ既定値にするのが定石です。第5章のカンマokと同じ、「無いときどうするか」を決める話です。

    要件

    1. 空文字の項目は既定値を使う(port は 8080、env は development、goos は linux)
    2. ポートが数値に変換できないときは 不正なポートです を返す
    3. listen=:PORT env=ENV build=GOOS/amd64 の形を返す

    ヒント

    既定値の代入は `if port == "" { port = "8080" }` の形です

    ポートの検証は既定値を入れた**後**に行います。空文字は既定値になるので、不正にはなりません

    値そのものは要らないので `if _, err := strconv.Atoi(port); err != nil {` と書けます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/10

    関連レッスン

    • 自由拡張

      欲しいAPIを自分で設計して実装し、並行処理を活かした集計APIを1本作れるようになります。

    • 完成と次のステップ

      fleama-goの完成を確かめ、次に学ぶものを自分で選べるようになります。

    • Node版と差し替える

      同じ仕様の別実装に置き換えられることを確かめ、実務のリプレイスを疑似体験します。

    • 仕様互換を仕上げる

      ステータスコードとエラー形式を仕様に揃え、互換のあるAPIとして仕上げられるようになります。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • サーバークライアント(ブラウザなど)がリクエストを送り、サーバーがレスポンスを返す。
    • コンパイルソースをバイトコードへ変換する処理
    • 環境変数JWT_SECRET など秘匿値を渡す手段
    • 変数データに名前をつけて参照する仕組み
    main.go
    エディタを読み込んでいます

    メモ

    1バイナリでデプロイ

    ⌘S で保存