1. はじめに
クラウドに頼らない、自分だけの開発環境。スマホをポケットに入れた瞬間、それはあなたの秘密基地になる。…なんて格好つけたことを言うつもりもなかったのですが、結果的にこうなったというお話。OneDriveにSVNのリポジトリを置いて複数のPCからのアクセスで運用してたら、OneDrive上で競合して面倒くさいことになりました。そこで、LAN内にローカルサーバを置いて運用することにしたので、手順を書き残しておきます。
なお、本記事の手順は Linux Mint 22.2 Cinnamon Edition での作業をベースにしています。
Windowsでの作業にも対応しています。
SVNサーバも動きます。
本記事では、SDカードのアプリ専用領域のみを使用しています。メディアフォルダを含むSDカード全体を扱う場合は、以下の記事をご参照ください。
2. なぜスマホ?なぜGit?
先日の記事でスマホにTermuxを入れてPythonを動かしてたあたりで、スマホってLinuxサーバとして使えそうだなと思ったのが1点。もう1点は、肌身離さず持ち歩く情報機器をサーバにすれば、所有PCが全損するような最悪のケースでもデータが残るということ。この2点からスマホに白羽の矢が立ちました。以前からFreeFileSyncでPCとスマホのデータを同期してたので、その延長でもあります。FreeFileSyncはお役御免となります。
当初はSVNサーバとして構築を進めてました。が、いざ旧時代の産物をまとめてコミットしたら、まともに進まない。ローカルのリポジトリとは勝手が違うようです。Gitならコミットしてからのプッシュなので、旧時代の産物まるごとでもサーバとのやり取りが速い。さらにサーバ障害時の復旧を考えると、Git運用ならクライアントが保持してるリポジトリのコピーで何とかなりそう。クライアント側のデータ量は増えるけど、リポジトリのバックアップについて考慮しなくて済みそうだったので、晴れてGitサーバになりましたw
3. PCのセットアップ
3.1 ソフトウェアのインストール
本記事ではRabbitVCSを使用してGit操作を行います。Linux Mintのソフトウェアマネージャから、以下をインストールしてください。
- Git
- Subversion1
- Rabbitvcs-core
- Nemo-python
RabbitVCSの右クリックメニュー統合には RabbitVCS.py が必要です。以下のサイトからダウンロードし、~/.local/share/nemo-python/extensions に配置してお使いください。次のコマンドでも対応できます。
mkdir -p ~/.local/share/nemo-python/extensions && \
wget -O ~/.local/share/nemo-python/extensions/RabbitVCS.py \
https://raw.githubusercontent.com/rabbitvcs/rabbitvcs/master/clients/nemo/RabbitVCS.py
RabbitVCS.py の配置後すぐは、右クリックメニューに反映されていません。一度ログアウトしてからログインしなおすと、使えるようになります。
Windows環境では以下をインストールしてご使用ください。
- Git for Windows
- TortoiseGit
3.2 SSH鍵の作成
ターミナルで以下のコマンドを実行して、SSH認証用の鍵ペアを作成します。作成先フォルダとファイル名はデフォルトでかまいません。パスフレーズも空で良いでしょう。~/.ssh に秘密鍵 id_ed25519 と公開鍵 id_ed25519.pub が作成されます。サーバ側で管理しやすいように、公開鍵末尾にコンピュータ名を付与しています。
ssh-keygen -t ed25519 -C "$(hostname)"
Windowsも同じコマンドで作成します。作成先は C:\Users\ユーザ名\.ssh です。
4. スマホのセットアップ
4.1 Termuxのインストール
以下のサイトを開いてスクロールしていくと、F-Droidクラインアントのインストールがお勧めされています。なので、まずはF-Droidをインストールします。「F-DROIDをダウンロード」ボタンをタップし、F-Droid.apk をダウンロードしてインストールしてださい。スマホから警告が出ますが、適宜対応くださいw
インストールできたら、F-Droidを開いて「Termux」を検索します。何やらいっぱい出てきますが、説明に以下の文言があるものを選んでインストールします。Termuxはサーバ運用するので、インストール後はバッテリの最適化をオフにすると良いでしょう。
- パッケージを伴ったターミナル・エミュレーター
4.2 SSH接続の準備
本記事ではSSH経由でGitサーバに接続します。Termuxを開いて以下のコマンドを実行してください。パッケージ情報を更新し、インストール済みパッケージをバージョンアップしてからOpenSSHをインストールします。コマンド実行時に確認のプロンプトが出ますが、すべてデフォルト動作で問題ないのでEnterキー(⏎)をタップしてください。
pkg update
pkg upgrade
pkg install openssh
鍵認証を設定するまではパスワードで認証する必要があります。以下のコマンドでパスワードを設定してください。入力中のパスワードは表示されません。
passwd
SSHの接続先は u0axxx@192.168.x.x 形式で指定します。ユーザ名とIPアドレスを以下のコマンドで確認してください。
whoami
ifconfig
以下のコマンドでSSHデーモンを起動します。これでPCからスマホにSSH接続できるようになります。
sshd
4.3 SSH鍵認証の設定
ここからは、PCからスマホに接続して作業します。以下のコマンドで接続してください。初回接続時は、未知の接続先として警告が出ますので yes と入力してください。
ssh u0axxx@192.168.x.x -p 8022
余談ですが、SSH Filesystemを使用すると以下のようなコマンドで接続先のフォルダをローカルフォルダにマウントできます。sshfsは別途インストールください。
sshfs -p 8022 u0axxx@192.168.x.x:/data/data/com.termux ~/com.termuxWindows環境では以下の組み合わせでsshfsが使用できるようです。
- WinFsp
- SSHFS-Win
PCからSShで接続できたら、TermuxにSSH鍵認証を設定します。以下のコマンドで authorized_keys ファイルを開いてください。PCで作成した id_ed25519.pub をテキストエディタで開いて、中身の文字列をまるっと authorized_keys にコピペで追加します。追加したら「Ctrl + O」からの「Enter」で保存し、「Ctrl + X」で終了します。
nano ~/.ssh/authorized_keys
追加後は、PC側のSSHクライアント設定ファイルを準備します。config ファイルを作成して、以下のように記載してください。
Host termux-ssh
HostName 192.168.x.x
User u0axxx
Port 8022
IdentityFile ~/.ssh/id_ed25519
Windowsも同じ記載で機能します。作成先は C:\Users\ユーザ名\.ssh です。
これで、以降は以下のコマンドで接続できるようになります。パスワードは不要です。
ssh termux-ssh
sshfsのマウントコマンドは以下のようになります。
sshfs termux-ssh:/data/data/com.termux ~/com.termux
4.4 SSHデーモンの起動設定
今回は常時起動ではなく、使用したいときだけ起動する運用方法とします。.bashrc と .bash_logout を以下のように作成してください。これでTermuxの起動時と終了時に、SSHデーモンも起動と終了することができます。Termux終了時は、exit コマンドまたは「Ctrl + D」で終了してください。
nano ~/.bashrc
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
fi
nano ~/.bash_logout
if [[ ! $SSH_CONNECTION ]]; then
pkill sshd
termux-wake-unlock
fi
4.5 シェルプロンプトの改変
Termuxのシェルプロンプトって、何か殺風景な感じがしませんか?Linux Mintのそれとは温度差があるというかなんというか。
そこで .bashrc に以下のように追記します。
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
+ else
+ PS1="\[\033[1;34m\]termux@Redmi-12-5G\[\033[0m\]:$PS1"
fi
すると、こうなります。殺風景さが気なる方はどうぞ。
5. Gitサーバのセットアップ
5.1 Gitのインストール
さて、ここからスマホをGitサーバとしてセットアップしていきます。今回はSSH経由でGitサーバに接続するので、「Git」だけあればOKです。以下のコマンドでインストールします。
pkg install git
Gitのインストールが完了したら、以下のコマンドでいくつかの項目を設定します。デフォルトブランチは何も設定しないと master になるため、一般的に使用されている main に変更します。コミット履歴には、どのデバイスからのコミットなのかを残したいので「user.name」にデバイス名(Redmi-12-5G など)を設定します。私的運用を前提にしているので、メールアドレスにはダミーを設定しています。
git config --global init.defaultBranch main
git config --global user.name "デバイス名"
git config --global user.email user@example.com
PC側も同様の設定をしておいてください。
git config --global init.defaultBranch main
git config --global user.name "$(hostname)"
git config --global user.email user@example.com
5.2 リポジトリフォルダの作成
今回はスマホのSDカード上にリポジトリを作成して運用します。以下のコマンドを実行して、SDカードにアクセスできるようにします。内部ストレージの共有フォルダにもアクセスできるようになります。
termux-setup-storage
コマンドを実行すると、~/storage 配下に以下のシンボリックリンクが作成されます。各リンク先フォルダのアクセス権も適宜設定されています。
| シンボリックリンク | リンク先 |
|---|---|
| external-1 | /storage/xxxx-xxxx/Android/data/com.termux/files |
| shared | /storage/emulated/0 |
| dcim | /storage/emulated/0/DCIM |
| downloads | /storage/emulated/0/Download |
| movies | /storage/emulated/0/Movies |
| music | /storage/emulated/0/Music |
| pictures | /storage/emulated/0/Pictures |
シンボリックリンクが作成されたことを確認したら、external-1 の配下にGitリポジトリ用のフォルダを作成し、HOMEディレクトリ直下にシンボリックリンクを作成します。
mkdir ~/storage/external-1/git && \
ln -s ~/storage/external-1/git ~/git
SDカードを使用しない場合は、~/git フォルダを作成してください。
mkdir ~/git
5.3 Gitリポジトリの作成
それでは、Gitリポジトリを作成します。リポジトリ名は my-first-repo とすることにします。以下のコマンドを実行してください。SDカード上のフォルダはTermuxのフォルダと所有者が違うので、「safe.directory」の設定が必要です。
mkdir ~/git/my-first-repo && \
cd ~/git/my-first-repo && \
git init --bare && \
git config --global --add safe.directory "$(pwd)"
リポジトリが作成できたら、PC側でクローンしてみましょう。Git作業用のフォルダ(~/GIT など)で右クリックして、「RabbitVCS Git」から「Clone」を選択します。「URL」欄に以下をコピペしてOKボタンをクリックすると、リポジトリがクローンされます。「コミット」や「プッシュ」は、my-first-repo フォルダ内から右クリックで行うことができます。
ssh://termux-ssh/~/git/my-first-repo
6. メディアフォルダのワークスペース化
本記事では、内蔵ストレージのメディアフォルダを対象としています。
6.1 リモートリポジトリとの紐付け
ここでは、スマホのメディアフォルダをGit管理できるようにします。今回はDCIMフォルダを対象にします。まずは、以下のコマンドでDCIMフォルダ用のリポジトリを作成します。
mkdir ~/git/DCIM && \
cd ~/git/DCIM && \
git init --bare && \
git config --global --add safe.directory "$(pwd)"
続いて、DCIMフォルダをGitのワーキングディレクトリにします。以下のコマンドでローカルリポジトリを作成し、先ほど作成したリポジトリと紐付けます。
cd ~/storage/shared/DCIM && \
git init && \
git config --global --add safe.directory "$(pwd)" && \
git remote add origin ~/git/DCIM
6.2 初回コミットの実施
それでは、DCIMフォルダ配下にあるファイルをまとめてコミットします。と、その前に、コミット対象にしないファイルやフォルダを設定してしまいましょう。手元の環境では、DCIMフォルダ直下に .tmfs というフォルダがあったので、これを除外フォルダとして設定します。以下のコマンドで .gitignore ファイルを作成して編集します。
nano .gitignore
.tmfs/
除外設定が終わったら、以下のコマンドですべてを追加してコミット&プッシュします。
git add -A && \
git commit -m "Initial commit" && \
git push -u origin main
6.3 自動コミットの設定
写真を撮影した場合など、DCIMフォルダ配下にファイルが増えたらコミット&プッシュの操作が必要になります。手動でやるのも面倒なので、.bashrc に仕込んでしまいましょう。
nano ~/.bashrc
if [[ ! $SSH_CONNECTION ]]; then
termux-wake-lock
sshd
+ cd ~/storage/shared/DCIM && \
+ pwd && \
+ git pull && \
+ git add -A && \
+ git commit -m "Auto commit" && \
+ git push
+ cd ~
else
PS1="\[\033[1;34m\]termux@Redmi-12-5G\[\033[0m\]:$PS1"
fi
どうでしょうか。これで、スマホのメディアフォルダの中身もGitで管理して、クローンでPC側に引っ張ってこれます。何というか、すべてがそこに集約された秘密基地みたいでわくわくしませんか?きっと、そう感じるのは私だけではないはず。(希望的観測)
7. VSCodeのGit統合機能
これまではソースの管理をSVNで行っていましたが、今回のモバイルサーバ移行でGit管理になりました。…いや、VSCodeのGit統合機能は良いですね。「未管理」「追加」「変更」などの状態がサイドバーに表示されるし、差分の表示もVSCode内でできる。ステージ済の状態からの差分が見られるのも地味に便利です。加えて、コミットやプッシュの操作もVSCode内で完結するので、Git管理に移行して正解だったかもしれませんw
-
RabbitVCSはGit&SVN両対応なので、ついでに入れますw ↩



