「Git サーバー」の版間の差分
Kusanaginoturugi (トーク | 投稿記録) →アクセスコントロール: ソリューションを解決策に変更 |
→全般: リンクを修正 |
||
| (2人の利用者による、間の4版が非表示) | |||
| 12行目: | 12行目: | ||
[https://miracoin.wordpress.com/2014/11/25/step-by-step-guide-on-setting-up-git-server-in-arch-linux-pushable/ Step by Step Guide on Setting Up git Server] では Arch での安全でないサーバーのセットアップを説明しています。 |
[https://miracoin.wordpress.com/2014/11/25/step-by-step-guide-on-setting-up-git-server-in-arch-linux-pushable/ Step by Step Guide on Setting Up git Server] では Arch での安全でないサーバーのセットアップを説明しています。 |
||
デフォルトでは、git ユーザは期限切れになっています("Your account has expired; please contact your system administrator") |
デフォルトでは、git ユーザは期限切れになっています ("Your account has expired; please contact your system administrator") 有効期限切れの条件を解除するには、例えば、以下のように [[ユーザーとグループ#ユーザー管理の他の例|chage]] を使用します。 |
||
chage -E -1 git |
chage -E -1 git |
||
| 18行目: | 18行目: | ||
=== SSH === |
=== SSH === |
||
[[OpenSSH|SSH サーバー]]を設置するだけです。 |
[[OpenSSH|SSH サーバー]] を設置するだけです。 |
||
この SSH ユーザーアカウントでは、push と pull のコマンドのみを許可することで、より安全性を確保することができます。これは、デフォルトのログインシェルを git-shell に置き換えることで実現します。[https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server Setting Up the Server] で説明しています。 |
この SSH ユーザーアカウントでは、push と pull のコマンドのみを許可することで、より安全性を確保することができます。これは、デフォルトのログインシェルを git-shell に置き換えることで実現します。[https://git-scm.com/book/en/v2/Git-on-the-Server-Setting-Up-the-Server Setting Up the Server] で説明しています。 |
||
| 27行目: | 27行目: | ||
;ホームディレクトリが修正された場合のベースパスの修正: git がリポジトリを提供するために、gitのホームディレクトリからリポジトリを提供する場合、"/usr/lib/systemd/system/git-daemon@.service" の --base-path を "/srv/git" へ変更する必要があります。 |
;ホームディレクトリが修正された場合のベースパスの修正: git がリポジトリを提供するために、gitのホームディレクトリからリポジトリを提供する場合、"/usr/lib/systemd/system/git-daemon@.service" の --base-path を "/srv/git" へ変更する必要があります。 |
||
=== |
=== Dumb HTTP === |
||
この文脈における "Dumb" とは、[[WebDAV]] のみが pull と push に関与することを意味します。 |
|||
{{Expansion|There are many [[web server]]s with CGI support.}} |
|||
==== nginx ==== |
|||
nginx の基本的な WebDAV 手順に従います。WebDAV 経由の push にもロックが必要です。以下にブロック箇所の例を示します。 |
|||
{{hc|1=/etc/nginx/nginx.conf|2= |
|||
location /repos/ { |
|||
auth_basic "Authorized Personnel Only!"; |
|||
auth_basic_user_file /etc/nginx/htpasswd; |
|||
dav_methods PUT DELETE MKCOL COPY MOVE; |
|||
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK; |
|||
dav_access user:rw group:rw all:r; |
|||
dav_ext_lock zone=general; |
|||
create_full_put_path on; |
|||
client_body_temp_path /tmp; |
|||
} |
|||
}} |
|||
{{ic|dav_ext_lock zone}} に注目してください。指定したロックゾーンを設定の http セクションに追加します: |
|||
{{hc|1=/etc/nginx/nginx.conf|2=dav_ext_lock_zone zone=general:10m;}} |
|||
ここで、サーバーの git リポジトリを準備するときの通常の手順を実行します。 |
|||
* {{ic|git clone --bare /path/to/myrepo myrepo.git}} |
|||
* ベアリポジトリをサーバーにコピーします。 |
|||
* ベアリポジトリで {{ic|git update-server-info}} を実行します。 |
|||
* リポジトリを http:http によって所有されるようにchownします |
|||
HTTP ベーシック認証を追加した、htaccess ファイルにパスワードを入力した人は、誰でも push することができます。 |
|||
これで、通常どおり clone を作成できます。 |
|||
$ git clone <nowiki>https://www.example.com/repos/myrepo.git</nowiki> |
|||
Cloning into 'myrepo'... |
|||
$ |
|||
いくつかの変更を加え、add、commit、push します。 |
|||
$ git push origin main |
|||
error: Cannot access URL <nowiki>https://www.example.com/repos/myrepo.git/</nowiki>, return code 22 |
|||
fatal: git-http-push failed |
|||
error: failed to push some refs to '<nowiki>https://www.example.com/repos/myrepo.git</nowiki>' |
|||
実行しても PROPFIND は 401 Unauthorized とだけ報告します。nginx のエラーログには何もありません。どうやら git クライアントは、その後のすべてのリクエストでユーザー名とパスワードを渡すことに問題があるようです。git credential cache を実行しても解決しません。今のところうまくいっている唯一の解決策は、~/.netrc を編集することです (明らかに git は http に curl を使っています): |
|||
{{hc|1=~/.netrc|2= |
|||
machine www.example.com |
|||
login git |
|||
password topsecret |
|||
}} |
|||
$ > git push origin main |
|||
Fetching remote heads... |
|||
refs/ |
|||
refs/heads/ |
|||
refs/tags/ |
|||
updating 'refs/heads/main' |
|||
from 03f8860418facfbecedd5e0a81b480131b31bcba |
|||
to ec5536091e31ebf172a34c6d1ebddfc36e3bd3a6 |
|||
sending 3 objects |
|||
done |
|||
Updating remote server info |
|||
To <nowiki>https://www.example.com/repos/myrepo.git</nowiki> |
|||
0318860..ec55560 main -> main |
|||
clone URL を {{ic|<nowiki>https://username:password@www.example.com/repos/myrepo.git</nowiki>}} と指定することは考えないでください。これは最初のクローンでは動作しますが、その後の push ではエラーログに宛先 URL が別のリポジトリで処理されているというエラーメッセージが表示されます。 |
|||
=== Smart HTTP === |
|||
{{man|1|git-http-backend}} は CGI プログラムで、HTTP(S) で clone や pull, push を効率的に行うことができます。 |
{{man|1|git-http-backend}} は CGI プログラムで、HTTP(S) で clone や pull, push を効率的に行うことができます。 |
||
| 61行目: | 130行目: | ||
Git プロトコルは、暗号化も認証もされておらず、読み取りアクセスのみ許可します。 |
Git プロトコルは、暗号化も認証もされておらず、読み取りアクセスのみ許可します。 |
||
Git デーモン |
Git デーモン({{man|1|git-daemon}})は {{ic|git-daemon.socket}} で[[起動]]することができます. |
||
このサービスは {{ic|--export-all}} と {{ic|--base-path}} パラメータを使用して {{ic| |
このサービスは {{ic|--export-all}} と {{ic|--base-path}} パラメータを使用して {{ic|,/srv/git/}} に置かれたすべてのリポジトリにサービスを提供します. |
||
== アクセスコントロール == |
== アクセスコントロール == |
||
| 72行目: | 141行目: | ||
* {{App|[[Gitosis]]|Git リポジトリをホストするためのソフトウェア、Python で書かれています。|https://github.com/tv42/gitosis|{{AUR|gitosis-git}}}} |
* {{App|[[Gitosis]]|Git リポジトリをホストするためのソフトウェア、Python で書かれています。|https://github.com/tv42/gitosis|{{AUR|gitosis-git}}}} |
||
もし、リポジトリにアクセスできるすべての人のための[[ユーザーアカウント]]を作成し、git オブジェクト |
もし、リポジトリにアクセスできるすべての人のための[[ユーザーアカウント]]を作成し、git オブジェクト(ブランチなど)のレベルでのアクセス制御を必要としない場合は、アクセス制御に標準的なファイルパーミッションを使用することもできますので、注意してください。[https://github.com/sitaramc/gitolite/blob/d74e58b5de8c78bddd29b009ba2d606f7fcb4f2d/doc/overkill.mkd] |
||
== Web インターフェース == |
|||
=== シンプルな Web アプリケーション === |
|||
== Web interfaces == |
|||
* [[Gitweb]] — Git に付属するデフォルトの Web インターフェース。 |
|||
=== Simple web applications === |
|||
| ⚫ | |||
=== 高度な Web アプリケーション === |
|||
* [[Gitweb]] — the default web interface that comes with Git |
|||
| ⚫ | |||
* {{App|[[Gitea]]|無痛のセルフホスト型 GIT サービス。Gogs のコミュニティによるフォーク。|https://gitea.io|{{Pkg|gitea}}}} |
|||
=== Advanced web applications === |
|||
| ⚫ | |||
| ⚫ | |||
{{TranslationStatus|Git_server|2022-02-01|710469}} |
|||
* {{App|[[Gitea]]|Painless self-hosted Git service. Community managed fork of Gogs.|https://gitea.io|{{Pkg|gitea}}}} |
|||
| ⚫ | |||
| ⚫ | |||
2023年11月13日 (月) 01:09時点における最新版
この記事では、Git サーバーをホストする方法について概要を説明します。より詳細な情報は、Pro Git book の Git on the Server chapter の章を参照ください。
プロトコル
詳細な説明と長所・短所は、Git on the Server - The Protocols を参照してください。
全般
Step by Step Guide on Setting Up git Server では Arch での安全でないサーバーのセットアップを説明しています。
デフォルトでは、git ユーザは期限切れになっています ("Your account has expired; please contact your system administrator") 有効期限切れの条件を解除するには、例えば、以下のように chage を使用します。
chage -E -1 git
SSH
SSH サーバー を設置するだけです。
この SSH ユーザーアカウントでは、push と pull のコマンドのみを許可することで、より安全性を確保することができます。これは、デフォルトのログインシェルを git-shell に置き換えることで実現します。Setting Up the Server で説明しています。
#全般の手順で作成した git サーバーをこの条項の手順 (#SSH) で保護する場合、Arch では以下の追加手順が必要です。
- 正しいホームディレクトリ
- ssh が /srv/git/.ssh/authorized_keys を読めるようにするには、/etc/passwd の git 用ホームディレクトリを "/" から "/srv/git" に変更する必要があります。
- ホームディレクトリが修正された場合のベースパスの修正
- git がリポジトリを提供するために、gitのホームディレクトリからリポジトリを提供する場合、"/usr/lib/systemd/system/git-daemon@.service" の --base-path を "/srv/git" へ変更する必要があります。
Dumb HTTP
この文脈における "Dumb" とは、WebDAV のみが pull と push に関与することを意味します。
nginx
nginx の基本的な WebDAV 手順に従います。WebDAV 経由の push にもロックが必要です。以下にブロック箇所の例を示します。
/etc/nginx/nginx.conf
location /repos/ {
auth_basic "Authorized Personnel Only!";
auth_basic_user_file /etc/nginx/htpasswd;
dav_methods PUT DELETE MKCOL COPY MOVE;
dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;
dav_access user:rw group:rw all:r;
dav_ext_lock zone=general;
create_full_put_path on;
client_body_temp_path /tmp;
}
dav_ext_lock zone に注目してください。指定したロックゾーンを設定の http セクションに追加します:
/etc/nginx/nginx.conf
dav_ext_lock_zone zone=general:10m;
ここで、サーバーの git リポジトリを準備するときの通常の手順を実行します。
git clone --bare /path/to/myrepo myrepo.git- ベアリポジトリをサーバーにコピーします。
- ベアリポジトリで
git update-server-infoを実行します。 - リポジトリを http:http によって所有されるようにchownします
HTTP ベーシック認証を追加した、htaccess ファイルにパスワードを入力した人は、誰でも push することができます。
これで、通常どおり clone を作成できます。
$ git clone https://www.example.com/repos/myrepo.git Cloning into 'myrepo'... $
いくつかの変更を加え、add、commit、push します。
$ git push origin main error: Cannot access URL https://www.example.com/repos/myrepo.git/, return code 22 fatal: git-http-push failed error: failed to push some refs to 'https://www.example.com/repos/myrepo.git'
実行しても PROPFIND は 401 Unauthorized とだけ報告します。nginx のエラーログには何もありません。どうやら git クライアントは、その後のすべてのリクエストでユーザー名とパスワードを渡すことに問題があるようです。git credential cache を実行しても解決しません。今のところうまくいっている唯一の解決策は、~/.netrc を編集することです (明らかに git は http に curl を使っています):
~/.netrc
machine www.example.com login git password topsecret
$ > git push origin main Fetching remote heads... refs/ refs/heads/ refs/tags/ updating 'refs/heads/main' from 03f8860418facfbecedd5e0a81b480131b31bcba to ec5536091e31ebf172a34c6d1ebddfc36e3bd3a6 sending 3 objects done Updating remote server info To https://www.example.com/repos/myrepo.git 0318860..ec55560 main -> main
clone URL を https://username:password@www.example.com/repos/myrepo.git と指定することは考えないでください。これは最初のクローンでは動作しますが、その後の push ではエラーログに宛先 URL が別のリポジトリで処理されているというエラーメッセージが表示されます。
Smart HTTP
git-http-backend(1) は CGI プログラムで、HTTP(S) で clone や pull, push を効率的に行うことができます。
Apache
Apache HTTP Server をインストールし、mod_cgi, mod_alias, mod_env を有効にして、そしてもちろん git があれば、この設定はかなり簡単です。
基本的なセットアップを実行したら、Apache の設定ファイルに以下を追加してください。
/etc/httpd/conf/httpd.conf
<Directory "/usr/lib/git-core">
Require all granted
</Directory>
SetEnv GIT_PROJECT_ROOT /srv/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/
ここでは、Git リポジトリが /srv/git にあり、それにアクセスするために次のような方法をとるものとします。http(s)://your_address.tld/git/your_repo.git.
より詳細なドキュメントについては、以下のリンクを参照してください。
- https://git-scm.com/book/en/v2/Git-on-the-Server-Smart-HTTP
- https://git-scm.com/docs/git-http-backend
Git
Git プロトコルは、暗号化も認証もされておらず、読み取りアクセスのみ許可します。
Git デーモン(git-daemon(1))は git-daemon.socket で起動することができます.
このサービスは --export-all と --base-path パラメータを使用して ,/srv/git/ に置かれたすべてのリポジトリにサービスを提供します.
アクセスコントロール
きめ細かなアクセス制御を行うために、以下のような解決策があります。
- Gitolite — Perl で書かれた、Git の上のアクセスコントロールレイヤー。
- Gitosis — Git リポジトリをホストするためのソフトウェア、Python で書かれています。
もし、リポジトリにアクセスできるすべての人のためのユーザーアカウントを作成し、git オブジェクト(ブランチなど)のレベルでのアクセス制御を必要としない場合は、アクセス制御に標準的なファイルパーミッションを使用することもできますので、注意してください。[1]
Web インターフェース
シンプルな Web アプリケーション
高度な Web アプリケーション
- Gitea — 無痛のセルフホスト型 GIT サービス。Gogs のコミュニティによるフォーク。
- GitLab — Ruby で書かれたプロジェクト管理とコードホスティングアプリケーション。
- Gogs — Go で書かれたセルフホスティングの Git サービス。
- https://gogs.io || gogsAUR