pgrepup: обновление postgresql 9.5 до 10

Заметки по которым делал:
https://habr.com/ru/company/true_engineering/blog/437318/
https://github.com/rtshome/pgrepup

 

Устанавливал на тестовых машинах с нуля, поэтому ставил в том числе и postgresql. Сразу скажу, что на бою пока не делал, однако тестовые машинки обновлялись на ура. Судя по ману с хабра, базу можно обновить и до 11 версии, тем не менее я тестировал только до 10.

ubuntu 16.04

Подключаем репозиторий postgresql
https://www.postgresql.org/download/linux/ubuntu/

 

postgresql 9.5

apt install postgresql-9.5 postgresql-9.5-pglogical postgresql-9.5-pgl-ddl-deploy

vim /etc/postgresql/9.5/main/postgresql.conf

listen_addresses = '*'
wal_level = logical
shared_preload_libraries = 'pglogical.so'
max_replication_slots = 2		        # или больше
max_wal_senders = 2				# или больше

vim /etc/postgresql/9.5/main/pg_hba.conf
в начало прописываем

host    all             postgres        192.168.0.0/24          trust
host    all             postgres        127.0.0.1/32            trust
host    replication     pgrepup_replication    127.0.0.1/32     md5
host    all             pgrepup_replication    127.0.0.1/32     md5
systemctl restart [email protected]

 

postgresql 10

apt install postgresql-10 postgresql-10-pglogical postgresql-server-dev-10 checkinstall

vim /etc/postgresql/10/main/postgresql.conf

wal_level = logical
shared_preload_libraries = 'pglogical.so,pgl_ddl_deploy.so'

vim /etc/postgresql/10/main/pg_hba.conf
в начало прописываем

host    all             postgres         192.168.0.0/24         trust
host    all             postgres         127.0.0.1/32           trust
host    replication     pgrepup_replication    127.0.0.1/32     md5
host    all             pgrepup_replication    127.0.0.1/32     md5

устанавливаем pgl_ddl_deploy

git clone https://github.com/enova/pgl_ddl_deploy.git
cd pgl_ddl_deploy
PATH=/usr/lib/postgresql/10/bin/:$PATH
echo $PATH
make CLANG=true
checkinstall
systemctl restart [email protected]

 

pgrepup

Ставим python2.7 и pgrepup

apt install python2.7 python-virtualenv
mkdir pgrepup
python2.7 -m virtualenv pgrepup
source pgrepup/bin/activate
pip install pgrepup

Переходим в окружение

source pgrepup/bin/activate

Настраиваем конфиг

pgrepup config

cat ~/.pgrepup

[Security]
encrypted_credentials = n
tmp_folder = /tmp
app_owner = postgres

[Source]
host = 127.0.0.1
port = 5432
connect_database = template1
user = postgres
password = 

[Destination]
host = 127.0.0.1
port = 5433
connect_database = template1
user = postgres
password =

 

Правим баги pgrepup

1. Баг первый

grep "def .*()" pgrepup/lib/python2.7/site-packages/pgrepup/commands/*.py

vim pgrepup/lib/python2.7/site-packages/pgrepup/commands/

В каждом файле *.py добавляем пропущенные **kwargs в описании функции

Пример: меняем

def setup():

на

def setup(**kwargs):

 

2. Баг второй

vim pgrepup/lib/python2.7/site-packages/pgrepup/commands/setup.py

Ищем строки с sh -c и объединяем в одну

https://github.com/rtshome/pgrepup/pull/16/commits/ef582405cce90959c751157414e3fadab183bef5

Должно получиться:

os.system('sh -c "PGPASSFILE=%(pgpass)s pg_dumpall -U %(user)s -h %(host)s -p%(port)s -s -f %(fname)s --if-exists -c"' %
'sh -c "PGPASSFILE=%(pgpass)s psql -U %(user)s -h %(host)s -p%(port)s -f %(fname)s -d postgres >/dev/null 2>&1"'

 

3. Баг третий

Если в названии базы есть — , например test-base

vim pgrepup/lib/python2.7/site-packages/pgrepup/helpers/replication.py

Ищем строку:

c.execute('GRANT CREATE ON DATABASE ' + db + ' TO ' + user)

Правим на:

c.execute('GRANT CREATE ON DATABASE ' + '"' + db + '"' + ' TO ' + user)

 

Проверяем

pgrepup check

Если есть ошибки

pgrepup fix

Ставим

pgrepup setup
pgrepup start

pgrepup status
...
Replication status 
 >  Database postgres 
 >      Replication status ..............................................replicating
 >  Database template1 
 >      Replication status ..............................................replicating
 >  Database test-base
 >      Replication status .............................................initializing
 >  Xlog difference (bytes) ...................................................68128

Когда статус initializing перейдет в replicating можно останавливать

pgrepup stop

Удаляем хвосты

pgrepup uninstall

Выходим из окружения pgrepup

deactivate

centos 7

Подключаем репозиторий postgresql
https://www.postgresql.org/download/linux/redhat/

 

postgresql 9.5

yum install postgresql95 postgresql95-devel

Инициализируем базу

/usr/pgsql-9.5/bin/postgresql95-setup initdb

База и конфиг файлы здесь, там же и логи

ls -l /var/lib/pgsql/9.5/data/

 

postgresql 10

yum install postgresql10 postgresql10-devel

Инициализируем базу

/usr/pgsql-10/bin/postgresql-10-setup initdb

База и конфиг файлы здесь, там же и логи

ls -l /var/lib/pgsql/10/data/

 

Установка pglogical
— для 9.5

curl https://access.2ndquadrant.com/api/repository/dl/default/release/9.5/rpm | bash
yum install postgresql95-pglogical

— для 10

curl https://access.2ndquadrant.com/api/repository/dl/default/release/10/rpm | bash
yum install postgresql10-pglogical

 

Устанавливаем pgl_ddl_deploy extension

git clone https://github.com/enova/pgl_ddl_deploy.git
cd pgl_ddl_deploy

— для 9.5

PATH=/usr/pgsql-9.5/bin/:$PATH
USE_PGXS=1 make
USE_PGXS=1 make install
make clean

— для 10

PATH=/usr/pgsql-10/bin/:$PATH
make CLANG=true
make install

 

Настраиваем конфиг файлы

vim /var/lib/pgsql/9.5/data/postgresql.conf

listen_addresses = '*'
wal_level = logical
shared_preload_libraries = 'pglogical.so,pgl_ddl_deploy.so'
max_replication_slots = 2		        # или больше
max_wal_senders = 2				# или больше

vim /var/lib/pgsql/9.5/data/pg_hba.conf

host    all             postgres        192.168.0.0/22          trust
host    all             postgres        127.0.0.1/32            trust
host    replication     pgrepup_replication    127.0.0.1/32     md5
host    all             pgrepup_replication    127.0.0.1/32     md5
systemctl restart [email protected]

vim /var/lib/pgsql/10/data/postgresql.conf

port = 5433
wal_level = logical
shared_preload_libraries = 'pglogical.so,pgl_ddl_deploy.so'

vim /var/lib/pgsql/10/data/pg_hba.conf

host    all             postgres         127.0.0.1/32           trust
host    all             postgres         192.168.0.0/22         trust
host    replication     pgrepup_replication    127.0.0.1/32     md5
host    all             pgrepup_replication    127.0.0.1/32     md5
systemctl restart [email protected]

Настройку pgrepup идентична тому как на убунте

oracle java8 jdk

Ввиду того, что теперь нет возможности скачать deb пакет будем его создавать.

Для начала ставим необходимые пакеты

sudo apt install java-package java-common libgtk-3-dev libcairo-gobject2

Качаем jdk архив jdk-8u211-linux-x64.tar.gz с сайта оракла https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (нужна учетка, но её можно создать)

Создаем из архива deb пакет

make-jpkg jdk-8u211-linux-x64.tar.gz

Устанавливаем

sudo dpkg -i oracle-java8-jdk_8u211_amd64.deb

Смотрим версию

java -version
java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

Если ставили до этого javа

update-alternatives --list java
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
/usr/lib/jvm/java-8-oracle/jre/bin/java
/usr/lib/jvm/java-9-openjdk-amd64/bin/java
/usr/lib/jvm/oracle-java8-jdk-amd64/jre/bin/java

Выбрать нужную

sudo update-alternatives --set java /usr/lib/jvm/oracle-java8-jdk-amd64/jre/bin/java

Tiny Tiny RSS: ошибка после обновления

Startup failed
Tiny Tiny RSS was unable to start properly. This usually means a misconfiguration or an incomplete upgrade. Please fix errors indicated by the following messages:
PHP UConverter class is missing, it's provided by the Internationalization (intl) module.
You might want to check tt-rss wiki or the forums for more information. Please search the forums before creating new topic for your question.

Лечится установкой пакета php-intl

yum install php-intl
systemctl restart php-fpm.service

LVM восстановление рейда

Есть сервер на котором выполнили vgreduce —removemissing vgraid до замены диска на новый и репейра. В итоге картинка была такая

# lvs -a -o +devices
  LV                VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
  lvraid            vgraid rwi-a-r---  9,98g                                    100,00           lvraid_rimage_0(0),lvraid_rimage_1(0),lvraid_rimage_2(0),lvraid_rimage_3(0)
  [lvraid_rimage_0] vgraid iwi-aor---  4,99g                                                     /dev/sdb(1)
  [lvraid_rimage_1] vgraid iwi-aor---  4,99g                                                     /dev/sdd(1)
  [lvraid_rimage_2] vgraid iwi-aor---  4,99g                                                     /dev/sde(1)
  [lvraid_rimage_3] vgraid vwi-a-r---  4,99g
  [lvraid_rmeta_0]  vgraid ewi-aor---  4,00m                                                     /dev/sdb(0)
  [lvraid_rmeta_1]  vgraid ewi-aor---  4,00m                                                     /dev/sdd(0)
  [lvraid_rmeta_2]  vgraid ewi-aor---  4,00m                                                     /dev/sde(0)
  [lvraid_rmeta_3]  vgraid ewi-a-r---  4,00m

Репейр не получалось сделать

# lvconvert --repair vgraid/lvraid /dev/sdf
Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
  Unable to remove 1 images:  Only 0 devices given.
  Failed to remove the specified images from vgraid/lvraid
  Failed to replace faulty devices in vgraid/lvraid.

В итоге удалось починить таким способом. Не претендую на правильность и не мне говорить, что сперва следует протестировать.

Что хочу сделать. Обмануть рейд сказав, что у него все работает, затереть на нужном диске метадату, получив статус unknown device(1) и дальше по ману восстановить рейд.

Смотрю архив бэкапов конфигов группы.

vgcfgrestore --list vgraid

Интересует вот этот

File:         /etc/lvm/archive/vgraid_00003-2109598279.vg
VG name:      vgraid
Description:  Created *before* executing 'vgreduce --removemissing vgraid'
Backup Time:  Mon Apr 15 16:01:59 2019

Делаю на всякий случай копию этого файла

cp /etc/lvm/archive/vgraid_00003-2109598279.vg /etc/lvm/archive/vgraid_00003-2109598279.vg.orig

Редактирую /etc/lvm/archive/vgraid_00003-2109598279.vg и смотрю uuid нужного диска

# vim /etc/lvm/archive/vgraid_00003-2109598279.vg

Заменяю
device = "unknown device"       # Hint only
на
device = "/dev/sdf"     # Hint only

и
flags = ["MISSING"]
на
flags = []

Создаю PV

# pvcreate --uuid "PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb" --restorefile /etc/lvm/archive/vgraid_00003-2109598279.vg /dev/sdf
  Physical volume "/dev/sdf" successfully created

Добавляю его в группу

# vgextend vgraid /dev/sdf
  Volume group "vgraid" successfully extended

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

# vgcfgrestore -f /etc/lvm/archive/vgraid_00003-2109598279.vg vgraid
  Restored volume group vgraid
# lvs -a -o +devices
   LV                VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
   lvraid            vgraid rwi-a-r---  9,98g                                    100,00           lvraid_rimage_0(0),lvraid_rimage_1(0),lvraid_rimage_2(0),lvraid_rimage_3(0)
   [lvraid_rimage_0] vgraid iwi-aor---  4,99g                                                     /dev/sdb(1)
   [lvraid_rimage_1] vgraid iwi-aor---  4,99g                                                     /dev/sdd(1)
   [lvraid_rimage_2] vgraid iwi-aor---  4,99g                                                     /dev/sde(1)
   [lvraid_rimage_3] vgraid iwi-a-r---  4,99g                                                     /dev/sdf(1)
   [lvraid_rmeta_0]  vgraid ewi-aor---  4,00m                                                     /dev/sdb(0)
   [lvraid_rmeta_1]  vgraid ewi-aor---  4,00m                                                     /dev/sdd(0)
   [lvraid_rmeta_2]  vgraid ewi-aor---  4,00m                                                     /dev/sde(0)
   [lvraid_rmeta_3]  vgraid ewi-a-r---  4,00m                                                     /dev/sdf(0)

Ура. Получилось.

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

Трем метадату. Одного килобайта достаточно для того, чтоб перевести его в состояние unknown device(1) Нужно для того, чтоб он заново не влетал в групу.

# dd if=/dev/zero of=/dev/sdf bs=512 count=2
# lvs -a -o +devices
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  LV                VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
  lvraid            vgraid rwi-a-r-p-  9,98g                                    100,00           lvraid_rimage_0(0),lvraid_rimage_1(0),lvraid_rimage_2(0),lvraid_rimage_3(0)
  [lvraid_rimage_0] vgraid iwi-aor---  4,99g                                                     /dev/sdb(1)
  [lvraid_rimage_1] vgraid iwi-aor---  4,99g                                                     /dev/sdd(1)
  [lvraid_rimage_2] vgraid iwi-aor---  4,99g                                                     /dev/sde(1)
  [lvraid_rimage_3] vgraid iwi-a-r-p-  4,99g                                                     unknown device(1)
  [lvraid_rmeta_0]  vgraid ewi-aor---  4,00m                                                     /dev/sdb(0)
  [lvraid_rmeta_1]  vgraid ewi-aor---  4,00m                                                     /dev/sdd(0)
  [lvraid_rmeta_2]  vgraid ewi-aor---  4,00m                                                     /dev/sde(0)
  [lvraid_rmeta_3]  vgraid ewi-a-r-p-  4,00m                                                     unknown device(0)

Отключаю диск

echo 1 > /sys/block/sdf/device/delete

Ищю его заново. Здесь могут быть host, host1, host2. Смотрю lsblk когда он появится. Имя диска может измениться. На тестовом сервере три раза имя менялось на новое, на боевом осталось прежним.

echo "- - -" > /sys/class/scsi_host/host2/scan

Дальше по манам.

# pvcreate /dev/sdi
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  Physical volume "/dev/sdi" successfully created
# vgextend vgraid /dev/sdi
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  Volume group "vgraid" successfully extended
# lvconvert --repair vgraid/lvraid /dev/sdi
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  Attempt to replace failed RAID images (requires full device resync)? [y/n]: y
  Faulty devices in vgraid/lvraid successfully replaced.

Смотрю процесс восстановления

# lvs -a -o +devices
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  LV                VG     Attr       LSize  Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert Devices
  lvraid            vgraid rwi-a-r---  9,98g                                    28,13            lvraid_rimage_0(0),lvraid_rimage_1(0),lvraid_rimage_2(0),lvraid_rimage_3(0)
  [lvraid_rimage_0] vgraid iwi-aor---  4,99g                                                     /dev/sdb(1)
  [lvraid_rimage_1] vgraid iwi-aor---  4,99g                                                     /dev/sdd(1)
  [lvraid_rimage_2] vgraid iwi-aor---  4,99g                                                     /dev/sde(1)
  [lvraid_rimage_3] vgraid Iwi-aor---  4,99g                                                     /dev/sdi(1)
  [lvraid_rmeta_0]  vgraid ewi-aor---  4,00m                                                     /dev/sdb(0)
  [lvraid_rmeta_1]  vgraid ewi-aor---  4,00m                                                     /dev/sdd(0)
  [lvraid_rmeta_2]  vgraid ewi-aor---  4,00m                                                     /dev/sde(0)
  [lvraid_rmeta_3]  vgraid ewi-aor---  4,00m                                                     /dev/sdi(0)

Убираю хвосты

# vgreduce --removemissing vgraid
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  WARNING: Device for PV PT8JJy-5BvS-fzCv-qO20-cwzv-FWIl-HQ83Xb not found or rejected by a filter.
  Wrote out consistent volume group vgraid

Tiny Tiny RSS на nginx, php-fpm и postgresql

Качаем tt-rss с официального сайта https://tt-rss.org/

git clone https://tt-rss.org/git/tt-rss.git /path/to/tt-rss/www

Ставим nginx

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx

Конфиг nginx

server {
    listen 443 ssl http2;
    server_name rss.site.name;
    root /path/to/tt-rss/www/;
    index index.php index.html index.htm;
    access_log /path/to/tt-rss/log/ssl-access.log main;
    error_log /path/to/tt-rss/log/ssl-error.log;

    keepalive_timeout           60;
    ssl_certificate             /etc/letsencrypt/live/rss.site.name/fullchain.pem;
    ssl_certificate_key         /etc/letsencrypt/live/rss.site.name/privkey.pem;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_dhparam                 /etc/ssl/certs/dhparam.pem;
    add_header                  Strict-Transport-Security 'max-age=604800';

    # GZIP Compression
    gzip on;
    gzip_vary on;
    gzip_min_length 10240;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";

    location ~ \.php$ {
    try_files  $uri =404;
    fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
    #fastcgi_pass    127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param DOCUMENT_ROOT /path/to/tt-rss/www/;
    fastcgi_param SCRIPT_FILENAME /path/to/tt-rss/www$fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED /path/to/tt-rss/www$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_param QUERY_STRING $query_string;
    fastcgi_param REQUEST_METHOD $request_method;
    fastcgi_param CONTENT_TYPE $content_type;
    fastcgi_param CONTENT_LENGTH $content_length;
    fastcgi_param HTTPS on;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    }
    
    location /cache {
        deny all;
    }
    
    location = /config.php {
        deny all;
    }

}

server {
     listen  443 ssl http2;
     server_name  www.rss.site.name;
     rewrite ^ https://rss.site.name$request_uri? permanent;
}

Обращаю внимание, что у меня nginx работает с php-fpm через сокет. Если у вас по tcp порту, то ставьте
fastcgi_pass 127.0.0.1:9000;

Создаем директрию для логов

mkdir /path/to/tt-rss/log

Выставляем права

chown -R nginx. /path/to/tt-rss

Ставим сертификат от LetsEncrypt

yum install certbot
certbot certonly --standalone --preferred-challenges=http -d rss.site.name

Запускаем nginx

systemctl start nginx
systemctl enable nginx

Ставим php-fpm

rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install epel-release yum-utils
yum-config-manager --enable remi-php71
yum install php71 php-intl
yum install php-fpm php-pgsql 
systemctl start php-fpm
systemctl enable php-fpm

Настроим php-fpm

yum install net-tools
netstat -tulpn | grep php-fpm

Все в порядке, повис на порту 9000. Запустим его через unix сокет. Для этого открываем конфиг /etc/php-fpm.d/www.conf и комментируем строку:

vim /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000

Вместо нее добавляем несколько других:

listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

Заодно измените пользователя, от которого будет работать php-fpm. Вместо apache укажите nginx

user = nginx
group = nginx
systemctl restart php-fpm

Открываем 80, 443 порты

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

Уже можно заходить на rss.site.name и должно перекинуть в https://rss.site.name/install/

Осталось настроить postgresql

Подключим репозитрий

yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm

Установим и запустим postgresql 11

yum install postgresql11-server
/usr/pgsql-11/bin/postgresql-11-setup initdb
systemctl start postgresql-11
systemctl enable postgresql-11

Cоздаем базу и пользователя для tt-rss

sudo -u postgres psql
postgres=# create database mydb;
postgres=# create user myuser with encrypted password 'mypass';
postgres=# grant all privileges on database mydb to myuser;

Смотрим где наша база и конфиги к ней

postgres=# SHOW config_file;
              config_file               
----------------------------------------
 /var/lib/pgsql/11/data/postgresql.conf
(1 row)

Выходим из postgresql

postgres=# \q

Правим файл /var/lib/pgsql/11/data/pg_hba.conf
Приводим его к виду

#local   all             all                                     peer
#host    all             all             127.0.0.1/32            ident
#host    all             all             ::1/128                 ident
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5

Перезапускаем postgresql

systemctl restart postgresql-11

Возвращаемся к странице настроек https://rss.site.name/install/

По идее ошибок быть не должно. Сохраняем предложенный config.php файл. Его можно будет потом поправить и настроить под себя.

Дефолтные логин и пароль: admin — password

Осталось настроить проверку новых постов. Можно запускать по крону или написать демона, как подсказывает wiki: https://git.tt-rss.org/fox/tt-rss/wiki/UpdatingFeeds

Выбираю демоном

vim /etc/systemd/system/tt-rss.service

[Unit]
Description=ttrss_backend
After=network.target mysql.service postgresql.service

[Service]
User=nginx
ExecStart=/path/to/tt-rss/www/update_daemon2.php

[Install]
WantedBy=multi-user.target
systemctl start tt-rss.service
systemctl enable tt-rss.service

Обновляю так

cp -r /path/to/tt-rss/ /path/to/tt-rss.copy
cd /path/to/tt-rss/www/
git pull origin master

Postfix: Illegal address syntax

Редко, но бывает вижу в логах постфикса такие ошибки:

Nov  6 17:22:44 mx postfix/smtpd[22836]: warning: Illegal address syntax from unknown[192.168.XX.XX] in RCPT command: <'[email protected]'>
Nov  6 17:22:45 mx postfix/smtpd[22836]: warning: Illegal address syntax from unknown[192.168.XX.XX] in RCPT command: <'[email protected]'>
Nov  6 17:22:46 mx postfix/smtpd[22836]: warning: Illegal address syntax from unknown[192.168.XX.XX] in RCPT command: <'[email protected]'>
Nov  6 17:22:48 mx postfix/smtpd[22836]: too many errors after RCPT from unknown[192.168.XX.XX]

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

В main.cf добавляем

smtpd_command_filter = pcre:/etc/postfix/command_filter.regex

в /etc/postfix/command_filter.regex

/^RCPT\s+TO:\s*<'([^[:space:]]+)'>(.*)/		RCPT TO:<$1>$2

Спасибо extremeshok.com

Dovecot deleted-to-trash plugin

По умолчанию Outlook, при подключении по IMAP, некорректно работает с Dovecot, а именно при удалении письма только перечеркивает его и не перемещает в Корзину. Этот плагин при удалении письма копирует его в Корзину. Именно копирует, потому что помеченное перечеркнутое Outlook-ом письмо останется там же где и было. Удалить же помеченные письма можно перейдя в Правка — Очистить — Очистить помеченные элементы. Так же можно настроить автоматические удаление помеченных элементов перейдя в Правка — Очистить — Параметры очистки и выставив галку рядом с «Удалять элементы при переключении папок в сети»

Вернемся к настройке плагина.

Установим необходимые пакеты

yum install autoconf automake gcc git dovecot-devel

Скачаем и установим плагин

git clone https://github.com/lexbrugman/dovecot_deleted_to_trash
cd dovecot_deleted_to_trash
make
cp lib_deleted_to_trash_plugin.so /usr/lib64/dovecot/lib95_deleted_to_trash_plugin.so

Правим /etc/dovecot/conf.d/20-imap.conf

protocol imap {
  mail_plugins = $mail_plugins imap_quota acl deleted_to_trash
}

И /etc/dovecot/conf.d/90-plugin.conf

plugin {
  deleted_to_trash_folder = Trash
}

Перезапустим Dovecot

systemctl restart dovecot.service

Спасибо https://extremeshok.com/

K3b: cdrecord has no permission to open the device

Первый раз за пару лет понадобилось записать пару файлов на CD диск и получил ошибку «cdrecord has no permission to open the device (cdrecord не имеет прав на открытие устройства)» Как оказалось лечится довольно легко. В K3b заходим в Настройки K3b — Программы — Права доступа.

Там у меня была такая картинка:

Правим права на те, что предлагает программа.

sudo chmod 4711 /usr/bin/cdrdao
sudo chmod 4711 /usr/bin/wodim

Получается так:

После этого запись идет нормально.

Zabbix 3 на nginx и php-fpm на centos 7

Идея в том, чтоб настроить веб-интерфейс zabbix 3 на nginx и php-fpm на одном сервере, а zabbix-server на другом.

Настраиваем веб-сервер

Ставим nginx

rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx

systemctl start nginx
systemctl enable nginx

Конфиг nginx

vim /etc/nginx/conf.d/zabbix.conf
server {
listen 80;

root /usr/share/zabbix;
access_log /var/log/nginx/zabbix.access.log;
server_name 172.16.16.10;

location / {
index index.php index.html index.htm;
}

location ~ \.php$ {
#fastcgi_pass 127.0.0.1:9000;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_param PHP_VALUE "
max_execution_time = 300
memory_limit = 128M
post_max_size = 16M
upload_max_filesize = 2M
max_input_time = 300
date.timezone = Europe/Moscow
always_populate_raw_post_data = -1
";
fastcgi_buffers 8 256k;
fastcgi_buffer_size 128k;
fastcgi_intercept_errors on;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
}

client_max_body_size 32m;

}

Обращаю внимание, что у меня nginx работает с php-fpm через сокет. Если у вас по tcp порту, то ставьте

fastcgi_pass 127.0.0.1:9000;

Открываем 80, 443 порты

firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload

Ставим php-fpm

rpm -ivh http://rpms.remirepo.net/enterprise/remi-release-7.rpm
yum install epel-release yum-utils
yum-config-manager --enable remi-php71

yum install php71
yum install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap

systemctl start php-fpm
systemctl enable php-fpm

Настроим php-fpm

yum install net-tools

netstat -tulpn | grep php-fpm

Все в порядке, повис на порту 9000. Запустим его через unix сокет. Для этого открываем конфиг /etc/php-fpm.d/www.conf и комментируем строку:

vim /etc/php-fpm.d/www.conf

;listen = 127.0.0.1:9000

Вместо нее добавляем несколько других:

listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0660
listen.owner = nginx
listen.group = nginx

Заодно измените пользователя, от которого будет работать php-fpm. Вместо apache укажите nginx

user = nginx
group = nginx

Ставим zabbix

rpm -ivh http://repo.zabbix.com/zabbix/3.5/rhel/7/x86_64/zabbix-release-3.5-1.el7.noarch.rpm
yum install zabbix-web-mysql

Настроим selinux
Дадим права на подключение к удаленной базе mysql

getsebool -a | grep httpd_can_network_connect_db
setsebool -P httpd_can_network_connect_db 1

Дадим возможность вебморде подключаться к серверной части

getsebool -a | grep zabbix
setsebool -P httpd_can_connect_zabbix 1

Настроим права

chown -R nginx. /etc/zabbix/web
chown -R nginx. /usr/share/zabbix

Дабы не получать ошибку

PHP message: PHP Fatal error:  Uncaught Exception: Cannot start session. in /usr/share/zabbix/include/classes/core/CSession.php:50

в /etc/php-fpm.d/www.conf ищем строку

php_value[session.save_path]    = /var/lib/php/session

И выставляем полные права на директорию /var/lib/php/session

chmod 770 /var/lib/php/session
chown :nginx /var/lib/php/session
systemctl restart php-fpm

Перезапускаем nginx

systemctl restart nginx.service

 

Настраиваем второй сервер

Ставим mariadb

yum install mariadb-server mariadb-devel
systemctl enable mariadb.service
systemctl start mariadb.service

Создадим базу и дадим права

create database zabbix;
grant all privileges on zabbix.* to 'zabbix'@'localhost' identified by 'пароль';
grant all privileges on zabbix.* to 'zabbix'@'172.16.16.10' identified by 'пароль';
flush privileges;

где 172.16.16.10 — ip адрес веб-сервера

Ставим zabbix-сервер

rpm -ivh http://repo.zabbix.com/zabbix/3.5/rhel/7/x86_64/zabbix-release-3.5-1.el7.noarch.rpm
yum install zabbix-server-mysql zabbix-agent

Указываем пароль базы

vim /etc/zabbix/zabbix_server.conf
DBPassword=пароль

Запускаем

systemctl start zabbix-server.service
systemctl enable zabbix-server.service
systemctl start zabbix-agent.service
systemctl enable zabbix-agent.service

Откроем порт mysql

firewall-cmd --add-service=mysql --permanent
firewall-cmd --reload

Открываем порты 10051, 10050, snmp

firewall-cmd --permanent --new-service=zabbix
firewall-cmd --service=zabbix --add-port=10051/tcp --permanent
firewall-cmd --service=zabbix --add-port=10050/tcp --permanent
firewall-cmd --add-service=zabbix --permanent
firewall-cmd --add-service=snmp --permanent
firewall-cmd --reload

По мотивам:
https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/
https://serveradmin.ru/ustanovka-zabbix-3-na-nginx-php-fpm/

добавляем в vim синтаксис для nginx

Качам синтаксис

mkdir -p ~/.vim/syntax/
wget http://www.vim.org/scripts/download_script.php?src_id=19394 -O ~/.vim/syntax/nginx.vim

Указываем где находятся конфиги nginx

vim ~/.vim/filetype.vim
au BufRead,BufNewFile /etc/nginx/*,/etc/nginx/conf.d/*,/usr/local/etc/nginx/* if &ft == '' | setfiletype nginx | endif