Como alterar o tamanho máximo de E-mail do Postfix

Hoje um cliente me avisou que um email específico não estava sendo enviado por conter um anexo grande. Portanto o meu servidor de e-mail Postfix o rejeitou.

Hora de verificar o log

Vamos utilizar o cat e o grep para não perder tempo.


$ cat /var/log/mail.log | grep limit

O retorno:


# cat /var/log/mail.log | grep limit

Aug 21 10:55:51 server postfix/submission/smtpd[67898]: warning: 93686809EF: queue file size limit exceeded

A configuração message_size_limit

A opção de configuração é “message_size_limit” e por padrão é definida como 10240000 bytes, que é aproximadamente 10MB. Você pode ver a configuração que a instalação do postfix está usando no momento, utilizando o seguinte comando:


# $ postconf | grep message_size_limit

Corrigindo o problema

Uma rápida olhada na configuração do postfix mostrou que o limite de tamanho da mensagem era o padrão, então eu precisava aumentá-la.

No lugar de alterar o arquivo de configuração manualmente, vamos utilizar o postconf.

# postconf -e message_size_limit=20480000

Reiniciando o Serviço


service postfix reload


O que fazer quando o Vagrant não retoma o download

Se você chegou até aqui, você com certeza já se deparou com esse erro irritante quando você tenta retomar um download que falhou?

PS D:\vagrant> vagrant init rasmus/php7dev  
A `Vagrantfile` has been placed in this directory. You are now  
ready to `vagrant up` your first virtual environment! Please read  
the comments in the Vagrantfile as well as documentation on  
`vagrantup.com` for more information on using Vagrant.
PS D:\vagrant> vagrant up --provider=virtualbox  
Bringing machine 'default' up with 'virtualbox' provider...  
==> default: Box 'rasmus/php7dev' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'rasmus/php7dev'
    default: URL: https://atlas.hashicorp.com/rasmus/php7dev
==> default: Adding box 'rasmus/php7dev' (v0.0.8) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/rasmus/boxes/php7dev/versions/0.0.8/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
    default: Progress: 0% (Rate: 0/s, Estimated time remaining: --:--:--):--)
An error occurred while downloading the remote file. The error  
message, if any, is reproduced below. Please fix this error and try  
again.  

Para solucionar esse problema, é necessário apenas remover o arquivo que foi parcialmente baixado, para fazê-lo basta executar o seguinte comando em seu powerShell.

PS D:\vagrant>rm ~/.vagrant.d/tmp/*  

Como adicionar colorização de sintaxe no Ghost

PRISM.JS

A biblioteca que nós utilizaremos para fazer a colorização de sintaxe, vamos utilizar o Prism.JS, que além de ser muito bom, como diz o site, é “super rápido”. E tem um bom conjunto de temas pré-definidos e alguns plugins úteis, para que ele possa atender às suas necessidades.

var str = 'rb.ite.saidrelda.golb//:ptth';  
[].map.call(str, function(x) {
  return x;
}).reverse().join(''); 
// Saída: 'http://blog.adlerdias.eti.br'

Como instalar o Prism.JS

Instalar o Prism.JS é muito fácil:

  • Primeiro você precisa fazer o download clicando aqui
  • Após selecionar as opções que você acha que vai atender às suas necessidades, faça o download dos arquivos de script(js) e estilo(css) gerados.
  • Coloque os arquivos nas pastas assets/css e assets/js adequadas, no tema que você estiver utilizando – o conteúdo content/themes/tema/assets/js/prism.js e content/themes/tema/assets/css/prism.css
  • Agora é só adicionarmos esses arquivos em seu layout.

Para fazer isso, abra o arquivo content/themes/theme-name/default.hbs e adicione a tag <link> no head para o css.

...
<link rel="stylesheet" type="text/css" href="{{asset "css/prism.css"}}" />  
...

e a tag <script>antes da tag </body>

...
    <script type="text/javascript" src="{{asset "js/prism.js"}}"></script>
</body>  

Pronto

Isso foi fácil. Agora você está pronto para começar a usar a colorização de sintaxe utilizando os recursos fornecidos pelo Prism.JS. O modo como funciona é procurando por um elemento <code class="language-*"></code>, ou no ghost, “`language-javascript em seu código. Então você só precisa adicionar a classe adequada para o seu bloco de código, assim:

```language-javascript
var str = 'rb.ite.saidrelda.golb//:ptth';  
[].map.call(str, function(x) {
  return x;
}).reverse().join(''); 
// Saída: 'http://blog.adlerdias.eti.br'
// é necessário colocar ``` para finalizar a marcação do bloco de código

E aqui está como o código é renderizado.

var str = 'rb.ite.saidrelda.golb//:ptth';  
[].map.call(str, function(x) {
  return x;
}).reverse().join(''); 
// Saída: 'http://blog.adlerdias.eti.br'

Como configurar um servidor WEB com Ubuntu 14.04

Depois de criar uma VM com Ubuntu 14.04 no Azure, é hora de iniciar a instalação e configuração do mesmo, como esse será um servidor web vamos começar configurando o ssh, fail2ban e fazendo a instalação padrão do LAMP.

Antes de tudo

Antes de fazer qualquer outra coisa, é bom adquirir o hábito de atualizar os programas e também o sistema operacional:

$ sudo apt-get update
$ sudo apt-get upgrade -y

Configurando a Localidade (locale)

Se você não tem UTF-8 como sua localidade padrão, algumas coisas podem dar errado enquanto você configura seu sistema. Portanto, verifique a localidade em primeiro lugar:

# exibe o locale
locale -a  
# criaremos a localidade UTF-8 Inglês
sudo locale-gen en_US.UTF-8  
export LANG=en_US.UTF-8  
# caso existam outras localidades UTF-8 disponíveis, você pode simplesmente optar por utilizá-la.
# Por exemplo, 
export LANG=C.UTF-8  

Fazendo isso, você estará corrigindo e evitando problemas como:

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0x* in position *: ordinal not in range(128)

Para finalizar, você deve criar o arquivo /etc/default/locale e inserir os valores:

$ sudo -s
touch /etc/default/locale  
echo LANG="en_US.UTF-8" > /etc/default/locale  
echo LANGUAGE="en_US:en" >> /etc/default/locale  

Configurando SSH

A primeira alteração que devemos fazer, é trocar porta padrão do ssh.

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old  
sed 's/Port 22/Port 6543/' < /etc/ssh/sshd_config    >/etc/ssh/sshd_config.new  
mv /etc/ssh/sshd_config.new /etc/ssh/sshd_config  
service ssh restart  

Também é necessário verificar as configurações de PermitRootLogin e PermitEmptyPasswords.

grep "PermitRootLogin" /etc/ssh/sshd_config  

Deve retornar

PermitRootLogin no

grep "PermitEmptyPasswords" /etc/ssh/sshd_config  

Deve retornar

PermitEmptyPasswords no

Caso PermitRootLogin ou PermitEmptyPasswords retornem yes, basta entrar no seu editor de texto preferido e trocar para no. Após fazer essas alterações é necessário reiniciar o ssh.

sudo service ssh restart  

Liberando Endpoint no Azure

Após fazer essa alteração, não se esqueça de adicionar a porta 6543 no endpoint do azure, caso contrário, não será mais possível se conectar à sua VM.

Instalando e Configurando o Fail2Ban

Primeiro vamos instalar o Fail2Ban utilizando o comando abaixo

sudo apt-get -y install fail2ban  

Como você pode ver, a instalação é trivial. Agora podemos iniciar a configuração para nosso próprio uso.

Vamos editar o arquivo /etc/fail2ban/jail.local

e vamos deixá-lo da seguinte forma:

[DEFAULT]
ignoreip = 127.0.0.0/8  
bantime  = 1800  
findtime  = 1800  
maxretry = 5  
backend = gamin

[ssh]
enabled  = true  
port     = 6543  
filter   = sshd  
logpath  = /var/log/auth.log  
maxretry = 5

[vsftpd-notification]
enabled  = false  
filter   = vsftpd  
action   = sendmail-whois[name=VSFTPD, dest=adlersd@gmail.com]  
logpath  = /var/log/vsftpd.log  
maxretry = 5  
bantime  = 1800

[vsftpd-iptables]
enabled  = true  
filter   = vsftpd  
action   = iptables[name=VSFTPD, port=ftp, protocol=tcp]  
           sendmail-whois[name=VSFTPD, dest=adlersd@gmail.com]
logpath  = /var/log/vsftpd.log  
maxretry = 5  
bantime  = 1800  
failregex = vsftpd(?:\(pam_unix\))?(?:\[\d+\])?:.* authentication failure; .* rhost=<HOST>(?:\s+user=\S*)?\s*$  
\[.+\] FAIL LOGIN: Client "<HOST>"\s*$

Dessa maneira estaremos protegendo tanto nosso ssh na porta customizada(6543) como o servidor ftp, VSFTPD.

Finalmente, devemos reiniciar o fail2ban.

sudo service fail2ban restart  

Instalando e Configurando o LAMP

Vamos instalar o LAMP utilizando o tasksel, para instalá-lo basta utilizarmos o comando:

Feito isso, podemos prosseguir e instalar o LAMP, isso pode ser feito de duas maneiras utilizando o tasksel – podemos executar o comando sudo tasksel – e da maneira como vamos fazer nesse guia utilizando a sintaxe alternativa do tasksel.

Você pode instalar o LAMP em um único comando, usando o apt-get modo tasksel (não se esqueça do acento ^ no final):

sudo apt-get install lamp-server^  

Pronto, agora temos tudo o que vamos precisar para essa primeira parte.

Configurando o MySql

Primeiro, vamos reiniciar o serviço:

sudo service mysql restart  

Vamos iniciar as configurações:

sudo /usr/bin/mysql_secure_installation  

O prompt irá pedir a sua senha de root atual, porém, como acabamos de fazer a instalação, basta deixá-lo em branco pressionando enter.

Enter current password for root (enter for none):  
OK, successfully used password, moving on...  

Em seguida, a mensagem irá perguntar se você deseja definir uma senha de root. Vá em frente e escolha Y e siga as instruções.

By default, a MySQL installation has an anonymous user, allowing anyone  
to log into MySQL without having to have a user account created for  
them.  This is intended only for testing, and to make the installation  
go a bit smoother.  You should remove them before moving into a  
production environment.

Remove anonymous users? [Y/n] y  
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This  
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] y  
... Success!

By default, MySQL comes with a database named 'test' that anyone can  
access.  This is also intended only for testing, and should be removed  
before moving into a production environment.

Remove test database and access to it? [Y/n] y  
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far  
will take effect immediately.

Reload privilege tables now? [Y/n] y  
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MySQL  
installation should now be secure.

Thanks for using MySQL!  

Agora, vamos criar um usuário:

Será necessário que você digite a senha que você definiu como senha de root para a sua instalação do MySql.

mysql -u root -p  
CREATE DATABASE novoBancoDeDados;  
CREATE USER novoUsuario@% IDENTIFIED BY 'novaSenha';  
GRANT ALL PRIVILEGES ON novoBancoDeDados.* TO novoUsuario@%;  
FLUSH PRIVILEGES;  
exit  

Configurando o Php

Nós precisamos fazer uma pequena mudança na configuração do php. Abra /etc/php.ini:

Encontre a linha, cgi.fix_pathinfo = 1, e mudar de 1 para 0.

cgi.fix_pathinfo=0  

Também pode ser necessário alterar os valores de algumas variáveis de ambiente.

date.timezone = America/Sao_Paulo  
short_open_tag = Off  
expose_php = off  
max_execution_time = 60  
memory_limit = 256M  
post_max_size = 128M  
upload_max_filesize = 128M  

Agora basta reiniciar o apache, para que as alterações entrem em vigor.

sudo service apache2 restart  

Como desabilitar as notificações por email da Cron

Recentemente eu me deparei com uma enxurrada de emails de notificação de cada tarefa que a cron executava no servidor. Um deles, por exemplo, executava ums script PHP a cada dez minutos. Mesmo que o script foi executado com êxito, eu estava ficando um e-mail a cada dez minutos, contendo a saída do script. Então, como vamos “desabilitar” esses e-mails? Você pode fazer isso de algumas maneiras.

Utilizando a variável MAILTO

A variável MAILTO permite que você defina o endereço de e-mail que os e-mails de notificação de Cron são enviados. Você pode suprimir todos os e-mails de suas tarefas Cron definindo esta variável como vazia:

$ crontab -e

No topo do arquivo, adicione a linha:

MAILTO=""  

Agora, basta salvar e sair do documento.

Enviando a saída para /dev/null

O dispositivo nulo, /dev/null, dos sistemas operacionais unix-like é um “buraco negro” para os dados, ou seja, qualquer saída enviada aqui será descartada, o que o torna um grande candidato para suprimir a saída das tarefas da Cron.

Para suprimir todas as saídas (STDOUT e STDERR) da sua tarefa Cron, você precisará adicionar ao final do seu comando > /dev/null 2>&1.

$ crontab -e

adicione ao final do comando:

*/10 * * * * comando > /dev/null 2>&1

O número 2 representa o fluxo de STDERR (erro padrão), enquanto 1 é o fluxo STDOUT (saída padrão).

Se você quiser receber e-mails sobre erros, mas não os sucessos, você precisará adicionar ao final do seu comando > /dev/null, assim, você irá suprimir a saída de apenas STDOUT:

$ crontab -e

adicione ao final do comando:

*/10 * * * * comando > /dev/null

Como instalar o servidor FTP (vsftpd) no Ubuntu 14.04

Se você quiser configurar um servidor ftp seguro, eficiente e rápido, então você pode considerar instalar o vsftpd. É, provavelmente, o servidor FTP mais seguro e rápido para sistemas UNIX-like.

Por se pequeno para fins de velocidade e segurança, muitas configurações de FTP mais complicados são realizáveis com vsftpd. Por exemplo, é possível lidar com:

  • Configurações de IP virtuais
  • Os usuários virtuais
  • Operação independente ou inetd
  • Configuração poderosa por usuário
  • largura de banda
  • Per-source-IP configuração
  • Per-source-IP limites
  • IPv6
  • O suporte à criptografia SSL através da integração

Utilizando o passo a passo a seguir como guia para a sua configuração, você evita de se deparar com error como:

  • Error: The data connection could not be established: EHOSTUNREACH – No route to host
  • Error: Connection timed out
  • Error: Failed to retrieve directory listing

Instalando vsFTPd

  
sudo apt-get update  
sudo apt-get install vsftpd  

Configurando o vsFTPd

O servidor vai ser executado com privilégios mínimos de o usuário “nobody” e registro completo será ativado. Finalmente, vamos limitar clientes para os tempos de espera de ligação específicas e limitar os comandos que aceitará de todos os clientes FTP.

  
sudo vim /etc/vsftpd.conf  
  
#######################################################
###  vsftpd.conf   BEGIN
#######################################################
# manpage: http://vsftpd.beasts.org/vsftpd_conf.html
#
# Run in daemon mode
background=YES  
listen=YES  
#listen_address=111.111.111.111
#pasv_address=127.0.0.1
#
# The new highly restrictive seccomp filter sandbox
# If you see "OOPS: priv_sock_get_cmd" then disable seccomp
seccomp_sandbox=NO  
#
# User to run daemon as
#nopriv_user=_vsftpd
#ftp_username=_ftp
#
# Ftp ports
connect\_from\_port\_20=NO  
ftp\_data\_port=20  
listen_port=21  
pasv_enable=Yes  
pasv\_min\_port=7000  
pasv\_max\_port=7014  
pasv\_addr\_resolve=NO  
pasv_address=191.237.128.149  
pasv_promiscuous=NO  
port_enable=NO  
port_promiscuous=NO  
#
# SSL (force options for a SSL only server)
#ssl_enable=YES
#ssl_tlsv1=YES
#ssl_sslv2=NO
#ssl_sslv3=NO
#rsa_cert_file=/etc/ssl/private/vsftpd.pem
#allow_anon_ssl=YES
#force_anon_data_ssl=YES
#force_anon_logins_ssl=YES
#force_local_data_ssl=YES
#force_local_logins_ssl=YES
#
# Timeouts
connect_timeout=0  
data\_connection\_timeout=0  
idle\_session\_timeout=0  
#
# Information messages
#setproctitle_enable=YES
#banner_file=/etc/banner
dirmessage_enable=YES  
ftpd_banner=Teste ftp server  
#
# Access limits and controls
async\_abor\_enable=NO  
#cmds_allowed=ABOR,APPE,CWD,DELE,HELP,LIST,MDTM,MKD,NLST,PASS,PASV,PWD,QUIT,RETR,RMD,RNFR,RNTO,SIZE,STOR,TYPE,USER
#cmds_allowed=ABOR,CWD,DELE,LIST,MDTM,MKD,NLST,PASS,PASV,PWD,QUIT,RETR,RMD,RNFR,RNTO,SIZE,STOR,TYPE,USER,ACCT,APPE,CDUP,HELP,MODE,NOOP,REIN,STAT,STOU,STRU,SYST
delay\_successful\_login=1  
delete\_failed\_uploads=yes  
guest_enable=NO  
write_enable=YES  
max_clients=100  
max\_login\_fails=1  
max\_per\_ip=0  
pam\_service\_name=vsftpd  
allow\_writeable\_chroot=YES  
tcp_wrappers=NO  
hide_file={.*,*.mp3}  
deny_file={*.mp3}  
#
# Preferences
ascii\_upload\_enable=NO  
ascii\_download\_enable=NO  
hide_ids=YES  
ls\_recurse\_enable=NO  
use_localtime=NO  
#
# Allow anonymous FTP?
#anonymous_enable=YES
#anon_max_rate=0
#anon_mkdir_write_enable=NO
#anon_root=/disk01/ftp/
#anon_world_readable_only=YES
#anon_umask=0022
#anon_upload_enable=NO
#anon_other_write_enable=NO
#no_anon_password=NO
#
# Allow local user access?
local_enable=YES  
local\_max\_rate=0  
local_umask=0022  
chroot\_local\_user=YES  
check_shell=NO  
chmod_enable=NO  
secure\_chroot\_dir=/var/run/vsftpd/empty  
#userlist_enable=YES
userlist_deny=NO  
#userlist_file=/etc/vsftpd_users
#
# Logging
dual\_log\_enable=NO  
log\_ftp\_protocol=NO  
vsftpd\_log\_file=/var/log/vsftpd.log  
xferlog_enable=YES  
xferlog\_std\_format=NO  
xferlog_file=/var/log/xferlog  
#
# Passive

#
#######################################################
###  vsftpd.conf  END
#######################################################

Ativando o modo Passivo

Para isso nós reservar um intervalo de portas para usar em conexões FTP passivas. No exemplo abaixo, nós iremos utilizar o intervalo da porta 7000 até 7014. Normalmente é comum ser utilizado um range de portas bem maior, porém no quando você utiliza azure, existe uma limitação de 150 endpoints, por isso, vamos utilizar um range menor. Para ativar o modo passivo, será preciso editar o arquivo de configuração vsftpd.conf novamente:

  
sudo vi /etc/vsftpd.conf  

Adicionando as linhas abaixo:

  
pasv_enable=YES  
pasv\_min\_port=7000  
pasv\_max\_port=7014  
port_enable=YES  

Configurando o Firewall

Você vai precisar para ativar dois módulos do kernel para o iptables. Estes irão ligar o NAT (Network Address Translation) para FTP e rastreamento de conexão FTP. Como iptables / Netfilter é parte do kernel, precisamos usar modprobe para adicioná-los para a sessão atual, afinal você não vai querer reiniciar um servidor só por isso, e também fazer alterações em /etc/modules para que, caso seja necessário reiniciar o seu servidor mais tarde, os módulos sejam carregados durante a inicialização do mesmo.

Primeiro, nós deveremos utilizar o modprobe para usar esses dois módulos agora:

  
sudo modprobe ip_nat_ftp  
sudo modprobe ip_conntrack_ftp  

Em seguida, vamos modificar o arquivo de configuração /etc/modules assim os módulos deverão ser carregados na próxima reinicialização:

  
sudo vim /etc/modules  

Adicione as linhas:

  
ip\_nat\_ftp  
ip\_conntrack\_ftp  
  
sudo iptables -A INPUT -p tcp --destination-port 7000:7014 -j ACCEPT  

Adicionando usuários com acesso a pastas específicas

Pode ser necessário criar usuários com acesso a pastas específicas do seu servidor de FTP, para isso crie o usuário e atribua o home do mesmo para a pasta desejada.
Como meu servidor web está rodando nessa pasta estou adicionando o usuário para o grupo www-data

  
useradd -m usuarioEspecifico -s /usr/sbin/nologin -d /home/ftp/www/pasta/especifica/ -g www-data  

Garantindo permissão de escrita

Para garantir que o grupo possa escrever na pasta

  
sudo chmod go+rwx /home/ftp/www/pasta/especifica/  

Liberando as portas

Amazon EC2

Isto pode ser feito através do AWS Management Console (painel de controle web EC2 da Amazon), ou no seu próprio console:

ec2-authorize default -p 20-21
ec2-authorize default -p 7000-7014

Azure

É necessário adicionar as seguintes portas abertas no
EndPoint:
TCP 20-21
TCP 7000-7014

Reinicie o serviço vsftpd

Finalmente, você deve ter tudo que você precisa para se conectar via FTP no seu servidor:

  
sudo service vsftpd restart  

Como definir o fuso horário no Ubuntu

Uma das primeiras coisas que você deve fazer quando instala um servidor linux, é definir o fuso horário, afinal, é muito chato quando você tem que ir para o arquivo de log e encontrar todas as timestamps estão em UTC. Mas podemos definir o fuso horário do servidor para que quando seu SGBD cron e etc fiquem no mesmo horário em que o seu computador, tornando-os mais realistas.

Você pode verificar o fuso horário atual, apenas executando o comando:

  
$ date

Thu Dec 18 17:06:17 MST 2014

Para trocar a o fuso horário, basta executar o comando:

  
$ sudo dpkg-reconfigure tzdata

E selecionar o continente e o fuso horário que preferir.

Também não se esqueça de reiniciar cron, afinal, como ele não vai detectar a mudança do fuso horário ele continuará executando os seus agendamentos em UTC.

Como Instalar a Plataforma de Blog Ghost no Ubuntu

Depois de mudar meu blog da kinghost para a DigitalOcean, eu resolvi mudar também a plataforma que eu utilizava para as postagens. Então, resolvi mudar do wordpress para o Ghost.

Primeiro, vamos verificar a configuração do mysql.

Verificando MySql

Antes de criarmos os bancos, é importante verficarmos se nossa instalação do MySql está utilizando utf8. No arquivo /etc/mysql/my.cnf verifique se a ele possui as linhas character_set_server e collation_server.

[mysqld]
[....]
character_set_server = utf8  
collation_server = utf8_general_ci  
[....]

Feito isso, podemos prosseguir para a instalação propriamente dita, e para tal vamos criar os bancos de dados e um usuário para o ghost.

Criando usuário e bancos de dados

$ mysql -u root -p

No prompt de comando mysql> vamos utilizar os seguintes comandos. Certifique-se de trocar “SUA_SENHA” com sua própria
senha, afinal, essa vai ser a senha do seu banco de dados que utilizaremos para o Ghost.
Vamos criar dois bancos de dados, um ghost e um ghostdev, um para produção e outro para desenvolvimento, respectivamente.
Criaremos um usuário ghost que terá acesso aos bancos, lembre-se de substituir @’localhost’ por @’%’, caso você deseje ter acesso remoto à esses bancos.
Atribuiremos privilégios para que os usuários possam acessar os bancos.

create database ghostdev;  
create database ghost;  
create user 'ghost'@'localhost' identified by 'SUA_SENHA';  
grant all privileges on ghost.* to 'ghost'@'localhost';  
grant all privileges on ghostdev.* to 'ghost'@'localhost';  
flush privileges;  
quit  

Instalando o Nodejs

$ sudo apt-get install npm nodejs

Instalando o Ghost

Primeiro, vamos entrar na pasta, criar a pasta blog

$ mkdir /var/www/blog/
$ cd /var/www/blog/

Agora, vamos baixar o ghost utilizando o curl.

$ curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip

Vamos descompactar o arquivo.

$ unzip -uo ghost.zip -d .
$ cd ghost

Instalaremos o Node.js no Ghost. Você também vai querer o módulo para MySQL, para que a nossa instalação do Ghost utilize o banco de dados que criamos anteriormente.

$ npm install --production
$ npm install mysql

Modifique os config.js em seu Ghost. Altere a url nas sessões de desenvolvimento e produção para o endereço do seu blog.

development: {  
    // The url to use when providing links to the site, E.g. in RSS and email.
    url: 'http://blog.adlerdias.eti.br',

e

production: {  
    url: 'http://blog.adlerdias.eti.br',

Em seguida, colocaremos as configurações do banco de dados de produção e desenvolvimento, substituindo as versões SQLite padrão, tanto em desenvolvimento e produção:

database: {  
    client: 'mysql',
    connection: {
        host: 'localhost',
        user: 'ghost',
        password: 'SUA_SENHA',
        database: 'ghostdev',
        charset: 'utf8'
    }
},

e, para Produção:

database: {  
    client: 'mysql',
    connection: {
        host: 'localhost',
        user: 'ghost',
        password: 'SUA_SENHA',
        database: 'ghost',
        charset: 'utf8'
    }
},

Para finalizar, vamos instalar e iniciar o Ghost.

$ npm install --production
$ npm start

Em um navegador, navegue até a url 127.0.0.1:2368 para ver o seu Blog.

Gzip Requisições HTTP com NGINX

Se você utiliza já utiliza o Nginx, provavelmente você se importa com desempenho, e uma das maneiras mais fáceis de ganhar desempenho é compactar em Gzip as requisições HTTP. O Gzip pode não só aumentar o desempenho do seu site, como também economizar a banda.

Como o Gzip funciona

De uma forma bem simplificada, a compressão em gzip funciona, encontrando strings semelhantes dentro de um arquivo de texto, e substituindo aquelas strings temporariamente para fazer o tamanho total do arquivo menor. Esta forma de compressão é particularmente adequada para a web porque o HTML e CSS geralmente contém muitas strings repetidas, como espaços em branco, tags e definições de css.

Se você utiliza o Nginx no Linux, você, provavelmente já possui o gzip instalado.

Você pode adicionar essas diretivas no http, server ou ainda na location do seu arquivo de configuração do nginx, dependendo apenas das suas necessidades.

gzip on;  
gzip_proxied any;  
gzip_types text/plain text/css text/javascript text/xml application/xml application/xhtml+xml application/xml+rss;  
gzip_disable "MSIE [1-6].";  

Explicando as diretivas

gzip on; – Habilitamos a compressão Gzip.
gzipproxied any; – Aplica a compressão Gzip em todas as requisções. Você pode ver a lista com todos os parâmetros aqui – gzipproxied.
gziptypes text/plain text/css text/javascript text/xml application/xml application/xhtml+xml application/xml+rss; – Tipos de conteúdo que serão comprimidos com Gzip. Perceba que text/html já é habilitado por padrão, e irá gerar um aviso se você adicioná-lo aqui.
gzip*disable “MSIE [1-6].” – Serve para desabilitarmos a compressão com Gzip para as versões muito antigas do Internet Explorer.

Outras Configurações Gzip

Existem algumas outras configurações que podem ser utilizadas que não foram listadas acima. Ou seja, você pode personalizá-lo ainda mais. Eu não vejo qualquer razão para mudar estes dos valores padrão, mas acredito que valha a pena citá-los.

gzipcomplevel

Você pode aumentar o nível de compressão, pagando o preço do trabalho do servidor. O nível padrão é 1, que é o que a maioria das pessoas utilizam. É geralmente aceito que o aumento gzipcomplevel é um anti-pattern de desempenho, uma vez que leva mais tempo para comprimir do que a economia que será gerada por essa compressão extra.

gzipminlength

Com essa diretiva, você pode definir o tamanho mínimo do arquivo em bytes para que o mesmo seja comprimido utilizando Gzip. O valor padrão é de 20 bytes.

Se você quiser ler mais sobre Gzipping com o servidor nginx, recomendo a documentação oficial.

File(/usr/bin/php) is not within the allowed path(s)

open_basedir – O que é?

No PHP existe uma diretiva chamada openbasedir, que é uma medida de proteção que previne que usuários abram arquivos ou scripts que estão localizados fora do diretório home com PHP, a não ser que a pasta esteja especificada como excluída. A diretiva openbasedir se ativada, irá garantir que todas as operações em arquivos sejam limitadas à arquivos que estão dentro de uma certa hierarquia de pastas, e assim, evitar que scripts consigam acessar arquivos em uma pasta que não esteja autorizada. Quando um script tenta abrir um arquivo com, por exemplo, fopen() or gzopen(), a localização do arquivo é verificada. Quando o arquivo está fora da árvore de diretórios permitida, o php irá recusar abrir esse arquivo e algum dos erros abaixos poderá acontecer:

[adlersd@insomniac:~/www]
% composer  
PHP Warning:  Phar::mapPhar(): open_basedir restriction in effect. File(/usr/local/bin/composer) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/home/adlersd/www/) in /usr/local/bin/composer on line 13

Warning: Phar::mapPhar(): open_basedir restriction in effect. File(/usr/local/bin/composer) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/home/adlersd/www/) in /usr/local/bin/composer on line 13  

ou

[ErrorException]
  is_file(): open_basedir restriction in effect. File(/usr/bin/php) is not within the allowed p  
  ath(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/)

ou ainda

[adlersd@insomniac:~/www/sf2]
% composer                                                                255 ↵
PHP Warning:  Phar::mapPhar(): open_basedir restriction in effect. File(/usr/local/bin/composer) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/) in /usr/local/bin/composer on line 13

Warning: Phar::mapPhar(): open_basedir restriction in effect. File(/usr/local/bin/composer) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/) in /usr/local/bin/composer on line 13  
PHP Warning:  require(phar://composer.phar/bin/composer): failed to open stream: phar error: invalid url or non-existent phar "phar://composer.phar/bin/composer" in /usr/local/bin/composer on line 15

Warning: require(phar://composer.phar/bin/composer): failed to open stream: phar error: invalid url or non-existent phar "phar://composer.phar/bin/composer" in /usr/local/bin/composer on line 15  
PHP Fatal error:  require(): Failed opening required 'phar://composer.phar/bin/composer' (include_path='.:/usr/share/pear') in /usr/local/bin/composer on line 15

Fatal error: require(): Failed opening required 'phar://composer.phar/bin/composer' (include_path='.:/usr/share/pear') in /usr/local/bin/composer on line 15  

Como eu utilizo open_basedir para resolver o meu problema?

Precisamos editar o php.ini, no meu caso, /etc/php/php.ini

[adlersd@insomniac:~/]
% sudo vim /etc/php/php.ini

e modificar a linha abaixo adicionando os paths que estavam nos alertas/erros acima:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/usr/bin/:/usr/local/bin/