Вводные
Нужно организовать
- систему учета задач
- отображение изменений в коде в привязке к задаче
- хранилище конфигурации 1С
- возможность доступа к сервисам из сети internet
Общая схема в шапке публикации.
Вариант решения
В качестве системы учета задач использую redmine (ссылка), вариант использования опишу в отдельной статье. Привязать к задачам можно только локальный git репозиторий в формате bare.
Что такое голый/чистый/bare репозиторий в git?
Голый/Чистый/bare репозиторий в Git — это репозиторий, который не имеет рабочего каталога. Обычно используется в качестве удалённого репозитория. Так как bare репозиторий используется только для обмена, то нет причин создавать рабочую копию на диске, проще говоря, такой репозиторий содержит только каталог .git вашего проекта и ничего больше.
Можно вручную настроить git сервис, но с точки зрения администрирования это не удобно, поэтому рядом с redmine развернут gitea (ссылка) и у пользователя из под которого запущен redmine есть доступ к папке с репозиториями gitea. Если используется gitlab, то можно зеркалировать репозиторий (ссылка).
VDS использую "VDS-KVM-SSD-Старт-8.0 Виртуализация: KVM, Процессор: 1 ядро, Память: 2 Гб, Диск: 20 Гб SSD", для работы хватает.
ОС Ubuntu 20.04.
Реализация
Схема работы redmine
Работает система на Ruby on Rails (ссылка)
Использую вариант с phusionpassenger (ссылка)
есть альтернатива с puma (ссылка), работающая через unix_socket (ссылка)
Выбрал passenger исходя из простоты настройки и стабильности работы.
Работа с Ubuntu
Подключаюсь к серверу с помощью PuTTY (ссылка), на хостинге используется доступ под root, стандартно при установке ubuntu используется пользователь входящий в группу "sudo"(ссылка), поэтому для запуска команд ниже нужно использовать "sudo ", при первом вызове будет запрошен пароль пользователя. Возможно перейти в сеанс root командой "sudo -s"
apt update
apt upgrade
Подтвердить (ввести "Y") о скачивании и установке обновлений
Установка и настройка компонентов
Установка MySQL
Установка MySQL, добавление базы и пользователя
apt install mariadb-server mariadb-client libmariadb-dev
Устанавливаем сервис mysql в автозагрузку
systemctl enable mariadb
После установки запускаем настройку безопасности
mysql_secure_installation
Этот скрипт поможет вам выполнить важные задачи безопасности, такие как настройка пароля root, отключение удаленного входа root, удаление анонимных пользователей и т. д. Если скрипт запрашивает пароль root, просто нажмите клавишу [Enter], так как по умолчанию пароль root не установлен.
"VALIDATE PASSWORD PLUGIN" можно не ставить, остальные пункты лучше применить.
Проверяем версию
mysql -v
У меня результат "Server version: 10.3.31-MariaDB-0ubuntu0.20.04.1 Ubuntu 20.04", это важно для настроек redmine.
Подключаемся к MySQL
mysql -uroot -p
После команды ввести пароль, ключ "-p" как раз отвечает за это. Если запускаете из под пользователя root то может сработать и "mysql" без ключей.
Проверяем кодировку
show variables like 'coll%';
в таблицах должно быть "utf8mb4_general_ci" или "utf8_unicode_ci" или "utf8_general_ci", у меня было "latin1_swedish_ci".
Если отличается, то выходим из клиента mysql
exit;
Открываем на редактирование кофигурационный файл mysql
nano /etc/mysql/my.cnf
после строк "!includedir" добавляем (если в файле присутствую указанные разделы, то нужно в них добавить или изменить значения)
[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
default-storage-engine=MyISAM
Сохраняем комбинацией "Ctrl+O" + "Enter", выходим комбинацией "Ctrl+X"
Перезагружаем сервис mysql
systemctl restart mysql
повторно подключаемся к mysql
mysql -uroot -p
Создаем базу
CREATE DATABASE redmine CHARACTER SET utf8mb4;
Создаем пользователя и устанавливаем права на базу, "password" нужно заменить на свой стойкий пароль.
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY 'password';
Аналогично добавляем базу для gogs
CREATE DATABASE gitea;
GRANT ALL PRIVILEGES ON gitea.* TO 'gitea'@'localhost' IDENTIFIED BY 'password';
Обновляем права доступа и выходим
FLUSH PRIVILEGES;
exit;
Установка Ruby
Требования "Redmine 4.2 does not support Ruby 2.7.0 and 2.7.1. Use Ruby 2.7.2 or higher"
При установке через apt получаем "ruby 2.7.0p0", что не соответствует требованиям
Устанавливаем через rbenv, он ставит пакеты в рамках пользователя поэтому добавляем пользователя redmine и запускаем nginx из под него.
apt install git build-essential libssl-dev
useradd -r -m -d /opt/redmine -s /usr/bin/bash redmine
usermod -aG redmine www-data
su - redmine
cd ~
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
rbenv install 2.7.4
rbenv global 2.7.4
ruby -v
"ruby 2.7.4p191"
Установка Nginx, модуля passenger
apt-get install nginx
Запускаем службу и ставим её в автозагрузку
systemctl start nginx
systemctl enable nginx
Пакета модуля passenger в репозитории ubuntu нет, для его установки нужно предварительно поставить пакеты сборки и подключить хранилище.
Установка модуля passenger
apt-get install dirmngr gnupg apt-transport-https ca-certificates software-properties-common
"software-properties-common"в инструкциях нет, он нужен для запуска "add-apt-repository"
Для уточнения за что отвечают пакеты можно воспользоваться поиском по репозиторию ubuntu (пример для apt-transport)
Импортируем ключ GPG репозитория (более подробное описание принципа), подключаем репозиторий "Phusionpassenger", обновляем кеш заголовков пакетов
apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 561F9B9CAC40B2F7
add-apt-repository 'deb [arch=amd64] https://oss-binaries.phusionpassenger.com/apt/passenger focal main'
apt update
Устанавливаем модуль
apt install libnginx-mod-http-passenger
Указываем пользователя для запуска nginx
nano /etc/nginx/nginx.conf
user redmine;
Указываем расположение нужной версии ruby
nano /etc/nginx/conf.d/mod-http-passenger.conf
passenger_ruby /opt/redmine/.rbenv/shims/ruby;
Перезапускаем nginx
service nginx restart
Redmine поставляется в исходном коде, загружается с ресурса https://www.redmine.org/releases/, так же использует пакеты для работы с изображениями и PDF.
Загрузка, распаковка, установка redmine
Ставим пакеты
apt install imagemagick libmagickwand-dev
Скачиваем архив с кодом, распаковываем (взял не последнюю версию для того чтобы показать как обновлять)
su - redmine
wget https://www.redmine.org/releases/redmine-4.2.3.tar.gz
tar -xvf redmine-4.2.2.tar.gz
установку сделаю в "/opt/redmine" создаю папку, копирую в нее код
mkdir /opt/redmine
cp -r redmine-4.2.2/* /opt/redmine/
Перед установкой пакетов ruby нужно произвести настройку общей конфигурации и подключения к базе данных, формат файла YAML (ссылка), очень чувствителен к отступам, не путать с YML.
конфигурация redmine и установка пакетов ruby
переходим в папку, копируем примеры конфигурации в рабочее состояние
cd /opt/redmine/config/
cp configuration.yml.example configuration.yml
cp database.yml.example database.yml
настраиваем nano database.yml
nano database.yml
Пример
production:
adapter: mysql2
database: redmine
host: localhost
username: redmine
password: "password"
encoding: utfmb4
Нужно заменить "password" на рабочий пароль, и учесть # Use "utf8" instead of "utfmb4" for MySQL prior to 5.7.7
Устанавливаем пакетный менеджер ruby и пакеты для работы redmine
apt install gcc ruby-dev libxslt-dev libxml2-dev zlib1g-dev
cd /opt/redmine/
gem install bundler
bundle config set --local without 'development test postgresql sqlite'
bundle install
Nginx по умолчанию работает под правами пользователя www-data, для корректной работы выдаем ему права на папку с redmine, эту команду желательно повторять при копировании файлов в папку под пользователем "root".
chown -R redmine:redmine /opt/redmine/
После успешной установки всех пакетов создаем секретный ключ и запускам миграцию данных (создание начального образа базы данных).
создание ключа, миграция данных
cd /opt/redmine
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate
при установке может возникнуть ошибка "env: ruby\r: No such file or directory" решается правкой и сохранением фалов "/opt/redmine/bin/rake", "/opt/redmine/bin/bundle", убрал пустую строку после первой, проявляется при скачивании дистрибутива redmine упакованным в zip
Для запуска приложения нужно настроить точку входа в nginx.
После установки присутствует настройка по умолчанию "/etc/nginx/sites-available/default", и на нее сделана ссылка из "/etc/nginx/sites-enabled/default". Структура "sites-available" (доступные) и "sites-enabled" (активные) сделана для более удобного управления сайтами. В "default" параметр "server_name _;", что означает что он отвечает на все запросы. Если нет домена, то можно настраивать и в этом файле, соблюдая структуру настроек.
настройка nginx для доменного имени
Создаем настройку для доменного имени
nano /etc/nginx/sites-available/test.malikov.pro.nginx
для работы расширение не важно потому что проверяются все файлы присутствующие в папке, для ".nginx" есть ассоциация плагина PHPStorm (ссылка)
содержимое файла,
server {
listen 80;
server_name test.malikov.pro;
location / {
root /opt/redmine/public;
access_log /var/log/nginx/test.malikov.pro.access.log;
error_log /var/log/nginx/test.malikov.pro.error.log;
passenger_enabled on;
passenger_min_instances 1;
client_max_body_size 10m;
}
}
Использована локация "/" для дальнейшего подключения gogs в локацию "/git"
Создаем ссылку в "sites-enabled"
ln -s /etc/nginx/sites-available/test.malikov.pro.nginx /etc/nginx/sites-enabled/test.malikov.pro.nginx
Проверяем корректность конфигурации, сделано для того чтобы не обваливать рабочий сервер некорректной конфигурацией.
nginx -t
При выводе сообщения к корректности настроек
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Загружаем настройки
service nginx reload
это альтернативный синтаксис работы с сервисами, равносилен "systemctl reload nginx". Конфигурация загружается без остановки сервиса, для перезагрузки нужно использовать "systemctl restart nginx".
Проверяем работоспособность перейдя по ссылке
Начальная настройка redmine из web интерфейса
Входим используя логин/пароль admin/admin, меняем его на рабочий.
Переходим в раздел "Администрирование", загружаем конфигурацию по умолчанию.
Включаем обязательную аутентификацию, срок хранения паролей, отключаем саморегистрацию.
Отключаем общедоступность новых проектов, и включаем трекеры задач по умолчанию.
Установка Gitea
Будет запускаться как сервис с публикацией на порту 3000, так же будет использовать свой SSH сервер на порту 2222. Запускаться будет с правами пользователя git.
Схема:
Устанавливаем git
apt install curl
Создаем пользователя git
adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos 'Git Version Control' git
Заходим на страницу скачивания (ссылка), смотрим актуальный релиз, на момент установки "0.11.91"
Переходим в рабочую папку, скачиваем архив с исполняемыми файлами.
cd ~
curl -s https://api.github.com/repos/go-gitea/gitea/releases/latest | grep browser_download_url | cut -d '"' -f 4 | grep '\linux-amd64$' | wget -i -
Распаковываем в папку пользователя git, устанавливаем права доступа
chmod +x gitea-*-linux-amd64
mv gitea-*-linux-amd64 /usr/local/bin/gitea
Создаем папки и устанавливаем права доступа на них
mkdir -p /var/lib/gitea/{custom,data,log}
chown -R git:git /var/lib/gitea/
chmod -R 750 /var/lib/gitea/
mkdir /etc/gitea
chown root:git /etc/gitea
chmod 770 /etc/gitea
Создаем файл сервиса
nano /etc/systemd/system/gitea.service
Взято с https://raw.githubusercontent.com/go-gitea/gitea/main/contrib/systemd/gitea.service, раскоментирован блок с mariadb
[Unit]
Description=Gitea (Git with a cup of tea)
After=syslog.target
After=network.target
###
# Don't forget to add the database service dependencies
###
#
#Wants=mysql.service
#After=mysql.service
#
Wants=mariadb.service
After=mariadb.service
#
#Wants=postgresql.service
#After=postgresql.service
#
#Wants=memcached.service
#After=memcached.service
#
#Wants=redis.service
#After=redis.service
#
###
# If using socket activation for main http/s
###
#
#After=gitea.main.socket
#Requires=gitea.main.socket
#
###
# (You can also provide gitea an http fallback and/or ssh socket too)
#
# An example of /etc/systemd/system/gitea.main.socket
###
##
## [Unit]
## Description=Gitea Web Socket
## PartOf=gitea.service
##
## [Socket]
## Service=gitea.service
## ListenStream=<some_port>
## NoDelay=true
##
## [Install]
## WantedBy=sockets.target
##
###
[Service]
# Modify these two values and uncomment them if you have
# repos with lots of files and get an HTTP error 500 because
# of that
###
#LimitMEMLOCK=infinity
#LimitNOFILE=65535
RestartSec=2s
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/gitea/
# If using Unix socket: tells systemd to create the /run/gitea folder, which will contain the gitea.sock file
# (manually creating /run/gitea doesn't work, because it would not persist across reboots)
#RuntimeDirectory=gitea
ExecStart=/usr/local/bin/gitea web --config /etc/gitea/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/gitea
# If you install Git to directory prefix other than default PATH (which happens
# for example if you install other versions of Git side-to-side with
# distribution version), uncomment below line and add that prefix to PATH
# Don't forget to place git-lfs binary on the PATH below if you want to enable
# Git LFS support
#Environment=PATH=/path/to/git/bin:/bin:/sbin:/usr/bin:/usr/sbin
# If you want to bind Gitea to a port below 1024, uncomment
# the two values below, or use socket activation to pass Gitea its ports as above
###
#CapabilityBoundingSet=CAP_NET_BIND_SERVICE
#AmbientCapabilities=CAP_NET_BIND_SERVICE
###
[Install]
WantedBy=multi-user.target
Запускаем сервис, устанавливаем автозагрузку
sudo systemctl daemon-reload
sudo systemctl enable --now gitea
Проверяем состояние командой
systemctl status gitea
Если сервис успешно запущен то, то в выводе видим "Active: active (running)".
Настройка Nginx для gitea
Настраиваем для домена git_test с проксированием на localhost:3000
Создаем файл конфигурации nginx
nano /etc/nginx/sites-available/git-test.malikov.pro.nginx
Содержимое
server {
listen 80;
server_name git-test.malikov.pro;
# log files
access_log /var/log/nginx/git-test.malikov.pro.access.log;
error_log /var/log/nginx/git-test.malikov.pro.error.log;
# Handle / requests
location / {
proxy_redirect off;
proxy_pass http://127.0.0.1:3000;
}
}
Создаем ссылку в активных сайтах
ln -s /etc/nginx/sites-available/git-test.malikov.pro.nginx /etc/nginx/sites-enabled/git-test.malikov.pro.nginx
Проверяем
nginx -t
Перезагружаем
service nginx reload
После установки переходим на страницу web панели, в моем случае "http://git-test.malikov.pro/".
Настраиваем параметры сервиса:
- Настройки базы данных:
- пользователь gitea,
- база данных gitea(создали на этапе установки настройки MySQL).
- Общие параметры Gitea
- Домен: в моем случае git-test.malikov.pro
- URL приложения: http://git-test.malikov.pro/
- Сервер и другие настройки служб
- Отключить самостоятельную регистрацию: включаем
- Разрешить требовать авторизацию для просмотра страниц: включаем
- Настройки учётной записи администратора, заносим на свое усмотрение, пользователь admin зарезервирован, обязателен для заполнения т.к. включен "Отключить самостоятельную регистрацию".
В результате успешной установки видим страницу, у меня при переходе
При установке может появится страница с Bad gateway, это после установки перезапускается сервис gitea чтобы применить настройки и одновременно идет перенаправление на страницу входа, нужно просто перезагрузить страницу в браузере.
Настройки сервиса осуществляются изменением конфиг файла
nano /etc/gitea/app.ini
например настройки отправки email, все параметры описаны на странице https://docs.gitea.io/en-us/config-cheat-sheet/#mailer-mailer
[mailer]
ENABLED = true
FROM =
MAILER_TYPE = smtp
HOST = smtp.yandex.ru:465
IS_TLS_ENABLED = false
USER =
PASSWD =
перезагружаем сервис
service gitea restart
Создание репозитория, подключение к проекту redmine
Добавляем новый репозиторий в gitea
В результате создалась папка "/var/lib/gitea/data/gitea-repositories/malikov_a/test.git", но прав доступа пользователю "redmine" к ней нет, добавляем его в группу git. Регистр "-G" важен, это обозначает "добавить к группе", "-g" означает "установить новую основную группу".
usermod -a -G git redmine
В redmine создаем проект
Подключаем репозиторий, проверяем результат
Автоматическое прикрепление коммита к задаче
В настройках redmine включаем "веб-сервис для управления хранилищем"
В настройках репозитория gogs добавляем оповещение
Пример строки webhook-а
http://git-test.malikov.pro/sys/fetch_changesets?key=CTrwxZNqOaMpuhSvInCs
Создаем задачу в проекте, она получает номер "1".
Делаем изменения в репозитории и добавляем наименование коммита "refs #1".
Обновляем страницу задачи видим связанную редакцию
Настройка firewall
В ubuntu есть встроенный firewall "ufw".
Добавляем к разрешения
ufw allow OpenSSH
ufw allow 22
ufw allow "Nginx Full"
включаем
ufw enable
проверяем состояние
ufw status
UPD 2021.01.23: Добавил установку пакетов и настройку bundler.
UPD 2021.09.24: Изменил ОС с 18.04 на 20.04, уточнил установку требуемой версии ruby
UPD 2021.09.25: Изменил службу с gogs на его продвинутый форк gitea
Итог
Настроить связку redmine и gogs возможно.
Благодарю за внимание.