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

Nginx + Let's Crypt

Шаг 1. Установка Certbot

# apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing python3-zope.interface -y

# apt-get install python3-certbot-nginx -y



Шаг 2. Проверка имени домена

# vim /etc/nginx/suite-available/default

server {
    ...
    server_name rus-notes.ru www.rus-notes.ru;
    ...
}



Шаг 3. Получение SSL-сертификата
# certbot --nginx -d rus-notes.ru -d www.rus-notes.ru

...
Account registered.
Requesting a certificate for rus-notes.ru and www.rus-notes.ru
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/rus-notes.ru/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/rus-notes.ru/privkey.pem
This certificate expires on 2025-03-30.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for rus-notes.ru to /etc/nginx/sites-enabled/default
Successfully deployed certificate for www.rus-notes.ru to /etc/nginx/sites-enabled/default
Congratulations! You have successfully enabled HTTPS on https://rus-notes.ru and https://www.rus-notes.ru
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Шаг 4. Проверка автоматического обновления сертификата

# certbot renew --dry-run



Шаг 5. Настройка сертификатов в Nginx

После выполнения всех вышеперечисленных действия сертификаты автоматически прописывают в /etc/nginx/suite-availabe/default.

вторник, 10 декабря 2024 г.

TypeScript, Node.js

Возникла необходимость разбираться с Node.js, при чтении книги "TypeScript Быстро" Яков Файн и Антон Моисеев.

Node.js - среда выполнения кода, написанного на JavaScript.


1. Установка NodeJS

1.1. С официального сайта скачиваем и устанавливаем NodeJS https://nodejs.org/en/


1.2 Проверяем версию NodeJS "node -v":

C:\Users\user>node -v

v22.12.0


1.3. Проверяем версию Node Package Manager "npm -v":

C:\Users\user>npm -v

10.9.0


2. Установка nvm-windows

2.1. Устанавливаем nvm-install.exe (https://github.com/coreybutler/nvm-windows);

2.2. Проверяем список установленных версий Node.js "nvm list":

C:\Users\user>nvm list
No installations recognized.


2.3. Перезапускаем cmd или ps;

2.4. Просматриваем версии, доступные для установки "nvm list available":

|   CURRENT    |     LTS      |  OLD STABLE  | OLD UNSTABLE |
|--------------|--------------|--------------|--------------|
|    23.3.0    |   22.12.0    |   0.12.18    |   0.11.16    |
|    ...       |    ...       |   ...        |        ...   |


2.5. Для большей совместимости, устанавливаем TLS версию "nvm install 22.12.00":

C:\Users\user>nvm install 22.12.0
Downloading node.js version 22.12.0 (64-bit)...
Extracting node and npm...
Complete
npm v10.9.0 installed successfully.
Installation complete. If you want to use this version, type
nvm use 22.12.0

2.6. Проверяем список установленных версий Node.js "nvm list":

C:\Users\user>nvm list
22.12.0


3. Установка TypeScript (tsc)

3.1. Установка tsc "npm install -g typescript" ("-g" - глобально):

C:\Users\user>npm install -g typescript

added 1 package in 11s
npm notice
npm notice New patch version of npm available! 10.9.0 -> 10.9.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v10.9.2
npm notice To update run: npm install -g npm@10.9.2
npm notice

3.2. Смотрим версию tsc "tsc -v":

C:\Users\user>tsc -v

Version 5.7.2


4. Пишем программу на TypeScript

4.1. Создаем каталог "demo01" в котором создаём файл main.ts со следующим содержимым:

function getFinalPrice(price: number, discount: number) {
return price - price /discount;
}
console.log(getFinalPrice(100, 10));


4.2. Компилируем main.ts в main.js "tsc main.ts

D:\library\projects\typescript\demo01>tsc main


4.3. Выполняем файл main.js "node main.js":

D:\library\projects\typescript\demo01>node main.js
90


Опции компиляции: при добавлении в main.ts строки "console.log(getFinalPrice(100, "10%"))" файл main.js будет сгенерирован, не смотря на ошибку передачи строкового аргумента "10%" в тип :numeric. Если не обходимо не выполнять компиляцию при ошибке, то необходимо выполнить компиляцию с опцией "--onEmitonError true":

D:\library\projects\typescript\demo01>tsc main.ts --onEmitOnError true

в этом случае, при наличии ошибки в тексе main.ts, файл main.js сформирован не будет.

Компилировать main.ts в main.js версии ECMAScript5:

D:\...> tsc --t ES5 main.ts


5. Создание нового проекта

5.1. В пустом каталоге для нового проекта выполните команду "tsc --init", в результате будет создан файл "tsconfig.json" со значениями компиляции по умолчанию.

понедельник, 14 октября 2024 г.

Arduino IDE (Esp32s3)

1. Установка Arduino IDE (arduino.cc).


Подготовка для программирования Esp32S3.

2. Additional board manager URLs: "https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json"

3. Во вкладке Board Manager ищем и устанавливаем "Esp32" (by Espressif Systems)

понедельник, 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

Nginx + Let's Crypt

Шаг 1. Установка Certbot # apt-get install python3-acme python3-certbot python3-mock python3-openssl python3-pkg-resources python3-pyparsing...