May 6, 2019

Gitolite + GitWeb with Docker

Выберем дирректорию для хранения конфигов и данных репозиториев. Для примера возьмем /srv/gitolite. Создадим в ней файл docker-compose.yml со следующим содержанием:

version: "3"

services:
  gitolite:
    image: jgiannuzzi/gitolite
    restart: always
    environment:
      - SSH_KEY_NAME=<ADMIN_NAME>
      - SSH_KEY=<ADMIN_PUBKEY>
    ports:
      - "<GITOLITE_PORT>:22"
    volumes:
      - ./keys:/etc/ssh/keys
      - ./git:/var/lib/git

  gitweb:
    image: fraoustin/gitweb
    environment:
      - CONTAINER_TIMEZONE=<TIMEZONE>
      - GITUSER=<WEB_USER>
      - GITPASSWORD=<WEB_PASSWORD>
      - IHM=mdl
    volumes:
      - ./git:/var/lib/git
    ports:
      - "<GITWEB_PORT>:80"

Необходимо заменить переменные <...> на актуальные значения:

  • ADMIN_NAME - имя пользователя с правами администратора (имеет права на конфигурационный репозиторий gitolite-admin.git).
  • ADMIN_PUBKEY - публичный ключ пользователя с правами администратора. Вида "ssh-rsa AAAAB...=="
  • GITOLITE_PORT - порт, на котором будет слушать Gitolite.
  • TIMEZONE - временная зона для веб-интерфейса. Например, Europe/Minsk.
  • WEB_USER - имя пользователя для авторизации в веб-интерфейсе.
  • WEB_PASSWORD - пароль пользователя для авторизации в веб-интерфейсе.
  • GITWEB_PORT - порт для веб-интерфейса (см. "Проксирование через Nginx").

Создадим конфигурационные файлы:

# docker-compose up -d

В файле git/.gitolite.rc установим значение UMASK на 0002:

# sed -i -e "s/0700/0002/g" git/.gitolite.rc

И поменяем права на уже созданные репозитории:

# chmod -R 775 git/repositories/

Теперь настроим GitWeb. Скопируем конфиг из контейнера:

# docker-compose ps
              Name                          Command             State           Ports         
----------------------------------------------------------------------------------------------
gitolite_gitolite_1_eb12ac1002ab   /docker-entrypoint.sh sshd   Up      0.0.0.0:<GITOLITE_PORT>->22/tcp  
gitolite_gitweb_1_a982cd3f879a     /entrypoint.sh app           Up      127.0.0.1:<GITWEB_PORT>->80/tcp
# docker cp gitolite_gitweb_1_a982cd3f879a:/etc/gitweb.conf .

И заменим в нем путь в репозиториям:

# sed -i -e "s:/var/lib/git:/var/lib/git/repositories:g" gitweb.conf

В docker-compose.yml для контейнера gitweb добавим volume:

      - ./gitweb.conf:/etc/gitweb.conf

Пересоздадим контейнеры:

# docker-compose down
# docker-compose up -d

Теперь репозитории можно клонировать с помощью команды git clone <ADMIN_NAME>@host:<REPOSITORY>.git. Например:

git clone admin@127.0.0.1:testing.git

Веб-интерфейс доступен по адресу http://host:<GITWEB_PORT>/. Для авторизации необходимо указать значения WEB_USER и WEB_PASSWORD.

Проксирование через Nginx

Также веб-интерфейс можно проксировать через внешний веб-сервер. Так, установить настроить веб-интерфейс на субдомен и добавить поддержку HTTPS. Для примера, настроим GitWeb по адресу https://git.example.com/.

Изменим значение GITWEB_PORT на 127.0.0.1:GITWEB_PORT. Например, для контейнера gitweb заменим

    ports:
      - "8022:80"

на

    ports:
      - "127.0.0.1:8022:80"

и обновим контейнер:

# docker-compose up -d

Создадим конфиг /etc/nginx/sites-available/git.example.com:

# touch /etc/nginx/sites-available/git.example.com
# ln -s /etc/nginx/sites-available/git.example.com /etc/nginx/sites-enabled/

И запишем в него следующий конфиг, изменяя необходимые значения:

server {
    listen 443 ssl;
    server_name git.example.com;
    charset utf-8;

    # Let's Encrypt
    ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;

    root /srv/gitolite;

    location / {
        proxy_pass http://127.0.0.1:8022/;
    }
}

server {
    listen 80;
    server_name git.example.com;
    return 301 https://git.example.com$request_uri;
}

Перезапустим Nginx:

# nginx -s reload

И проверим веб-интерфейс по адресу http://git.example.com/.