
こんにちは、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