Instalando drive PDO PHP do SQL Server no Linux

Instalando o PHP

sudo add-apt-repository ppa:ondrej/php -y
sudo apt-get update
sudo apt-get install php8.1 php8.1-dev php8.1-xml -y --allow-unauthenticated

Instalando os pré requisitos (Ubuntu 16.04 18.04 20.04 22.04)

sudo curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -

sudo curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list > /etc/apt/sources.list.d/mssql-release.list

Instalando o ODBC do SQL Server 17

sudo apt update
sudo ACCEPT_EULA=Y apt install -y msodbcsql17
sudo apt install unixodbc-dev

Opcional: Para usar ferramentas como BCP e SQLcmd

sudo ACCEPT_EULA=Y apt-get install -y mssql-tools
echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
source ~/.bashrc

Instalando o driver PDO do SQL Server no PHP

sudo pecl install sqlsrv
sudo pecl install pdo_sqlsrv

Setando a configuração do driver

sudo printf "; priority=20\nextension=sqlsrv.so\n" > /etc/php/8.1/mods-available/sqlsrv.ini

sudo printf "; priority=30\nextension=pdo_sqlsrv.so\n" > /etc/php/8.1/mods-available/pdo_sqlsrv.ini

Habilitando a configuração

sudo phpenmod -v 8.1 sqlsrv pdo_sqlsrv

Se estiver usando Apache, ele deve ser reiniciado

sudo service apache2 restart

Referências

Configurando variáveis de ambiente no Apache

Criando no um arquivo separado com somente com as variáveis

sudo vim /etc/apache2/conf-available/env-vars.conf

Definindo as variáveis no arquivo

SetEnv PASS_DB "senhaBemForte"
SetEnv USER_DB "stringAleatoria"
SetEnv TESTE "olha o teste"

Habilitando a configuração

sudo a2enconf env-vars

Reiniciando o Apache

sudo systemctl reload apache2

Observações

  • Fique atento às brechas de segurança da sua aplicação. As variáveis criadas podem ser acessadas via <?=phpinfo();?> , leia esse post.
  • Se você estiver usando o PHP-FPM essas variáveis não serão enxergadas pelo PHP.

Referências

    • https://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv
    • https://docstore.mik.ua/orelly/linux/apache/ch04_06.htm
    • https://www.doppler.com/blog/configuring-php-applications-using-environment-variables
    • https://stackoverflow.com/questions/6554583/how-secure-is-storing-db-variables-with-setenv-or-in-php-ini
    • https://imasters.com.br/desenvolvimento/protegendo-seus-dados-utilizando-variaveis-de-ambiente
    • https://www.linode.com/community/questions/23444/how-do-i-access-environment-variables-set-in-conf-file-in-php-code

    Instalando o Apache2 e configurando SSL/TLS

    Instalando o Apache2

    sudo apt install apache2

    Copie os arquivos do seu projeto para o Document root do Apache: /var/www/html

    Altere as permissões de dono e grupo para o usuário do apache: 

    sudo chown -R www-data:www-data /var/www/html/

    Aplicando URL Rewriting

    Avalie se para o seu caso o rewrite é aplicável.
    Ativando o mod_rewrite

    sudo a2enmod rewrite

    Apache rodando sem SSL/TLS, edite o arquivo:

    /etc/apache2/sites-available/000-default.conf

    Dentro do bloco de código <VirtualHost *:80> </VirtualHost> , insira a configuração a seguir. O bloco deve ficar mais ou menos assim:

    <VirtualHost *:80>
      <Directory />
        Options FollowSymLinks
        AllowOverride All
      </Directory>
      <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
      </Directory>
    </VirtualHost>

    Apache rodando com SSL/TLS, edite o arquivo:

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

    Obs: Pode haver variação no nome desse arquivo dependendo de como foi configurado o ssl/tls.

    Dentro do bloco de código <VirtualHost *:443> </VirtualHost>, insira a configuração abaixo:

    <VirtualHost *:443>
      <Directory />
        Options FollowSymLinks
        AllowOverride All
      </Directory>
      <Directory /var/www/html>
        Options FollowSymLinks
        AllowOverride All
        Order Allow,Deny
        Allow from all
      </Directory>
    </VirtualHost>

    Reinicie o Apache2

    sudo systemctl restart apache2

    Configurando a criptografia na comunicação  (certificado digital/HTTPS/TLS/SSL)


    Com Let’s Encrypt

    Siga os passos descritos no site da organização https://letsencrypt.org/getting-started/ .Geralmente instalar usando o https://certbot.eff.org/ dá certo.

    Observação

    Quando tentei instalar o certificado em instâncias da AWS, utilizando o DNS público da instância, exemplo ec2-52-548-54-242.compute-1.amazonaws.com, não deu certo.

    Criando o seu certificado

    Habilitando o módulo ssl

    sudo a2enmod ssl

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Criando a pasta onde ficará armazenado os arquivos do certificados:

    sudo mkdir /etc/apache2/ssl

    Criando os arquivos da chave e certificado

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

    Durante o processo de criação, irão aparecer algumas perguntas para você responder, a mais importante é “Common Name (e.g. server FQDN or YOUR name)”, insira o nome do seu domínio ou o IP público do seu servidor WEB.

    Edite o arquivo de configuração do ssl:

    sudo vim /etc/apache2/sites-available/default-ssl.conf

    Sem os comentários, ele deve estar mais ou menos assim:

    <IfModule mod_ssl.c>
       <VirtualHost _default_:443>
       	ServerAdmin webmaster@localhost
       	DocumentRoot /var/www/html
       	ErrorLog ${APACHE_LOG_DIR}/error.log
       	CustomLog ${APACHE_LOG_DIR}/access.log combined
       	SSLEngine on
       	SSLCertificateFile  /etc/ssl/certs/ssl-cert-snakeoil.pem
       	SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
       	<FilesMatch "\.(cgi|shtml|phtml|php)$">
               	SSLOptions +StdEnvVars
       	</FilesMatch>
       	<Directory /usr/lib/cgi-bin>
               	SSLOptions +StdEnvVars
       	</Directory>
       </VirtualHost>
    </IfModule>

    Edite o arquivo para ele ficar assim:

    <IfModule mod_ssl.c>
    	<VirtualHost default:443>
        	 ServerAdmin admin@example.com
        	 ServerName your_domain.com
        	 ServerAlias www.your_domain.com
        	 DocumentRoot /var/www/html
        	 ErrorLog ${APACHE_LOG_DIR}/error.log
        	 CustomLog ${APACHE_LOG_DIR}/access.log combined
        	 SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.crt
        	 SSLCertificateKeyFile /etc/apache2/ssl/apache.key
        	<FilesMatch ".(cgi|shtml|phtml|php)$">
            	SSLOptions +StdEnvVars
        	</FilesMatch>
        	<Directory /usr/lib/cgi-bin>
            	SSLOptions +StdEnvVars
        	</Directory>
    	</VirtualHost>
    </IfModule>

    Habilitando a configuração

    sudo a2ensite default-ssl.conf

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Ativando redirecionamento HTTP para HTTPS

    Ativando o redirecionamento usando virtualHost

    Edite o arquivo:

    sudo vim /etc/apache2/sites-available/000-default.conf

    Adicione a linha no bloco <VirtualHost *:80> </VirtualHost> e salve.

    Redirect / https://seu-dominio-aqui.com

    Reiniciando o Apache2

    sudo systemctl restart apache2

    Trabalhando as permissões de arquivo

    Alterando a propriedade e grupo da pasta /var/www/html/ para o usuário do apache: 

    sudo chown -R www-data:www-data /var/www/html/

    Alterando as permissões de acesso da pasta.
    Obs: Esse nível de acesso pode variar conforme a sua necessidade.

    sudo chmod -R 750 /var/www/html/

    Debugando problemas

    Para acompanhar as requisições que estão chegando:

    tail -f /var/log/apache2/access.log

    Para acompanhar os erros:

    tail -f /var/log/apache2/error.log

    Referências

    Docker: Comandos basicos

    O processo de instalação no Ubuntu e derivados você pode encontrar aqui e para Windows aqui.

    Sintaxe do comando Docker: 

    usuario@host# docker [OPTIONS] COMMAND [ARG...]

    O docker é uma CLI (comand-line interface).

    usuario@host# docker --version
    Docker version 19.03.5, build 633a0ea838

    O –version é uma opção. Para ver outras opções execute o comando man docker

    usuario@host# docker run hello-world

    O run é um comando do docker. Ao executar esse comando, caso a imagem hello-world não exista na sua máquina, o docker solicita ao docker hub e baixa a imagem

    Listar os containers em execução

    docker ps

    Listar todos os containers da máquina

    docker ps -a

    Na saída do comando, cada coluna tem seu significado:
    IMAGE -> imagem que esse container utilizou 
    COMMAND -> O comando que foi executado
    PORTS -> Se o container estiver respondendo em uma porta, aparecerá aqui.
    NAMES -> Se não for dado um nome ao container o docker dará um nome a ele.

    Listar as imagens da minha máquina

    docker images

    Na saída do comando, cada coluna tem seu significado:
    REPOSITORY -> Nome da imagem
    TAG -> versão da imagem

    Criar um container com interatividade, terminal e dando um nome

    docker run -ti --name [nome] [nome-da-imagem] /bin/bash

    Exemplo: docker run -ti –name desenvolvimento ubuntu /bin/bash

    O /bin/bash é um comando que eu posso executar ao rodar o container.

    O –name [nome] é um nome que você pode dar para o container.

    Criar e executar um container em background (demon)

    docker run -d [imagem]

    Criar um container com limitação de memória

    docker run -ti --memory 512m --name teste ubuntu 

    Criar um container a partir de uma versão específica de imagem

    docker run [nome-da-imagem]:[versao]
    Exemplo: docker run centos:7

    Finalizar o container por dentro

    CTRL+D

    Esse atalho finaliza o  processo principal do container e por conseguinte encerra o finaliza.

    Sair do container sem finalizar

    CTRL+P+Q

    Entrar em um container já em execução

    docker attach [CONTAINER ID | NOME-CONTAINER]

    Dar um STOP no container

    docker stop [CONTAINER ID | NOME-CONTAINER]

    Dar um START em um container ‘stopado’

    docker start [CONTAINER ID | NOME-CONTAINER]

    Dar um PAUSE no container

    docker pause [CONTAINER ID | NOME-CONTAINER]

    Despausar um container

    docker unpouse  [CONTAINER ID | NOME-CONTAINER]

    Saber o consumo de recursos do container

    docker stats  [CONTAINER ID | NOME-CONTAINER]

    Saber o consumo dos processos rodando no container

    docker top [CONTAINER ID | NOME-CONTAINER]

    Listar os logs do container

    docker logs [CONTAINER ID | NOME-CONTAINER]

    Remover um container

    docker rm [CONTAINER ID | NOME-CONTAINER]

    Se o container estiver em execução você precisa acrescentar o parametro -f:

    docker rm -f [CONTAINER ID | NOME-CONTAINER]

    Saber todas as informações sobre um container

    docker inspect [CONTAINER ID | NOME-CONTAINER]

    Criar um container passando um volume

    docker run -ti -v /volume [nome-da-imagem] [comando]

    Descobrir onde está o diretório no HOST-DOCKER que foi criado o volume

    docker inspect -f {{.Mounts}} [CONTAINER ID | NOME-CONTAINER]

    Criar um container mapeando um diretório local para um volume dentro do container

    docker run -ti -v /diretorio-no-host-docker:/volume [nome-da-imagem] [comando]

    Referências

    Descomplicando o docker v1 (Linux Tips)

    Como instalar o PostgreSQL e pgAdmin no Linux

    Tutorial de instalação do SGBD PostgreSQL e a ferramenta de administração pgAdmin 4. No final é dado dicas caso esteja utilizando PHP.

    Estou usando Ubuntu, qual a minha versão?

    Se você estiver usando o Ubuntu ou uma distribuição baseada nele, um desses comandos pode te ajudar a descobrir:

    lsb_release -cs
    cat /etc/*-release

    No resultado do comando acima, procure por ‘VERSION_CODENAME’.

    Instalando o PostgreSQL

    Preferencialmente siga a documentação de instalação do PostgreSQL. Caso tenha algum problema execute o comando abaixo:

    sudo apt -y install postgresql

    Estou com problema no arquivo /etc/apt/sources.list.d/pgdg.list

    Algumas pessoas tem problema ao criar o arquivo /etc/apt/sources.list.d/pgdg.list utilizando o script da documentação do Postgres. Se for o seu caso, faça isso:

    • Descubra qual a sua versão utilizando a dica do tópico acima.
    • O comando abaixo ira criar o arquivo /etc/apt/sources.list.d/pgdg.list. Coloque no comando abaixo a sua versão:
    sudo echo "deb http://apt.postgresql.org/pub/repos/apt suaVersao-pgdg main" > /etc/apt/sources.list.d/pgdg.list

    Como remover o PostgreSQL?

    Para remover totalmente o PostgreSQL siga esses passos:

    sudo apt --purge remove postgresql\*
    
    sudo rm -rf /etc/postgresql/
    sudo rm -rf /etc/postgresql-common/
    sudo rm -rf /var/lib/postgresql/
    sudo userdel -r postgres
    sudo groupdel postgres

    Usando PHP?

    Se você estiver usando php, instale também a extensão PDO do postgres

    sudo apt install php8.1-pgsql

    Instalando o pgAdmin 4

    Preferencialmente siga a documentação de instalação do pgAdmin 4. Caso tenha algum problema execute o comando abaixo:

    sudo apt install pgadmin4

    Criando o banco de dados pelo terminal

    Primeiro precisamos acessar o prompt de comando do usuário postgres. Este usuário foi criado automaticamente na instalação do PostgresSQL.

    sudo su - postgres

    Para criar o banco de dados:

    createdb bancoTeste

    Vamos manipular o banco utilizando a ferramenta psql:

    psql -d bancoTeste

    Vamos atribuindo uma nova senha para o usuário postgres:

    \password postgres

    Ele vai pedir que você digite a nova senha duas vezes.

    O psql é uma ferramenta muito útil. Esse post é um bom começo: PostgreSQL: Basic psql Commands

    Acessando o pgAdmin 4

    – Você pode pesquisar no menu de aplicativos do seu S.O por: pgadmin4

    – Ou iniciando pelo terminal usando o comando: pgadmin4

    – A partir do usuário postgres você consegue criar e logar nos bancos.

    Referências