KENTEM TechBlog

建設業のDXを実現するKENTEMの技術ブログです。

Azure上にOpenProjectをセットアップした話

この記事は、 テックブログ強化月間 リレーブログ企画2026 参加の記事です。

こんにちは、KENTEMのまつです。 WBSを作成するにあたり、ガントチャートで視覚的に共有・分析できるようにしたいなぁ、、となったため、OpenProjectをAzure上にセットアップして使ってみました。

OpenProjectのガントチャートはこんな感じのやつ

構成

ざっくり構成図です。現実と少し違うところもあるけどそこはご愛嬌。

構成図

月額コスト概算

リソース 単価 (円) 数量 概算月額 (円)
VM (D2ads v5) 15 250h ( 12.5h * 20d ) 3,750
App Service (B1) 2.2 730h ( 365d * 24h / 12mon ) 1,606
ACR (Basic) 25.571 30d 767.14

セットアップ

前提条件

  • Azure サブスクリプション
  • Azure Portal へのアクセス権限
  • Azure 基礎知識
  • Docker の基本的な理解

リソースグループ作成

1.Azure Portal → 「リソースグループ」 を検索
2.「+ 作成」 をクリック
3.以下を入力

項目
サブスクリプション (自分のサブスクリプション)
リソースグループ名 rg-xxxxxxxxxxx
リージョン Japan East

4.「確認および作成」「作成」


VNet とサブネット作成

VNet 作成

1.Azure Portal → 「仮想ネットワーク」 を検索
2.「+ 作成」 をクリック

基本タブ

項目
リソースグループ rg-xxxxxxxxxxx
名前 vnet-xxxxxxxxxxx
リージョン Japan East

IP アドレス タブ

項目
IPv4 アドレス空間 172.16.0.0/16

サブネットを追加

サブネット名 アドレス範囲 用途
snet-xxxxxxxxxxx-vm 172.16.0.0/24 VM 用
snet-xxxxxxxxxxx-as 172.16.1.0/24 App Service VNet 統合用

3.「確認および作成」「作成」

App Service 用サブネットの委任設定

1.作成した VNet → 「サブネット」
2.snet-xxxxxxxxxxx-as をクリック
3.「サブネットの委任」Microsoft.Web/serverFarms を選択
4.「保存」


Ubuntu VM 作成

1.Azure Portal → 「仮想マシン」 を検索
2.「+ 作成」「Azure 仮想マシン」

基本タブ

項目
リソースグループ rg-xxxxxxxxxxx
仮想マシン名 vm-xxxxxxxxxxx
リージョン Japan East
イメージ Ubuntu Server 24.04 LTS
サイズ Standard D2ads v5 (2 vcpu 数、8 GiB メモリ)
VMアーキテクチャ x64
認証の種類 SSH 公開キー
ユーザー名 root-op
SSH 公開キー vm-xxxxxxxxxxx-key (新規作成)

ディスク タブ

項目
OSディスクの種類 StandardSSD (ローカル冗長)

ネットワーク タブ

項目
仮想ネットワーク vnet-xxxxxxxxxxx
サブネット snet-xxxxxxxxxxx-vm
パブリック IP vm-xxxxxxxxxxx-ip (新規作成)
NIC ネットワークセキュリティグループ Basic
パブリック受信ポート SSH (22)

3.「確認および作成」「作成」

⚠️ SSH キーをダウンロードして安全に保存してください


VM に OpenProject をインストール

ターミナル で VM に接続

1.ターミナルで以下コマンドを実行してSSH接続する

ssh <<username>>@<<ipaddress>> -i <<pem file path>>

Docker インストール

※手順は割愛

OpenProject コンテナ起動

1.データ永続化用のディレクトリ作成

// 無ければ追加
sudo mkdir -p /var/lib/openproject/pgdata
sudo mkdir -p /var/lib/openproject/assets
    
// アクセス権が足りなければ設定
sudo chown 1000:1000 -R /var/lib/openproject/pgdata
sudo chown 1000:1000 -R /var/lib/openproject/assets

2.SECRET用のランダム文字列生成

head /dev/urandom | tr -dc A-Za-z0-9 | head -c 32 ; echo ''

3.OpenProject コンテナの起動

docker run -d --name openproject --restart always
  -p 8080:80
  -e SECRET_KEY_BASE=<<SECRETのランダム文字列>>
  -e OPENPROJECT_HOST__NAME=<<AppServiceのドメイン名>>
  -e OPENPROJECT_HTTPS=true
  -e OPENPROJECT_HSTS=false
  -e OPENPROJECT_RAILS__RELATIVE__URL__ROOT=
  -v /var/lib/openproject/pgdata:/var/openproject/pgdata
  -v /var/lib/openproject/assets:/var/openproject/assets
  openproject/openproject:17

カスタム Nginx イメージの作成

Nginx をリバースプロキシサーバーとして利用するため、App Service 向けの Docker イメージを作成します。
なお、App Service のスタートアップコマンドでは複雑なシェルコマンドが実行できないため、カスタム Docker イメージの作成で代替しています。

Azure Container Registry 作成

1.Azure Portal → 「Container registories」 を検索
2.「+ 作成」

基本タブ

項目
リソースグループ rg-xxxxxxxxxxx
レジストリ名 crxxxxxxxxxxx
リージョン Japan East
価格プラン Basic

3.「確認および作成」「作成」
4.作成した Container Registoriy → 「アクセス キー」
5.管理者ユーザー のチェックを有効化

⚠️ ACR 名は Azure 全体で一意である必要があります

Nginx 設定ファイル作成

# 作業ディレクトリ作成
mkdir ~/openproject-proxy && cd ~/openproject-proxy

# default.conf 作成
echo 'server {
    listen 80;
    location / {
        proxy_pass http://<<VM のプライベート IP>>:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port 443;
        proxy_cookie_path / "/; Secure; SameSite=Lax";
        client_max_body_size 100M;
        proxy_read_timeout 300;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
    }
}' > default.conf

⚠️ <<VM のプライベート IP>> は VM の実際のプライベート IP に置き換えてください 確認方法: Azure Portal → VM → 概要 → プライベート IP アドレス

Dockerfile 作成

echo 'FROM nginx:alpine
COPY default.conf /etc/nginx/conf.d/default.conf' > Dockerfile

Container Registoryがあるサブスクリプションに移動

az account set --subscription "<<サブスクリプション名>>"

⚠️ <<サブスクリプション名>> は Container Registory を作成したサブスクリプションの名前に置き換えてください

イメージをビルド&プッシュ

az acr build --registry crxxxxxxxxxxx --image openproject-proxy:v1 .

⚠️ タグ名 v1 はコンテナーをプッシュする度にインクリメントしてください


App Service 作成

1.Azure Portal → 「App Service」 を検索
2.「+ 作成」「Web アプリ」

基本タブ

項目
リソースグループ rg-xxxxxxxxxxx
名前 as-xxxxxxxxxxx(一意の名前に変更)
公開 コンテナー
オペレーティングシステム Linux
リージョン Japan East

価格プラン

項目
App Service プラン 新規作成: asp-xxxxxxxxxxx
価格プラン Basic B1

コンテナー タブ

項目
オプション 単一コンテナー
イメージソース Azure Container Registry
名前 main
レジストリ crxxxxxxxxxxx
認証 管理者資格情報
イメージ openproject-proxy
タグ v1

⚠️ タグ名 v1 はコンテナーをプッシュする度に作成した App Service の設定からインクリメントしてください

ネットワーク タブ

項目
パブリック アクセスを有効にする オン
仮想ネットワーク統合を有効にする オン
仮想ネットワーク vnet-xxxxxxxxxxx
VNet 統合を有効にする オン
送信サブネット snet-xxxxxxxxxxx-as

3.「確認および作成」「作成」


OpenProjectのエンドポイントへのアクセス制限

1.作成した App Service → 「ネットワーク」
2.「公衆ネットワークアクセス」「アクセス制限なしで有効」
3.「公衆ネットワーク アクセス」選択した仮想ネットワークとIPアドレスから有効 に変更
4.「一致しないルールのアクション」拒否に変更
5.「+ 追加」

規則の追加

項目
名前 ○○からの要求
アクション 許可
優先度 300
ソースの設定 IPv4
IP アドレス ブロック <<OpenProjectに接続を許可するIPアドレス>>

6.「規則の追加」

動作確認

1.ブラウザで https://<App Service名>.azurewebsites.net にアクセス
2.OpenProject のログイン画面が表示されることを確認

初期ログイン情報

公式ドキュメントを参照 https://www.openproject.org/docs/installation-and-operations/installation/docker-compose/

⚠️ 初回ログイン後、パスワードを変更してください


NSG でアクセス制限

VM へのアクセスを App Service サブネットからのみに制限します。

1.Azure Portal → VM → 「ネットワーク」
2.「受信ポートの規則を追加する」

項目
ソース IP Addresses
ソース IP アドレス 10.0.2.0/24(App Service サブネット)
ソース ポート範囲 *
宛先 Any
宛先ポート範囲 8080
プロトコル TCP
アクション 許可
優先度 310
名前 HTTP_8080

3.追加


VM の自動起動・停止設定

コスト削減のため、夜間は VM を停止し、朝に自動起動させます。

自動シャットダウン設定

1.Azure Portal → VM → 左メニュー → 「自動シャットダウン」
2.以下を設定

項目
有効にする オン
スケジュールされたシャットダウン 20:00
タイムゾーン (UTC+09:00) 大阪、札幌、東京

3.保存

自動起動設定(Logic Apps)

1.Azure Portal → 「Logic Apps」「+ 追加」

項目
リソースグループ rg-xxxxxxxxxxx
名前 logic-start-vm
リージョン Japan East
プランの種類 消費

2.「確認および作成」「作成」
3.作成後、「ロジック アプリ デザイナー」 を開く
4.「繰り返し」 トリガーを選択して設定

項目
間隔 1
頻度
タイムゾーン (UTC+09:00) Osaka, Sapporo, Tokyo
設定時刻(時間) 8
設定時刻(分) 0

5.「+ 新しいステップ」「条件」 を追加(平日のみ実行する場合)

項目
左側 dayOfWeek(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time')) (式として入力)
演算子 次の値以上
右側 1

AND 条件を追加

項目
左側 dayOfWeek(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'))
演算子 次の値以下
右側 5

6.True 側に 「+ アクションの追加」「Azure VM」 を検索 → 「仮想マシンを起動する」

項目
サブスクリプション (自分のサブスクリプション)
リソースグループ rg-xxxxxxxxxxx
仮想マシン名 vm-xxxxxxxxxxx

7.保存

最終動作確認

初期ユーザーと"動作確認"で変更したパスワードでログインします。
ログインができることを確認して問題なければ構築完了です。

問題があった場合、問題の切り分けのために、VM上のOpenProjectに直接アクセスできるか?リバースプロキシを経由してアクセスできるか?という感じで段階的に確認をしていくと良いです。

おわりに

OpenProjectはAllInOneパッケージがあるため比較的簡単にセットアップできました。 ガントチャート作ってみたいけど、Excelは嫌だという方はぜひ試してみてはいかがでしょうか。

KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp