Install php {MySQL,PgSQL,Redis,Postfix,vBox} Admin

Intro

Normalmente, há duas maneiras de compor a URL destes aplicativos: pode-se utilizar um subdomínio específico (https://phpmyadmin.domain.tld) ou accessá-los à partir de pastas dentro do domínio principal (https://domain.tld/phpmyadmin). Cada um deles vai ter vantagens e desvantagens, sendo que nem sempre se pode escolher entre um ou outro, devido a restrições pré-existentes na infraestrutura (DNS, emissão de certificados, decisões do ~business~, etc)

Ao usar Apache, não há diferenças essenciais entre a configuração de um subdomínio ou de uma subpasta. Entretanto, isto não se aplica a Nginx: a configuração de aplicações em subpastas pode ser bastante complicada, mesmo para usuários experientes. A documentação oficial é confusa, e não é exatamente fácil pesquisar sobre isso, pois uma pesquisa pelos termos “nginx” e “subfolder” traz muito conteúdo que está desatualizado ou simplesmente não se aplica ao problema. Por isso, o objetivo desse artigo é trazer exemplos prontos e explicar o que está sendo feito, para que seja possível adaptar esses exemplos para outras situações que não serão abordadas aqui.

Embora os exemplos sejam baseados em Arch Linux, são facilmente transponíveis para outras distros. Parto também do princípio que MySQL é a database “padrão”, ainda que PostGreSQL esteja entre os exemplos tratados.

Tópicos:

  • instalação de pacotes e como habilitar sua inicialização automática;

  • preparação para executar MySQL / MariaDB;

  • configuração básica de PostGreSQL;

  • configuração básica de Postfix;

  • configuração básica de Redis;

  • PHP 7.4 e módulos necessários (fpm, gd, intl, imap, mysqli, redis);

  • revisão dos arquivos de configuração em /etc/webapps/;

  • criar databases para phpmyadmin e postfixadmin;

  • revisão das contas de serviço e seus agrupamentos;

  • nginx: main site with https, basic auth and subfolders;

      # pacman -S nginx postfix mysql redis certbot php (...)
      # systemctl enable { nginx, mysql, redis, postfix, php-fpm }
    

phpMyAdmin

Por padrão, o serviço de MySQL é configurado para escutar conexões de rede em todas as interfaces disponíveis. Se isso não for desejável, é preciso configurar explicitamente para que o serviço esteja disponível apenas localmente. Há duas opções possíveis, e devemos optar por apenas uma delas:

…tcp/ip apenas para o host local:

bind-address = 127.0.0.1
port = 3306

… ou sockets:

skip-networking

Caso sockets estejam em uso, deve-se adaptar a configuração do Nginx de acordo com isso. Após esta definição, a instalação do serviço prossegue com o seguintes comandos:

# mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# systemctl start mysqld
# mysql_secure_install

Desta maneira, a senha do usuário root pode ser definida, e é recomendável remover as databases de testes e proibir usuários anonimos.

Os comandos abaixo criarão um usuário para lidar com a database do phpmyadmin e executar tarefas de backup. Pode-se usar /usr/share/webapps/phpMyAdmin/sql/create_tables.sql se necessário para criar as tabelas. As tabelas abaixo devem estar listadas em /etc/webapps/phpmyadmin/config.inc.php

# mysql -u root -p < /usr/share/webapps/phpMyAdmin/sql/create_tables.sql
# mysql -u root -p
> CREATE USER 'pma'@'localhost' IDENTIFIED BY 'CHANGE-ME!';
> GRANT USAGE ON mysql.* TO 'pma'@'localhost' IDENTIFIED BY 'CHANGE-ME!';
> GRANT SELECT (
    Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv,
    Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv,
    File_priv, Grant_priv, References_priv, Index_priv, Alter_priv,
    Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv,
    Execute_priv, Repl_slave_priv, Repl_client_priv
 ) ON mysql.user TO 'pma'@'localhost';
> GRANT SELECT ON mysql.db TO 'pma'@'localhost';
> GRANT SELECT ON mysql.host TO 'pma'@'localhost';
> GRANT SELECT (Host, Db, User, Table_name, Table_priv, Column_priv)
    ON mysql.tables_priv TO 'pma'@'localhost';
> GRANT SELECT, INSERT, UPDATE, DELETE ON phpmyadmin.* TO 'pma'@'localhost';
> GRANT SELECT, LOCK TABLES ON *.* TO 'pma'@'localhost';

Falta agora configurar a chave para blowfish_secret e um diretório temporário, o qual requer permissão de escrita para o usuário http

# vi /usr/share/webapps/phpMyAdmin/config.inc.php
> $cfg['blowfish_secret'] = 'UNIQUE-32-CHARS-RANDOM-STRING';
> $cfg['TempDir'] = '/tmp/phpmyadmin';

Com isso, tanto MySQL como phpmyadmin estão prontos para serem utilizados pelo Nginx.

nginx subfolder: https://git.cryptostratus.net/CryptoStratus/GeneralConfig/raw/branch/master/nginx/subfolders/phpmyadmin.conf

phpPgAdmin

Após a instalação do PG, a instancia deve ser iniciada como o usuario postgres e habilitar o serviço na inicialização

# sudo -iu postgres
$[postgres] initdb --auth=peer --locale=en_US.UTF-8 --encoding=UTF8 --pgdata=/var/lib/postgres/data
$[postgres] exit
# systemctl enable postgresql

nginx subfolder: https://git.cryptostratus.net/CryptoStratus/GeneralConfig/raw/branch/master/nginx/subfolders/phppgadmin.conf

phpRedisAdmin

phpPostfixAdmin

phpVboxAdmin

nginx

Uma vez que todos os serviços acima estejam funcionando, podemos integrá-los dentro do nginx.

Estrutura hierárquica dos arquivos:

  • nginx.conf é o arquivo principal, onde se estabelecem diretivas de escopo global e outros arquivos são incluídos
  • extra: php-fpm.conf define o uso de scripts .php
  • sites-available: qualquer site a ser utilizado é definido aqui, mas não deve ser referenciado diretamente….
  • sites-enabled: …pois são feitos links simbólicos desses sites nesta pasta, os quais são invocados pelo arquivo principal
  • ssl: default.conf contém diretivas reaproveitaveis por qualquer site que tenha SSL/TLS habilitado. De resto, arquivos de certificados, chaves, dhparams.pem, etc.
  • subfolders: cada aplicação tem um arquivo especifico, para ser invocado pelo site principal de acordo com a necessidade.

.

  • location /phpmyadmin => define o nome da subpasta e o escopo da aplicação
  • alias /path/to/app => deve apontar para o caminho onde a aplicação foi instalada. Não é o caso aqui, mas algumas aplicações devem apontar para a pasta public dentro da aplicação.
  • log de acesso e log de erro próprios, para não poluir os logs do site principal
  • include php
  • a regex define os tipos de arquivo que não html e php
  • rewrite para gerar as urls corretamente

.

# nginx -t
# systemctl reload nginx
  • testar URL
  • profit