ZhouJiatao's Blog

搭建Git服务器

这篇教程讲述如何创建最基本的Git服务器,最后会介绍如何限制通过Shell登录以确保安全。

之前租用了DigitalOcean的服务器搭建VPN,以便翻墙查找技术资料(最低标准每个月才5美元)。既然有自己的服务器了,而且有20GB的硬盘空间,何不把Github的私人仓库都移到自己的服务器,这样每个月又可以省下7美元,而且创建的私人仓库数量不受限制。
所以,动工吧!

创建SSH Key

$ ls ~/.ssh
id_rsa        id_rsa.pub

已经存在id_rsa和id_rsa.pub文件,可以不用创建,继续使用原本的SSH Key。
当然,出于某种原因,你仍然想创建新的SSH Key,请先了解如何管理多个SSH private Key

在OS X系统或者Linux系统下,创建SSH Key只需要在终端里输入,将youremail替换成你的邮箱地址:

$ ssh-keygen -C "youremail"

按照终端的提示操作。

Generating public/private rsa key pair.
Enter file in which to save the key (/home/example/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again: 
Your identification has been saved in example_rsa.
Your public key has been saved in example_rsa.pub.
The key fingerprint is:
ab:cd:ef:01:23:45:67:89:0a:bc:de:f0:12:34:56:78 youremail@XX.com <youremail@xx.com>
The key's randomart image is:
+--[ RSA 2048]----+
|    o+-+  ..     |
|  E o            |
|   . ++.o..      |
|    o o H .      |
|   . .   =       |
|    . =o.o=      |
| o .             |
|  .              |
|     = o  .      |
+-----------------+

终端输出类似以上内容时,SSH Key创建成功了。

如果你使用的是Windows系统,可以通过工具来创建SSH Key,比如 “PuTTY Gen”。

服务器添加Git用户并且安装Git工具

root身份登录你的服务器。
添加新用户”git”(用户名可按个人喜好选择)

# useradd git

为Git用户设置密码

# passwd git

安装git工具

  • CentOS/Fedora: yum install git
  • Ubuntu/Debian: apt-get install git

添加SSH Key到服务器

Git用户的身份登陆服务器。从root身份切换到Git身份,用这条命令:

# su git

创建authorized_keys文件用于保存公钥。

$ mkdir ~/.ssh && touch ~/.ssh/authorized_keys

执行以上命令后,在/home/git/.ssh/目录下有authorized_keys文件。

现在将公钥文件(后缀为.pub的文件)的内容导入authorized_keys文件。
怎么导入?实际上,用文本编辑器打开公钥文件,拷贝里面的文本内容,复制到,authorized_keys文件内就可以。

你也可以在本地机器用以下命令完成上述操作:

$ cat .ssh/id_rsa.pub | ssh git@123.xx.xx.xx "cat >> ~/.ssh/authorized_keys"

请将123.xx.xx.xx替换成你的服务器IP;

查看authorized_keys文件内容

$ cat ~/.ssh/authorized_keys

初始化Git仓库

在服务器,进入想要保存git仓库的目录,执行(将‘my-project‘替换成你项目的名字):

$ git init --bare my-project.git

在当前目录下,可以看到一个新的目录 my-project.git ,这就是我们创建的空的Git仓库。

Good! 现在你的VPS已经有了Git仓库。

在本机使用Git服务

  1. 如果本机没有该项目,就将服务器中的项目克隆到本机:

    $ git clone git@ip:my-project.git
    

    ip替换成你的服务器ip地址。

  2. 如果本机已经有该项目,需要将本地的内容推送到服务器:

    进入项目所在目录,修改远程地址

    $ git remote set-url origin  git@ip:my-project.git
    

    ip替换成你的服务器ip地址。

    推送本地内容到服务器

    $ git push -u origin master
    

    首次推送分支,加上 -u 参数,Git会将本地分支和远程分支关联起来,在以后的推送,都可以省略此参数。

附加

禁用shell登录

出于安全考虑,避免有人登录git用户修改其它目录的文件,我们不允许git用户登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash
改为:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

------

如何管理多个SSH private Key

允许电脑有多个不同的私钥,以连接不同的服务器。你需要编辑 ~/.ssh/config:

Host 10.10.10.1
IdentityFile ~/.ssh/linode_rsa

Host 200.20.20.2
IdentityFile ~/.ssh/id_rsa

如果连接10.10.10.1, 私钥~/.ssh/linode_rsa会被使用。

如果连接200.20.20.2, 私钥~/.ssh/id_rsa会被使用。

参考:Multiple SSH private keys Examples