Поиск

Найдены 15 статей по слову "devops"

HTTPS на localhost

Когда на локалхосте нужен https можно сделать следующее.

Выполняем команду:

openssl req -x509 -out localhost.crt -keyout localhost.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=localhost' -extensions EXT -config <( \
   printf "[dn]\nCN=localhost\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:localhost\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

Копируем файлы localhost.crt и localhost.key в папку приложения и подключаем.

Также, не забывайте, что может потребоваться добавить сертификат в кейчеин (на маке просто делаем двойной клик по localhost.crt).

Также, может потребоваться перейти по ссылке на сертификат (если допустим подключается апи к другому хосту), то просто открывайте сайт по тому урлу и соглашайтесь через “Дополнительно” и “Перейти на сайт”.

Например, для nodejs код будет выглядеть примерно так (index.js):

const https = require('https');

const HTTPS_OPTIONS = Object.freeze({
    cert: fs.readFileSync('./localhost.crt'),
    key: fs.readFileSync('./localhost.key')
});

const httpsServer = https.createServer(HTTPS_OPTIONS);

Источник: https://letsencrypt.org/ru/docs/certificates-for-localhost/

devops

Docker показывает IP контейнера, а не пользователя

Это в первую очередь касается PHP проектов.

Делаем две вещи. Первое - для reverse proxy (если используется) у nginx дописываем в раздел следующее:

server {
    ...
    location / {
        ...
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        ...
    }
    ...
}

И рестартим nginx.

После этого у нас для переменной $_SERVER['HTTP_X_REAL_IP'] будет правильный IP-адрес клиента, а для $_SERVER['REMOTE_ADDR'], скорее всего, останется неправильной.

Второе, что делаем - надо прокинуть правильную переменную в fastcgi_param. Идем во внутренний nginx и исправляем конфиг:

server {
    ...
    location ~ \.php$ {
        ...
        fastcgi_param REMOTE_ADDR $http_x_real_ip;
        ...
    }
    ...
}
devops nginx php

git падает с нехваткой памяти

Когда вы видите подобное сообщение от git при пуше:

Delta compression using up to 2 threads.
warning: suboptimal pack - out of memory 
error: pack-objects died of signal 90)   
fatal: The remote end hung up unexpectedly
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '...'
fatal: write error: Bad file descriptor

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

git config --global pack.windowMemory "32m"

и попробуйте запушить еще раз.

bash copypaste devops

Логирование POST-запросов в nginx

Для разработки периодически возникает необходимость логировать запросы для того, чтобы разобраться в проблеме. Если используете nginx, то можно настроить логирование запросов на его стороне.

Для этого надо создать новый формат лога и выставить его в виртуальном хосте. Также, рекомендую выставить client_body_buffer_size побольше, т.к., если вы превысите стандартный размер в килобайт, то вместо тела запроса будет “-“.

Форматируем лог, в убунту при стандартной установке это файл /etc/nginx/nginx.conf:

# ...

http {
    # ...
    client_body_buffer_size 100K;
    client_header_buffer_size 10k;

    log_format postdata '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                '$status $body_bytes_sent "$request_body" "$http_referer" '
                '"$http_user_agent" $request_time';
    # ...
}
# ...

И выставляем в виртуальном хосте, например /etc/nginx/sites-enabled/default:

server {
    # ...
    access_log /var/log/nginx/postdata.log postdata;
    # ...
}

Проверяем, что все написали правильно и конфигурация “ок”:

nginx -t

Перезагружаем сервер:

service nginx restart

Делаем запрос и идем смотреть лог /var/log/nginx/postdata.log.

Если у вас не создался лог, проверьте, создана ли директория, где он лежит и есть ли у nginx права на запись в этой директории на этот файл.

devops nginx

Отправка почты через mail() из php

Крайне не рекомендую использовать php-функцию mail() для отправки почты. Лучше все-таки отправлять ее через smtp с возможностью настройки из приложения всех необходимых данных.

Но в случае, чтобы тот же битрикс не ругался, можно проделать это следующим образом:

1. Устанавливаем sendmail

apt install sendmail -y

2. Вносим изменения в /etc/hosts:

127.0.0.1 localhost localhost.localdomain yourdomain
...

3. Перезапускаем конфиг (на все вопросы отвечаем утвердительно):

sendmailconfig

4. Перезагружаем все:

service nginx restart
service sendmail restart
service php7.0-fpm restart

5. Готово, можно проверять:

<?php

echo  mail(
    "mymail@yandex.ru",
    "test message",
    "test message",
    "From:no-reply@gmail.com"
);

bash bitrix devops linux php

Глобально меняем ключи доступа и пароли от всех своих серверов с помощью Ansible

Если вам необходимо обновить ключи доступа и пароли на многих серверах (например, ушел какой-либо сотрудник у которого был доступ к каким-то серверам, либо просто в целях безопасности обновить надо, либо для CI, вариантов куча), то можно использовать для этого Ansible.

Создайте директорию public_keys/, где будете хранить ваш ключ и ключи ваших сотрудников. Добавьте туда все необходимые ключи, например:

Файл public_keys/crusat:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDVk9yuKpN/c1+TsM3i0YW5H1Z86dVZQvAkOAxF3VZMIS48Ng6JjTOx58/kf5Z1fjNVcxNWv0uyrARstgZTokWiNfeHGYyMR+htivsJnFHiG6i1OXUdRAfNh84EXPm0LZbvzcRm9MM36nsa5cNS4dGE8ZxObW29O....

Со всеми остальными проделайте то же самое.

Теперь создадим плейбук set_access.yml (обратите внимание на обращение к ключам из public_keys - эти ключи будут добавлены, адаптируйте под себя):

---
- hosts: all 
  remote_user: root
  vars_files: ['credentials.yml']
  tasks:
  - name: Set main authorized key and remove existent
    authorized_key:
      user: root
      state: present
      key: '{{ item }}'
      exclusive: True
    with_file:
      - ./public_keys/crusat
  - name: Set up other keys
    authorized_key:
      user: root
      state: present
      key: '{{ item }}'
    with_file:
      - ./public_keys/user1
      - ./public_keys/user2
  - name: Set root password
    user:
      name: root
      state: present
      update_password: always
      password: "{{ admin_default_password }}"
      shell: /bin/bash

Теперь надо сделать возможность задания входа по паролю (см. последнюю задачу в ansible - можно задавать для разных пользователей, просто скопируйте, сколько необходимо).

Для этого создадим файл set_access.sh:

#!/bin/bash

NEW_PASSWORD='mysuperpassword'

HASHED_PASSWORD=`python3 -c 'import crypt; print(crypt.crypt("'"$NEW_PASSWORD"'", crypt.mksalt(crypt.METHOD_SHA512)))'`

echo 'admin_default_password: '$HASHED_PASSWORD > ./credentials.yml

ansible-playbook -i inventory_hosts -l test ./set_access.yml

Здесь укажите правильный путь к инвентарю. Суть в следующем - скрипт берет пароль, хэширует его, помещает в файл credentials.yml и затем выполняет плейбук, который как раз возьмет хэшированный пароль как переменную и задаст необходимый пароль для пользователя root.

ansible bash copypaste devops

Установка бесплатного SSL-сертификата для существующего сайта (nginx)

Представим, что у вас есть сервер на Ubuntu 16.04+ и сайт на nginx с готовым конфигом, но без https. Предположим, что его домен звучит как crusat.ru. Меняйте везде на свой, когда встречаете.

Будем устанавливать сертификат от letsencrypt с помощью программы certbot .

Устанавливаем зависимости certbot:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot

Останавливаем nginx:

$ sudo service nginx stop

Устанавливаем сертификат (укажите также свою почту - туда будут приходить уведомления, когда надо продлить сертификат - этой же командой можно будет)

$ sudo certbot certonly --standalone -n --agree-tos --email crusat@yandex.ru -d crusat.ru

Если необходимо сделать один сертификат для нескольких доменов, то можно написать так:

$ sudo certbot certonly --standalone -n --agree-tos --email crusat@yandex.ru -d crusat.ru -d www.crusat.ru

Далее в конфиге nginx убрать listen 80; и добавить:

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/crusat.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/crusat.ru/privkey.pem;
server_name crusat.ru;

Обратите внимание на пути к файлам ключа и сертификата - letsencrypt их покажет после создания.

После этого можно протестировать, все ли правильно командой:

$ sudo nginx -t

Если конфигурация “ок”, то запускаем

$ sudo service nginx start
bash devops nginx

Проверка веб-ресурса на уязвимости с помощью OpenVAS

OpenVAS - это автоматизированное средство проверки серверов на уязвимости.

ВНИМАНИЕ! Вы имеете право проверять только свои серверы. Проверка чужих незаконна, т.к. это является взломом.

Самое удобное для тестирования - использовать докер. Если вы с ним еще незнакомы, то почитайте эти статьи: раз, два.

docker run -d -p 443:443 --name openvas mikesplain/openvas

Далее заходим по адресу https://localhost и жмем кнопку “Подробнее” и “Сделать исключение для этого сайта” (у него самоподписанный SSL-сертификат).

Заходим в админку (иногда приходится очень долго ждать, вплоть до 5 минут, пока все запустится):

Логин: admin
Пароль: admin

Переходим в верхнем меню в Scans -> Tasks. Слева сверху наводим на волшебную палочку (маленькая фиолетовая иконка). После этого появляется окно с просьбой ввести хост или IP-адрес. Вводим туда что-то, например, crusat.ru. После этого запускается анализ сервера на уязвимости. Это займет некоторое время, можно отслеживать прогресс в столбце “Status”.

После того, как статус сменился на “Done”, можно нажать на единичку в столбце “Reports”. После этого вы перейдете на список отчетов. В нем надо нажать в первом столбце (поле “Date”) на заголовок отчета - после этого откроется список найденных уязвимостей с отображением их критичности и описанием (по клику можно посмотреть подробности).

Также, можно скачать отчет. Для этого слева от главного заголовка “Report: Results” надо навести на стрелочку и выбрать первый пункт (“Report: Summary and Download”). Он перебросит на страницу с двумя отчетами - отфильтрованный и полный. Справа от каждого есть поле выбора (там можно выбрать, например, PDF) и зеленая стрелочка - по ней можно скачать отчет в выбранном формате.

В целом, рекомендую покопаться в интерфейсе - много интересного можно найти.

Удачи и держите свои машины в безопасности!

bash devops docker сайты

Что такое Docker и что делать, если ваша команда его уже использует?

Что такое вообще этот docker и зачем он нужен?

Он обеспечивает изоляцию выполняемых программ в нем от окружения (программного обеспечения и настроек) вашей операционной системы.

Например, вы работаете над проектом, который использует PHP версии 7. И вдруг к вам на техподдержку приходит проект, который работает максимум на PHP 5.3. Что делать? Если не использовать Docker (или подобное ПО), то вам придется иметь на вашей рабочей машине две версии PHP и разруливать их. Учитывая остальное необходимое для работы приложения ПО, система довольно быстро замусоривается и вполне могут начаться конфликты между ПО, который необходим для одного проекта и неприемлим для другого.

Вы можете рассматривать контейнер docker’а как легковесную виртуальную машину (аналог vmware, virtualbox и т.п.). Только без графического интерфейса и выполняющую определенную программу.

Некоторые термины

Проект - исходный код и конфигурации проекта, над которым вы работаете, обычно находится в одном git-репозитории.

Образ - операционная система и набор программ, которые можно использовать для создания контейнера (программистам проще представлять его как “Класс”). Примеры - Ubuntu 18.04 с установленным PHP 7.1; Debian с установленным nginx; CentOS с установленным MySQL 5.7.

Контейнер - созданный на основе образа экземпляр, может накапливать внутри себя изменения (программистам проще представлять его как “Объект, экземпляр класса”).

Какая разница между командами docker и docker-compose?

Команда docker просто выполняет команду, которая следует в параметрах, например docker run hello-world запустит образ hello-world и покажет результат его выполнения.

Команда docker-compose работет с конфигурациями (файлы формата *.yml), которые содержат инструкции для сборки проекта. Также, он может запускать несколько контейнеров сразу, а не только один как команда docker.

Для разработки обычно используется docker-compose, т.к. он позволяет удобно передавать конфигурацию сборки между разработчиками.

Я только получил проект, что делать?

Для начала надо поднять проект локально. Для этого выполняется команда:

docker-compose up

Параметр up создает необходимые для работы проекта контейнеры. Если контейнеры уже были созданы, то он запускает их.

В самом простом случае этого должно быть достаточно чтобы запустить проект и начать работу.

Что за параметр -f?

Вам могла попадаться команда вида:

docker-compose -f docker-compose-dev.yml up

Параметр -f <путь_к_файлу_yml> позволяет указать путь к файлу конфигурации для запуска проекта.

Дело в том, что когда мы не указываем этот параметр, то это равнозначно -f docker-compose.yml - т.е. это стандартный путь к файлу конфигурации.

Т.е., две следующие команды - равнозначны (делают одно и то же):

docker-compose up
docker-compose -f docker-compose.yml up

Но, возможно есть несколько файлов конфигурации (например, один запускает только базу данных - docker-compose-db.yml, другой целиком бекенд - docker-compose-backend.yml, третий проект в продакшн режиме - docker-compose-production.yml), тогда и пригождается эта команда. В ней можно указать полный путь, например, /home/user/myproject/myconfigs/my-docker-compose.yml. Его можно применять для любого из параметров (up, down, start, stop, build и т.п.). Ставится всегда перед параметром, т.е. docker-compose -f <путь> <параметр start|stop|down|up|build>.

Что за параметр -d?

Это запуск проекта в фоновом режиме.

Например:

docker-compose up -d

Поднимает проект в фоне, т.е. вы не увидите логов приложения без особых команд. Ставится всегда после параметра, т.е. docker-compose <параметр> -d.

Я закончил работу с проектом, что делать?

Можно выполнить одну из двух команд.

Эта команда просто остановит контейнеры, то есть вы сможете быстро их запустить позже (командой docker-compose start):

docker-compose stop

А эта команда остановит и удалит контейнеры проекта, то есть вы освободите место на жестком диске, но запуск контейнеров будет производится дольше:

docker-compose down

Помните, что если вы использовали особую конфигурацию для поднятия проекта (параметр -f), то его же надо использовать и для этих команд, например, docker-compose -f docker-compose-db.yml stop.

Как посмотреть, какие контейнеры сейчас запущены?

Эта команда покажет запущенные контейнеры:

docker ps

А эта все созданные контейнеры:

docker ps -a

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

devops docker

Reverse proxy на Apache 2

Внезапно, да? В 2019 то году. Ну, вдруг пригодится для Django или еще чего на каком-нибудь супер древнем или супер странном сервере:

<VirtualHost *:80>
        ServerAdmin info@example.com
        DocumentRoot /var/www/example/
        ServerName example.ru
        ErrorLog /var/log/apache2/example.error.log
        CustomLog /var/log/apache2/example.access.log common

        Alias /robots.txt /var/www/example/static/robots.txt
        Alias /favicon.ico /var/www/example/static/favicon.ico

        Alias /media/ /var/www/example/media/
        Alias /static/ /var/www/example/static/

        <Directory /var/www/example/static>
                Require all granted
        </Directory>

        <Directory /var/www/example/media>
                Require all granted
        </Directory>

        ProxyPreserveHost On
        ProxyPass / http://127.0.0.1:8000/

</VirtualHost>
devops nginx