-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdeploy.sh
More file actions
137 lines (114 loc) · 5.9 KB
/
Copy pathdeploy.sh
File metadata and controls
137 lines (114 loc) · 5.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#!/usr/bin/env bash
#
# deploy.sh - mashiro をリポジトリのクローンから docker compose 起動まで自動化する
#
# 配置場所:
# このスクリプトは「mashiro デプロイ用ディレクトリ」に置く想定。
# 同じディレクトリ内に以下が存在することを前提とする:
# - .env (必須: Bot トークン等の環境変数)
# - assets/ (必須: 自撮り画像・ボイス等 -> コンテナ内 /bot/data/assets に read-only マウント)
# - .netrc (任意: /dl 用の認証情報)
# - cookies.txt (任意: YouTube のログイン済み Cookie)
# - saves/ (永続化したい保存データ -> コンテナ内 /bot/data/saves にマウント)
#
# 動作:
# 1. リポジトリを ./app にクローン (既にあれば最新へ更新)
# 2. 上記の外部ファイルをクローンへ注入
# 3. saves/ を永続ボリュームとしてマウントする override を生成
# 4. ghcr.io からイメージを pull して docker compose up -d で起動
#
set -euo pipefail
REPO_URL="https://github.com/mimaraka/mashiro.git"
BRANCH="main"
APP_DIRNAME="app"
# このスクリプトが置かれているディレクトリ (シンボリックリンクも解決)
SCRIPT_DIR="$(cd "$(dirname "$(readlink -f "$0")")" && pwd)"
APP_DIR="$SCRIPT_DIR/$APP_DIRNAME"
log() { printf '\033[1;34m[deploy]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[deploy] 警告:\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m[deploy] エラー:\033[0m %s\n' "$*" >&2; exit 1; }
################################################################################
# 1. 前提条件のチェック
################################################################################
command -v git >/dev/null 2>&1 || die "git がインストールされていません。"
command -v docker >/dev/null 2>&1 || die "docker がインストールされていません。"
# docker compose (v2) / docker-compose (v1) を検出
if docker compose version >/dev/null 2>&1; then
COMPOSE=(docker compose)
elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE=(docker-compose)
else
die "docker compose / docker-compose が見つかりません。"
fi
# 必須ファイルの確認
[ -f "$SCRIPT_DIR/.env" ] || die ".env が $SCRIPT_DIR に存在しません。"
[ -d "$SCRIPT_DIR/assets" ] || die "assets/ が $SCRIPT_DIR に存在しません。"
# 任意ファイルの確認 (無ければ警告のみ)
[ -f "$SCRIPT_DIR/.netrc" ] || warn ".netrc が見つかりません (/dl の認証なしで続行)。"
[ -f "$SCRIPT_DIR/cookies.txt" ] || warn "cookies.txt が見つかりません (Cookie なしで続行)。"
# saves/ ディレクトリは永続マウント先。無ければ作成する。
if [ ! -d "$SCRIPT_DIR/saves" ]; then
warn "saves/ が見つからないため新規作成します。"
mkdir -p "$SCRIPT_DIR/saves"
fi
################################################################################
# 2. リポジトリのクローン / 更新
################################################################################
if [ -d "$APP_DIR/.git" ]; then
log "既存のクローンを更新します ($BRANCH)..."
git -C "$APP_DIR" fetch --prune origin
git -C "$APP_DIR" checkout "$BRANCH"
git -C "$APP_DIR" reset --hard "origin/$BRANCH"
elif [ -e "$APP_DIR" ]; then
die "$APP_DIR が存在しますが git リポジトリではありません。手動で削除してください。"
else
log "リポジトリをクローンします -> $APP_DIR"
git clone --branch "$BRANCH" "$REPO_URL" "$APP_DIR"
fi
################################################################################
# 3. 外部ファイルをクローンへ注入
################################################################################
log "設定ファイルをクローンへ反映します..."
# .env: docker compose の env_file が参照 (クローン直下に必要)
cp -f "$SCRIPT_DIR/.env" "$APP_DIR/.env"
# .netrc: docker-compose.yml が ./.netrc を /bot/.netrc に read-only マウントする
if [ -f "$SCRIPT_DIR/.netrc" ]; then
cp -f "$SCRIPT_DIR/.netrc" "$APP_DIR/.netrc"
else
# 実体が無いと docker が空ディレクトリを作ってしまうため、空ファイルを用意する。
: > "$APP_DIR/.netrc"
fi
# cookies.txt: docker-compose.yml が ./cookies.txt をマウントする
if [ -f "$SCRIPT_DIR/cookies.txt" ]; then
cp -f "$SCRIPT_DIR/cookies.txt" "$APP_DIR/cookies.txt"
else
# base の docker-compose.yml は ./cookies.txt を read-only マウントする。
# 実体が無いと docker が空ディレクトリを作ってしまうため、空ファイルを用意する。
: > "$APP_DIR/cookies.txt"
fi
# saves/ を永続ボリューム、assets/ を read-only でマウントする override を生成。
# (base の docker-compose.yml はリポジトリ汎用なのでホスト固有パスを書かない。
# assets はリポジトリに含めず外部化しているため、ここでホストからマウントする)
log "saves/ ・ assets/ のマウント設定を生成します..."
cat > "$APP_DIR/docker-compose.override.yml" <<YAML
services:
mashiro:
volumes:
- $SCRIPT_DIR/saves:/bot/data/saves
- $SCRIPT_DIR/assets:/bot/data/assets:ro
YAML
################################################################################
# 4. docker compose で起動
################################################################################
log "GitHub Packages からイメージを取得します..."
( cd "$APP_DIR" && "${COMPOSE[@]}" pull )
log "docker compose で起動します..."
( cd "$APP_DIR" && "${COMPOSE[@]}" up -d )
log "起動しました。状態:"
( cd "$APP_DIR" && "${COMPOSE[@]}" ps )
cat <<EOF
完了しました。
ログ表示: cd "$APP_DIR" && ${COMPOSE[*]} logs -f
停止: cd "$APP_DIR" && ${COMPOSE[*]} down
再デプロイ: "$SCRIPT_DIR/$(basename "$0")"
EOF