Установка или обновление Jenkins — ошибка пермишенов при сборке — запуск сервиса Jenkins от юзера

Jenkins update

При установке и обновлении Jenkins, сервис в Linux стартуется от лица стандартного пользователя «jenkins», что может приводить к ошибкам вида «wrong permissions» или подобным на фазе отработки процесса сборки проекта.

Особенно это актуально, когда идет сборка на основе репозитория и права на папке проекта принадлежат определенному пользователю. Например, ec2-user для амазонских линуксов, или ubuntu — для убунту, соответственно.

В таком случае, требуется запускать сервис Jenkins от иного пользователя, а не стандартного. И нужно сделать следующее:

  • Находим конфигурационный файл запуска сервиса Jenkins
systemctl status jenkins

и находим путь к конфигу, смотрите скриншот ниже

Jenkins status 01
jenkins status 02
  • Стопаем Jenkins и редактируем User and Group в конфиг-файле.

В случае примера со второго скрина — основной конфигурации имеет под-конфиг, в поле JENKINS_CONFIG (JENKINS_CONFIG=/etc/sysconfig/jenkins)

systemctl stop jenkins
# путь к конфигу ниже берем из подхода, описанного выше
nano /usr/lib/systemd/system/jenkins.service

Комментируем текущие User and Group и вставляем необходимые, сохраняем файл

#User=jenkins
#Group=jenkins
User=ec2-user
Group=ec2-user
  • Кроме этого, нужно назначить права на папку с jenkins для этого пользователя.

Обычно Jenkins устанавливается по пути /var/lib/jenkins/ :

chown -R ec2-user:ec2-user /var/lib/jenkins/
  • Все готово для старта сервиса Jenkins:
systemctl start jenkins

В интерфейсе Дженкинса можно проверить, что новый юзер «применился»:

Manage Jenkins -> System Information -> Environment Variables
поле — USER

Обновление mySQL с версии 5.7 до 8.0

update mysql
  1. Сперва стоит ознакомиться с нюансами, которые следует учитывать при обновлении с версии 5.7 до 8.0
  2. Так же, стоит воспользоваться инструментом для проверки готовности обновления базы данных — Update Checker

Сами процедуры могут немного различаться в зависимости от операционной системы, поэтому приведенные ниже шаги ориентированы на общую схему и могут потребовать некоторых адаптаций.

  • Создаем резервную копию данных

Создание резервной копии данных в MySQL можно выполнить с использованием инструмента mysqldump, который поставляется вместе с MySQL. Этот инструмент позволяет экспортировать базу данных или выбранные таблицы в файл SQL, который затем можно использовать для восстановления данных. Вот примеры использования mysqldump:

mysqldump -u username -p --all-databases > backup.sql

Где:

  • -u username: указывает имя пользователя базы данных.
  • -p: запрашивает пароль пользователя (вас попросят ввести пароль после выполнения команды).
  • --all-databases: указывает, что нужно создать резервную копию всех баз данных.

Создание резервной копии конкретной базы данных:

mysqldump -u username -p database_name > backup.sql

Где database_name — это имя вашей базы данных.

Создание резервной копии конкретных таблиц:

mysqldump -u username -p database_name table1 table2 > backup.sql

Где table1 и table2 — это имена таблиц.

Восстановление из резервной копии:

mysql -u username -p database_name < backup.sql

Где database_name — это имя базы данных, а backup.sql — ваш файл резервной копии.

Помните о безопасности: не храните пароли в открытом виде в командах, и убедитесь, что ваш файл резервной копии хранится в безопасном месте.

  • Убеждаемся в наличии резервной копии конфигурационных файлов

Cохраняем резервные копии конфигурационных файлов MySQL, таких как my.cnf или my.ini.

  • Устанавливаем новую версию MySQL

Установка MySQL 8.0 на Linux (Ubuntu):

Обновите информацию о доступных пакетах:

sudo apt-get update

Установите MySQL Server:

sudo apt-get install mysql-server

MySQL должен автоматически запуститься после установки. Если нет, вы можете запустить его вручную:

sudo systemctl start mysql

После установки MySQL, выполните команду для настройки безопасности:

sudo mysql_secure_installation

В процессе выполнения вы будете отвечать на вопросы и устанавливать пароль для пользователя root MySQL.

Установка MySQL 8.0 на Windows:
— Перейдите на официальный сайт MySQL и загрузите установочный файл для Windows: https://dev.mysql.com/downloads/installer/
— Запустите установщик и следуйте инструкциям. Выберите «Developer Default» для установки сервера MySQL, а также других инструментов, таких как MySQL Workbench.
— В процессе установки вам могут быть предложены параметры конфигурации сервера. Убедитесь, что вы запомнили пароль для пользователя root MySQL.
— Завершите установку, следуя указаниям установщика.
— MySQL Server должен автоматически запуститься после установки. Если нет, вы можете запустить его с помощью MySQL Notifier или службы Windows.

  • Используем MySQL Shell для обновления схемы

MySQL 8.0 включает в себя MySQL Shell, который предоставляет утилиту mysqlsh. Запустите его и введите следующие команды:

mysqlsh 
\sql
\source path/to/mysql-upgrade.sql

Вместо path/to/mysql-upgrade.sql укажите путь к скрипту обновления, который предоставляется в составе дистрибутива MySQL.

  • Обновление и анализ данных

После обновления схемы MySQL, переносим данные из старой версии в новую, используя утилиты, такие как mysqldump или mysql_upgrade.

  • Настраиваем конфигурацию

Анализируем и адаптируем конфигурационные файлы (например, my.cnf или my.ini) для новой версии MySQL.

  • Перезапустите MySQL после завершения обновления и настройки.
  • Проверяем работоспособность вашего приложения и базы данных, чтобы убедиться, что все работает корректно.

Необходимо обязательно ознакомьтесь с официальной документацией MySQL для вашей конкретной версии и операционной системы, чтобы уточнить детали и изменения, связанные с обновлением.

Как работает cron с переменными времени @daily, @weekly, @monthly

linux crontab daily

Простыми словами, переменные расписания запускают команды:

  • @daily — раз в день
  • @weekly — раз в неделю
  • @monthly — раз в месяц

Как же понять, в какое именно время запускаются команды?..

…Заходим в консоль сервера и используем команду:

cat /etc/anacrontab

Вывод примерно такой:

# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

Пояснения к этой системе можно найти, введя команду:

man anacrontab

Вывод будет примерно такой:

       The  START_HOURS_RANGE  variable  defines an interval (in hours) when scheduled jobs can be run.  In case this time interval is missed, for example, due to a power down, then scheduled jobs are not executed that day.

       The RANDOM_DELAY variable denotes the maximum number of minutes that will be added to the delay in minutes variable which is specified for each job.  A RANDOM_DELAY set to 45 would  therefore add, randomly, between 0 and 45 minutes to the delay in minutes for each job in that particular anacrontab.  When set to 0, no random delay is added.

       Empty lines are either blank lines, line containing white spaces only, or lines with white spaces followed by a '#' followed by an arbitrary comment.

       You can continue a line onto the next line by adding a '\' at the end of it.

       In case you want to disable Anacron, add the 0anacron cron job (which is a part of crontab(1)) into the /etc/cron.hourly/jobs.deny directory.

EXAMPLE
       This example shows how to set up an Anacron job similar in functionality to /etc/crontab which starts all regular jobs between 3:00 and 22:00 only.  A RANDOM_DELAY which can be 45 minutes at the most is specified.  Jobs will run serialized in a queue where each job is started only after the previous one is finished.

       # environment variables
       SHELL=/bin/sh
       PATH=/sbin:/bin:/usr/sbin:/usr/bin
       MAILTO=root
       RANDOM_DELAY=45
       # Anacron jobs will start between 6am and 8am.
       START_HOURS_RANGE=3-22
       # delay will be 5 minutes + RANDOM_DELAY for cron.daily
       1         5    cron.daily          nice run-parts /etc/cron.daily
       7         0    cron.weekly         nice run-parts /etc/cron.weekly
       @monthly  0    cron.monthly        nice run-parts /etc/cron.monthly

Пояснения:

  • Если запускается несколько команд с одной и той же переменной времени (например, @daily), они все ставятся в очередь, сереализуются и выполняются по порядку, при этом
  • START_HOURS_RANGE=3-22 — значит, что команды выполняются только во временном интервали с 3:00 до 22:00
  • RANDOM_DELAY=45 — значит, что следующая команда выполнится только после окончания предыдущей, и через 5 минут (из таблицы с примерами команд) + рандомное количество минут между 0 и 45. Другими словами, через рандомное время между 5 и 50 минутами

Установка скомпилированной версии v8js в Ubuntu или CentOS для server-side rendering

  • Скачаем архив со скомпилированной версией расширения v8js.so

Получаем рут права

> sudo su
  • Создаем временную папку для скачивания и заходим в нее
# mkdir -p /opt/google
# cd /opt/google
  • Сохраняем архив с расширением для рендеринга на серверной стороне
# wget https://blog.bayrell.org/media/files/archives/v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Распаковываем архив тут же
# tar xvf v8-ubuntu-18.04-x64-6.4.388.18-2.1.0.tar.gz
  • Далее необходимо скопировать расширение в папку расширений для вашего PHP
    Получить папку с расширениями можно следующей командой
# php -i | grep extension_dir

Ниже можно увидеть результат команды

тогда копируем расширение в эту папку, в нашем случае это:

# cp /opt/google/v8/6.4/v8js.so /usr/lib64/php/modules
  • А теперь нужно добавить это расширение в ini конфиг php
    получаем папку, в которой хранятся дополнительные ini конфиги
# php -i | grep "additional .ini files"

Вывод будет примерно как на скриншоте ниже

Заходим в папку и создаем ini файл для v8js расширения
В нашем случае это:

# cd /etc/php.d
# nano 50-v8js.ini

И вставляем в файл следюущий код:

extension=v8js.so

Сохраняем файл (CTRL+O, CTRL+X)

  • Теперь можем проверить работоспособность установленного расширения
    Переходим в какую то временную папку на сервер и создаем тестовый php файл
# nano test_v8js.php

В который вставляем следующий код:

<?php
$v8js = new V8Js();
$JS = <<< EOT
  var s = 'Hello world';
  s;
EOT;
$r = $v8js->executeString($JS);
var_dump($r);

В случае успеха увидим вывод в консоли:

string(11) "Hello world"

Если, в качестве менеджера процессов вы используете, например, php-fpm — необходимо его перезагрузить

# systemctl restart php-fpm

Если у вас PHP 7.4 или инструкции выше не работают, можно обратиться к процедуре компиляции V8Js из официальных репозиториев для Ubuntu 20 или Ubuntu 22

Nginx basic auth — аутентификация для сайта или папки сайта на Linux

Иногда возникает желание поставить аутентификацию (запаролить) сайт или же папку на сайте.

Например:

  • Для области администрирования
  • Проводятся работы по разработке и рано открывать область или функционал широкому кругу пользователей
  • Область, предназначенная только для разработки
  • Необходимо закрыть от индексирования (не через специальные файлы, а совсем)
  • Есть желание предоставлять доступ к области только для ограниченного круга лиц
  • Другие причины

Генерация аутентификационного файла

Такого рода аутентификация называется Basic auth (или Http auth), подразумевает ввод логина и пароля и выглядит следующим образом

При этом, если логин и пароль не введен или введен не верно — выдает 401ю ошибку

Обычно, файл, в котором хранятся логин и зашифрованный пароль, находится по пути:

/etc/nginx/.htpasswd

Проверим, существует ли уже такой файл

$ sudo su
# cat /etc/nginx/.htpasswd

И если он не существует, создадим такой файл с пользователем user01

# htpasswd -c /etc/nginx/.htpasswd user01

Система предложит 2 раза ввести пароль, который мы заранее подготовили и сохранили. Именно этот логин (user01) и пароль будут использованы для аутентификации

Если же файл .htpasswd существует, можно добавить пользователя таким образом

# htpasswd -c /etc/nginx/.htpasswd user02

При этом, далее, можно в режиме редактирования файла убрать других пользователей, если это необходимо — удалением соответствующих строк.

Если введенные пользователь (user02) уже существует — таким образом, мы просто поменяем ему пароль…

Конфигурирование Nginx

Следующий шаг — внедрение аутентификации в конфигурацию сайта Nginx. При этом, можно закрыть как весь сайт, расположив строчки:

auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/.htpasswd

На уровне server:

server {
    .…
    auth_basic "Restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd
    ….
}

Так и на уровне какой то области (папки), в примере ниже в зоне «admin»:

server {
    .…
    location /admin {
        ….
        auth_basic "Restricted area";
        auth_basic_user_file /etc/nginx/.htpasswd
        ….
    }
    ….
}


После добавления в конфигурацию сайте — не забываем перезагрузить nginx.

Исключения для определенных IP

Бонусом, есть возможность добавить какие то айпишники в «белый список», чтобы для них не запрашивалась аутентификация, а для остальных — запрашивались логин и пароль. Делается это следующим образом:

{
    …
    satisfy any;
    allow 11.22.33.44; # whitelisted IP 1
    allow 22.33.44.55; # whitelisted IP 2
    …
    deny all;
    auth_basic "Restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd;
    …
}

Основные команды Linux для начинающего администратора

Общие команды

Подключаемся к серверу по SSH

$ ssh -i {path_to_PEM_file} {user_name}@{IP_address}

Получаем рут права (многие серьезные команды требуют рут права)

$ sudo su

Просматриваем историю предыдущих команд

# history

Очищаем окно терминала от текста

# clear

Выходим из под юзера или из удаленного сервера

# exit

Работа с директориям

Перейти в директорию

# cd {folder_name}

На уровень выше

# cd ..

В домашнюю папку пользователя

# cd ~/

В самую корневую папку

# cd /

Показываем список папок и файлов (простой вывод)

# ls

Показываем список папок и файлов (с подробными деталями)

# ll

создаем новую папку

# mkdir

изменяем владельца файла или папки (рекурсивно)

# chown apache:apache /var/www/domain-web/ -R

изменяем права доступа к файлу или папке (рекурсивно)

# chmod 775 /var/www/domain-web/ -R

распечатываем текущий путь (к каталогу)

# pwd

поиск файлов или папок по шаблону названия

# find {template}

поиск текста по шаблону (в файлах)

# grep {template}

Пример поиска команды в истории по фильтру-шаблону

# history | grep {word_to_search}


Работаем с файлами 

Выводим содержимое файла в консоль

# cat {file_path/file_name}

Выводим последние 100 строк (удобно если большой файл)

# tail -100 {file_name}

Смотрим изменения в файле в режиме реального времени

# tail -f {file_name}

редактируем файл, если файла нету — он создается

# nano {file_name}

CTRL+O — сохраняем изменения

CTRL+X — закрываем файл

очищаем файл (например, чтобы отредактировать с нуля) без его удаления

# echo '' > {file_name}

очищаем файл и сразу переходим к редактированию

# echo '' > {file_name} && nano {file_name}

удаляем файл или каталог (рекурсивно)

# rm -rf {file_name}

копируем файл (например, делаем бекап конфига перед редактированием)

# cp {file_path/file_name} {new_file_path/file_name}

Просмотр расписания cron (у каждого системного пользователя он свой)

# crontab -l

Редактирование расписания cron

# crontab -e

Тоже, но через nano редактор

EDITOR=nano crontab -e


Просматриваем статистику о системе

анализ свободного/занятого дискового пространства

# df -h

показывает размер файла или каталога

# du -chs {directory 1} {directory 2}

показывает размер каталогов (или файлов), в том числе скрытых, с сортировкой по размеру

# du -chs .[!.]* * | sort -h

Просмотр информации о ресурсах операционной системы и запущенных процессах

# top

Тоже что top, но более интерактивно

# htop


Сервисы

Просмотр всех сервисов и их статусов

# service --status-all

Статус, старт, рестарт и стоп сервиса

# service nginx status

# service php-fpm start

# service redis-server restart

# service searchd stop


Бонус — команды посложнее

Выводим список с детальной информацией о процессах системы, которые в названии имею строчку «php»

ps aux | grep "php"

Подключится к mysql серверу

mysql -u {user_name} -p -h {server_name}

количество соединений к серверу с группировкой по статусам

# ss -tan | awk '{print $1}' | sort | uniq -c

количество соединений к серверу с группировкой по статусам — в реальном времени

# watch -n1 'ss -tan | awk '\''{print $1}'\'' | sort |  uniq -c'

Установка Apache на CentOS 7

Второй по популярности веб-сервер для Linux систем — Apache.

Периодически встречаю ПО, требованием для установки которого является, как раз, Apache web-server.

Для CentOS 7 команда для установки Апача следующая

$ sudo yum install -y httpd

Чтобы при перезагрузке сервера сервис стартовал автоматически

$ sudo systemctl enable httpd

И запускаем его

$ sudo systemctl start httpd

Чтобы проверить корректность установки, можно перейти по адресу

http://ip-адрес-вашего-сервера

Тестовая страница выглядит примерно так

Установка Apache, в том числе, создает папку для ваших проектов

/var/www

и системного пользователя apache c группой apache

Давайте еще создадим и сконфигурируем веб-сайт.

В предыдущей статье рассказывалось как искать, приобретать и настраивать доменное имя. Предположим мы обладаем именем domain.com, наш проект назовем «domain» и разместим его на сервере.

Итак, чтобы иметь возможность редактировать файлы конфигураций

$ sudo su

Создадим папку для нашего проекта

# mkdir /var/www/domain/

и простую тестовую страницу

# nano index.html

(введите тут любой приветственный текст, сохраните CTRL+O и выйдите из режима редактирования CTRL+X)  

И применим необходимые права

# chown -R apache:apache /var/www/domain/

Переходим в директорию конфига нашего веб-сервера

# cd /etc/httpd/conf.d

Создаем и открываем для редактирования конфиг для нашего сайта

# nano domain.conf

С таким наполнением

<VirtualHost *:80>

 ServerName domain.com

 DocumentRoot /var/www/domain

 <Directory /var/www/domain>

  Options FollowSymLinks

  AllowOverride All

  Require all granted

 </Directory>

</VirtualHost>

И перезапускаем Apache

# systemctl restart httpd

Пробуем запускаться в браузере

http://domain.com