воскресенье, 28 июля 2019 г.

Установка и настройка Gogs

Gogs - это веб-интерфейс для работы с репозиториями git. Приложение написано на языке программирования Go, не требовательно к системным ресурсам и поэтому хорошо подходит для организации репозиториев исходных текстов небольших команд разработчиков.

Сборка приложения

Устанавливаем утилиту git и компилятор языка Go из репозиториев:
# apt-get install git golang-go
Создадим каталог для сборки приложения и перейдём в него:
$ mkdir gogs
$ cd gogs
Скачиваем и собираем приложение в только что созданном каталоге. При сборке указываем тег, предписывающий включить поддержку SQLite3:
$ env GOPATH=/home/stupin/gogs/ go get github.com/gogs/gogs
$ cd src/github.com/gogs/gogs
$ env GOPATH=/home/stupin/gogs/ go build -tags sqlite

Установка и настройка запуска приложения

Создаём пользователя gogs, от имени которого будет работать приложение:
# useradd -c 'Gogs' -r -M -d /opt/gogs gogs
Создаём каталог приложения gogs и копируем в него только то, что необходимо для работы приложения:
# cd /opt
# mkdir gogs
# cd gogs
# cp -R /home/stupin/gogs/src/github.com/gogs/gogs/gogs /home/stupin/gogs/src/github.com/gogs/gogs/public /home/stupin/gogs/src/github.com/gogs/gogs/templates .
Создаём каталог для файла конфигурации:
# mkdir -p custom/conf/
Создаём файл /opt/gogs/custom/conf/app.ini с настройками приложения:
[server]
DOMAIN = stupin.su
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
ROOT_URL = https://stupin.su/git/
DISABLE_SSH = false
SSH_PORT = 22
OFFLINE_MODE = false
Чтобы настройки приложения в дальнейшем можно было поменять в процессе первоначальной настройки через веб-интерфейс, дадим пользователю gogs доступ к файлу конфигурации:
# chown gogs:gogs /opt/gogs/custom/conf/app.ini
Создаём service-файл /etc/systemd/system/gogs.ini для запуска/остановки приложения через systemd:
[Unit]
Description=Gogs (Go Git Service)
After=syslog.target
After=network.target
;After=postgresql.service
After=nginx.service

[Service]
Type=simple
User=gogs
Group=gogs
WorkingDirectory=/opt/gogs
ExecStart=/opt/gogs/gogs web
Restart=always
Environment=USER=gogs HOME=/opt/gogs

[Install]
WantedBy=multi-user.target
Добавляем сервис в автозапуск при загрузке операционной системы:
# systemctl enable gogs.service
И запускаем его прямо сейчас:
# systemctl start gogs.service

Настройка проксирования через nginx

Если приложение планируется запускать на выделенном домене, то для настройки проксирования внешних запросов с https на локальный адрес http при помощи nginx в общем случае нужно создать следующую конфигурацию в файле /etc/nginx/sites-enabled/gogs:
server {
    listen 80;
    server_name example.com;
    return 302 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/certificate.crt;
    ssl_certificate_key /path/to/certificate_key.key;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://localhost:3000;
  }
}
И подключить её командой:
# sudo ln -s /etc/nginx/sites-available/gogs /etc/nginx/sites-enabled/gogs
Я же разместил приложение на одном домене с другими приложениями, в отдельном каталоге. Для настройки впишем в файл /etc/nginx/sites-enabled/root настройки проксирования запросов с адреса https://stupin.su/git/ на адрес http://127.0.0.1/git/:
# Gogs
  location /git/ {
    proxy_redirect off;
    proxy_bind 127.0.0.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_pass http://127.0.0.1:3000/;
  }

Настройка приложения

Осталось зайти в приложение и завершить его настройку. Я создал электронный почтовый ящик gogs@stupin.su и использовал следующие настройки:
Настройки базы данных
  Тип базы данных: SQLite3
  Путь: data/gogs.db

Общие параметры Gogs
  Имя приложения: Gogs
  Путь корня репозитория: /opt/gogs/gogs-repositories
  Пользователь: gogs
  Домен: stupin.su
  SSH порт: 22
  Использовать встроенный SSH сервер: Нет
  Порт HTTP: 3000
  URL приложения: https://stupin.su/git/
  Путь к журналу: /opt/gogs/log
  Включите режим консоли: Нет

Расширенные настройки
  Настройки службы электронной почты:
    Узел SMTP: mail.stupin.su:587
    Из: gogs@stupin.su
    Электронная почта отправителя: gogs@stupin.su
    Пароль отправителя: mailbox_password
    Включить подтверждение регистрации: Да
    Разрешить почтовые уведомления: Да
  Сервер и другие настройки служб
    Включение офлайн режима: Нет
    Отключить службу Gravatar: Да
    Включить поиск внешних Аватаров: Нет
    Отключить самостоятельную регистрацию: Да
    Включить капчу: Нет
    Разрешить требовать авторизацию для просмотра страниц: Нет
  Настройки учётной записи администратора
    Имя пользователя: stupin
    Пароль:
    Подтвердить пароль:
    Электронная почта администратора: vladimir@stupin.su
После сохранения этих настроек файл /opt/gogs/custom/conf/app.ini принял следующий вид:
APP_NAME = Gogs
RUN_USER = gogs
RUN_MODE = prod

[server]
DOMAIN           = stupin.su
HTTP_ADDR        = 127.0.0.1
HTTP_PORT        = 3000
ROOT_URL         = https://stupin.su/git/
DISABLE_SSH      = false
SSH_PORT         = 22
OFFLINE_MODE     = false
START_SSH_SERVER = false

[database]
DB_TYPE  = sqlite3
HOST     = 127.0.0.1:3306
NAME     = gogs
USER     = root
PASSWD   = 
SSL_MODE = disable
PATH     = data/gogs.db

[repository]
ROOT = /opt/gogs/gogs-repositories

[mailer]
ENABLED = true
HOST    = mail.stupin.su:587
FROM    = gogs@stupin.su
USER    = gogs@stupin.su
PASSWD  = mailbox_password

[service]
REGISTER_EMAIL_CONFIRM = true
ENABLE_NOTIFY_MAIL     = true
DISABLE_REGISTRATION   = true
ENABLE_CAPTCHA         = false
REQUIRE_SIGNIN_VIEW    = false

[picture]
DISABLE_GRAVATAR        = true
ENABLE_FEDERATED_AVATAR = false

[session]
PROVIDER = file

[log]
MODE      = file
LEVEL     = Info
ROOT_PATH = /opt/gogs/log

[security]
INSTALL_LOCK = true
SECRET_KEY   = secret_key
Теперь для пущей безопасности, чтобы никто не подсмотрел в файле пароль почтового ящика mailbox_password и ключ secret_key, которым шифруются данные сеансов пользователей, поменяем права доступа к файлу конфигурации:
# chmod ug=r,o= /opt/gogs/custom/conf/app.ini
Пример страницы обзора репозиториев:

воскресенье, 21 июля 2019 г.

Установка Gitblit

Gitblit - это веб-интерфейс для работы с репозиториями git. Приложение написано на языке Java и поэтому его довольно легко запустить как под управлением Unix-системы, так и под управлением операционной системы Windows.

Скачивание репозитория

Скачиваем и распаковываем архив:
$ wget http://dl.bintray.com/gitblit/releases/gitblit-1.8.0.tar.gz
$ tar xzvf gitblit-1.8.0.tar.gz
$ cd gitblit-1.8.0

Разработка плана развёртывания

Судя по содержимому файла service-ubuntu.sh, запуск приложения происходит при помощи команды:
/usr/bin/java --chuid $GITBLIT_USER --chdir $GITBLIT_PATH -- $ARGS
По умолчанию настройки имеют следующие значения:
GITBLIT_PATH=/opt/gitblit
GITBLIT_BASE_FOLDER=/opt/gitblit/data
GITBLIT_USER="gitblit"
source ${GITBLIT_PATH}/java-proxy-config.sh
ARGS="-server -Xmx1024M ${JAVA_PROXY_CONFIG} -Djava.awt.headless=true -jar gitblit.jar --baseFolder $GITBLIT_BASE_FOLDER --dailyLogFile"
В файле java-proxy-config.sh можно настроить прокси-сервер, на случай если система, на которой будет развёрнуто приложение, не имеет прямого выхода в Интернет. Будем считать, что нас такой случай не интересует. Если понадобится, можно будет просто соответствующим образом поменять значение ARGS.

Наша задача подготовить окружение для работы приложения и создать service-файл для запуска и остановки приложения через systemd. Нужно:
  1. Установить java
  2. Создать пользователя gitblit, который указан в переменной GITBLIT_USER
  3. Создать каталоги для приложения и его данных и задать значения переменных GITBLIT_PATH и GITBLIT_BASE_FOLDER
  4. Подготовить файл с настройками переменных окружения /etc/default/gitblit
  5. Подготовить service-файл для управления gitblit через systemd
  6. Настроить проксирование запросов к gitblit через nginx

Установка Java

На официальной странице проекта по ссылке http://gitblit.com/, в разделе «Java Runtime Requirement» написано, что Gitblit требует для работы Java 7 Runtime Environment (JRE) или Java 7 Development Kit (JDK). Разработкой мы заниматься пока не собираемся, поэтому обойдёмся JRE. В дистрибутиве Debian Stretch имеется только Java версии 8. Установим соответствующий пакет:
# apt-get install openjdk-8-jre-headless

Создание пользователя

Для создания пользователя gitblit выполним команду:
# useradd -M -r gitblit

Создание каталогов

Создадим каталог приложения вручную:
# mkdir -p /opt/gitblit
# chown gitblit:gitblit /opt/gitblit
# chmod o= /opt/gitblit
Скопируем в него распакованные файлы и проставим права доступа к ним:
# cd /opt/gitblit
# cp -R /home/stupin/gitblit/gitblit-1.8.0/* .
# chown gitblit:gitblit -R *
# chmod o= -R *

Создание файла /etc/default/gitblit

Создаём файл /etc/default/gitblit со следующим содержимым:
ARGS="-server -Xmx1024M -Djava.awt.headless=true -jar /home/gitblit/gitblit.jar --baseFolder /home/gitblit/data --dailyLogFile"
В файле /home/gitblit/data/default.properties меняем следующие настройки:
web.canonicalUrl = https://stupin.su/git/
server.contextPath = /
server.httpPort = 8080
server.httpsPort = 0
server.httpBindInterface = 127.0.0.1
server.httpBindInterface = 127.0.0.1
С этими настройками приложение будет принимать подключения по протоколу HTTP на порт 8080 на локальном петлевом интерфейсе. На этот порт мы будем пробрасывать запросы, поступающие в nginx на адрес https://stupin.su/git/

Создание service-файла

Создадим файл /etc/systemd/system/gitblit.service со следующим содержимым:
[Unit]

Description=Managing, viewing, and serving Git repositories

[Service]
Type=simple
EnvironmentFile=/etc/default/gitblit
WorkingDirectory=/opt/gitblit
User=gitblit
ExecStart=/usr/bin/java $ARGS
Restart=always

[Install]
WantedBy=multi-user.target
Включим автозапуск сервиса при старте системы и запустим его вручную:
# systemctl enable gitblit
# systemctl start gitblit

Настройка проксирования через nginx

Если nginx ещё не установлен, то установить его можно при помощи следующей команды:
# apt-get install nginx-light
Впишем в конфигурацию nginx (в моём случае это файл /etc/nginx/sites-enabled/root) в секцию server следующий блок:
# Gitblit
location /git/ {
  rewrite /git/(.*) /$1 break;
  proxy_redirect off;
  proxy_bind 127.0.0.1;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://127.0.0.1:8080/;
}
Все запросы, поступающие на адрес https://stupin.su/git/ передаются на обработку на адрес http://127.0.0.1:8080. При этом из адреса URL вырезается базовый каталог /git и запросы поступают в корневой каталог приложения.

И перезагрузим настройки nginx:
# systemctl reload nginx

Начальная настройка gitblit

Для первого входа в веб-интерфейс gitblit используется учётная запись admin с паролем admin.

Использованные материалы

Install Gitblit On Ubuntu / Fedora / CentOS

воскресенье, 14 июля 2019 г.

Установка и настройка cgit

cgit - это веб-интерфейс для доступа к git-репозиториям,​ который написан на Си и в целом аналогичен приложению Gitweb, написанному на Perl. Поскольку оба приложения очень похожи друг на друга, не стану притворяться и скажу прямо: эта статья является почти дословным повтором статьи про Gitweb, с необходимой поправкой на специфику cgit. Как и в случае с Gitweb, для эксперимента решил попробовать настроить cgit поверх связки nginx и uWSGI.

Установка пакетов

Установим необходимые пакеты:​
# apt-get install nginx-light uwsgi cgit

Настройка uwsgi

Первым делом настроим сервер приложений uWSGI для запуска CGI-сценария. Для этого создадим файл /​etc/​uwsgi/​apps-available/​cgit.ini со следующим содержимым:​
[uwsgi]

procname = uwsgi-cgit
procname-master = uwsgi-cgit-master

plugins = cgi
processes = 1
threads = 4
cgi = /cgit/=/usr/lib/cgit/cgit.cgi
cgi-timeout = 5
Теперь нужно подключить использование этого файла:
# cd /​etc/​uwsgi/​apps-enabled/​
# ln -s /​etc/​uwsgi/​apps-available/​cgit.ini .
Перезапустим uWSGI, чтобы его новые настройки вступили в силу:
# systemctl restart uwsgi.service

Настройка cgit

Теперь настроим файл конфигурации самого приложения cgit. Я буду настраивать приложение в подкаталоге веб-сервера /cgit/, поэтому у меня файл конфигурации /​etc/​cgitrc принял следующий вид:
favicon=/cgit/static/favicon.ico
css=/cgit/static/cgit.css
logo=/cgit/static/cgit.png

snapshots=tar.gz tar.bz2 zip
remove-suffix=1
enable-index-links=1
enable-index-owner=0

scan-path=/var/lib/cgit/
Будьте внимательны при редактировании файла конфигурации: порядок некоторых опций имеет значение. В частности, опция snapshots работает только при указании перед опцией scan-path.

Кроме указания пути к каталогу с проектами при помощи опции scan-path, имеется возможность описать каждый проект индивидуально и даже сгруппировать проекты. За подробностями обращайтесь к странице руководства cgitrc.

Настройка nginx

Наконец,​ теперь пришла очередь настраивать веб-сервер nginx. Для настройки откроем файл в каталоге /​etc/​nginx/​sites-enabled/,​ найдём секцию сервера и впишем в неё следующие настройки:​
location /cgit {
  return 301 $scheme://$host$request_uri/;
}

location /cgit/static/ {
  autoindex off;
  alias /usr/share/cgit/;
}

location /cgit/ {
  uwsgi_pass unix:/run/uwsgi/app/cgit/socket;
  include uwsgi_params;
  uwsgi_modifier1 9;
}
Перезагрузим nginx, чтобы добавленные нами настройки вступили в силу:
# systemctl reload nginx.service

Публикация репозиториев

Как можно увидеть в файле конфигурации /etc/cgitrc, созданном нами ранее, репозитории git должны размещаться в каталоге /​var/​lib/​cgit/​. Создадим этот каталог и назначим права на него:
# mkdir /var/lib/cgit
# chown www-data:www-data /var/lib/cgit
# chmod o= /var/lib/cgit
В этом каталоге нужно создать подкаталоги с расширением .git, содержащие так называемые «голые» (bare) репозитории. Обычный репозиторий, в котором ведётся разработка, содержит внутри себя текущие версии файлов, над которыми идёт работа, и каталог .git. Каталог .git, по-сути, и является «голым» репозиторием. Для создания «голого» репозитория из обычного можно воспользоваться такими командами:
# cd /var/lib/cgit
# git clone --bare /home/stupin/git/view3d view3d.git
И не забудьте поменять права доступа на «голый» репозиторий:
# cd /var/lib/cgit
# chown -R www-data:www-data view3d
# chmod -R o= view3d.git

Тестирование cgit

Теперь можно запустить браузер и проверить доступность приложения. У меня стартовая страница приложения выглядела следующим образом:​

Как видно из снимка экрана,​ ссылки на странице не дружественны для человека,​ что, впрочем,​ не мешает выполнять основную задачу,​ для которой это веб-приложение и было создано:​ просматривать git-репозитории через браузер.

Использованные материалы

воскресенье, 7 июля 2019 г.

Установка и настройка Gitweb

Gitweb - это веб-интерфейс для доступа к git-репозиториям, который написан на Perl и поставляется вместе с исходными текстами git. Gitweb рассчитан на запуск через веб-сервер Apache, но я Apache не использую и для эксперимента решил попробовать настроить Gitweb поверх связки nginx и uWSGI.

Установка пакетов

Несмотря на то, что в репозитории Debian имеется отдельный пакет с именем gitweb, всё необходимое для запуска gitweb есть в пакете git. Единственное, чего может не хватить - это модуля CGI.pm. Его можно установить из пакета libcgi-pm-perl. Установим необходимые пакеты:
# apt-get install nginx-light uwsgi git libcgi-pm-perl

Настройка uwsgi

Первым делом настроим сервер приложений uWSGI для запуска CGI-сценария. Для этого создадим файл /etc/uwsgi/apps-available/gitweb.ini со следующим содержимым:
[uwsgi]

procname = uwsgi-gitweb
procname-master = uwsgi-gitweb-master

plugins = cgi
processes = 1
threads = 4
cgi = /usr/share/gitweb/gitweb.cgi
cgi-timeout = 5
Теперь нужно подключить использование этого файла:
# cd /etc/uwsgi/apps-enabled/
# ln -s /etc/uwsgi/apps-available/gitweb.ini .
Перезапустим uWSGI, чтобы его новые настройки вступили в силу:
# systemctl restart uwsgi.service

Настройка Gitweb

Теперь настроим файл конфигурации самого приложения Gitweb. Я буду настраивать приложение в подкаталоге веб-сервера /gitweb/, поэтому у меня файл конфигурации /etc/gitweb.conf принял следующий вид:
# path to git projects (.git)
$projectroot = "/var/lib/git";

# directory to use for temp files
$git_temp = "/tmp";

# target of the home link on top of all pages
$home_link = $my_uri || "/gitweb/";

# html text to include at home page
$home_text = "indextext.html";

# file with project list; by default, simply scan the projectroot dir.
$projects_list = $projectroot;

# stylesheet to use
@stylesheets = ("/gitweb/static/gitweb.css");

# javascript code for gitweb
$javascript = "/gitweb/static/gitweb.js";

# logo to use
$logo = "/gitweb/static/git-logo.png";

# the 'favicon'
$favicon = "/gitweb/static/git-favicon.png";

# git-diff-tree(1) options to use for generated patches
#@diff_opts = ("-M");
@diff_opts = ();

Настройка nginx

Наконец, теперь пришла очередь настраивать веб-сервер nginx. Для настройки откроем файл в каталоге /etc/nginx/sites-enabled/, найдём секцию сервера и впишем в неё следующие настройки:
# Gitweb
location /gitweb/static/ {
  autoindex off;
  alias /usr/share/gitweb/static/;
}

location /gitweb/ {
  uwsgi_pass unix:/run/uwsgi/app/gitweb/socket;
  include uwsgi_params;
  uwsgi_modifier1 9;
  uwsgi_param PATH_INFO $1;
  uwsgi_param GITWEB_CONFIG /etc/gitweb.conf;
}
Перезагрузим nginx, чтобы добавленные нами настройки вступили в силу:
# systemctl reload nginx.service

Размещение репозиториев

Репозитории git, доступ к которым обеспечивает Gitweb, должны располагаться в каталоге /var/lib/git/. Я поместил туда несколько репозиториев для того, чтобы проверить работу приложения. Не забудьте дать права доступа к файлам репозиториев пользователю www-data и группе www-data, например, при помощи следующих команд:
# cd /var/lib/git/
# chown -R www-data:www-data *
В этом каталоге нужно создать подкаталоги с расширением .git, содержащие так называемые "голые" (bare) репозитории. Обычный репозиторий, в котором ведётся разработка, содержит внутри себя текущие версии файлов, над которыми идёт работа, и каталог .git. Каталог .git, по-сути, и является "голым" репозиторием. Для создания "голого" репозитория из обычного можно воспользоваться такими командами:
# cd /var/lib/git
# git clone --bare /home/stupin/git/view3d view3d.git
И не забудьте поменять права доступа на "голый" репозиторий:
# cd /var/lib/git
# chown -R www-data:www-data view3d.git
# chmod -R o= view3d

Тестирование Gitweb

Теперь можно запустить браузер и проверить доступность приложения. У меня стартовая страница приложения выглядела следующим образом:

Как видно из снимка экрана, ссылки на странице не дружественны для человека, что, впрочем, не мешает выполнять основную задачу, для которой это веб-приложение и было создано: просматривать git-репозитории через браузер.

Использованные материалы