全ページをgit管理する
◎構想記録
・git リポジトリはデータ転送用のプロトコルをHTTPとする(gitLabは使わない)
・git リポジトリのバックアップはローカルサーバのバックアップドライブとする
・自動でリポジトリのバックアップがとれる
・ブラウザからコメントを入れてコミットできる
・変更されたファイルの一覧が表示され差分を確認できる
◎当面の目標
・環境を作る
・ローカルサーバの git用仮想マシンの状況と操作方法(コミットなど)を確認する
・ローカルサーバのバックアップドライブにgit のバックアップを取る(暫定版)
・手動で定期的にバックアップを取るよう設定する
・手動で簡単にコミットできるように設定する
◎DONE
・ローカルサーバの git用仮想マシンの状況を確認し証明書を更新してリポジトリを作成しそこにコミットした
◎TODO
・ローカルサーバのバックアップドライブにgit のバックアップを取る(暫定処置) 手動で実行
・ローカルサーバのバックアップドライブにgit のバックアップを取る(自動化) 済
・このサーバに git操作用の管理ページを作成する(設計1回目) 済
・このサーバに git操作用の管理ページを作成する(実装1回目) 作業中
◎作業記録
・まずは手作業で
・gitサーバで bareを作成 git init --bare /var/lib/git/projectname.git
・ オーナーを変更 chown -R apache:apache /var/lib/git/projectname.git
・このサーバで クローン git clone https://gitserver/gitdir/projectname.git
・ .gitをコピー mv ictmallwww/.git projectdir/
・ 追加 git add *
・ コミット git commit -m "メッセージ"
・ プッシュ git push https://gitserver/gitdir/projectname.git master
・ローカルサーバのバックアップドライブにgit のバックアップを取る(暫定版)
・ローカルサーバのバックアップドライブのUUIDを調べる
blkid /dev/sdc
・xmlにデバイスを追加して再起動する
・gitサーバでは上手く認識してくれない
・ホストのusbデバイスにqcow2ファイルを作成して、それをマウントして、保存する
qemu-img create -f qcow2 /usbhdd/git_bak.qcow2 100G
mkfs.ext4 /dev/vda フォーマット
mount /dev/vda /mnt/hostusb マウント
mkdir /mnt/hostusb/gitbak20200908 ディレクトリ作成
cp -a /var/lib/git/* /mnt/hostusb/gitbak20200908/ コピー
・課題 バックアップしたファイルを簡単に取り出す方法を調べる
バックアップの自動化をする
・このサーバに git操作用の管理ページを作成する(設計1回目)
・要件
・git statusの結果を表示できる
・その中のファイルをクリックしてgit add できる
・コメントを入力してgit commitできる
・git pushできる
・要件から外すもの
・上記以外のgit操作(タグやブランチやマージなど)
・認証 必要に応じてベーシック認証を掛ける
・仕様(素案)
・機能
・status
・add
・commit
・push
・画面構成
・1画面のみ
・画面タイプ
・メニュー+ワークエリア
・画面レイアウト
・メニュー
・status
・commit
・push
・ワークエリア
・statusの結果表示
※懸念事項
・add時はファイルの一つ一つ個別にaddするか、まとめてaddするか
・commit時のメッセージの入力場所をダイアログにするかワークエリアに常時表示か
・操作イメージ
・(起動)
・(statusメニューをクリック)
・git statusを実行
・(追加されたファイルと変更されたファイル名の先頭にチェックボックスが表示されている)
・(追加するファイルのチェックボックスにチェックを付ける)
・(コミットのメッセージを入力する)
・(コミットボタンを押す)
・git addとgit commitを実行
・(pushボタンを押す)
・git pushを実行
・初期処理
・メニューを表示
・git statusを実行
・ワークエリアを表示
・結果をワークエリアに表示
・メッセージ入力を表示
・コミットボタンを表示
・イベント処理
・メニュイベント処理
・仕様(修正案1)
・修正概要
・メニューが不要でコマンドエリアでボタンやテキスト入力を切り替えるように変更
・機能
・status
・add
・commit
・push
・画面構成
・1画面のみ
・画面タイプ
・ワークエリア+コマンドエリア
・画面レイアウト
・ワークエリア
・statusの結果表示
・add,commitの結果表示
・pushの結果表示
・コマンドエリア
・メッセージ入力
・commitボタン
・ID入力
・パスワード入力
・pushボタン
※前回の懸念事項
・add時はファイルの一つ一つ個別にaddするか、まとめてaddするか まとめてするように仕様を策定
・commit時のメッセージの入力場所をダイアログにするかワークエリアに常時表示か ワークエリアに表示するように仕様を策定
・操作イメージ
・(起動)
・git statusを実行
・git statusの結果として得た追加されたファイルと変更されたファイルを表示し、先頭にチェックボックスを表示する
・(追加するファイルのチェックボックスにチェックを付ける)
・(コミットのメッセージを入力する)
・(コミットボタンを押す)
・git addとgit commitを実行
・git addの結果を表示する
・(pushボタンを押す)
・git pushを実行
・git pushの結果を表示する
・初期処理
・git statusを実行
・ワークエリアを表示
・結果をワークエリアに表示
・メッセージ入力を表示
・コミットボタンを表示
・イベント処理
・commitコマンドイベント処理
・addを実行
・ワークエリアに結果を表示
・commitを実行
・ワークエリアに結果を表示
・メッセージ入力を非表示にする
・commitボタンを非表示にする
・pushボタンを表示する
・pushコマンドイベント処理
・pushを実行
・ワークエリアに結果を表示
・pushボタンを非表示にする
・ローカルサーバのバックアップドライブにgit のバックアップを取る(自動化)
・検討
・自動化方法 crontabでphpプログラムを呼び出す
・シェルスクリプトではなくphpプログラムを選択した理由は、複雑な分岐などが必要になった場合phpの方が書きやすいと思うから
・バックアップ方法
・何のためのバックアップか?
・元データが読み出せなくなったときの復旧に使う 消されたものは消された状態で復旧したい
・元データが操作ミスで不適切なものに入れ替わったときの復旧 消されたもの、指定した時点のものを取り出したい
・バックアップのバックアップは必要ないか
・ディスクが壊れたとき バックアップ装置がraid構成になっていればリスクは低いが、そうでなければ必要
・バックアップのバックアップというより、複数個所にバックアップをとる方が考え方が楽
・当面は1か所に保存する
・gitディレクトリをrsyncを使ってバックアップ、2回目以降は前回のバックアップを比較対象としてハードリンクを使った増分バックアップ
・このとき、削除されたファイルがどうなるか確認して、できるだけ、古いバックアップには残っており新しい方では削除されるようにする
・実験
・rsyncを起動するphpプログラムを作りながら、削除されたファイルを要件通りに扱えるオプション設定を探す
・本来は1日に一度でいいが実験なのでcrontabで1分単位で指定して見みる
ディレクトリ名の付け方などが1日単位の運用になってもいけそうならcrontabの設定だけ変える
・実験場所はgitサーバのどこかに保存元ディレクトリと保存先ディレクトリを使ってrsyncのコマンドを手でたたくところから始める
・そこで、削除ファイルについて分かったら、phpのスクリプト化を行い、crontabで起動してみる
・最後に、運用用のローカルの司令塔に、cronを設定し、保存先を他の用途でも使っているusbメモリとする
・実験結果
・ハードリンクでの差分バックアップでは、新たなところに全てをバックアップするが既にあるものはハードリンクにする。
ということは、削除されはファイルは古い方に残ったままであり、新しいディレクトリにはコピーされないので要件通りとなる
差分はdiffで分かる
・実装
自分のサーバ内でバックアップするスクリプトを作成した
・TODO
・司令塔でrsyncを実行して、所定のディレクトリに保存するスクリプトを実装し運用を開始する
・このサーバに git操作用の管理ページを作成する(実装1回目)
・実装記録
・ワークエリアとコマンドエリアを持った外枠を表示する
・apiを仮実装して呼び出してみる
・懸念事項
・pushのためには、gitサーバーのid,パスワードが必要なので入力フォームが必要
・コマンドラインでid,パスワードを入力するのは双方向のIOを持ったプロセスを使う必要がある
・検討記録
・実験のためにリポジトリからクローンして、そのパスをグローバル変数に定義して、それを使うように実装する
・pushボタンの前にID、パスワード入力用のテキスト入力フォームを表示するように仕様を変更する
・まず、apiの呼び出しのテストを行う
・次に、コマンドラインでid,パスワードを入力するためのプロセスの起動を実験する
・確認できたら、すべてのapiを実装する
・実装記録
・仕様(修正案1)を変更
・gitStatusを実装し正しく動作することを確認
・起動時にgitStatusを実行し結果を表示するようにする 済
・追加、変更されたファイルにチェックボックスをつける 作業中
・ステージングされたファイルの切り出し Changes to be committed:の次の空行の次から空行まで
・変更ファイルの切り出し Changes not staged for commit:の次の空行の次から空行まで
・追加ファイルの切り出し Untracked files:の次の空行の次から空行まで
・削除ファイルの切り出し
・.gitに書き込み権限がないとadd、commitができない
・commitをしたら、画面を再描画
・検討記録
・pushの実装方法
・懸念材料1 gitサーバにアクセスするときにid,パスワードが必要 ← 画面で入力すればいい
・懸念材料2 gitサーバにアクセスするときにid,パスワードをパラメータで渡せない ← 双方向プロセスを使う
↑ 標準入出力がとれない
・pushのために専用ユーザとデーモンを利用する方向に方針転換。セキュリティ、安定性を確保しながら開発を進めるため一旦中断
◎再開
・『専用ユーザでPHPプログラムをデーモンとして動かす』での検証をもとに
常駐側と依頼側の要件整理から要件決定、仕様検討、仕様決定、実装、要件調整、仕様再検討・・・と進める
◎要件整理
・ブラウザでstatusを確認し、ファイルを選択してadd,commitを行い、pushできるようなWebアプリケーションを実装する。
・gitサーバとのプロトコルはhttpsとし、ID,パスワードでログインする。
◎実現方法
・gitサーバとhttpsプロトコルはで接続するには対話的にID,パスワードを入力する必要がある。
・これには標準入出力のパイプでは実現できず、今分かっている方法としてはssh2を使ってOSのユーザとしてログインする方法しかない
・apacheユーザはログインできなくしてあるので、他のユーザにログインする必要があり、そのためにはパスワードを知っている必要がある
・このパスワードをブラウザから入力させるにしても、apacheユーザが読める形でファイルに保存しておいてもリスクが増す。
・そこで、専用のOSユーザを追加するか、rootが自分にログインすることになり、今回は、rootが自分でrootにログインする方法とする
・この際のパスワードは暗号化してファイルに保存しておき、ログインするプログラムが複号化して使うことにする。
・当然、プログラムソースを読んで複号キーとファイルの置き場所を見つければ、パスワードを知ることができるというリスクは存在する
・そのリスクを低減するためにプログラムもファイルもroot権限が無いと読めない設定にする
・次に、この自分にログインするプログラムの起動方法については常駐とし、apacheプログラムからのコマンドを待ち受けることとする
・常駐プログラムは特定のディレクトリを監視し、ファイルが作成されたイベントでコマンドを受け取って実行する
・結果は指定されたディレクトリに書き込むことで渡し、apacheプログラムはそのイベントを待つ
・このイベントを待つ方法としてphpではinotify apiを利用できる。
◎仕様検討
・プログラム、ファイル構成
・常駐プログラム
・パスワードファイル
・コマンド、データ受取ディレクトリ
・Webアプリ
・結果、データ受取ディレクトリ
・プログラム概要
・パスワード暗号化プログラム
・キー入力されたパスワードを暗号化して所定のパスにキーと一緒に書き込む(パラメータで渡すと履歴に残る)
・常駐プログラム
・パスワード設定モードと通常モードがあり、パスワードの設定を行ってから、通常モードで常駐させる
・起動時にroot権限で実行されるphpスクリプト。(後にはサービス化を検討)
・特定のディレクトリをinotify apiで監視し、コマンドを受け取る
・コマンドを受け取ったら、暗号化パスワードを読み出し、復号してssh2で自分にログインして、gitサーバにログインし、コマンドを実行する
・コマンドを事項した結果は、同時に受け取ったディレクトリにファイルとして書き込む。このことにより呼び出し側にイベントを起こす
・コマンドはcreate、clone、push、pullを実装する。
・Webアプリ
・起動されると、git statusを実行し、その結果をファイルツリー領域とコマンド領域を持った画面に表示する
・ファイルツリー領域ではファイルを選択することができ、コマンド領域ではメッセージ、リポジトリ名の入力とコマンドの実行ができる
・コマンドにはcleate、clone、status、add、commit、push、pullがあり、ajaxでサーバに必要な情報を渡し、結果を受け取って、それを表示する
・プログラム詳細
・常駐プログラム
・プログラム名 git_http_proxy.php
・起動方法 crontabに@reboot
・パスワードファイル名 git_http_proxy.config
・暗号化アルゴリズム ???
・暗号化キー 暗号化時に生成
・初期化
・引数が1個で-cの場合は、
・キー入力プロンプトを出しパスワードを2回入力させ、パスワードチェック
・OKならパスワードファイル作成を行い終了
・NGなら再入力を促し、キー入力に戻る
・inotifyインスタンスを初期化
・非ブロッキングモードでループに入る
・ループ
・ループ間隔は一秒とする
・readして空のとき 何もせず1秒スリープしてループの先頭に戻る
・readして空でないとき 配列の数だけループしてコマンドを実行して終わったらループの先頭に戻る
・コマンド実行
・push
・ssh2で自分にログイン
・git pushを実行
・自分からログアウト
・ssh2で自分にログイン
・パスワードファイルをgit pushを実行
・git pushを実行
・phpでコマンドを実行する
・自分からログアウト
・exitコマンドを実行する
・パスワードチェック
・2回のパスワードが一致しているかチェックし違えばNGで戻る
・パスワードの長さが6文字未満ならNGで戻る
・それ以外ならOKで戻る
・パスワードファイル作成
・opensslのコマンドを使ってキーを作成
・そのキーを使って暗号化
・ファイルを書き込み、権限を400にする
・レイアウト&Javascriptファイル
・ファイルツリー領域とコマンド操作領域を表示
・ファイルツリー領域
・ファイルツリー表示
・コマンド操作領域
・リポジトリ名入力
・コミットメッセージ入力
・作成ボタン
・statusボタン
・addボタン
・commitボタン
・pushボタン
・pullボタン
・API処理対応スクリプトファイル
・設置
・パスワード発行モードで常駐プログラムを実行
<TODOと状況>