Перейти к собственно контенту

Архив

Метка: FreeBSD

Данная статья описывает настройку Redmine+Unicorn+Nginx на ОС FreeBSD. Данные будем хранить в MySQL

Установка Web сервера

Ставим nginx
# cd /usr/ports/www/nginx
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
nginx_enable=YES

Ставим MySQL ( я выбрал MariaDB 10.1 )
# cd /usr/ports/databases/mariadb101-server
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
mysql_enable=YES
Запускаем MySQL
# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
# mysqladmin -u root password 'password'

Установка Redmine

# cd /usr/ports/www/redmine
# make config-recursive
# make install clean

Создаем пользователя и базу для redmine:
# mysql -p
CREATE DATABASE redmine CHARACTER SET utf8;
CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'PASSWORD';
GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost';

Переходим в директорию с Redmine, копируем и редактируем конфиг подключения к БД в соотвествии ранее созданного пользователя:
cd /usr/local/www/redmine/
cp config/database.yml.example config/database.yml
nano config/database.yml

Установка Unicorn:
Редактируем файл Gemfile
# ee Gemfile
и добавляем в конце
gem 'unicorn'

Выполняем команду
# bundle install --without development test

Генерируем ключи и инициализируем базу данных
# bundle exec rake generate_secret_token
# rake db:migrate RAILS_ENV=production
# rake redmine:load_default_data RAILS_ENV=production

Создаем и редактируем конфиг unicorn
# touch config/unicorn.rb
# ee config/unicorn.rb

и приводим его к такому виду
worker_processes 3 # Numbers CPU + 1
working_directory "/usr/local/www/redmine/"
preload_app true
timeout 300
listen "/usr/local/www/redmine/tmp/sockets/unicorn.sock", :backlog => 64
pid "/usr/local/www/redmine/tmp/pids/unicorn.pid"
stderr_path "/usr/local/www/redmine/log/unicorn.stderr.log"
stdout_path "/usr/local/www/redmine/log/unicorn.stdout.log"

before_fork (далее…)

Данная статья описывает настройку почтового сервера на ОС FreeBSD ( у меня стоит версия 11.1-STABLE ) на базе Exim в качестве SMTP сервера с поддержкой SpamAssasin и ClamAV, Dovecot в качестве POP3 / IMAP сервера, поддержкой SSL и веб интерфейсами Vexim для упрвавления ящиками и Roundcube в качестве почтового веб клиента. Данные будем хранить в MySQL

Установка Web сервера и сервера баз данных

Ставим nginx
# cd /usr/ports/www/nginx
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
nginx_enable="YES"

Ставим MySQL ( я выбрал MariaDB 10.1 )
# cd /usr/ports/databases/mariadb101-server
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
mysql_enable="YES"
Запускаем MySQL
# /usr/local/etc/rc.d/mysql-server start

Задаем пароль для root в MySQL ( в скобках сам пароль )
# mysqladmin -u root password 'password'

Ставим PHP ( отмечаем FPM )
# cd /usr/ports/lang/php71
# make config-recursive
# make install clean

в /etc/rc.conf добавляем:
php_fpm_enable="YES"

Приводим файл /usr/local/etc/php-fpm.conf к такмоу виду:
[global]
pid = run/php-fpm.pid
error_log = /var/log/php-fpm.log
events.mechanism = kqueue
include=/usr/local/etc/php-fpm.d/*.conf

Редактируем файл пула
# ee /usr/local/etc/php-fpm.d/www.conf
и приводим к такому виду
[www]
user = www
group = www
listen = /tmp/www.sock
listen.backlog = -1
listen.owner = www
listen.group = www
listen.mode = 0666
pm.status_path = /status
ping.path = /ping
pm = dynamic
pm.max_children = 5
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 5
pm.max_requests = 5000
security.limit_extensions = .php
chdir = /usr/local/www/
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_value[open_basedir] = /usr/local/www:/tmp:/usr/local/share/pear:/usr/local/mail:/var/www
php_admin_value[error_log] = /usr/local/www/logs/php-fpm-error.log
php_admin_value[memory_limit] (далее…)

В дополнение к статье Собственный Dynamic DNS сервер на базе Bind решил написать статью, для тех у кого есть домен c использованием Clouflare.com. В настройках CF получаем API Key. Допустим zone называется deathstar.name , мне нужно было для домашнего файлохранилища как и в предыдущей статье менять IP по крону ( метод получения внешнего немного изменен, но можно и использовать метод с предыдущей статьи )

Скрипт находится тут

ID всех записей можно узнать командой:

curl https://www.cloudflare.com/api_json.html   -d 'a=rec_load_all'   -d 'tkn=ВАШ API ключ'   -d 'email=deathstar@deathstar.name'   -d 'z=deathstar.name'

тут находим запись netdisk.deathstar.name и левее названия будет rec_id. Ставим в крон аналогично предыдущей статьи и радуемся.

В дополнение к этой статье я напишу как установить Redmine и при необходимости перенести данные на сервер с ОС CentOS 6.5 и панелью ISPmanager Lite.

У нас имеется один сервер с рабочим Redmine и второй с ISPmanager Lite на котороый и будет делать перенос.

1) Ставим пакеты для сборки сорцов:

# yum install gcc-c++ patch readline readline-devel zlib zlib-devel
# yum install libyaml-devel libffi-devel openssl-devel make
# yum install bzip2 autoconf automake libtool bison iconv-devel mysql-devel

2) Устанавливаем RVM ( Ruby Version Manager ):

# curl -L get.rvm.io | bash -s stable

3) Выставляем переменные окружения:

# source /etc/profile.d/rvm.sh

4) Ставим Ruby 1.9.3 и назначаем дефолтным в системе, проверяем работоспособность:

# rvm install 1.9.3
# rvm use 1.9.3 --default

Провеверям:

# ruby --version
ruby 1.9.3p551 (2014-11-13 revision 48407) [x86_64-linux]

5) Ставим Passenger и добавляем поддержку в Nginx:

# gem install passenger

Качаем исходный код nginx:

# cd /tmp
# wget http://nginx.org/download/nginx-1.7.9.tar.gz && tar xvzf nginx-1.7.9.tar.gz

Смотри с какими параметрами был уже бинарик у нас собран:

# nginx -V
nginx version: nginx/1.7.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
TLS SNI support enabled
configure arguments: --user=nginx --group=nginx --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --with-debug --with-http_secure_link_module --with-http_random_index_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module (далее…)

Как правило у большинства домашних провайдеров всегда динамические IP адреса, а так как порой надо было иметь доступ к внешнему жесткому диску MyBookLive из интернета — было решено поднять свой DynDNS сервер.
Нам потребуется домен и DNS сервер который будет обслуживать домен.
Про настройку Bind в качестве Master и Slave сервера писать не буду — в интернете куча статей, у меня крутится Bind99 на FreeBSD в качестве Master + Slave с двумя внешними IP адресами на сервере.

На клиенте ( у меня это MyBookLive с Debian на борту ) генерируем ключи для возможности удаленного обновления зоны:
dnssec-keygen -a hmac-md5 -b 128 -n USER deathstar

Должно получится два файла Kdeathstar.+157+03649.private и Kdeathstar.+157+03649.key
Смотрим содержимое файла Kdeathstar.+157+03649.key
deathstar# cat Kdeathstar.+157+03649.key
deathstar. IN KEY 0 3 157 OoMn1WMkDFdAH/ZZ9ip0Imm==

На сервере создаем файл /etc/namedb/keys.conf с таким содержимым ( значение для строки secret берем выше из файла ключа Kdeathstar.+157+03649.key на клиенте ):
key deathstar {
algorithm hmac-md5;
secret "OoMn1WMkDFdAH/ZZ9ip0Imm==";
};

Затем на сервере в файл /etc/namedb/named.conf впишите в самый конец файла:
include "/etc/namedb/keys.conf";

и приводим зону в этом же файле к такому состоянию:
zone "deathstar.name" {
type master;
file "/etc/namedb/master/deathstar.name";
allow-update { key deathstar; };
allow-query { any; };
notify yes;
};

и перезапускаем bind
deathstar# /etc/rc.d/named restart

На клиенте создаем скрипт такого вида:
#!/bin/sh

# SETTINGS
TTL=10
SERVER=ns1.deathstar.name
HOSTNAME=netdisk.deathstar.name.
ZONE=deathstar.name
KEYFILE="/etc/Kdeathstar.+157+03649.private"

IP_FILE="/tmp/myBookLiveIP"
OLDIP="$(grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' $IP_FILE)"
IP="$(wget -q checkip.dyndns.org -O - | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"
DNSIP="$(host -t A $HOSTNAME | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}')"

if (далее…)

В дополнение к этой статье  напишу как сделать несколько IP адресов на 3proxy:

 

Установка все как в предыдущей статье

( в CentOS : yum install -y 3proxy

Debian / Ubuntu: apt-get install 3proxy )

но конфиг уже выглядит иначе

# Name servers
nserver 8.8.8.8
nserver 8.8.4.4
# nscache is good to save speed, traffic and bandwidth
nscache 65536

# Here we can change timeout values

users user:CL:password

daemon

log /var/log/3proxy/3proxy.log
logformat «- +_L%t.%. %N.%p %E %U %C:%c %R:%r %O %I %h %T»
archiver gz /bin/gzip %F
rotate 30

auth strong
allow * * * *

proxy -n -a -p3128 -i100.218.211.82 -e100.218.211.82 -p3128
proxy -n -a -p3128 -i142.218.209.164 -e142.218.209.164 -p3128
proxy -n -a -p3128 -i167.248.229.155 -e167.248.229.155 -p3128
proxy -n -a -p3128 -i162.211.209.142 -e162.211.209.142 -p3128
proxy -n -a -p3128 -i162.213.109.133 -e162.213.109.133 -p3128
proxy -n -a -p3128 -i162.219.302.124 -e162.219.302.124 -p3128

auth strong

flush

maxconn 32
socks -n -a -p3128 -i100.218.211.82 -e100.218.211.82 -p3128
socks -n -a -p3128 -i142.218.209.164 -e142.218.209.164 -p3128
socks -n -a -p3128 -i167.248.229.155 -e167.248.229.155 -p3128
socks -n -a -p3128 -i162.211.209.142 -e162.211.209.142 -p3128
socks -n -a -p3128 -i162.213.109.133 -e162.213.109.133 -p3128
socks -n -a -p3128 -i162.219.302.124 -e162.219.302.124 -p3128

setgid 65535
setuid 65535

Надо было удалить мне файлы от poudriere, но вот не задача — система выкидывала вот такую ошибку

deathstar# rm -rf /poudriere/*
rm: /poudriere/jails/fbsd9-amd64/libexec/ld-elf32.so.1: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/libexec/ld-elf.so.1: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/libexec: Directory not empty
rm: /poudriere/jails/fbsd9-amd64/sbin/init: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/sbin: Directory not empty
rm: /poudriere/jails/fbsd9-amd64/var/empty: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/var: Directory not empty
rm: /poudriere/jails/fbsd9-amd64/usr/lib32/libthr.so.3: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/lib32/librt.so.1: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/lib32/libcrypt.so.5: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/lib32/libc.so.7: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/lib32: Directory not empty
rm: /poudriere/jails/fbsd9-amd64/usr/lib/librt.so.1: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/lib: Directory not empty
rm: /poudriere/jails/fbsd9-amd64/usr/bin/opiepasswd: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/chpass: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/login: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/crontab: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/ypchpass: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/rlogin: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/rsh: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/ypchsh: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/ypchfn: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/yppasswd: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/chfn: Operation not permitted
rm: /poudriere/jails/fbsd9-amd64/usr/bin/opieinfo: (далее…)

В дополнение к статье «Настройка OpenVPN сервера» решил написть о настройке VPN сервера , работающего по протоколу PPTP.

Имеем
# root@vpn:/root # uname -a
FreeBSD vpn.server 9.1-STABLE FreeBSD 9.1-STABLE #0 r249412M: Sat Apr 13 02:34:28 MSK 2013 root@vpn.deathstar.name:/usr/obj/usr/src/sys/GENERIC amd64
Цель – поднять VPN PPTP сервер для выхода в интернет.

1) Настройка NAT

Добавляем в файл /boot/loader.conf такие строки
ipfw_nat_load="YES"
libalias_load="YES"

Создаем правила для IPFW ( например файл /etc/firewall )
root@vpn:/root # ee /etc/firewall
#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} add check-state
${ipfw} table all flush
${ipfw} add drop tcp from 172.17.0.0/24 135,137-139 to 172.17.0.0/24 via rl0
${ipfw} add drop tcp from 172.17.0.0/24 135,137-139 to any via rl0
${ipfw} add drop udp from 172.17.0.0/24 135,137,138,139 to 172.17.0.0/24 via rl0
${ipfw} add drop udp from 172.17.0.0/24 135,137-139 to any via rl0
${ipfw} nat 1 config if re0 reset same_ports
${ipfw} add nat 1 ip from 172.17.0.0/24 to any via re0
${ipfw} add nat 1 ip from any to ВНЕШНИЙ_IP_СЕРВЕРА
${ipfw} add allow all from any to any

и делаем исполняемым
root@vpn:/root # chmod +x /etc/firewall

Для загрузки правил при старте добавляем в /etc/rc.conf
gateway_enable=YES
firewall_enable=YES
firewall_script="/etc/firewall"

и перезапускаем сервер
root@vpn:/root # reboot

2) Установка, настройка и запуск VPN PPTP сервера
root@vpn:/root # make install clean -С /usr/ports/net/mpd5 ( опции оставляем по умолчанию как есть )

Переходим в каталог с конфигами
cd /usr/local/etc/mpd5/

и создаем файл mpd.conf со следующим содержанием
root@vpn:/usr/local/etc/mpd5 # ee mpd.conf

startup:
set user foo bar admin
set user foo1 bar1
set console self 127.0.0.1 5005
set console open
set web self 0.0.0.0 5006
set web open

default:
load pptp_server

pptp_server:

set ippool add pool1 172.17.0.50 172.17.0.99 # Диапазон выдаваемых адресов

create (далее…)

Имеем
# root@vpn:/root # uname -a
FreeBSD vpn.server 9.1-STABLE FreeBSD 9.1-STABLE #0 r249412M: Sat Apr 13 02:34:28 MSK 2013 root@vpn.deathstar.name:/usr/obj/usr/src/sys/GENERIC amd64

Цель — поднять OpenVPN сервер для выхода в интернет.

1) Настройка NAT

Добавляем в файл /boot/loader.conf такие строки
ipfw_nat_load="YES"
libalias_load="YES"

Создаем правила для IPFW ( например файл /etc/firewall )
root@vpn:/root # ee /etc/firewall
#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} add check-state
${ipfw} table all flush
${ipfw} add drop tcp from 172.17.0.0/24 135,137-139 to 172.17.0.0/24 via rl0
${ipfw} add drop tcp from 172.17.0.0/24 135,137-139 to any via rl0
${ipfw} add drop udp from 172.17.0.0/24 135,137,138,139 to 172.17.0.0/24 via rl0
${ipfw} add drop udp from 172.17.0.0/24 135,137-139 to any via rl0
${ipfw} nat 1 config if re0 reset same_ports
${ipfw} add nat 1 ip from 172.17.0.0/24 to any via re0
${ipfw} add nat 1 ip from any to ВНЕШНИЙ_IP_СЕРВЕРА
${ipfw} add allow all from any to any

и делаем исполняемым
root@vpn:/root # chmod +x /etc/firewall

Для загрузки правил при старте добавляем в /etc/rc.conf
gateway_enable=YES
firewall_enable=YES
firewall_script="/etc/firewall"

и перезапускаем сервер
root@vpn:/root # reboot

2) Установка, настройка и запуск OpenVPN сервера

root@vpn:/root # make install clean -С /usr/ports/security/openvpn ( опции оставляем по умолчанию как есть )

Создаем каталоги для конфигов
root@vpn:/root # mkdir /usr/local/etc/openvpn/
root@vpn:/root # mkdir /usr/local/etc/openvpn/ccd

Копируем каталог easy-rsa в каталог конфигов OpenVPN
root@vpn:/root # cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/

Переходим в скопированный каталог
root@vpn:/root # cd /usr/local/etc/openvpn/easy-rsa/

Переходим в оболочку sh
# sh

Выполняем следующим команды:
# . ./vars
# ./clean-all
# ./build-ca

Будут спрашивать данные для сертификата, заполните их в соотвествии с вопросами.

# ./build-key-server (далее…)

После сборки мира и ядра, и попытки установить собранное добро получил ошибку:

# make installworld
ERROR: Required auditdistd user is missing, see /usr/src/UPDATING.
*** [installcheck_UGID] Error code 1

Stop in /usr/src.
*** [installworld] Error code 1

Stop in /usr/src.

Для устранения ошибки необходимо добавить в систему пользователя auditdistd:

pw useradd -n auditdistd -g audit -c "Auditdistd unprivileged user" -d /var/empty -s /usr/sbin/nologin