Installing and configuring Postgresql 9.4 on Debian 8

Tags:

Install the postgresql server package:

#apt-get install postgresql-9.4

Create cluster (if it haven't created automatically):

#pg_createcluster 9.4 main --start

Next we need to allow connects from remote sources.

Edit /etc/postgresql/9.4/main/postgresql.conf and set listen_addresses to '*'.

Restart the Postgresql service:

#service postgresql Restart

Now we should create database user.

#su postgres
#psql

postgres=# CREATE USER db_user_name WITH PASSWORD 'secret_password';

Create new database and grant access to it to our user.

postgres=# CREATE DATABASE "db_name"
  WITH OWNER "db_user_name"
  ENCODING 'UTF8'
  LC_COLLATE = 'en_US.UTF-8'
  LC_CTYPE = 'en_US.UTF-8'
  TEMPLATE = template0;

Now we have database with UTF8 collation, it is time to allow connect from remote sources. Our user is the owner of the schema.

Edit /etc/postgresql/9.4/main/pg_hba.conf and add line

host    all   db_user_name    0.0.0.0/0               md5

after the line:

host    all   all             127.0.0.1/32            md5

Save file and restart the service.

Now we can connect to our server from remote computer.

git clone recursive

Tags:

В Git 2.6 для Windows появилась неприятная бага - если уровень вложенности сабмодулей больше 3х, то команда git clone --recursive падает с ошибкой при клонировании глубоко вложенных сабмодулей.

Как бороться - разбить клонирование на 3 этапа:

git clone <repo_addr>
cd <repo_dir>
git submodule update --init
git submodule foreach --recursive git submodule update --init

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

State переменные в Perl

Tags:

В Perl существует особый тип переменных под названием state.

В доке про них написано:

state declares a lexically scoped variable, just like my. However, those variables will never be reinitialized ...

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

sub count {
  state $count = 0;
  $count++;
}

Однако, есть нюанс - фраза will never be reinitialized означает что переменная действительно никогда не будет переинициализирована пока существует родительский скрипт. И это дает нам вот такую замечательную граблю на которую можно ненароком наступить:

Объявляем пакет:

package MyTestState;

use strict;
use feature 'state';

sub new {
  bless {}, shift;
}

sub count {
  state $count = 0;
  $count++;
}

1;

И саму программу:

use lib 'lib';
use v5.18;
use MyTestState;

my $mystate =  MyTestState->new();

for (0..10) {
  my $counter = $mystate->count();
  say "Counter [$counter]";
}

Вывод ожидаем:

Counter [0]
Counter [1]
Counter [2]
...
Counter [10]

А теперь добавляем такой код:

undef $mystate;

say "next object!=======";

my $mystate1 = MyTestState->new();
for (0..10) {
  my $counter = $mystate1->count();
  say "Counter [$counter]";

}

Здесь мы удаляем старый объект со счетчиком и создаем новый. Логично предположить что счетчик пойдет заново, но на самом деле нет. Не смотря на то что мы удалили старый объект и создали новый, переменная со счетчиком никуда не делась и не была переиницализирована! И при запуске программы мы увидим:

Counter [0]
Counter [1]
Counter [2]
...
Counter [10]
next object!
Counter [11]
Counter [12]
Counter [13]
...
Counter [20]
Counter [21]

Так что слово newer в документации действительно значит "никогда пока жив инстанс интерпретатора запустивший скрипт".

Spotlight does not search for

Tags:

If your Spotlight does not search for some files or applications:

The first of all - restart the Spotlight:

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

If it have no effect - remove Spotlight's index:

Stop Spotlight service:

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

Remove Spotlight index folder:

sudo rm -rf /.Spotlight-V100

Run service:

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist

After reindex - everything should work well.

Installing Redmine from Ubuntu package

Tags:

Устанавливаем Redmine из пакетов в Ubuntu. Версия в пакетах не самая свежая, зато никаких заморочек с настройкой руби и интеграцией с БД.

В качестве БД будем использовать Postgresql, на фронтенде Nginx, все совершенно стандартно.

Устанавливаем все нужные пакеты:

sudo apt install redmine redmine-psql postgresql nginx thin

В вопросах инсталятора redmine выбираем бэкэнд psql, в следующем диалоге на запрос автоматической конфигурации БД говорим yes, оставляем поле пароля пустым. Пароль будет сгенерирован автоматически и данные зальются в схему redmine_default.

Redmine установится в /usr/share/redmine, его конфигурация будет лежать в /etc/redmine но сейчас там нет ничего интересного для нас.

Проверим что все работает корректно. Идем в /usr/share/redmine и запускаем Redmine с помощью webrick

 ruby script/rails server webrick -e production

Демон запустится на 0.0.0.0:3000 заходим, проверяем что все работает, гасим демона.

Теперь настроим thin для запуска Redmine. Создадим конфиг файл:

sudo thin config --config /etc/thin1.9.1/redmine.yml --chdir YOUR_REDMINE_DIRECTORY     --environment production --address 0.0.0.0 --port 3030     --daemonize --log /var/log/thin/redmine.log --pid /var/run/thin/redmine.pid     --user www-data --group www-data --servers 1 --prefix YOUR_PREFIX

YOUR_REDMINE_DIRECTORY - путь к директории куда установлен Redmine, в нашем случае /usr/share/redmine. YOUR_PREFIX - префикс в адресе по которому будет доступен Redmine, для установки в http://your_redmine.domain/ пишем /. Если хотим чтобы доступ был через http://your_redmine.domain/redmine пишем redmine.

Команда для установки в корень по умолчанию будет выглядеть как-то так:

sudo thin config --config /etc/thin1.9.1/redmine.yml --chdir /usr/share/redmine --environment production --address 0.0.0.0 --port 3030 --daemonize --log /var/log/thin/redmine.log --pid /var/run/thin/redmine.pid --user www-data --group www-data --servers 1 --prefix /

Теперь настроим Nginx.

Создадим файл /etc/nginx/sites-available/redmine со следующим содержимым:

upstream redmine_thin_servers {
    server 0.0.0.0:3030;
}

server {

  listen   80; ## listen for ipv4

  server_name your_redmine.domain;
  server_name_in_redirect off;

  proxy_set_header        Host $http_host;
  proxy_set_header        X-Real-IP $remote_addr;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header        X-Forwarded-Proto $scheme;
  proxy_redirect off;

  location / {
    root   /usr/share/redmine/public;

    error_page 404  404.html;
    error_page 500 502 503 504  500.html;

    try_files $uri/index.html $uri.html $uri @redmine_thin_servers;
  }

  location @redmine_thin_servers {
    proxy_pass http://redmine_thin_servers;
  }
}

Создадим на него ссылку в /etc/nginx/sites-enabled

cd /etc/nginx/sites-enabled
sudo ln -s ../sites-available/redmine

Запустим thin и nginx

sudo service thin start
sudo service nginx start

После этого redmine должен быть доступен на 80м порту вашего домена. Если там 502 или еще чего - значит конфигурация отличается и надо смотреть какую ошибку пишут в логах thin и redmine.

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

Оставим открытыми только ssh и http(80) порты

sudo apt install ufw ufw allow ssh ufw allow http ufw enable

Это установит ufw, добавит ssh и http в список разрешенных портов, заблокирует все остальные и добавит правил firewall в автозагрузку при старте системы.

Enjoy.