Skip to content

Tutoriais

Tutorial de instalação do OwnCloud 9.1 Server no Ubuntu 16.04

Introdução

O OwnCloud é um serviço que provê o armazenamento de arquivos na nuvem, assim como acontece com o DropBox, Google Drive e outros serviços.

O OwnCloud pode ser instalado em um servidor de uma rede interna de uma empresa ou organização, de forma que é possível ter um serviço de armazenamento de arquivos na nuvem ou storage privado. O OwnCloud possui uma versão gratuita e outra entreprise e na página abaixo você encontra a lista de funcionalides:

https://owncloud.org/features/

Ele é extremamente leve (pode ser instalado numa máquina com 512 MB de memória RAM). Na página abaixo, você encontra a lista de requisitos de hardware e software.

https://doc.owncloud.org/server/9.1/admin_manual/installation/system_requirements.html

Para a realização deste tutorial foi utilizada uma máquina virtual com as seguintes características:
  • S.O: Ubuntu Server 16.04 64 bits
  • Memória: 2 GB
  • CPU: 1 vCPU com clock acima de 2.0 GHz
  • HD: 80 GB

Instalando o OwnCloud

1) Instale as dependências do serviço:

sudo su
add-apt-repository -y ppa:ondrej/php
apt update
apt -y install apache2 mariadb-server libapache2-mod-php5.6 php5.6-gd php5.6-json  php5.6-mysql php5.6-curl php5.6-intl php5.6-mcrypt php5.6-imagick unzip php5.6-zip php5.6-xml php5.6-mbstring php5.6-ldap

2) Crie um banco de dados, usuário e senha para ser usado pelo OwnCloud. Use os comandos baixo. Por padrão a senha do root do MySQL/MariaDB é vazia, então basta pressionar ENTER.

mysql -u root -p
MariaDB [(none)]> create database owncloud_db character set utf8;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO owncloud_user@localhost
IDENTIFIED BY 'SUA_SENHA' WITH GRANT OPTION;
MariaDB [(none)]> quit

Onde:

owncloud_db => nome do banco de dados a ser usado pelo OwnCloud.

owncloud_USER => nome do usuário do banco de dados.

SUA_SENHA => deve ser trocada pela senha que você desejar.
3) Baixe os arquivos fontes do OwnCloud em https://download.owncloud.org/community/owncloud-latest.zip

mkdir /install
cd /install
wget https://download.owncloud.org/community/owncloud-latest.zip

4) Descompacte os arquivos do Owncloud com o comando abaixo.

unzip owncloud-latest.zip

5) Use os comandos abaixo para copiar os arquivos do Owncloud para o Apache.

cp -R owncloud /var/www/html/
chown -R www-data:www-data /var/www/html/owncloud/
chmod -R +x /var/www/html/owncloud/

6) Neste tutorial, o diretório (ou storage) a ser gerenciado pelo Owncloud para armazenar os arquivos dos usuários, ficará em /files/owncloud. Foi necessário criar o diretório e definir as permissões adequadas com os comandos abaixo.

mkdir -P /files/owncloud
chown -R www-data:www-data /files/owncloud/

Aplicando configurações de segurança no MySQL/MariaDB

1) Aplique configurações de segurança no MySQL/MariaDB executando o comando abaixo.

mysql_secure_instalation

Será pedido a senha de root do MySQL/MariaDB. Apenas pressione ENTER para informar que a senha está vazia ou informe a senha do root (se em algum momento anterior você já tiver definido).

Continuando, defina a nova senha do usuário root do MySQL/MariaDB. Depois responda adequadamente as perguntas seguintes para remover o acesso anônimo ao banco, desabilite o acesso remoto com o usuário root do banco e remova o banco de teste.

Aplicando configurações de segurança no Apache

1) Edite o arquivo /etc/apache2/conf-enabled/security.conf e altere os valores dos parâmetros para deixá-los conforme mostrado abaixo:

ServerTokens Prod
ServerSignature Off
TraceEnable Off

2) Ainda neste arquivo, descomente as linhas abaixo para evitar vulnerabilidades de segurança.

Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Header set X-XSS-Protection: "1;mode=block"
Header set X-Robots-Tag: "none"

3) Habilite os módulos a2enmod headers e env para aplicar as configurações realizadas no ponto 2.

a2enmod headers
a2enmod env
service apache2 restart

4) Desabilite o módulo de indexação de arquivos de um diretório e o módulo cgid.

a2dismod -f autoindex
a2dismod -f cgid
service apache2 restart

5) Habilite os módulos abaixo.

a2enmod -f ssl
a2enmod -f rewrite
a2enmod dir
a2enmod mime
service apache2 restart

6) Se você não tiver um certificado, pode criar um sendo auto-assinado e com duração de 10 anos. Faça isso usando a sequencia de comandos abaixo.

mkdir /etc/apache2/ssl
cd /etc/apache2/ssl
openssl req -newkey rsa:1024 -x509 -nodes -out server.pem -keyout server.pem -days 3650

Durante a execução do comando acima, serão feitas as seguintes perguntas:

Sigla do país em que está o servidor: BR
Nome do estado em que está o servidor: Estado
Nome da cidade em que está o servidor: Cidade
Nome da empresa ou organização: Empresa LTDA
Nome do setor da empresa ou organização: Redes
Nome do servidor. Exemplo: box.empresa.com.br
Para as demais perguntas, basta pressionar ENTER para deixar em branco.

7) Mova os arquivos padrão do Apache para o diretório /root.

mv  /etc/apache2/sites-available/000-default.conf /root/
mv  /etc/apache2/sites-available/default-ssl.conf /root/

 

8) Crie o arquivo novo /etc/apache2/sites-available/000-default.conf com o seguinte conteúdo.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/owncloud

    <Directory />
        Deny from all
    </Directory>
    <Directory /var/www/html/owncloud>
        Options +FollowSymLinks
        AllowOverride None
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/owncloud
    <Directory />
        Deny from all
    </Directory>

    #********* BEGIN *********#
    Alias /owncloud /var/www/html/owncloud
    <Directory /var/www/html/owncloud>
        Options +FollowSymLinks
        AllowOverride None
        Allow from all
    </Directory>
    #***********************************#

    ErrorLog /var/log/apache2/error.log
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined
    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/server.pem
    SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SSLv3:!SSLv2:!TLSv1:!TLSv1.1SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
<IfModule mod_rewrite.c>
    <IfModule mod_ssl.c>
        <LocationMatch /owncloud>
            RewriteEngine on
            RewriteCond %{HTTPS} !^on$ [NC]
            RewriteRule . https://ip-servidor/%{REQUEST_URI} [L]
        </LocationMatch>
        <LocationMatch />
            RewriteEngine on
            RewriteCond %{HTTPS} !^on$ [NC]
            RewriteRule . https://ip-servidor/%{REQUEST_URI} [L]
        </LocationMatch>
    </IfModule>
</IfModule>
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains"
  Header always set X-XSS-Protection "1; mode=block"
</IfModule>

9) Depois disso, reinicie o Apache com o comando abaixo.

service apache2 restart

10) Altere o valor dos parâmetros upload_max_filesize e post_max_size no arquivo de configuração do PHP, que fica em: /etc/php/5.6/apache2/php.ini

Antes:

upload_max_filesize = 2M
post_max_size = 8M

Depois:

upload_max_filesize = 5G
post_max_size = 5G

Depois disso, reinicie o Apache com o comando abaixo.

service apache2 restart

11) Edite o arquivo de configuração do MariaDB, que fica em: /etc/mysql/mariadb.conf.d/50-server.cnf e altere o parâmetro abaixo:

Antes:
max_allowed_packet = 1M
Depois:
max_allowed_packet = 5G
Depois reincie o MariaDB com o comando:
service mysql restart

12) Acesse a página de instalação do OwnCloud em: https://ip-servidor/owncloud e preencha os campos iniciais conforme mostrado na figura abaixo.

owncloud

Para aprender mais sobre a interface Web e configurar o OwnCloud, veja as páginas abaixo.

https://doc.owncloud.org/server/9.1/user_manual/webinterface.html

https://doc.owncloud.org/server/9.1/user_manual/files/index.html

https://doc.owncloud.org/server/9.1/admin_manual/maintenance/backup.html

https://doc.owncloud.org/server/9.1/admin_manual/configuration_server/harden_server.html

https://doc.owncloud.org/server/9.1/admin_manual/configuration_server/config_sample_php_parameters.html

13) Para instalar as aplicações clientes, acesse a página abaixo.

https://owncloud.org/install/#install-clients

Fonte:
https://doc.owncloud.org/server/9.1/admin_manual/installation/source_installation.html
https://doc.owncloud.org/server/9.1/admin_manual/configuration_server/index.html

Dicas de segurança no Apache:
http://labs.siteblindado.com/2015/07/http-security-headers-guia-definitivo.html
http://blog.conviso.com.br/aumentando-a-seguranca-das-aplicacoes-com-headers-http-de-seguranca/
https://kb.sucuri.net/warnings/hardening/headers-x-xss-protection
https://www.keycdn.com/blog/http-security-headers/
https://scotthelme.co.uk/hardening-your-http-response-headers/
http://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html

Instalação e configuração do Taiga no Ubuntu Server 16.04/14.04

Informações Gerais

O Taiga é uma plataforma de gerenciamento de projetos para desenvolvedores ágeis, designers e gerentes de projeto que querem uma bela ferramenta que torna o trabalho verdadeiramente agradável.

Mais informações sobre o Taiga podem ser obtidas nas URLs abaixo:

http://taiga.pm

http://taiga.io 

Neste tutorial foi utilizada uma máquina virtual que executa o Ubuntu Server 16.04 ou 14.04 64 bits e o idioma do S.O é inglês (UTF8-US). O endereço do servidor no DNS interno é server.domain.com.br.

Instalando as dependências do Taiga

Crie o usuário taiga e acesse o diretório dele.

sudo adduser taiga
sudo addgroup admin
sudo adduser taiga admin
su taiga
cd /home/taiga

OBS.: Defina uma senha para o usuário Taiga e lembre-se dela para adicionar num arquivo de configuração mais adiante.

Para instalar o Taiga e as dependências foram executados os comandos abaixo.

sudo apt-get install -y build-essential binutils-doc autoconf flex bison libjpeg-dev libfreetype6-dev \
zlib1g-dev libzmq3-dev libgdbm-dev libncurses5-dev automake libtool libffi-dev curl git tmux gettext \
curl openssh-server ca-certificates postfix nginx python3 python3-pip python-dev python3-dev \
python-pip virtualenvwrapper libxml2-dev libxslt-dev libxslt1-dev python-lxml python-virtualenv \
openssl

Instalando e configurando o PostgreSQL

Antes de iniciar a instalação do Taiga, instale o PostgreSQL 9.5 com os comandos abaixo.

No Ubuntu 16.04:

sudo echo "deb http://apt.postgresql.org/pub/repos/apt/ xenial-pgdg main" > /etc/apt/sources.list.d/pgdg.list

No Ubuntu 14.04:

sudo echo "deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main" > /etc/apt/sources.list.d/pgdg.list

Nas duas versões do Ubuntu:

sudo wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql-9.5 postgresql-contrib-9.5 postgresql-doc-9.5 postgresql-server-dev-9.5

Edite o arquivo /etc/postgresql/9.5/main/pg_hba.conf e configure o arquivo como mostrado abaixo.

Antes:

local     all       postgres      peer 
local     all       all          peer 
host     all      127.0.0.1/32  md5 
host     all      ::1/128           md5
 Depois:

local     all       postgres         trust 
local     all       all             trust 
host    all       127.0.0.1/32     trust 
host     all      ::1/128               trust

Outro arquivo que precisa ser editado é o /etc/postgresql/9.5/main/postgresql.conf conforme mostrado abaixo.

Antes:

#listen_addresses = 'localhost'
port = 5432

Depois:

listen_addresses = 'localhost'
port = 5432

Depois de alterar estes arquivos é preciso reiniciar o PostgreSQL para aplicar as configurações realizadas. Faça isso usando o comando abaixo.

sudo service postgresql restart

Crie o banco de dados e o usuário do banco a ser utilizado pelo Taiga.

sudo -u postgres createuser -a -d -E -P taiga
sudo -u postgres createdb taiga -O taiga

OBS.: Defina uma senha para o usuário Taiga. Ela pode ser diferente da senha do usuário taiga do sistema operacional. Lembre-se dela para adicionar num arquivo de configuração mais adiante.

Instalando e Configurando o Taiga-Back

Execute os comandos abaixo para criar o ambiente a ser usado na instalação e funcionamento do taiga-back.

source "/usr/share/virtualenvwrapper/virtualenvwrapper.sh"
sudo mkdir /opt/virtual_env/
export WORKON_HOME="/opt/virtual_env/"
sudo chown -R taiga:taiga /opt/virtual_env/

Baixe e instale o taiga-back com os comandos abaixo.

cd /home/taiga
git clone https://github.com/taigaio/taiga-back.git taiga-back
cd taiga-back
git checkout stable

No Ubuntu 16.04:

mkvirtualenv -p /usr/bin/python3.5 taiga
pip install -r requirements.txt

No Ubuntu 14.04:

mkvirtualenv -p /usr/bin/python3.4 taiga
pip install -r requirements.txt

Popule o banco de dados do taiga-back.

python manage.py migrate --noinput
python manage.py loaddata initial_user
python manage.py loaddata initial_project_templates
python manage.py loaddata initial_role
python manage.py compilemessages
python manage.py collectstatic --noinput

Crie o arquivo de configuração /home/taiga/taiga-back/settings/local.py com o conteúdo abaixo.

from .common import *

MEDIA_URL = "https://server.domain.com.br/media/"
STATIC_URL = "https://server.domain.com.br/static/"
ADMIN_MEDIA_PREFIX = "https://server.domain.com.br/static/admin/"
SITES["front"]["scheme"] = "https"
SITES["front"]["domain"] = "server.domain.com.br"

DATABASES = {
 'default': {
 'ENGINE': 'django.db.backends.postgresql',
 'NAME': 'taiga',
 'USER': 'taiga',
 'PASSWORD': 'PASSWORD_DB',
 'HOST': 'localhost',
 'PORT': '5432',
 }
}
SECRET_KEY = "taiga"

DEBUG = False
TEMPLATE_DEBUG = False
PUBLIC_REGISTER_ENABLED = True

ADMINS = (
 ("Admin", "yourlogin@domain.com.br"),
)
DEFAULT_FROM_EMAIL = "taiga@server.domain.com.br"
SERVER_EMAIL = DEFAULT_FROM_EMAIL

# Uncomment and populate with proper connection parameters
# for enable email sending. EMAIL_HOST_USER should end by @domain.tld
#EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
#EMAIL_USE_TLS = False
#EMAIL_HOST = "localhost"
#EMAIL_HOST_USER = "taiga"
#EMAIL_HOST_PASSWORD = "PASSWORD_S.O"
#EMAIL_PORT = 25

# Uncomment and populate with proper connection parameters
# for enable github login/singin.
#GITHUB_API_CLIENT_ID = "yourgithubclientid"
#GITHUB_API_CLIENT_SECRET = "yourgithubclientsecret"

Instalando e Configurando o Taiga-Frontend (interface web)

Execute os comandos abaixo para instalar a interface web do Taiga.

cd /home/taiga
git clone https://github.com/taigaio/taiga-front-dist.git taiga-front-dist
cd taiga-front-dist
git checkout stable

Crie o arquivo /home/taiga/taiga-front-dist/dist/conf.json com o conteúdo abaixo.

{
 "api": "https://server.domain.com.br/api/v1/",
 "eventsUrl": null,
 "eventsMaxMissedHeartbeats": 5,
 "eventsHeartbeatIntervalTime": 60000,
 "debug": false,
 "debugInfo": false,
 "defaultLanguage": "en",
 "themes": ["taiga"],
 "defaultTheme": "taiga",
 "publicRegisterEnabled": true,
 "feedbackEnabled": true,
 "privacyPolicyUrl": null,
 "termsOfServiceUrl": null,
 "maxUploadFileSize": null,
 "contribPlugins": []
}

Configurando o serviço Circus

Execute os comandos abaixo para instalar o circus.

cd /home/taiga
sudo pip2 install circus
mkdir /home/taiga/conf/ /home/taiga/logs/

Crie o arquivo /home/taiga/conf/circus.ini com o seguinte conteúdo.

[circus]
check_delay = 5
endpoint = tcp://127.0.0.1:5555
pubsub_endpoint = tcp://127.0.0.1:5556
statsd = true

[watcher:taiga]
working_dir = /home/taiga/taiga-back
cmd = gunicorn
args = -w 3 -t 60 --pythonpath=. -b 127.0.0.1:8001 taiga.wsgi
uid = taiga
numprocesses = 1
autostart = true
send_hup = true
stdout_stream.class = FileStream
stdout_stream.filename = /home/taiga/logs/gunicorn.stdout.log
stdout_stream.max_bytes = 10485760
stdout_stream.backup_count = 4
stderr_stream.class = FileStream
stderr_stream.filename = /home/taiga/logs/gunicorn.stderr.log
stderr_stream.max_bytes = 10485760
stderr_stream.backup_count = 4

[env:taiga]
PATH = /opt/virtual_env/taiga/bin:$PATH
TERM=rxvt-256color
SHELL=/bin/bash
USER=taiga
LANG=en_US.UTF-8
HOME=/home/taiga
#No Ubuntu 16.04
PYTHONPATH=/opt/virtual_env/taiga/lib/python3.5/site-packages
#No Ubuntu 14.04 
#PYTHONPATH=/opt/virtual_env/taiga/lib/python3.4/site-packages

No Ubuntu 16.04

Crie o arquivo /lib/systemd/system/circus.service com o seguinte conteúdo.

[Unit]
Description=Job that runs the circus daemon
After=syslog.target network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/circusd /home/taiga/conf/circus.ini

[Install]
WantedBy=multi-user.target

No Ubuntu 14.04:

Crie o arquivo /etc/init/circus.conf com o seguinte conteúdo.

start on filesystem and net-device-up IFACE=lo
stop on runlevel [016]

respawn
exec /usr/local/bin/circusd /home/taiga/conf/circus.ini

Inicie o serviço circus com o serguinte comando.

sudo service circus start

Configurando o serviço Nginx

Crie a chave de criptografia 4096 bits para ser usado no SSL.

cd /etc/ssl
sudo openssl dhparam -out dhparam.pem 4096

OBS.: A execução do comando acima pode demorar algumas horas ou até um dia inteiro. O jeito é ter muuuuuita paciência.

Para a execução deste tutorial, foi criado um certificado auto-assinado com validade de 10 anos para ser usado pelo Taiga. Abaixo estão os comandos.

sudo mkdir -p /etc/ssl/certs
sudo openssl genrsa -des3 -out /etc/ssl/certs/server.key 2048 
sudo openssl req -new -key /etc/ssl/certs/server.key -out /etc/ssl/certs/server.csr 
sudo cp -v /etc/ssl/certs/server.{key,original} 
sudo openssl rsa -in /etc/ssl/certs/server.original -out /etc/ssl/certs/server.key 
sudo rm -v /etc/ssl/certs/server.original 
sudo openssl x509 -req -days 3650 -in /etc/ssl/certs/server.csr -signkey /etc/ssl/certs/server.key -out /etc/ssl/certs/server.crt
sudo rm -v /etc/ssl/certs/server.csr

Crie o arquivo /etc/nginx/sites-available/taiga com o seguinte conteúdo.

server {
 listen 80 default_server;
 server_name server.domain.com.br;
 return 301 https://$server_name$request_uri;
}

server {
 listen 443 ssl default_server;
 server_name server.domain.com.br;

large_client_header_buffers 4 32k;
 client_max_body_size 50M;
 charset utf-8;

index index.html;

# Frontend
 location / {
 root /home/taiga/taiga-front-dist/dist/;
 try_files $uri $uri/ /index.html;
 }

# Backend
 location /api {
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Scheme $scheme;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://127.0.0.1:8001/api;
 proxy_redirect off;
 }

location /admin {
 proxy_set_header Host $http_host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Scheme $scheme;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_pass http://127.0.0.1:8001$request_uri;
 proxy_redirect off;
 }

# Static files
 location /static {
 alias /home/taiga/taiga-back/static;
 }

# Media files
 location /media {
 alias /home/taiga/taiga-back/media;
 }

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
 add_header Public-Key-Pins 'pin-sha256="klO23nT2ehFDXCfx3eHTDRESMz3asj1muO+4aIdjiuY="; pin-sha256="633lt352PKRXbOwf4xSEa1M517scpD3l5f79xMD9r9Q="; max-age=2592000; includeSubDomains';

ssl on;


 ssl_certificate /etc/ssl/certs/server.crt;
 ssl_certificate_key /etc/ssl/certs/server.key;
#ssl_trusted_certificate /etc/ssl/certs/ca.crt;
 ssl_session_timeout 5m;
 ssl_protocols TLSv1.2;
 ssl_prefer_server_ciphers on;
 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:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
 ssl_session_cache shared:SSL:10m;
 ssl_dhparam /etc/ssl/dhparam.pem;
 ssl_stapling on;
 ssl_stapling_verify on;
}

Remova o site padrão do nginx e habilite a configuração do site do taiga.

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/taiga /etc/nginx/sites-enabled/taiga

Teste a configuração do nginx

sudo nginx -t

Se o resultado do comando anterior for igual ao que está abaixo, então a configuração está certa.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Reinicie o serviço nginx.

sudo service nginx restart

O Taiga estará acessível na URL: https://server.domain.com.br. O login padrão é admin e a senha é 123123

taiga

Fonte:

https://taigaio.github.io/taiga-doc/dist/setup-production.html

 

Customizando o Tomcat 8

Informações iniciais

Hoje (03/08/2016), a versão do Tomcat mais recente e recomendada para uso em produção é a 8.5.4, que pode ser obtida nesta página: https://tomcat.apache.org/download-80.cgi

Para usar o Tomcat 8 é necessário instalar o Java 8. O Java 8 da Oracle pode ser obtido neste link http://www.oracle.com/technetwork/java/javase/downloads/index.html e instalado no Ubuntu seguindo este tutorial: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

O Tomcat padrão contém algumas vulnerabilidades de segurança e para minimizá-las é necessário customizá-lo.

1- Foi obtido o Tomcat 8.5.4 acessando a página https://tomcat.apache.org/download-80.cgiCom isso foi baixado o arquivo apache-tomcat-8.5.4.zip no diretório /home/aecio/Downloads.

2- Descompacte o arquivo apache-tomcat-8.5.4.zip e altere o nome da pasta descompactada para tomcat8.

cd /home/aecio/Downloads
unzip apache-tomcat-8.5.4.zip
mv apache-tomcat-8.5.4/ tomcat8

3- Algumas configurações de segurança são listadas nesta página: https://www.owasp.org/index.php/Securing_tomcat

4- Mantenha comentado todos os usuários listados no arquivo tomcat8/conf/tomcat-users.xml. Isso evitará que qualquer usuário possa gerenciar o Tomcat via Web. Todas as configurações no Tomcat devem ser feitas via linha de comando ou edição de arquivos.

5- Altere o arquivo tomcat8/conf/server.xml para conter:

Antes:

<Server port="8005" shutdown="SHUTDOWN">

Depois:

<Server port="-1" shutdown="Shutd0wn-ADICIONE-OUTRA-PALAVA-DIFICIL">

6- Altere a porta padrão do HTTP de 8080 para 80 no arquivo tomcat8/conf/server.xml .

Antes:

<Connector port="8080" protocol="HTTP/1.1"

Depois:

<Connector port="80" protocol="HTTP/1.1"

7- Remova os diretórios existentes dentro de tomcat8/webapps/.

rm -rf tomcat8/webapps/docs
rm -rf tomcat8/webapps/examples
rm -rf tomcat8/webapps/host-manager
rm -rf tomcat8/webapps/manager

8- Remova o diretório tomcat8/conf/Catalina/

rm -rf tomcat8/conf/Catalina

9- Oculte a versão do Tomcat.

cd tomcat8/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
cd org/apache/catalina/util/

Edite o arquivo ServerInfo.properties e altere a seguinte linha:

Antes:

server.info=Apache Tomcat/8.5.4.0

Depois:

server.info=Apache Tomcat

Empacote o arquivo novamente.

cd /home/aecio/Downloads/tomcat8/lib
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
rm -rf org/
cd ..

10- Crie o usuario tomcat e defina uma senha difícil para ele.

sudo adduser tomcat

ou:

sudo useradd tomcat
sudo passwd tomcat

Mova o tomcat8 para o diretório /opt e aplique a permissão 700 para o usuário tomcat.

sudo mv /home/aecio/Downloads/tomcat8 /opt
sudo chmod -R 700 /opt/tomcat8
sudo chown -R tomcat:tomcat /opt/tomcat8

11- Se quiser habilitar a porta do HTTPS e usar um certificado válido emitido por uma autoridade certificadora como a GlobalSign ou outra, siga o seguintes passos:

a) Cadastre o o certificado emitido pela autoridade certificadora (no formato .pfx) num arquivo /etc/certs/keystore.jks e os certificados raíz e intermediário num arquivo/etc/certs/cacerts.jks (veja os links abaixo).

https://support.globalsign.com/customer/en/portal/articles/2121490-java-keytool—create-keystore

https://support.globalsign.com/customer/portal/articles/1352403-java-codesigning-jks-method—certificate-generation-and-installation

https://support.globalsign.com/customer/pt_br/portal/articles/1352403-assinatura-de-c%C3%B3digo-java-jks—gera%C3%A7%C3%A3o-e-instala%C3%A7%C3%A3o-de-certificado

https://support.globalsign.com/customer/pt_br/portal/articles/1223425-instalar-e-configurar-certificado-ssl—tomcat

https://docs.oracle.com/cd/E19798-01/821-1841/gjrgy/index.html

https://docs.oracle.com/cd/E19798-01/821-1751/ghlgv/index.html

Dê permissões de acesso ao usuário tomcat para o diretório /etc/certs.

sudo chmod -R 700 /etc/certs
sudo chown -R tomcat:tomcat /etc/certs

b) Habilite o HTTPS na porta 443 usando a configuração abaixo no arquivo tomcat8/server.xml. Isso dará suporte apenas ao protocolo TLS1.2 com cifras fortes.

 <Connector port="443" maxThreads="150" disableUploadTimeout="true"
 acceptCount="100" scheme="https" secure="true" clientAuth="false" 
 SSLEnabled="true" sslProtocol="TLSv1.2" sslEnabledProtocols="TLSv1.2" keyAlias="alias-cert" 
 keystoreFile="/etc/certs/keystore.jks" keystorePass="changeit" 
 keystoreType="JKS" truststoreFile="/etc/certs/cacerts.jks" 
 truststorePass="changeit" truststoreType="JKS"
 ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"
 />

Essas configurações de segurança do protocolo HTTPS foram obtidas em:

https://tomcat.apache.org/tomcat-8.0-doc/security-howto.html

https://www.owasp.org/index.php/Securing_tomcat

http://www.maximporges.com/2009/11/18/configuring-tomcat-ssl-clientserver-authentication/

Java based SSL connection to Tomcat with server and client certifications
Tomcat web application with SSL client certificates

https://blog.eveoh.nl/2014/02/tls-ssl-ciphers-pfs-tomcat/

https://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html

https://www.digicert.com/ssl-certificate-installation-tomcat.htm

https://www.mulesoft.com/tcat/tomcat-ssl

https://br.godaddy.com/help/como-gerenciar-uma-csr-e-instalar-um-certificado-ssl-no-tomcat-4x5x6x7x-5239

https://www.sslshopper.com/tomcat-ssl-installation-instructions.html

https://support.globalsign.com/customer/en/portal/articles/1223425-tomcat—install-ssl-certificate

http://www.mkyong.com/tomcat/how-to-configure-tomcat-to-support-ssl-or-https/

https://www.geocerts.com/install/tomcat

http://helpdesk.ssls.com/hc/en-us/articles/203505171-How-to-install-a-SSL-certificate-on-a-Tomcat-server

12- Crie o arquivo /etc/init.d/tomcat com o seguinte conteúdo.

----------------------------  /etc/init.d/tomcat  ------------------------
#!/bin/bash
# chkconfig: 345 88 88
# description: tomcat (TOMCAT) Tomcat

### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $local_fs $network $syslog
# Should-Start: $remote_fs $named $time
# Required-Stop: $local_fs $network $syslog
# Should-Stop: $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: TOMCAT
# Description: tomcat (TOMCAT) Tomcat
### END INIT INFO

#----------------------------------------------------
# informa se o usuario que estah rodando o comando eh root
isroot(){
MYUID=$(id | cut -d= -f2 | cut -d\( -f1)
[ $MYUID -eq 0 ] && echo YES || echo NO
}

#--------------------------------
getPID(){
#PID=$(ps ax | pgrep -fl $TOMCATEXEC  | sed "s/^ *//" | cut --field=1 --delimiter=" " | head -n1)
PID=$(ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }')
echo $PID > $PID_FILE
}

#--------------------------------
isRunning(){
local PID="$1"
[ -z "$PID" ] && return 1
ps -p $PID > /dev/null 2>&1 && return 0 || return 1
}

#--------------------------------
status(){
getPID

[ -f $PID_FILE ] || return 3
PID=$(cat $PID_FILE )

if [ -z "$PID" ]; then
   echo "[INFO] Tomcat is not running..." 
   return 1
fi
if isRunning $PID; then
   echo "[INFO] Tomcat is running: PID=$PID"
   return 0 
else
   echo "[INFO] Tomcat is not running..." 
   return 1
fi
}

#--------------------------------
stop(){

if [ ! -f $PID_FILE ]; then
   echo "[INFO] Tomcat is not running..."
   return 0
fi

PID=$(cat $PID_FILE )
[ -z "$PID" ] && return 0
if isRunning $PID ; then
   echo "[INFO] Stopping Tomcat..."
   kill -9 $PID
   sleep 2
   return 0
fi
}

#--------------------------------
start(){

if [ -f $PID_FILE ]; then
   PID=$(cat $PID_FILE )
   if [ -z "$PID" ]; then
      echo "[INFO] Starting Tomcat..."
      cd $TOMCATDIR
      $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
      cd - > /dev/null &
      getPID
      return 0
   fi

   if isRunning $PID; then
     echo "[INFO] Tomcat is already running. Use \"restart\""
     return 0
   else
     echo "[INFO] Starting Tomcat..."
     cd $TOMCATDIR
     $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
     cd - > /dev/null &
     getPID
     return 0
   fi
else
   echo "[INFO] Starting Tomcat..."
   cd $TOMCATDIR
   $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
   cd - > /dev/null &
   getPID
   return 0
fi
}

#--------------------------------
# MAIN
#--------------------------------

#-----------Variaveis
TOMCATEXEC=tomcat
TOMCATDIR=/opt/tomcat8
TOMCAT_SCRIPT_STARTUP=/opt/tomcat8/bin/startup.sh
PID_FILE=/tmp/tomcat.pid


if [ $(isroot) = NO ] ; then
        echo "[ERROR] Voce deve ser root para executar este comando."
        echo "Execute o comando \"sudo $CMDLINE\""
        exit 4
fi

# Define usage string, used in more than one place.
usage="[INFO] Usage: $0 {start|stop|restart|status}"

# Check that we have one parameter: action
if [ $# -ne 1 ] ; then
  if [ $# -lt 1 -o "$1" = "" ] ; then
    echo "[ERROR] $0: action not specified"
  else
    echo "[ERROR] $0: too many parameters"
  fi
  echo "$usage"
  exit 2
fi
action="$1"



case $action in
start)
        start
        RETURN=$?
        ;;

stop)
        stop
        RETURN=$?
        ;;
restart)
        stop
        start
        RETURN=$?
        ;;

status)
        status
        RETURN=$?
        ;;
*)
        # If we don't recognize action, consider it an invalid argument.
        # If the standard adds actions we don't support, exit should be 3 for those.
        echo "[ERROR] $0: action \"$action\" not recognized"
        echo "$usage"
        exit 3
        ;;
esac
exit $RETURN
-----------------------  end of /etc/init.d/tomcat  ----------------------

13- Dê permissão de execução ao script /etc/init.d/tomcat.

sudo chmod 755 /etc/init.d/tomcat
sudo chown root:root /etc/init.d/tomcat

14- Habilite a inicialização do Tomcat no boot do Sistema Operacional.

No Debian/Ubuntu:

sudo update-rc.d -f tomcat defaults

No CentOS/RedHat 6.x:

sudo chkconfig --add /etc/init.d/tomcat
sudo chkconfig tomcat on

15- Inicie o Tomcat com o comando abaixo.

sudo /etc/init.d/tomcat start

 

Cluster Ativo/Passivo com PostgreSQL 9.3, Red Hat 6, pcs, Pacemaker, Corosync e DRBD

Introdução

Para a execução deste tutorial foram criadas duas máquinas virtuais com as configurações abaixo.
  • Processador: 1 vCPU com clock acima de 2.0 GHz.
  • Memória: 1 GB.
  • HD1: 50 GB (com duas partições: / de 42 GB e swap de 8 GB).
  • HD2: 20 GB (mas este não foi configurado durante a instalação do S.O).
  • 2 placas de rede.
  • S.O: Red Hat 6.8 64 bits com idioma em Inglês-US (UTF-8).

Cada VM possui duas placas de rede, mas apenas uma das placas de rede de cada VM foi configurada com IP fixo (também pode ser usado IPs distribuídos pelo serviço DHCP, desde que os IPs sejam associados ao MAC de uma placa de rede de cada VM).

As VMs são identificadas da seguinte forma:
  • db1.domain.com.br: 10.0.0.1/24 na interface eth0
  • db2.domain.com.br: 10.0.0.2/24 na interface eth0

Estas informações foram adicionadas no arquivo /etc/hosts de cada máquina. Veja o ambiente do cluster na figura abaixo.

cluster_db2

 

 

Após a instalação do S.O, é necessário que ele esteja registrado para poder acessar os repositórios oficiais da Red Hat. Veja nesta página como registrar o sistema: https://access.redhat.com/documentation/en-US/Red_Hat_Network_Satellite/5.3/html/Reference_Guide/ch-register.html

Também foi configurado a autenticação via par de chaves RSA para o usuário root de cada máquina acessar a outra via SSH sem senha. Aqui está o tutorial: https://goo.gl/NdLkD4

Instalação dos pacotes

Aviso: Os passos abaixo devem ser executados nas duas máquinas.

1- Crie o arquivo /etc/yum.repos.d/centos.repo e adicione o seguinte conteúdo.

[centos-6-base]
name=CentOS-$releasever
Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.globo.com/centos/6.8/os/x86_64/
enabled=1

2- Execute os comandos abaixo para adicionar repositórios extras e autenticá-los.
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import http://mirror.globo.com/centos/6.8/os/x86_64/RPM-GPG-KEY-CentOS-6
rpm -ivh https://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-2.noarch.rpm

3- Execute o comando abaixo para instalar os pacotes que usaremos ao longo do tutorial.

yum -y install pacemaker cman pcs ccs resource-agents ntsysv kmod-drbd84 drbd84-utils postgresql93-contrib postgresql93 postgresql93-server

Cada nó terá os seguintes componentes de software, a fim de trabalhar como membro do o cluster HA (High-availability).

Pacemaker => É um gestor de recursos do cluster, que executa scripts no momento em que os nós do cluster são inicializados ou desligados ou quando os recursos relacionados falham. Além disso, pode ser configurado para verificar periodicamente o estado de cada nó do cluster. Em outras palavras, o pacemaker será encarregado de dar a partida e parada dos serviços (como um servidor web ou de banco de dados, para citar um exemplo clássico) e irá implementar a lógica para garantir que todos os serviços necessários estão rodando em apenas um local, ao mesmo tempo a fim de evitar a corrupção de dados.

Corosync: Trata-se de um serviço de mensagens que irá fornecer um canal de comunicação entre os nós do cluster. Ele é essencial e funciona como um marca-passo que checa a disponibilidade de cada nó.

PCS: É uma ferramenta de configuração do corosync e pacemaker que permite a visualização, edição e criação de clusters. Ele é opcional, mas é bom instalá-lo para ajudar na configuração do Cluster.

Desabilitando o Selinux e Iptables

Como este tutorial tem objetivo apenas de criar um ambiente de teste, desabilite o SELinux e o Iptables para não interferir na comunicação dos nodes do cluster e na configuração dos serviços.

Instruções para desabilitar o SELinux:https://goo.gl/4McGVw
Instruções para parar o Iptables:http://goo.gl/uE3PP9

Configurando os dois nós do cluster para sincronizar a configuração

OBS.: Durante a execução dos comandos, deve ser utilizado o usuário root ou outro que possa executado o comando sudo.

Em cada máquina virtual foram executados os comandos abaixo, para iniciar o serviço pcsd e definir uma senha para o usuário hacluster, que será usado futuramente para sincronizar a configuração do cluster nas duas VMs. A senha do usuário hacluster deve ser a mesma em cada máquina.
service pcsd start
passwd hacluster

Adicionando os nós do cluster


Na VM db1, foram executados os comandos abaixo para adicionar os nós do cluster.
pcs cluster auth db1 db2
pcs cluster setup --name cluster-db db1 db2
pcs cluster start --all

OBS.: Durante a execução dos comandos será solicitado o login e senha do usuário hacluster

Os comandos abaixo configuram algumas das propriedades principais do cluster.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
pcs resource defaults migration-threshold=1
Em máquinas virtuais não dá para usar o STONITH (Shoot    The    Other    Node    In The    Head), que um dispositivo responsável por  evitar que dois nós ou membros de um cluster atuem como nó primário em um cluster do tipo HA. Isso ajuda a evitar a corrupção de dados. Este dispositivo “chuta” o nó slave para ser o prímario, quando há uma falha no nó master atual. Por isso no primeiro comando acima, ele foi desabilitado. O Fence é um processo de isolamento, ou a separação, de um nó do cluster ao usar os recursos ou iniciar serviços. Ele ajuda a evitar que um nó com defeito execute os recursos de cluster. Em alguns casos, se um nó do cluster parar de responder, o mesmo deve ser colocado como offline antes de outro nó assumir a execução dos recursos. O fence também é um mecanismo do STONITH.

 

O segundo comando acima evita que os recursos sejam iniciados em mais nós do que o desejado. É usado quando você tem um cluster com vários pares de nós (veja http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/_perform_a_failover.html). Neste tutorial, a política de quorum foi desabilitada.

 

Já o terceiro comando acima, indica quantas falhas o cluster irá esperar que aconteça em um nó para mover os recursos para o próximo nó online.

 

Os comandos abaixo devem ser executados nas duas VMs para verificar o status do corosync e demais serviços do cluster.
corosync-cfgtool -s 
corosync-cpgtool
pcs status
Inicie os serviços dos cluster das duas máquinas.
service pcsd start
service corosync start
service cman start
service pacemaker start

Configure os serviços para serem inicializados no boot do S.O das duas máquinas

chkconfig pcsd on
chkconfig cman on
chkconfig pacemaker on
chkconfig corosync on

Visualizando a configuração do cluster

Quando quiser visualizar a configuração do cluster, use o comando abaixo.

pcs config

Comando para remoção da configuração do cluster

Se precisa remover a configuração do cluster, use os comandos abaixo nas duas VMs.

pcs cluster stop --force
pcs cluster destroy

Adicionando o IP do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar o IP do cluster.

pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.1 cidr_netmask=24 nic=eth1 op monitor interval=10s
Com o comando acima será atribuído o IP 192.168.0.1/24 na interface de rede eth1 (das duas máquinas) e o recurso ClusterIP será monitorado a cada 10s.
Este IP será automaticamente configurado apenas em uma das máquinas por vez. Por padrão, apenas a máquina MASTER conterá o IP definido acima na segunda placa de rede (identificada no Red Hat 6 como eth1). Se o db1 ficar indisponível, este IP será configurado na máquina db2. Quando o master voltar ao normal, o IP continuará no db2 e só será migrado para o db1 em caso de problema no db2.
 

Execute o comando abaixo para visualizar a configuração.

ifconfig

Testando a migração do IP do cluster para a máquina db2. Na máquina db1 execute:

pcs cluster stop db1 --force

Na máquina db2, execute o comando abaixo para visualizar a configuração.

ifconfig

Na máquina db1, inicie o cluster.

pcs cluster start db1

Novamente execute o comando abaixo para visualizar a configuração.

ifconfig

Adicionando uma rota de saída do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar a rota do cluster. É por essa rota que o cluster irá se comunicar com os hosts das demais redes.

pcs resource create DefRoute ocf:heartbeat:Route destination=default device=eth1 gateway=192.168.0.1 op monitor interval=10s

Adicionando um grupo de recursos

Para evitar que os recursos ClusterIP e DefRoute sejam iniciados em máquinas diferentes do cluster, podemos criar um grupo de recursos e incluí-los de forma que os dois sejam iniciados na mesma máquina. Para fazer isto, use os comandos abaixo:

pcs resource group add ClusterGrupoRecursos ClusterIP DefRoute
pcs resource manage ClusterIP DefRoute

Listando, atualizando e removendo um recurso

Se precisar listar os recursos ativos do cluster, use o comando abaixo.

pcs resource show
Se precisar atualizar um recurso. Use a opção update do comando pcs resource. Exemplo, o comando abaixo altera o IP do cluster.
 
pcs resource update ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.75 cidr_netmask=24 nic=eth1 op monitor interval=10s

Se precisar remover um recurso do cluster, use o comando abaixo.

pcs resource delete NOMERECURSO
pcs resource cleanup NOMERECURSO

Se precisar ver a inicialização de um recurso no modo debug (depuração), use o comando abaixo:

pcs resource debug-start NOMERECURSO --full

Fonte: http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/#ap-lsb

Se precisar consultar a lista de agentes do heartbeat, pacemaker ou LSB para configurar um recurso do cluster, use os comandos abaixo.

pcs resource agents ocf:heartbeat
pcs resource agents ocf:pacemaker
pcs resource agents lsb:

Configurando o DRBD nas duas máquinas

Os pacotes do DRBD já foram instalados no início do tutorial.

As duas VMs já possuem um segundo disco de 20 GB e que não foi usado durante a instalação. Esses discos serão usados pelo serviço DRBD para sincronizar os dados. O DRBD atuará como um cluster Ativo > Passivo. Os dados serão gravados apenas na máquina ativa do cluster. Na máquina passiva os dados serão sincronizados e o disco ficará apenas no modo leitura. O disco a ser usado pelo DRBD será montado no sistema como /database com o sistema de arquivos ext4 e será usado pelo PostgreSQL para armazenar os arquivos dos bancos de dados.

Em cada máquina, crie o arquivo /etc/drbd.d/disk_database.res com o conteúdo abaixo para configurar um recurso no DRBD que usará o disco disponível identificado no S.O como /dev/sdb1.

resource disk_database {
 protocol C;
 meta-disk internal;
 device /dev/drbd1;
 syncer {
   verify-alg sha1;
 }
 net {
   allow-two-primaries;
 }
 on db1 {
   disk   /dev/sdb;
   address  10.0.0.1:7789;
 }
 on db2 {
   disk   /dev/sdb;
   address  10.0.0.2:7789;
 }
}

O disco /dev/drdb1, configurado acima, é o disco DRBD que abstraí o uso do disco /dev/sdb1 de cada máquina.

Em cada máquina, ative o uso do recurso com os comandos abaixo.

drbdadm create-md disk_database
modprobe drbd
drbdadm up disk_database

Na máquina db1, force-a para ser o nó primário do DRBD.

drbdadm primary --force disk_database
Visualize a sincronização dos discos com o comandos abaixo.
 
 cat /proc/drbd
 A sincronização demorará alguns minutos.

Quando terminar a sincronização dos discos, execute o comando abaixo na máquina db1 para formatá-lo com o sistema de arquivos ext4.

mkfs.ext4 /dev/drbd1
Na máquina db1, teste o uso do disco /dev/drbd1.
 
mkdir /database
mount /dev/drbd1 /database
ls /database
mkdir /database/teste
touch /database/teste/a.txt

Configurando o DRBD para ser gerenciado pelo cluster

Na máquina db1, execute os comandos abaixo para configurar o recurso DRBD disk_database (configurado no arquivo /etc/drbd.d/disk_database.res) para ser gerenciado pelo Cluster.

pcs cluster cib drbd_cfg
pcs -f drbd_cfg resource create DBData ocf:linbit:drbd \
 drbd_resource=disk_database op monitor interval=60s
pcs -f drbd_cfg resource master DBDataClone DBData \
 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

Execute o comando abaixo para visualizar a configuração do recurso.

pcs -f drbd_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push drbd_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status

Habilite nas duas máquinas, o carregamento do módulo drbd no boot do S.O.

echo drbd > /etc/modprobe.d/drbd.conf

Configurando o Postgresql

O PostgreSQL já foi instalado no início do tutorial. Configure-o para usar o disco /dev/drbd1 montado na máquina db1 no diretório /database.
mkdir -p /database/pgsql
chown -R postgres:postgres /database/
chmod -R 0700 /database/
sudo -u postgres /usr/pgsql-9.3/bin/initdb -D /database/pgsql
Edite o script de inicialização do PostgreSQL, localizado em /etc/init.d/postgresql-9.3. No script mude apenas as variáveis citadas para conter os valores abaixo. Antes de editar o script, faça um backup do mesmo.
 
PGPORT=5433
PGDATA=/database/pgsql/
PGLOG=/database/pgsql/pgstartup.log
PGUPLOG=/database/pgsql/pgupgrade.log
Salve as alterações e copie-o para a máquina db2.
scp /etc/init.d/postgresql-9.3 root@db2:/etc/init.d/postgresql-9.3

Configurando recurso Postgresql no cluster

Na máquina db1, execute o comando abaixo para criar o recurso Postgresql que irá inicializar o serviço na máquina ativa do cluster, usando o script /etc/init.d/postgresql-9.3 (representado no comando abaixo por lsb:postgresql-9.3). É importante lembrar que ele não deve ser inicializado junto com o boot do sistema operacional. Apenas o cluster deve inicializá-lo.

pcs resource create Postgresql lsb:postgresql-9.3

Configurando a ordem de inicialização dos recursos no cluster

Configure o cluster para só inicializar o Postgresql depois de configurar o IP, a rota e montar o disco /dev/drbd1 em /database (usando o sistema de arquivos ext4) na máquina ativa. Execute os comandos abaixo apenas na máquina db1, pois a configuração será replicada para o db2.

pcs cluster cib fs_cfg
pcs -f fs_cfg resource create DBFS Filesystem \
 device="/dev/drbd1" directory="/database" fstype="ext4"
pcs -f fs_cfg constraint colocation add DBFS with DBDataClone INFINITY with-rsc-role=Master
pcs -f fs_cfg constraint order promote DBDataClone then start DBFS
pcs -f fs_cfg constraint colocation add ClusterIP with DefRoute INFINITY
pcs -f fs_cfg constraint order ClusterIP then DefRoute
pcs -f fs_cfg constraint colocation add DefRoute with DBFS INFINITY
pcs -f fs_cfg constraint order DefRoute then DBFS
pcs -f fs_cfg constraint colocation add Postgresql with DBFS INFINITY
pcs -f fs_cfg constraint order DBFS then Postgresql

Execute os comandos abaixo para revisar a configuração.

pcs -f fs_cfg constraint
pcs -f fs_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push fs_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status
 
Pronto! Agora é só realizar testes de funcionamento com o cluster.
 
OBS.: Para verificar o funcionamento do PostgreSQL, use o comando abaixo.
 
/etc/init.d/postgresql-9.3 status

Comandos úteis à gerência de configuração do cluster

Comandos para visualizar a configuração do cluster CIB (Cluster Information Base):
pcs cluster cib --config
pcs cluster cib
Comando para backup da configuração do cluster:
pcs config backup cluster_config_$(date +%Y-%m-%d)

Restaurando a configuração do cluster a partir do backup:1) Você precisa parar o serviço de cluster no nó, restaurar a configuração e iniciá-lo depois:

pcs cluster stop node --force
pcs config restore --local  cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Estes comandos restauram a configuração apenas no nó atual.
Para restaurar a configuração em todos os nós, use os comados abaixo.
pcs cluster stop node --force
pcs config restore cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Obtendo o relatório do cluster para análise de incidentes:
pcs cluster report [--from "YYYY-M-D  H:M:S"  [--to  "YYYY-M-D"  H:M:S"]]"  dest
Você também pode voltar a configuração do cluster para um determinado ponto. Para ver os pontos de configuração execute o comando:
pcs config checkpoint
Para visualizar a configuração de determinado ponto, use o comando abaixo:
pcs config  checkpoint view    <checkpoint_number>
Para voltar a usar a configuração de determinado ponto, use o comando:
pcs  config  checkpoint    restore    <checkpoint_number>
Para saber mais detalhes das sintaxes dos comandos e aprender mais sobre o assunto, recomendo a leitura das fontes e livros indicados no tutorial.

Fontes:

Sites:

http://blog.clusterlabs.org/blog/2010/pacemaker-heartbeat-corosync-wtf/

http://www.unixmen.com/configure-drbd-centos-6-5/

http://clusterlabs.org/quickstart-redhat-6.html

http://elrepo.org/tiki/tiki-index.php

http://drbd.linbit.com/en/doc/users-guide-84

http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/pdf/Clusters_from_Scratch/Pacemaker-1.1-Clusters_from_Scratch-en-US.pdf

CRMSH vs PCS: https://github.com/ClusterLabs/pacemaker/blob/master/doc/pcs-crmsh-quick-ref.md

http://www.picoloto.com.br/tag/mkfs-ext4

https://www.vivaolinux.com.br/artigo/Cluster-de-alta-disponibilidade-para-servidores-web-com-Debian-71-Corosync-Pacemaker-DRBD?pagina=1

http://asilva.eti.br/instalar-cluster-high-availbility-no-centos-7-com-pacemaker/

http://clusterlabs.org/quickstart-redhat.html

http://clusterlabs.org/wiki/Install

http://keithtenzer.com/2015/06/22/pacemaker-the-open-source-high-availability-cluster/

http://bigthinkingapplied.com/creating-a-linux-cluster-in-red-hatcentos-7/

https://bigthinkingapplied.com/tag/cluster/

http://www.tokiwinter.com/building-a-highly-available-apache-cluster-on-centos-7/

http://www.cloudera.com/documentation/enterprise/5-4-x/topics/admin_cm_ha_failover.html

http://jensd.be/156/linux/building-a-high-available-failover-cluster-with-pacemaker-corosync-pcs

Documentação Oficial sobre cluster no Red Hat 7:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Overview/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Reference/index.html

Documentação geral do Red Hat 7:

https://access.redhat.com/documentation/en/red-hat-enterprise-linux/7/

Tutorial: Enviando SMS usando Zabbix + Zenvia

 

89309-sms

 

Eu e Willeson Souza escrevemos este tutorial ensinando como receber alertas do Zabbix usando o Zenvia Gateway para o envio das mensagens.

 

O tutorial foi testado em dois ambientes:
  • Ambiente 1: Zabbix 2.0.6 + Debian 6 + Postgres 8.X
  • Ambiente 2: Zabbix 2.2.0 + Ubuntu 12.04 + Postgres 9.3
Bons testes! :-).

 

Instalando o NFS no Ubuntu 12.04

 

O NFS (Network File System) é um sistema de arquivos distribuídos desenvolvido inicialmente pela Sun Microsystems, Inc., a fim de compartilhar arquivos e diretórios entre computadores conectados em rede, formando assim um diretório virtual. Nesta página [1], você encontra mais informações sobre o funcionamento desse serviço de rede.

Este tutorial ensina a instalar e configurar o NFS  no Ubuntu 12.04.

No servidor

Instale o serviço com o seguinte comando:

sudo apt-get install nfs-kernel-server

Crie um diretório para armazenar os arquivos a serem compartilhados com os hosts clientes. Exemplo: /compartilhado.

sudo mkdir /compartilhado

Edite o arquivo /etc/exports para especificar as permissões do compartilhamento. Adicione seguinte linha:

/compartilhado *(rw,sync,no_subtree_check,no_root_squash)

Assim, o diretório será compartilhado com permissões de leitura e escrita e qualquer arquivo que for adicionado no diretório será rapidamente disponibilizado aos usuários do host cliente. Saiba mais sobre as permissões acessando esta página [2]

Edite o arquivo /etc/hosts.denny e adicione as seguintes linhas para negar o acesso remoto ao NFS a todos os hosts:

portmap: ALL
lockd: ALL
mountd: ALL
rquotad: ALL

Agora libere o acesso remoto ao NFS para hosts específicos.

Se você quer compartilhar o diretório “/compartilhado” com todos os hosts pertencentes a faixa de rede 192.168.0.0/24 (na qual também está o servidor NFS), edite o arquivo /etc/hosts.allow e informe as linhas abaixo. Se você quer compartilhar apenas com um ou dois computadores da rede, substitua 192.168.0.0/24 pelos endereços IP separando-os por vírgula. Ex.: portmap: 192.168.0.2, 192.168.0.3.

portmap: 192.168.0.0/24
lockd: 192.168.0.0/24
rquotad 192.168.0.0/24
mountd: 192.168.0.0/24
statd: 192.168.0.0/24

Execute o comando abaixo para ativar o serviço e habilitar as configurações.

sudo /etc/init.d/nfs-kernel-server restart

No cliente

Instale o cliente NFS.

sudo apt-get install nfs-common

Monte o diretório compartilhado pelo servidor NFS no host cliente.

Crie o diretório que receberá os arquivos compartilhados pelo servidor.

sudo mkdir /media/compartilhado

Edite o arquivo /etc/fstab e adicione a seguinte linha ao final. Isso fará com que a montagem do diretório remoto seja executada automaticamente quando o computador for ligado.

IP-Servidor:/compartilhado /media/compartilhado nfs rw 0 0

Na linha acima, substitua “IP-Servidor” pelo IP do servidor NFS. Exemplo: 192.168.0.1.

Agora monte manualmente o diretório remoto no host cliente.

sudo mount IP-Servidor:/compartilhado /media/compartilhado

Pronto! Agora é só testar. Adicione alguns arquivos no diretório “/compartilhado” do servidor e verá estes mesmos arquivos no diretório “/media/compartilhado” do host cliente.

Abraço e até a próxima.

Fontes:

[1] http://www.qfoi.com.br/index.php/artigos/51-instalando-nfs-no-ubuntu

[2] http://www.vivaolinux.com.br/artigo/Configurando-um-servidor-NFS-em-4-passos?pagina=1