Свое собственноe облако restfs

Я тут, тихим сапом, взялся осваивать c++. В результате моих изысканий родилось что то чуть более чем «Hello world». В качестве задачки я взялся за реализацию некоего REST API для облачного хранения файликов.
Первый прототип выложил на GitHub restfs.
Умеет оно совсем не много.
— создавать пользователей
— логиниться под этим пользователем (получать сессионный токен)
— создавать и просматривать директории
— заливать и скачивать файлики.

Работает как fcgi daemon, чтобы легко прятаться за nginx. Все это работает в потоках и настраивается простым ini файлом.
Файлики хранит в Elliptics on Yandex а информацию о них хранит в PostgreSQL.

Тут описание в формате RAML о том, как это использовать.

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

И это боюсь только начало…

Postgres + GSSAPI

secure-postgresql-deployment-17-728Чисто ради интереса, решил попробовать настроить аутентификацию при подключению к PostgreSQL из ActiveDirectory развернутом на базе Samba 4.3. В общем, оказалось ничего сложного.

1. Заводим обычного пользователя в AD, под которым наш сервер PostgreSQL будет обращаться в AD, и выгружаем keytab следующим образом (из винды, которая в домене):

C:\>ktpass -princ postgresql/srv.krb.local@KRB.LOCAL -mapuser pguser -pass pgpass -out pgpass.keytab

где postgresql — имя службы (обязательно именно такое для PostgreSQL),
srv.krb.local — FQDN сервера, на котором работает PostgreSQL,
KRB.LOCAL — REALM нашего домена,
pguser — пользователь, которого мы завели в домене,
pgpass — пароль этого пользователя в домене,
pgpass.keytab — имя файла куда выгружаем все эти данные.

2. На сервере srv.krb.local необходимо установить и настроить Kerberos клиента. Если этот сервер был ранее введен в домен, то все это у Вас уже настроено. В противном случае необходимо установить пакет krb5-workstation (у Вас же там Centos, правда?) и привести файл /etc/krb5.conf примерно к такому виду:

[libdefaults]
        default_realm = KRB.LOCAL
        dns_lookup_realm = false
        dns_lookup_kdc = true

а в /etc/resolv.conf nameserver должен указывать на DNS сервер, который обслуживает Ваш AD

3. Запишем файл pgpass.keytab куда-нибудь на сервер srv.krb.local, где его сможет прочитать PostgreSQL. Я например его записал в /var/lib/pgsql/krb/pgpass.keytab и выставил права:

$ chown postgres:postgres /var/lib/pgsql/krb/pgpass.keytab
$ chmod 600 /var/lib/pgsql/krb/pgpass.keytab

4. В Файле postgresql.conf задаем параметры:

listen_addresses = '*'
krb_server_keyfile = '/var/lib/pgsql/krb/pgpass.keytab'

а в файле pg_hba.conf пишем:

host  all all 0.0.0.0/0 gss include_realm=0 krb_realm=KRB.LOCAL

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

5. Перечитываем настройки PostgreSQL:

# service postgresql-9.4 reload

6. Пользователи с именами аналогичными тем, что в домене должены обязательно присутствовать в PostgreSQL или же Вам потребуется делать map, используя файл pg_ident.conf, но я на этом останавливаться не буду, а просто создам пользователя в PostgreSQL как в домене, например, administrator.

postgres=# CREATE ROLE administrator LOGIN ;

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

$ whoami
administrator
 
$ klist 
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: administrator@KRB.LOCAL
 
Valid starting     Expires            Service principal
03/02/16 18:09:22  03/03/16 04:09:22  krbtgt/KRB.LOCAL@KRB.LOCAL
        renew until 03/03/16 18:09:16
 
$ psql -h srv.krb.local postgres
psql (9.4.6)
Введите "help", чтобы получить справку.
 
postgres=> \conninfo
Вы подключены к базе данных "postgres" как пользователь "administrator" (сервер "srv.krb.local", порт "5432").
postgres=>

В общем это все.

PGConf 2016

PostgreSQLС 3 по 5 февраля в Москве на площадке Известия Холл проходила конференция PGConf 2016.

Были различные доклады и мастер-классы, однако я хочу отметить один доклад который мне особенно понравился про резервное копирование.

Автор доклада Michael Paquier рассказал про свою разработку менеджера резервного копирования кластера PostgreSQL.

Попробую кратко описать суть, как её понял я:

Сначала делается полная резервная копия файлов кластера как это делается обычно  pg_start_backup && tar -zcf /path/to/backup.tar.gz  $PGDATA && pg_stop_backup. При этом, запоминается номер транзакции или другая отметка этого момента.

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

Все это обернуто в довольно удобную утилитку pg_arman  для сохранения и восстановления. Автор выкладывает все в GitHub. Для боевого использования оно пока не годится, зато потестировать можно.