1. はじめに
GROWI(Wikiシステム)をセルフホストする場合、本体の他にMongoDB、Elasticsearch、そしてリバースプロキシとしてのApacheなど、複数のサービスを管理する必要があります。これらを個別に手動で起動・停止するのは手間がかかり、手順ミスも起きやすくなります。
そこで、サービス間の依存関係を考慮し、安全かつ簡潔に管理するためのBashスクリプトを作成しました。
1-1. 筆者環境
- Ubuntu 24.04
- Growi (systemdにサービス登録済み)
- Apacheのバーチャルホストでリバースプロキシ運用
- mongodb
- elasticsearch
2. スクリプトの主な特徴
- 依存関係を考慮した起動順序:
- DB → 検索エンジン(起動待ち含む) → Apache設定 → GROWI本体の順で確実に立ち上げます。
- Apache設定の動的切り替え:
a2ensite/a2dissiteを活用し、サービス停止時にはApache自体は止めず、GROWIへのアクセスパスのみをクリーンに遮断します。
- 対話モードとコマンドライン引数の両対応:
- 単体実行ではメニューが表示され、引数を渡せば自動実行が可能です。
- エラーハンドリング: 各ステップで実行状態をチェックし、異常があれば即座に中断・通知します。
3. 管理スクリプト: manage-growi.sh
systemctlをいじるので、root権限で作っておきます。
#!/bin/bash
# ==============================================================================
# GROWIスタック管理スクリプト
# 対応サービス: MongoDB, Elasticsearch, Apache2, GROWI
# ==============================================================================
# --- [ 設定セクション ] ---
APACHE_CONF_NAME="growi.conf"
SITE_NAME="${APACHE_CONF_NAME%.conf}"
SERVICES=("mongod.service" "elasticsearch.service" "apache2.service" "growi.service")
# カラー出力設定
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# --- [ ユーティリティ関数 ] ---
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_err() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }
log_ok() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
# 実行権限チェック
if [[ $EUID -ne 0 ]]; then
log_err "このスクリプトの実行にはroot権限(sudo)が必要です。"
fi
# サービスの状態確認
is_active() {
systemctl is-active --quiet "$1"
return $?
}
# --- [ メイン機能 ] ---
start_services() {
log_info "GROWIスタックの起動を開始します。"
# 1. MongoDB
log_info "データベース (MongoDB) を起動中..."
systemctl start mongod.service
is_active mongod.service || log_err "MongoDBの起動に失敗しました。"
# 2. Elasticsearch
log_info "検索エンジン (Elasticsearch) を起動中..."
systemctl start elasticsearch.service
# 応答待ち(最大75秒)
for i in {1..15}; do
if is_active elasticsearch.service; then break; fi
[[ $i -eq 15 ]] && log_err "Elasticsearchの起動がタイムアウトしました。"
sleep 5
done
# 3. Apache (設定の有効化)
log_info "Apacheのリバースプロキシ設定を有効化しています..."
if [ ! -L "/etc/apache2/sites-enabled/${APACHE_CONF_NAME}" ]; then
a2ensite "${SITE_NAME}" > /dev/null
fi
systemctl reload apache2.service || systemctl start apache2.service
# 4. GROWI 本体
log_info "GROWI本体を起動中..."
systemctl start growi.service
sleep 3
if is_active growi.service; then
log_ok "すべてのサービスが正常に起動しました。"
else
log_err "GROWIの起動に失敗しました。ログを確認してください。"
fi
}
stop_services() {
log_info "GROWIスタックを停止します。"
# サービス影響を最小限にするため、リバースプロキシから先に遮断
log_info "GROWI本体を停止中..."
systemctl stop growi.service
log_info "Apacheの設定を無効化しています..."
if [ -L "/etc/apache2/sites-enabled/${APACHE_CONF_NAME}" ]; then
a2dissite "${SITE_NAME}" > /dev/null
systemctl reload apache2.service
fi
log_info "バックエンドサービスを停止中..."
systemctl stop elasticsearch.service
systemctl stop mongod.service
log_ok "すべての関連サービスが正常に停止しました。"
}
show_status() {
echo -e "\n${YELLOW}--- サービス稼働状況 ---${NC}"
printf "%-25s %s\n" "サービス名" "ステータス"
printf "%-25s %s\n" "------------------------" "-------"
for s in "${SERVICES[@]}"; do
if is_active "$s"; then
printf "%-25s ${GREEN}RUNNING${NC}\n" "$s"
else
printf "%-25s ${RED}STOPPED${NC}\n" "$s"
fi
done
if [ -L "/etc/apache2/sites-enabled/${APACHE_CONF_NAME}" ]; then
echo -e "Apache設定 (${APACHE_CONF_NAME}): ${GREEN}ENABLED${NC}"
else
echo -e "Apache設定 (${APACHE_CONF_NAME}): ${RED}DISABLED${NC}"
fi
echo ""
}
# --- [ エントリポイント ] ---
ACTION=${1:-"menu"}
case "$ACTION" in
start) start_services ;;
stop) stop_services ;;
status) show_status ;;
restart) stop_services; start_services ;;
menu)
echo -e "${YELLOW}実行する操作を選択してください:${NC}"
select opt in "Start" "Status" "Stop" "Restart" "Exit"; do
case $opt in
Start) start_services; break ;;
Status) show_status; break ;;
Stop) stop_services; break ;;
Restart) stop_services; start_services; break ;;
Exit) exit 0 ;;
*) echo "無効な選択です。" ;;
esac
done
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
4. 利用前の事前準備
スクリプトを使用するには、実行権限の付与と、システム上のファイル名の確認が必要です。
- 保存と実行権限の付与
ファイルを manage-growi.sh として保存した場合、以下のコマンドを実行します。
sudo chmod +x manage-growi.sh
- 設定の確認(重要)
スクリプト内の APACHE_CONF_NAME="growi.conf" が、実際に /etc/apache2/sites-available/ に存在するファイル名と一致しているか確認してください。
5.使い方(コマンド一覧)
このスクリプトは root権限(sudo) が必要です。
A. 対話型メニューで操作する
引数なしで実行すると、メニューが表示されます。
sudo ./growi-stack.sh
B. 直接コマンドを指定する
特定の操作を即座に実行したい場合に使用します。
- 起動:
sudo ./growi-stack.sh start - 停止:
sudo ./growi-stack.sh stop - 状態確認:
sudo ./growi-stack.sh status - 再起動:
sudo ./growi-stack.sh restart
6. 表示・実行例
ステータス確認時の表示 (status)
現在の各サービスの稼働状況が一覧で表示されます。
--- サービス稼働状況 ---
サービス名 ステータス
------------------------ -------
mongod.service RUNNING
elasticsearch.service RUNNING
apache2.service RUNNING
growi.service RUNNING
Apache設定 (growi.conf): ENABLED
起動処理の実行例 (start)
依存関係を考慮し、DBから順に起動していきます。
[INFO] GROWIスタックの起動を開始します。
[INFO] データベース (MongoDB) を起動中...
[INFO] 検索エンジン (Elasticsearch) を起動中...
[INFO] Apacheのリバースプロキシ設定を有効化しています...
[INFO] GROWI本体を起動中...
[SUCCESS] すべてのサービスが正常に起動しました。
7. スクリプトの主な特徴と処理順序
このスクリプトは、単なる一括起動ではなく、GROWIの依存関係を考慮した設計になっています。
| 順序 | 起動時 (Start) | 停止時 (Stop) | 理由 |
|---|---|---|---|
| 1 | MongoDB | GROWI本体 | DBがないとアプリが落ちるため / 停止は入り口から。 |
| 2 | Elasticsearch | Apache設定無効 | 検索エンジンを準備。 |
| 3 | Apache設定有効 | Elasticsearch | インフラが整ってから外部公開。 |
| 4 | GROWI本体 | MongoDB | 最後にアプリを立ち上げる。 |
8. 運用のヒント
- トラブルシューティング: もし
[ERROR]が出た場合は、個別のログを確認してください。 - GROWIのログ:
journalctl -u growi.service -f - Elasticsearchのログ:
journalctl -u elasticsearch.service -f - 自動起動設定: サーバー再起動時に自動で立ち上げたい場合は、このスクリプトを使わず
systemctl enable [サービス名]を各サービスに設定するのが一般的です。このスクリプトは、メンテナンス時の手動メンテナンス用として最適です。













