| name | gitserver-guide |
| description | Git SSH server setup and configuration on NixOS including bare repository management, SSH key authentication, and remote access |
Git SSH Server (NixOS)
このドキュメントでは、NixOS上でSSH経由でアクセス可能なGitベアリポジトリサーバーの設定と使用方法について説明します。
概要
NixOSのservices.gitserverモジュールを使用して、SSH経由でアクセス可能なGitサーバーを簡単に構築できます。
主な機能
- SSH公開鍵認証: パスワード不要のセキュアな認証
- 自動リポジトリ初期化: 宣言的な設定によるベアリポジトリの自動作成
- 制限されたシェル: git-shellによる安全な環境
- systemd統合: サービスとして自動管理
設定方法
1. SSH鍵ペアの準備
アクセスするクライアントマシンでSSH鍵を生成します(既にある場合はスキップ):
ssh-keygen -t ed25519 -C "your_email@example.com"
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
公開鍵を確認:
cat ~/.ssh/id_ed25519.pub
cat ~/.ssh/id_rsa.pub
2. NixOS設定の追加
nixos/configuration.nixまたは別のモジュールファイルに以下を追加:
{
services.gitserver = {
# Gitサーバーを有効化
enable = true;
# アクセスを許可するSSH公開鍵
authorizedKeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleKey1 user@laptop"
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleKey2 user@desktop"
];
# 初期化するリポジトリ
repositories = [
"myproject.git"
"dotfiles.git"
"notes.git"
];
};
}
3. 設定の適用
sudo nixos-rebuild switch --flake .#desktop
使用方法
ローカルからのアクセス
NixOSマシン自体からアクセスする場合:
git clone /var/lib/git/myproject.git
git clone git@localhost:myproject.git
リモートからのアクセス
他のマシンからSSH経由でアクセス:
git clone git@nixos-hostname:myproject.git
git clone git@192.168.1.100:myproject.git
git clone git@nixos-tailscale-name:myproject.git
既存プロジェクトをプッシュ
cd /path/to/local/project
git init
git add .
git commit -m "Initial commit"
git remote add origin git@nixos-hostname:myproject.git
git push -u origin main
新しいリポジトリの追加
方法1: 設定ファイルで宣言的に追加
configuration.nixを編集:
services.gitserver.repositories = [
"myproject.git"
"dotfiles.git"
"newrepo.git" # 新規追加
];
設定を適用:
sudo nixos-rebuild switch --flake .#desktop
方法2: 手動で作成
sudo -u git git init --bare /var/lib/git/newrepo.git
トラブルシューティング
SSHアクセステスト
ssh git@nixos-hostname
このメッセージは正常です。git-shellは対話的アクセスを制限しています。
リポジトリ一覧の確認
sudo ls -la /var/lib/git/
SSH公開鍵の確認
sudo cat /var/lib/git/.ssh/authorized_keys
接続エラーの場合
ssh -vvv git@nixos-hostname
sudo nix-instantiate --eval -E '(import <nixpkgs/nixos> {}).config.networking.firewall.allowedTCPPorts'
サービスの状態確認
systemctl status git-init-repos.service
journalctl -u git-init-repos.service
設定オプション
services.gitserver.enable
- 型: boolean
- デフォルト:
false
- 説明: Git SSH サーバーを有効化
services.gitserver.user
- 型: string
- デフォルト:
"git"
- 説明: Gitリポジトリを管理するユーザー名
services.gitserver.group
- 型: string
- デフォルト:
"git"
- 説明: Gitリポジトリのグループ名
services.gitserver.repoDir
- 型: path
- デフォルト:
"/var/lib/git"
- 説明: ベアリポジトリの保存ディレクトリ
services.gitserver.authorizedKeys
- 型: listOf string
- デフォルト:
[]
- 説明: アクセスを許可するSSH公開鍵のリスト
例:
authorizedKeys = [
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleKey user@host"
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQ... user@host"
];
services.gitserver.repositories
- 型: listOf string
- デフォルト:
[]
- 説明: 自動的に初期化するベアリポジトリ名のリスト
例:
repositories = [
"myproject.git"
"dotfiles.git"
"website.git"
];
セキュリティ
このGitサーバーは以下のセキュリティ対策を実装しています:
- ✅ パスワード認証無効(公開鍵認証のみ)
- ✅ rootログイン禁止
- ✅ git-shellによる制限されたシェル環境
- ✅ ユーザー権限の分離(gitユーザー専用)
- ✅ ファイアウォール設定(SSH port 22)
バックアップと復元
バックアップ
sudo tar czf git-backup-$(date +%Y%m%d).tar.gz /var/lib/git/
sudo tar czf myproject-backup.tar.gz /var/lib/git/myproject.git
復元
sudo tar xzf git-backup-20231225.tar.gz -C /
sudo chown -R git:git /var/lib/git/
自動バックアップ(推奨)
NixOSのservices.resticやservices.borgbackupと組み合わせて自動バックアップを設定できます。
高度な使用例
Git Hooks
サーバーサイドフックを使用して、プッシュ時の自動処理を実装できます:
sudo -u git tee /var/lib/git/myproject.git/hooks/post-receive << 'EOF'
echo "Push received at $(date)"
EOF
sudo -u git chmod +x /var/lib/git/myproject.git/hooks/post-receive
アクセス制御
複数のユーザーで異なるアクセス権限を管理したい場合は、GitoliteやGiteaの使用を検討してください。
関連ドキュメント