Архив рубрики: Публикации

Встроенные переменные nginx

  • $args, эта переменная равна аргументам в строке запроса;
  • $arg_name, эта переменная равна аргументу name в строке запроса;
  • $binary_remote_addr, эта переменная равна адресу клиента в бинарном виде, длина её значения всегда 4 байта;
  • $content_length, эта переменная равна строке «Content-Length» в заголовке запроса;
  • $content_type, эта переменная равна строке «Content-Type» в заголовке запроса;
  • $cookie_name, эта переменная равна cookie name;
  • $document_root, эта переменная равна значению директивы root для текущего запроса;
  • $document_uri, то же самое, что и $uri;
  • $host, эта переменная равна строке «Host» в заголовке запроса или имени сервера, на который пришёл запрос, если этой строки нет;
  • $hostname, эта переменная равна имени хоста;
  • $http_name, эта переменная равна строке name в заголовке запроса;
  • $is_args, эта переменная равна «?», если в строке запроса есть аргументы, и пустой строке, если их нет;
  • $limit_rate, эта переменная позволяет установить ограничение скорости соединения;
  • $pid, эта переменная равна номеру рабочего процесса;
  • $request_method, эта переменная равна методу запроса, обычно это «GET» или «POST»;
  • $remote_addr, эта переменная равна адресу клиента;
  • $remote_port, эта переменная равна порту клиента;
  • $remote_user, эта переменная равна имени пользователя, используемого в Basic аутентификации;
  • $realpath_root, эта переменная равна значению директивы root для текущего запроса, при этом все символические ссылки преобразованы в реальные путь;
  • $request_filename, эта переменная равна пути к файлу для текущего запроса, формируемому из директив root или alias и URI запроса;
  • $request_body, эта переменная содержит тело запроса. Значение переменной появляется в location’ах, обрабатываемых директивами proxy_pass и fastcgi_pass.
  • $request_body_file, эта переменная равна имени временного файла, в котором хранится тело запроса. По завершению работы файл необходимо удалить. Для того, чтобы тело запроса клиента всегда записывалось в файл, нужно указать client_body_in_file_only on. При передаче имени в проксированном запросе или в запросе к FastCGI-серверу следует запретить передачу самого тела директивами «proxy_pass_request_body off» или «fastcgi_pass_request_body off» соответственно.
  • $request_uri, эта переменная равна полному первоначальному URI вместе с аргументами;
  • $query_string, то же самое, что и $args;
  • $scheme, эта переменная равна схеме запроса — «http» или «https»;
  • $server_protocol, эта переменная равна протоколу запроса, обычно это «HTTP/1.0» или «HTTP/1.1»;
  • $server_addr, эта переменная равна адресу сервера, на который пришёл запрос. Как правило, для получения значения этой переменной делается один системный вызов. Для того, чтобы избежать системного вызова, нужно указывать адреса в директивах listen и использовать параметр bind;
  • $server_name, эта переменная равна имени сервера, на который пришёл запрос;
  • $server_port, эта переменная равна порту сервера, на который пришёл запрос;
  • $uri, эта переменная равна текущему URI в запросе, он может отличаться от первоначального, например, при внутренних редиректах или при использовании индексных файлов.




Источник: http://docs.mirocow.com/doku.php?id=nginx:%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5_nginx



2022-04-25T01:00:51
Software

В чем разница между абстрактным классом и интерфейсом в Java

Java предоставляет несколько способов обеспечения абстракции данных, таких как интерфейсы Java и абстрактные классы Java. И интерфейс, и абстрактный класс обеспечивают безопасность, скрывая детали внутренней реализации и показывая/выделяя только необходимые детали. Однако между абстрактными классами и интерфейсами существует множество сходств и различий.

Этот пост поможет вам в перечисленных ниже аспектах интерфейсов Java и абстрактных классов:

  1. Что такое интерфейс Java.
  2. Что такое абстрактный класс Java.
  3. Сравнение на основе сходства.
  4. Абстрактный класс Java против интерфейса Java.

Итак, начнем!

 

Что такое Java-интерфейс

Это шаблон для класса, который содержит некоторые абстрактные методы и статические/финальные переменные. В java интерфейсы предоставляют только объявление метода, а дочерние/реализованные классы предоставляют определение метода.

 

Что такое абстрактный класс Java

Любой класс Java, который имеет хотя бы один абстрактный (только объявление метода) метод, известен как абстрактный класс в Java.

 

Сравнение на основе сходства

Некоторые важные аспекты интерфейсов и абстрактных классов Java перечислены ниже:

  • В java мы не можем создать объект/экземпляр обоих интерфейсов или абстрактных классов.
  • Оба предоставляют пользователю только необходимые данные.
  • Оба обеспечивают абстракцию.
  • Оба могут иметь абстрактные методы/функции.
  • Оба скрывают информацию/детали реализации от пользователей.

 

Абстрактный класс Java против интерфейса Java

Ключевые слова «abstract» и «interface» используются в java для создания/объявления абстрактных классов и интерфейсов соответственно.

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

Основной синтаксис абстрактного класса и интерфейса показан в приведенных ниже фрагментах:

Абстрактный класс

public abstract class ClassName{

public abstract void methodName();

}



Интерфейс

public interface InterfaceName{

void methodName();

}

 

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

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

Интерфейсы имеют только «конечные» (неизменяемые) члены, в то время как абстрактные классы могут иметь конечные и неконечные члены.

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

Множественное наследование может быть достигнуто с помощью интерфейсов, в то время как абстрактные классы не поддерживают множественное наследование.

В Java абстрактный класс может наследовать другой класс и может реализовывать множество интерфейсов, с другой стороны, интерфейс Java может расширять только другой интерфейс.

 

Пример

Приведенный ниже пример позволит вам понять, как интерфейсы и абстрактные классы работают в java:

interface FirstInterface {

    void methodOne();

    void methodTwo();

    void methodThree();

}

abstract class AbstractClass implements FirstInterface {

    public void methodThree() {

        System.out.println("Abstract class Implementing methodThree");

    }

}

class NormalClass extends AbstractClass {

    public void methodOne() {

        System.out.println("Implementing methodOne");

    }

    public void methodTwo() {

        System.out.println("Implementing methodTwo");

    }

    public void methodThree() {

        System.out.println("Implementing methodThree");

    }

}

public class InterfaceExample {

    public static void main(String[] args) {

        FirstInterface obj = new ClassThree();

        obj.methodOne();

        obj.methodTwo();

        obj.methodThree();

    }    

}

 

В этом примере мы создали интерфейс «FirstInterface» , абстрактный класс «AbstractClass» и еще два обычных класса Java и выполнили следующие функции:

  • FirstInterface содержит три абстрактных метода.
  • AbstractClass реализует FirstInterface и переопределяет methodThree ().
  • NormalClass расширяет AbstractClass и переопределяет методы methodOne() и methodTwo() класса FirstInterface.

InterfaceExample — это основной класс, из которого мы создали основной метод и вызвали все методы FirstInterface :

В чем разница между абстрактным классом и интерфейсом в Java

 

Вывод подтвердил работу указанной выше Java-программы.

 

Вывод

В Java абстракция может быть достигнута с помощью абстрактных классов и интерфейсов, и оба они не могут быть созданы. Однако между абстрактными классами и интерфейсами существует множество различий. Например, интерфейсы должны иметь все абстрактные методы, а абстрактные классы могут иметь абстрактные и неабстрактные методы; используя интерфейсы, можно достичь множественного наследования, в то время как абстрактные классы не поддерживают множественное наследование и т. д. В этом посте объясняются различные аспекты абстрактных классов и интерфейсов с помощью подходящих примеров.



2022-04-24T07:00:21
Java

В чем разница между абстрактным классом и интерфейсом в Java

Java предоставляет несколько способов обеспечения абстракции данных, таких как интерфейсы Java и абстрактные классы Java. И интерфейс, и абстрактный класс обеспечивают безопасность, скрывая детали внутренней реализации и показывая/выделяя только необходимые детали. Однако между абстрактными классами и интерфейсами существует множество сходств и различий.

Этот пост поможет вам в перечисленных ниже аспектах интерфейсов Java и абстрактных классов:

  1. Что такое интерфейс Java.
  2. Что такое абстрактный класс Java.
  3. Сравнение на основе сходства.
  4. Абстрактный класс Java против интерфейса Java.

Итак, начнем!

 

Что такое Java-интерфейс

Это шаблон для класса, который содержит некоторые абстрактные методы и статические/финальные переменные. В java интерфейсы предоставляют только объявление метода, а дочерние/реализованные классы предоставляют определение метода.

 

Что такое абстрактный класс Java

Любой класс Java, который имеет хотя бы один абстрактный (только объявление метода) метод, известен как абстрактный класс в Java.

 

Сравнение на основе сходства

Некоторые важные аспекты интерфейсов и абстрактных классов Java перечислены ниже:

  • В java мы не можем создать объект/экземпляр обоих интерфейсов или абстрактных классов.
  • Оба предоставляют пользователю только необходимые данные.
  • Оба обеспечивают абстракцию.
  • Оба могут иметь абстрактные методы/функции.
  • Оба скрывают информацию/детали реализации от пользователей.

 

Абстрактный класс Java против интерфейса Java

Ключевые слова «abstract» и «interface» используются в java для создания/объявления абстрактных классов и интерфейсов соответственно.

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

Основной синтаксис абстрактного класса и интерфейса показан в приведенных ниже фрагментах:

Абстрактный класс

public abstract class ClassName{

public abstract void methodName();

}



Интерфейс

public interface InterfaceName{

void methodName();

}

 

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

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

Интерфейсы имеют только «конечные» (неизменяемые) члены, в то время как абстрактные классы могут иметь конечные и неконечные члены.

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

Множественное наследование может быть достигнуто с помощью интерфейсов, в то время как абстрактные классы не поддерживают множественное наследование.

В Java абстрактный класс может наследовать другой класс и может реализовывать множество интерфейсов, с другой стороны, интерфейс Java может расширять только другой интерфейс.

 

Пример

Приведенный ниже пример позволит вам понять, как интерфейсы и абстрактные классы работают в java:

interface FirstInterface {

    void methodOne();

    void methodTwo();

    void methodThree();

}

abstract class AbstractClass implements FirstInterface {

    public void methodThree() {

        System.out.println("Abstract class Implementing methodThree");

    }

}

class NormalClass extends AbstractClass {

    public void methodOne() {

        System.out.println("Implementing methodOne");

    }

    public void methodTwo() {

        System.out.println("Implementing methodTwo");

    }

    public void methodThree() {

        System.out.println("Implementing methodThree");

    }

}

public class InterfaceExample {

    public static void main(String[] args) {

        FirstInterface obj = new ClassThree();

        obj.methodOne();

        obj.methodTwo();

        obj.methodThree();

    }    

}

 

В этом примере мы создали интерфейс «FirstInterface» , абстрактный класс «AbstractClass» и еще два обычных класса Java и выполнили следующие функции:

  • FirstInterface содержит три абстрактных метода.
  • AbstractClass реализует FirstInterface и переопределяет methodThree ().
  • NormalClass расширяет AbstractClass и переопределяет методы methodOne() и methodTwo() класса FirstInterface.

InterfaceExample — это основной класс, из которого мы создали основной метод и вызвали все методы FirstInterface :

В чем разница между абстрактным классом и интерфейсом в Java

 

Вывод подтвердил работу указанной выше Java-программы.

 

Вывод

В Java абстракция может быть достигнута с помощью абстрактных классов и интерфейсов, и оба они не могут быть созданы. Однако между абстрактными классами и интерфейсами существует множество различий. Например, интерфейсы должны иметь все абстрактные методы, а абстрактные классы могут иметь абстрактные и неабстрактные методы; используя интерфейсы, можно достичь множественного наследования, в то время как абстрактные классы не поддерживают множественное наследование и т. д. В этом посте объясняются различные аспекты абстрактных классов и интерфейсов с помощью подходящих примеров.



2022-04-24T07:00:21
Java

Выходит libmdbx 0.11.7 с переносом проекта на GitFlic, исправлениями ошибок и многим другим.

В выпуск новой библиотеки libmdbx версии 0.11.7, запуск выделяется переносом проекта на сервис GitFlic после того, как администрация GitHub удалила libmdbx вместе с рядом других проектов 15 апреля 2022 года без каких-либо предупреждений и объяснений, а также заблокировала доступ многим разработчикам, связанным с компаниями, попавшими под санкции США.

С точки зрения пользователя все страницы, репозиторий и форки проекта внезапно превратились в страницу «404», без возможности общения и без выяснения причин.



Читать

10 примеров команд lsof в Linux

10 примеров команд lsof в Linux. В этой статье мы рассмотрим команду lsof с практическими примерами. lsof расшифровывается как «LiSt Open Files» и используется для того чтобы понять, какие файлы открываются какими процессами. Как мы все знаем, Linux/Unix рассматривает все как файлы (в том числе каналы, сокеты, каталоги, устройства и т.д.). Одна из причин использования команды lsof – это ситуация когда диск не может быть размонтирован, так как возникает ошибка: “Файлы используются“. С помощью этой команды мы можем легко определить используемые файлы.




1. Вывод всех открытых файлов с помощью команды lsof




В приведенном ниже примере lsof в Linux будет показан список открытых файлов. В данном выводе отображаются такие столбцы, как CommandPIDUSERFDTYPE и т.д.




lsof







Разделы и их значения говорят сами за себя. Однако мы рассмотрим столбцы FD&TYPE более подробно:




FD – обозначает дескриптор файла и принимает следующие значения как:




  • cwd – текущий рабочий каталог
  • rtd – корневой каталог
  • txt – текст программы (код и данные)
  • mem  файл памяти




Кроме того, в столбцах FD такие номера, как 1u, являются фактическим дескриптором файла, а за ним следует один из флагов urw как режим доступа:




  • r – доступа для чтения.
  • w – доступа для записи.
  • u – чтения и записи.




TYPE – файлов и их идентификация:




  • DIR – директория
  • REG – обычный файл
  • CHR – специальный символьный файл.
  • FIFO – First In First Out




2. Список открытых пользовательских файлов




Приведенная ниже команда отобразит список всех открытых файлов пользователя sedicomm:




lsof -u sedicomm




3. Поиск процессов, работающих на конкретном порту




Чтобы узнать все запущенные процессы на определенном порту, просто используйте следующую команду с флагом -i. В приведенном ниже примере будут выведены все запущенные процессы порта 22:




# lsof -i TCP:22



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)

sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)




4. Вывод открытых файлов IPv4 и IPv6




В приведенном ниже примере lsof в Linux показаны только сетевые файлы IPv4 и IPv6, выведенные с помощью отдельных команд:




1# lsof -i 42​3COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME4rpcbind 1203 rpc # lsof -i 4



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600




# lsof -i 6



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc

rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)

cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)




5. Вывод открытых файлов диапазона портов TCP 1-1024




Для вывода всех запущенных процессов открытых файлов TCP-порт меняется в диапазоне 1-1024.




# lsof -i TCP:1-1024



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)

sshd 1471 root 4u IPv6 12685 0t0 TCP *:ssh (LISTEN)

master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)

sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

sshd 1838 sedicomm 3u IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

sshd 1871 root 3r IPv4 15842 0t0 TCP 192.168.0.2:ssh->192.168.0.1:groove (ESTABLISHED)

httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)

httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)




6. Исключение пользователей с использованием символа «^»




В этом примере lsof в Linux мы исключили пользователя root. Вы же можете исключить конкретного пользователя, используя «^» с командой приведённой ниже:




# lsof -i -u^root



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 8u IPv4 11331 0t0 TCP *:sunrpc (LISTEN)

rpcbind 1203 rpc 9u IPv6 11333 0t0 UDP *:sunrpc

rpcbind 1203 rpc 10u IPv6 11335 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600

rpc.statd 1277 rpcuser 5r IPv4 11836 0t0 UDP *:soap-beep

rpc.statd 1277 rpcuser 8u IPv4 11850 0t0 UDP *:55146

rpc.statd 1277 rpcuser 9u IPv4 11854 0t0 TCP *:32981 (LISTEN)

rpc.statd 1277 rpcuser 10u IPv6 11858 0t0 UDP *:55800

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)




7. Узнайте, какие файлы и команды использует пользователь?




Приведенный ниже пример показывает, что пользователь sedicomm использует такие команды, как ping и /etc.




# lsof -i -u sedicomm



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

bash 1839 sedicomm cwd DIR 253,0 12288 15 /etc

ping 2525 sedicomm cwd DIR 253,0 12288 15 /etc




8. Вывод списка всех сетевых подключений




Следующая команда с опцией «-i» выводит список всех сетевых подключений «LISTENING & ESTABLISHED»:




# lsof -i



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

rpcbind 1203 rpc 6u IPv4 11326 0t0 UDP *:sunrpc

rpcbind 1203 rpc 7u IPv4 11330 0t0 UDP *:954

rpcbind 1203 rpc 11u IPv6 11336 0t0 TCP *:sunrpc (LISTEN)

avahi-dae 1241 avahi 13u IPv4 11579 0t0 UDP *:mdns

avahi-dae 1241 avahi 14u IPv4 11580 0t0 UDP *:58600

rpc.statd 1277 rpcuser 11u IPv6 11862 0t0 TCP *:56428 (LISTEN)

cupsd 1346 root 6u IPv6 12112 0t0 TCP localhost:ipp (LISTEN)

cupsd 1346 root 7u IPv4 12113 0t0 TCP localhost:ipp (LISTEN)

sshd 1471 root 3u IPv4 12683 0t0 TCP *:ssh (LISTEN)

master 1551 root 12u IPv4 12896 0t0 TCP localhost:smtp (LISTEN)

master 1551 root 13u IPv6 12898 0t0 TCP localhost:smtp (LISTEN)

sshd 1834 root 3r IPv4 15101 0t0 TCP 192.168.0.2:ssh->192.168.0.1:conclave-cpp (ESTABLISHED)

httpd 1918 root 5u IPv6 15991 0t0 TCP *:http (LISTEN)

httpd 1918 root 7u IPv6 15995 0t0 TCP *:https (LISTEN)

clock-app 2362 narad 21u IPv4 22591 0t0 TCP 192.168.0.2:45284->www.gov.com:http (CLOSE_WAIT)

chrome 2377 narad 61u IPv4 25862 0t0 TCP 192.168.0.2:33358->maa03s04-in-f3.1e100.net:http (ESTABLISHED)

chrome 2377 narad 80u IPv4 25866 0t0 TCP 192.168.0.2:36405->bom03s01-in-f15.1e100.net:http (ESTABLISHED)




9. Поиск по PID




В приведенном ниже примере показано только те выводы, чей PID равен 1:




# lsof -p 1



COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

init 1 root cwd DIR 253,0 4096 2 /

init 1 root rtd DIR 253,0 4096 2 /

init 1 root txt REG 253,0 145180 147164 /sbin/init

init 1 root mem REG 253,0 1889704 190149 /lib/libc-2.12.so

init 1 root mem REG 253,0 142472 189970 /lib/ld-2.12.so




10. Завершение всей активности конкретного пользователя




Иногда вам может потребоваться завершить все процессы для конкретного пользователя. Команда ниже завершает все процессы пользователя sedicomm:




# kill -9 `lsof -t -u sedicomm`




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




Источник: https://blog.sedicomm.com/2020/03/19/10-primerov-komand-lsof-v-linux/



2022-04-23T02:29:41
Утилиты командной строки

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

В данной статье рассмотрим, как установить и настроить хранилища репозиториев Harbor.




Установка хранилища репозиториев Harbor




Harbor устанавливается как Docker-образ с помощью online installer.




Чтобы установить хранилища репозиториев Harbor:




  1. Скачайте скрипт online installer и разархивируйте его:




root@ubuntu-standard-2-4-40gb:~# wget https://github.com/goharbor/harbor/releases/download/v1.9.3/harbor-online-installer-v1.9.3.tgz 

root@ubuntu-standard-2-4-40gb:~# tar -zxvf harbor-online-installer-v1.9.3.tgz




  1. В получившейся папке harbor настройте файл harbor.yml:




hostname: <SERVER_DNS_NAME>

http:

  # port for http, default is 80. If https enabled, this port will redirect to https port

  port: 8080

# https related config

 https:

#   # https port for harbor, default is 443

   port: 8443

#   # The path of cert and key files for nginx

   certificate: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.crt

   private_key: /opt/gitlab/config/ssl/<SERVER_DNS_NAME>.key

# The default data volume

data_volume: /opt/harbor




Причем:




  • Имя хоста совпадает с именем Gitlab, так как развертывание выполняется на сервере, на котором находится Gitlab.
  • Используем нестандартные HTTP- и HTTPS-порты, так как стандартные используются веб-интерфейсом Gitlab. 
  • Использует сертификат и ключ LetsEncrypt, которые были созданы при настройке Gitlab.




  1. Выполните скрипт install.sh:




root@ubuntu-standard-2-4-40gb:~/harbor# ./install.sh



[Step 0]: checking installation environment ...

Note: docker version: 19.03.5

Note: docker-compose version: 1.25.0



[Step 1]: preparing environment ...

[Step 2]: starting Harbor ...

Creating harbor-log ... done

Creating registryctl ... done

Creating redis ... done

Creating harbor-db ... done

Creating harbor-portal ... done

Creating registry ... done

Creating harbor-core ... done

Creating nginx ... done

Creating harbor-jobservice ... done



✔ ----Harbor has been installed and started successfully.----




Harbor запущен.




Настройка хранилища репозиториев Harbor




  1. Авторизуйтесь в Harbor. 




Так как у нас используются нестандартные порты, URL будет иметь следующий вид:




https://<SERVER_DNS_NAME>:8443




Логин по умолчанию admin. Первичный пароль задается в файле harbor.yml (по умолчанию — Harbor12345).










  1. Смените пароль пользователя admin. Для этого в правом верхнем углу нажмите на admin и выберите Change Password:










  1. Укажите текущий и новый пароли:










Создайте пользователя, от имени которого Gitlab будет работать с Harbor. Для этого слева выберите Users:**







**




Укажите данные нового пользователя:**







**




Внимание




Запомните введенный для пользователя пароль, он потребуется для интеграции с Gitlab.




  1. Создайте новый проект, в который будут складываться собранные образы из Gitlab. Для этого слева выберите Projects:




**







**    




  1. Введите данные нового проекта:




**







**




7. Добавьте пользователя в проект:**







**




8. Укажите для пользователя имя и роль:**