X

Как настроить Git репозиторий (заметки гика)

Сегодня решил завести в блоге раздел "Заметки", в котором будут представлены не совсем готовые статьи. У меня очень часто бывают случаи, когда статью с подробными примерами оформлять некогда, но все же хочется накидать заметки, пока они еще не вылетели из головы. Именно поэтому и созрела идея сделать такой раздел. Раздел для лиц 18+ гиков, поэтому  будет много непонятных слов для тех кто "в теме". Остальным придется гуглить или ждать выхода полноценных статей по мотивам заметок.

Начнем с заметки о настройке Git репозитория..

Дано

  • Windows Server 2012 R2 (дальше Store-сервер), который стоит за шлюзом на CentOS (дальше Gate-сервер или site.com)
  • Gate-сервер смотрит в WAN и откликается по домену site.com
  • На Gate-сервере настроен dnsmasq для обслуживания доменов *.loc со всех компьютеров локальной сети
  • На Store-сервере установлен Hyper-V
  • В Hyper-V установлена виртуальная машина на CentOS, которая выступает в роли git репозитория (дальше Git-сервер или git.loc)

Задача

  • Получить возможность работы с Git репозиториями расположенными на Git-сервере из WAN

Настройка Git сервера

  • Добавляем новую виртуалку в Hyper-V
  • Устанавливаем на неё CentOS, с именем хоста: git.loc
  • Основную часть места на hdd монтируем в папку /git
  • Заводим пользователя git:git
  • В папке /git создаем папку repo (/git/repo)
  • Устанавливаем у папки /git/repo владельца root:git и ставим ей права 0770
  • Устанавливаем git и его зависимости:
    # yum install git
  • Смотрим какой у машины ip (#ip addr show), если в сети есть dhcp, получаем что-то типа: 192.168.101.106. Если нету dhcp настраиваем ip руками.

Настройка Gate-сервера

  • Добавляем git.loc в dnsmasq, в /etc/dnsmasq.d/hosts.conf добавляем:
    address=/git/loc/192.168.101.106

    и перезагружаем демона:

    # service dnsmasq restart
  • Добавляем проброс ssh порта из WAN Gate-сервера на Git-сервер. Пробрасываем site.com:9090 в 192.168.101.106:22
    IPT="iptables"
    
    IP_WAN_1="222.111.222.111" # wan адрес site.com
    IP_LAN_2="192.168.101.1" # подсеть *.loc
    
    IP_GIT_SRV="192.168.101.106" # адрес машины git.loc
    PORT_GIT_SRV="22"
    
    $IPT -t nat -A PREROUTING -p tcp --dst $IP_WAN_1 --dport 9090 -j DNAT --to-destination $IP_GIT_SRV:$PORT_GIT_SRV
    $IPT -t nat -A POSTROUTING -p tcp --dst $IP_GIT_SRV --dport 9090 -j SNAT --to-source $IP_LAN_2
    $IPT -t nat -A OUTPUT -p tcp --dst $IP_WAN_1 --dport 9090 -j DNAT --to-destination $IP_GIT_SRV:$PORT_GIT_SRV
  • выполняем правила и при необходимости сохраняем их

Настройка git репозиториев на Git сервере

  • Заходим на Git-сервер пользователем git
  • Переходим в папку /git/repo
  • Создаем папку проекта test (/git/repo/test) и заходим в неё
  • Инициализируем новый голый (bare) репозиторий:
    # git init --bare --shared

Настройки для доступа из локальной сети

  • Заходим в папку с проектом
  • Инициализируем git хранилище:
    # git init
  • Добавляем репозиторий
    # git remote add origin ssh://git@git.loc/git/repo/test
  • Делаем первый коммит
    # git add * && git commit -m"Initial commit" && git push origin master
  • Подтверждаем импорт сертификата, вводим пароль от учетки git

Настройки для доступа из WAN:

Тут я опишу, импорт уже готового репозитория. Подразумеваю, что первоначальный коммит уже сделан, если нет делаем по аналогии с "Настройки для доступа из локальной сети", поменяется только настройки origin.

  • Создаем пустую папку проекта
  • Инициализируем git хранилище:
    # git init
  • Добавляем репозиторий
    # git remote add origin ssh://git@site.com:9090/git/repo/test
  • Выкачиваем изменения
    # git pull origin master
  • Подтверждаем импорт сертификата, вводим пароль от учетки git

Безопасность

При необходимости, в ограничиваем коннект только для разрешенных ip. Для этого в /etc/ssh/sshd_config прописываем следующее:

AllowUsers git@123.123.123.123 *@192.168.*.*

Тут разрешаем доступ только для ip 123.123.123.123 (адрес клиента из wan) с логином git, а так же любому логину из локальной сети.

И не забываем перезагрузить sshd

# service sshd restart

Так же не помешает добавить и настроить fail2ban для ограничения попыток логина через ssh.

Вот и всё.

P.S. Писал по памяти, возможно что-то упустил. Если это так,  исправлю позже. Как всегда, все вопросы можно задать в комментариях.