понедельник, 1 апреля 2024 г.

Docker. Первые контейнеры

Источник: php.dragomano.ru

Структура каталогов:

~/develop/web/project/

                 nginx/      - сервис web-сервера

               php-fpm/      - сервис php8.2

                 mysql/      - сервис mysql


I. Создание сервиса Nginx

i.1. Узнаем версию docker compose:

$ docker compose version

Docker Compose version v2.25.0


i.2. В каталоге сервиса nginx создаем docker-compose.yml-файл следующего содержания:

version: '2.25.0'

# Services

    services:

        # Nginx Service

        nginx:

            image: nginx:1.21

            ports:

                - 80:80


i.3. Переходим  каталог `~/develop/web/project/nginx`:

$ cd ~/develop/web/project/nginx


i.4. Запускаем наш контейнер на выполнение в фоновом (`-d`) режиме:

$ docker compose up -d


i.5. Просматриваем контейнеры запущенные в данный момент:

$ docker compose ps


i.6. Проверяем работу нашего сервиса:

$ wget http://localhost:80

В результате выполнения в каталоге */nginx появится файл index.html, его можно прочитать любым текстовым редактором nano, vim или др.

i.7. Для остановки контейнера выполняем:

$ docker compose stop


P.S. Разница между контейнером и сервисом следующая, сервис — один из компонентов приложения, перечисленных в docker-compose.yml. Каждый сервис ссылается на образ, который используется для запуска и остановки контейнеров на основе этого образа.


i.8. Доступ к оболочке командной строки выполняемого контейнера:

$ docker compose exec nginx bash


II. Создание сервиса Nginx + PHP-FPM

ii.1. Перейдите в каталог `project/php-fpm`:

$ cd ~/develop/web/project/php-fpm

... и создайте docker-compose.yml - файл, следующего содержания:


Docker. Подсказки по работе с контейнерами

Источник: www.ruanyifeng.com


Место хранения образов Docker и данные контейнеров:

/var/lib/docker


Проверка состояния работы сервиса Docker:

$ systemctl status docker


Перечислить образы docker на устройстве:

$ docker image ls


Удалить файл образа с устройства:

$ docker image rm [image-name]


I. Пример использования Docker

1. Переносим образ в локальное хранилище:

$ docker image pull library/hello-world

library - группа, в которой находится образ `hello-world`, её можно опустить:

$ docker image pull hello-world


2. Просмотр образа в локальном хранилище:

$ docker image ls


3. Сгенерировать работающий экземпляр контейнера из файла образа (запуск образа):

$ docker container run hello-world

, в случае, если к этому шагу docker image pull - не был выполнен, то имя указанного образа будет скопировано из хранилища Docker.

, если запуск контейнера произойдёт успешно, мы увидим на экране:

Hello from Docker!

This message shows that your installation appears to be working correctly.

...

После вывода на экран, работа контейнера завершится. В случае, если в контейнере выполняется служба, то контейнер не будет завершен.

4. Для тех контейнеров, которые автоматически не завершаются, можно выполнить команду:

$ docker container kill


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

# Перечислить контейнеры, запущенные на устройстве

$ docker container ls

# Перечислить контейнеры, запущенных и остановленных на устройстве

$ docker container ls --all


6.  При остановке контейнера, его файл образ занимает место на диске, для удаления образа с диска устройства:

$ docker container rm [container-id]


7. Проверить удаленный файл образа можно с помощью команды:

$ docker container ls --all


II. Файл Dockerfile

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

...

GNU\Linux. Debian. Установка Docker

Источник: docs.docker.com

Источник: help.reg.ru

Источник: www.ruanyifeng.com


1. Обновляем пакеты:

$ sudo apt update


2. Установите пакеты, которые необходимы для работы пакетного менеджера apt по протоколу HTTPS:

$ sudo apt install apt-transport-https ca-certificates curl software-properties-common


3. Добавьте GPG-ключ репозитория Docker:

curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg


4. Добавьте репозиторий Docker:

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb\_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


5. Снова обновляем пакеты:

$ sudo apt update


6.  Переключитесь в репозиторий Docker, чтобы его установить (docker-community edition):

$ apt-cache policy docker-ce


7. Установить Docker:

$ sudo apt install docker-ce


8. Проверяем работоспособность Docker:

$ sudo systemctl status docker


9. Чтобы использовать утилиту docker, нужно добавить ваше имя пользователя в группу Docker. Для этого введите в терминале команду:

$ sudo usermod -aG docker ${user}

Где user — имя пользователя.


10. Переходим в учётную запись пользователя:

$ su - ${user}

Где user — имя пользователя.


11. После завершения установки выполняем проверку версии Docker:

sudo docker version

$ sudo docker info


12. Выполняем проверку работоспособности Docker:

$ sudo docker run hello-world


13. Для обработки командной строки, необходимо выполнить проверку работы службы Docker:

$ sudo systemctl status docker


P.S. ? Дополнительно, возможно, имеет смысл установить docker-compose (пока не изучил для чего он) 

GNU\Linux. Debian. Обновление golang

Источник: тут

1. Подготавливаем каталог для скачивания новой версии языка:

# mkdir -p ~/distrib/golang && cd ~/distrib/golang

2. На официальном сайте "https://golang.org/dl/ " определяемся с номером последней версии языка go и скачиваем её:

wget https://golang.org/dl/go1.<VERSION_NUMBER>.linux-amd64.tar.gz

... в моём случае последняя версия "1.22.1":

# wget https://golang.org/dl/go1.22.1.linux-amd64.tar.gz

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

# rm -rf /usr/local/go
# rm -rf /usr/bin/go

Проверяем есть ли еще пути, которые могут содержать каталог "go":

# which go

если найден каталог, убедитесь, что он принадлежит языку программирования "go" и удалите его тоже

4. Распаковка новой версии языка go:

# tar -C /usr/local -xzf ~/distrib/go/go1.22.1.linux-amd64.tar.gz

5. Установка переменных окружения:

# echo "export PATH=$PATH:/usr/local/go/bin" >> ~/.profile
# echo "export GOPATH=~/.go" >> ~/.profile

6. Перезагрузка переменных окружения

# source ~/.profile

7. Проверяем версию "go":

# go version
go version go1.22.1 linux/amd64

среда, 13 марта 2024 г.

Настройка https в Nginx (openssl)

Источники: первый, второй.

На виртуальной машине Oracle VM VirtualBox установлен пакет LEMP (Debian 12.4, Nginx, MySQL/Mariadb, PHP 8.2).

Имя web-ресурса: ae-eco.local, для него и будем настраивать сертификат.


1. Обновляем пакеты GNU\Linux:

# apt-get update && apt-get upgrade


2. Создаем каталог для хранения сертификатов и переходим в него:

# mkdir /etc/nginx/ssl && cd /etc/nginx/ssl


3. Генерируем файлы сертификата и ключа:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout ae-eco.key -out ae-eco.crt

При генерации сертификата на вопросы отвечаем как считаем нужным, в моём случае:
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Astrakhan
Locality Name (eg, city) []:Astrakhan
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Private
Organizational Unit Name (eg, section) []:Private
Common Name (e.g. server FQDN or YOUR name) []:ae-eco.local
Email Address []:admin@ae-eco.local



4. В настройке сервера Nginx указываем следующее:

server {
    ...
    listen 443 ssl http2;
    ssl_certificate /etc/nginx/ssl/ae-eco.crt;
    ssl_certificate_key /etc/nginx/ssl/ae-eco.key;
    ...
}



5. Для переадресации со схемы http на https добавляем:

server {
    ...
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
    ...
}



6. Проверяем конфигурацию Nginx:

# nginx -t

или

# nginx -T


7. Перезапускаем Nginx:

# systemctl restart nginx


Заключение:
В моём случае настройка виртуального сервера в файле /etc/nginx/sites-enabled/default для локального web-ресурса ae-eco.local:
server {
listen 80;
listen [::]:80;
listen 443 ssl http2;
server_name ae-eco.local;
ssl_certificate /etc/nginx/ssl/ae-eco.crt;
ssl_certificate_key /etc/nginx/ssl/ae-eco.key;
#redirect non-https traffic
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
root /var/www/ae-eco.local/public_html;
index index.php index.html index.htm index.nginx-debian.html;
access_log /var/www/ae-eco.local/ae-eco.local.access.log;
error_log /var/www/ae-eco.local/ae-eco.local.error.log;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_NAME $document_root$fastcgi_script_name;
include fastcgi_params;
include snippets/fastcgi-php.conf;
}
}

четверг, 29 февраля 2024 г.

golang, начало

Перед установкой golang выполняем обновление ОС GNU/Linux.

Для ubuntu, debian/kalilinux:

# apt update && apt upgrade -y

Для AltLinux:

# apt-get update && apt-get dist-upgrade -y


1. Подготовка окружения для разработки

1.1. Установка golang

Для ubuntu, debian/kalilinux:

# apt install golang -y

Для AltLinux:

# apt-get install golang gcc -y


1.2. Первая программа

Создаём каталог тестового проекта и переходим в него:

# mkdir -p ~/develop/golang/test && cd ~/develop/golang/test


Создаем go-файл `test.go` со следующим содержанием:

# vim test.go

package main

import (

    "fmt"

)

func main() {

    fmt.Println("test string")

}

Запускаем тестовый код в режиме интерпретатора:

# go run test.go

...если на экране отобразился текст "test string", значит установка прошла правильно.


2. Многофайловые проекты

2.1. Разделение кодовой базы в разных файла одного каталога

Создаем каталог проекта и переходим в него:

# mkdir -p ~/develop/golang/test2 && cd ~/develop/golang/test2


Создаем главный файл проекта следующего содержания:

# vim main.go

package main

import (

    "fmt"

)

func func01() {

    fmt.Println("func01 from main.go file")

}

func main() {

    func01()

    func02()

}


Создаем дополнительный файл с функцией func02 следующего содержания:

# vim func02.go

package main

import (

   "fmt"

)

func func02() {

    fmt.Println("func02 from func02.go file")

}


Запускаем код в режиме интерпретации кода:

# go run main.go func02.go

...на экране должны отобразиться две строки.


Пишем скрипт для запуска следующего содержания:

# vim run.sh

 go run main.go func02.go

Назначаем скрипту атрибут исполняемого файла:

# chmod +x run.sh

Теперь этот проект можно запускать файлом run.sh:

# ./run.sh


2.2. Импорт кода/данных из файлов, расположенных в разных каталогах одного из наших проектов

Все проекты программ разрабатываемые нами на языке golang мы храним в домашнем каталоге "~/develop/golang". Также в среде разработки golang есть служебный каталог (/usr/lib/golang/src), в котором хранятся пакеты стандартной библиотеки golang, такие как "fmt" которая использовалась выше, и те, которые мы закачиваем из внешних репозиториев, на пример с github.ru/gorilla/mux.

Если попробовать в файле `main.go` выполнить импорт, например, пакета "mylib9087", то при попытке выполнения программы мы получим сообщение похожее на "main.go:8:2: package mylib9087 is not in std (/usr/lib/golang/src/mylib9087").

Один из возможных вариантов выполнять импорт наших пакетов которые находятся в структуре каталога "~/develop/golang" это создать на него ссылку в каталоге "/usr/lib/golang/src":

# ln -s ~/develop/golang /usr/lib/golang/src/myapps

В результате, при следующей структуре каталогов наших проектов:

~/develop/golang

    /project1

        /app

            main.go

        /modules

            mymodule.go

далее, из файла `main.go` мы можем выполнить импорт кодовой базы или данных из файла `mymodule.go` следующим образом:

#vim ~/develop/golang/project1/modules/mymodule.go

package modules

import (

    "fmt"

)

func func02() {

    fmt.Println("text from go-file mymodule.go")

}


#vim ~/develop/golang/project1/app/main.go

package main

import (

    "fmt"

    "myapps/project1/modules"

)

func main() {

    fmt.Println("text from go-file main.go")

    func02()

}

При выполнении файла `main.go` в режиме интерпретации мы увидим 2 строки текста, первая из которых будет выведена из файла `main.go`, вторая из файла `func02.go`:

# go run ~/develop/golang/project1/app/main.go 


3. Автоматическое добавление зависимостей

При использовании зависимостей в проекте, которые не входят в состав стандартной библиотеки языка программирования используем команду `go mod tidy`, также необходимо использование инициализации проекта при создании, например, при создании проекта `mserv-1`. В файле `...\mserv-1\main.go` добавляем внешнюю записимость `gorilla/mux`:

package main

import {

       ...

       "github.com/gorilla/mux"

}

3.1. Выполняем инициализацию проекта:

$ ~\develop\golang\mserv-1\go mod init [project-name]


3.2. Выполняем автоматическое добавление зависимостей:

$ ~\develop\golang\mserv-1\go mod tidy


3.3. При прописании в go-файл новых внешних зависимостей, снова выполняем `go mod tidy`

вторник, 2 января 2024 г.

Debian 12. Настройка web-сервера LEMP (Linux, Nginx, Mysql, Php) + виртуальные хосты

 По памяти:

После установки Debian 12

Шаг 1. Обновляем систему с применением обновлений:

#> apt-get update && apt-get upgrade -y


Шаг 2. Устанавливаем web-сервер Nginx:

#> apt-get install nginx -y


Шаг 3. Устанавливаем и настраиваем СУРБД Maridb:

#>apt-get install mariadb-server mariadb-client -y

#>mysql_secure_installation


Шаг 4. Создаем два каталога для размещения отдельных веб-сайтов:

#>mkdir -p /var/www/jacobs-master.ru/public_html

#>mkdir -p /var/www/workey.online/public_html


Шаг 5. Устанавливаем права на каталоги для пользователя www-data:

#>chown -R www-data:www-data /var/www/jacobs-master.ru/public_html

#>chmod -R 755 /var/www/jacobs-master.ru/public_html

#>chown -R www-data:www-data /var/www/workey.online/public_html

#>chmod -R 755 /var/www/workey.online/public_html


Шаг 6. Устанавливаем Php:

#> apt-get install php php-fpm php-mysql php-common php-cli php-json php-opcache php-readline php-mbstring php-xml php-gd php-curl -y


Шаг 7. Добавить в конец файл `/etc/nginx/sites-available/default` описание виртуальных серверов:

server {

  listen 80;

  listen [::]:80;

  server_name jacobs-master.ru;

  root /var/www/jacobs-master.ru/public_html;

  index index.php index.html index.htm index.nginx-debian.html;

  location / {

    try_files $uri $uri/ /index.php;

  }

# Для обработки php-файлов

  location ~ \.php$ {

    fastcgi_pass unix:/run/php/php8.2-fpm.sock;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

    include snippets/fastcgi-php.conf;

  }

}

server {

  listen 80;

  listen [::]:80;

  server_name workey.online;

  root /var/www/workey.online/public_html;

  index index.php index.html index.htm index.nginx-debian.html;

  location / {

    try_files $uri $uri/ /index.php;

  }

# Для обработки php-файлов

  location ~ \.php$ {

    fastcgi_pass unix:/run/php/php8.2-fpm.sock;

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    include fastcgi_params;

    include snippets/fastcgi-php.conf;

  }

}


Шаг 8. Проверяем синтаксис настроек nginx:

#> nginx -t


Шаг 9. Перезапускаем сервер nginx:

#> systemctl restart nginx

Docker. Первые контейнеры

Источник:  php.dragomano.ru Структура каталогов: ~/develop/web/project/                  nginx/      - сервис web-сервера                php...