Guia executado e testado em Ubuntu Server 18.04.2 LTS.
Atualizamos o sistema, instalamos os pacotes necessários e clonamos o repositório, em Ubuntu:
$ apt update
$ apt upgrade
$ apt install git python3-pip postgresql postgresql-contrib nginx certbot python3-certbot-nginx libmysqlclient-dev
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
$ nvm install 14.17.6
$ nvm use 14.17.6
$ pip3 install virtualenv
$ git clone https://github.com/rafaelsartori96/CACo-site.git
Agora faremos a build do Bootstrap para o site.
Entramos (a partir da pasta raiz do projeto) na pasta do Bootstrap:
$ cd boostrap/
Instalamos os prérequisitos do projeto localmente:
$ npm install
Para desenvolvimento e testes, iniciamos o ambiente de teste e visualização:
$ npm start
Para apenas compilar, fazemos a build do Bootstrap:
$ npm run build
Copiamos os arquivos para a pasta estática do site:
$ cp build/* ../django-site/djangosite/djangosite/static/
Saímos dessa pasta (voltamos à raiz):
$ cd ..
Para seguir, precisamos ativar o banco de dados. Por padrão, já não será possível conectar aos usuários remotamente, então nisso estamos seguros. Precisamos alterar a senha padrão e criar um usuário para ser utilizado com Django.
Para fazer isso, precisamos entrar como usuário postgres:
$ sudo su - postgres
# Agora, como usuário postgres, entramos no cliente
$ psql
postgres=#
Agora criamos um novo usuário e um banco de dados para o site:
postgres=# CREATE USER usuario WITH PASSWORD 'SENHA';
postgres=# CREATE DATABASE nome_banco_dados OWNER usuario;
Temos que adicionar também permissão para nos conectar com senha (o padrão é
peer, ou seja, um usuário shell de mesmo nome) quando utilizamos socket.
Alteramos a configuração de acesso de PostgreSQL no arquivo
/etc/postgresql/(versão)/main/pg_hba.conf:
$ EDITOR_PREFERIDO /etc/postgresql/(versão)/main/pg_hba.conf
# alteramos a coluna final "peer" na linha que inicia com "local" para "md5"
# Após alterar, reiniciamos o serviço
$ systemctl restart postgresql
Após configurarmos isso, podemos acessar o banco de dados utilizando o socket e nossa senha:
$ psql nome_banco_dados -U usuario -W
(pedirá a senha)
Agora basta colocarmos essa configuração no nosso arquivo config.json, que
faremos na próxima seção.
Para executar os comandos, é necessário substituir usuário, banco de dados e caminho até o arquivo de dump. Há um grande problema com troca de usuários e banco de dados quando restauramos um dump, então tome cuidado! Estou colocando o comando aqui pois precisei alterar o usuário do antigo banco de dados utilizado em Docker.
Para executar um dump:
pg_dump -U (usuário) (banco de dados) -F t --no-owner > (arquivo de dump, formato TAR)
Para restaurar o banco de dados:
pg_restore --no-owner --role (usuário) -d (banco de dados) -c -U (usuário) (arquivo de dump)
Configuramos agora o site utilizando um virtual
environment (instala pacotes de
Python sem que interfira com o resto do sistema, permitindo estabilidade pois
escolhemos quando queremos atualizar um sistema em produção independente dos
pacotes do sistema operacional). Faremos isso através de virtualenv, uma
ferramenta que torna mais agradável trabalhar com virtual environments.
Para utilizarmos depois o virtual environment em produção, temos que instalar o virtualenv num local bem definido do projeto (para configurarmos uwsgi futuramente).
Entramos na pasta raiz do projeto Django (a partir da pasta raiz do projeto):
$ cd django-site/
Criamos um virtual environment e instalamos todos os pacotes do projeto
(descritos no arquivo requirements.txt, que contém os pacotes do projeto e
suas versões):
# criamos o virtual environment com nome '.venv' (pode ser qualquer nome)
$ virtualenv .venv
# ativamos ele
$ source .venv/bin/activate
# Para produção, é importante continuar as versões testadas (sem atualizá-las)
# Note que o nome do virtual environment aparece à esquerda
(.venv) $ pip install --requirement requirements.txt
Entramos no projeto Django (a partir da pasta raiz do projeto Django):
(.venv) $ cd djangosite/
Editamos o arquivo config.json como diz
README.md:
(.venv) $ EDITOR_PREFERIDO config.json
# Configuramos o necessário
Para configurar o ReCaptcha v3, crie um aplicativo aqui.
Para configurar o e-mail: se utilizar o do IC, utilize as configurações SMTP daqui; caso contrário, procure as configurações do provedor de sua escolha.
Para configurar o banco de dados, basta substituir os credenciais.
Se houver qualquer dúvida, volte no endereço do README para ler mais atentamente o trecho de configuração.
Voltando à pasta Django, preparamos a estrutura do banco de dados:
(.venv) $ python manage.py makemigrations
Colocamos a estrutura no banco de dados:
(.venv) $ python manage.py migrate
Criamos um super usuário (administrador do site):
(.venv) $ python manage.py createsuperuser
Copiamos arquivos estáticos para serem servidos:
(.venv) $ python manage.py collectstatic
Executamos o servidor para desenvolvimento e testes no IP e porta que quisermos:
(.venv) $ python manage.py runserver ip:porta
No nosso navegador, acessamos o site com o final do endereço /admin para
acessarmos a página de administrador e criar páginas, notícias, menu etc. Para
visualizar o site corretamente, é necessário criar pelo menos uma notícia ou uma
página estática com endereço / (chamada de root ou raiz).
Após concluído, fechamos o servidor e o banco de dados utilizando Ctrl + C.
Para sair do virtual environment, utilize o comando exit ou utilize o atalho
Ctrl + D (isso não fechará o terminal, pois o virtual environment abre uma
sessão ao ser ativado).
Após executar os mesmos passos para desenvolvimento (preparar o workspace é bem parecido com preparar o website para produção, pois inicializamos o banco de dados, criamos um super user etc).
Para iniciar o servidor utilizando uwsgi (para ser passado pelo nginx), utilizamos no virtual environment:
(.venv) $ uwsgi --ini uwsgi.ini
(uwsgi criará o socket ou servirá TCP para o nginx que ainda será configurado)
Depois dos testes com nginx, temos que configurar o uwsgi para abrir
automaticamente com um serviço, que está descrito em uwsgi.service. Nesse
arquivo, precisamos atualizar os caminhos até o projeto e nome de usuário,
depois copiar e ativar o serviço utilizando systemd. Para isso, fazemos:
$ EDITOR_PREFERIDO uwsgi.service
(alteramos o caminho para a raiz do projeto)
# Copiamos o serviço para a pasta de serviços
$ cp uwsgi.service /etc/systemd/system/
# Recarregamos o systemctl
$ systemctl daemon-reload
# Iniciamos o serviço e testamos
$ systemctl start uwsgi.service
Após conferir o status utilizando o comando systemctl status uwsgi.service e
verificar também se tudo está funcionando (após configurar nginx e testar
utilizando o navegador), podemos ativar o serviço para executar em boot.
$ systemctl enable uwsgi.service
Observação: teste também systemctl stop uwsgi.service.
Precisamos copiar e configurar o perfil que queremos para nginx, substituindo a
configuração padrão (em /etc/nginx/nginx.conf).
$ cd nginx/
$ cp http.conf /etc/nginx/nginx.conf
$ EDITOR_PREFERIDO /etc/nginx/nginx.conf
(precisamos alterar os caminhos de alguns itens)
É necessário configurar nginx.conf para o caminho do socket configurado em
uwsgi e para o caminho das pastas static/ e media/. Então podemos utilizar
o editor para substituir o texto /caminho/para/projeto/django pelo caminho
real até o arquivo django_caco-uwsgi.socket (incluindo o nome do arquivo) que foi criado ao executar o uwsgi anteriormente.
Conferimos se está tudo certo e recarregamos a configuração:
$ nginx -t
(verificar se há erros no arquivo de configuração)
$ nginx -s reload
# Com Django aberto, testamos o site e, se necessário, verificamos o log:
$ cat /var/log/nginx/acess.log | less
$ cat /var/log/nginx/error.log | less
Na primeira execução, é necessário adquirir os certificados para habilitar o serviço HTTPS. Utilizamos o certbot para fazer isso, ele irá automaticamente fazer as mudanças necessárias na configuração do nginx.
Para configurar o dhparam.pem que utilizanos com nginx, precisamos executar:
$ openssl dhparam -out /etc/nginx/dhparam.pem 2048
Para verificar o que está desatualizado no virtual environment e atualizar, é
necessário estar na pasta que contém o requirements.txt e executar, com o
environment ativado:
# Reinstalamos com upgrade
(.venv) $ pip install -U -r requirements.txt
# Checamos dependências
(.venv) $ pip check
# Se tudo foi testado e funciona, atualizamos requirements.txt
(.venv) $ pip freeze > requirements.txt
Para verificar o que está desatualizado no package e atualizar, é necessário
estar na pasta que contém o package.json e executar:
$ npm outdated
# "Wanted" é a versão compatível descrita pelo package.json
Para atualizar para Latest é necessário instalar o pacote npm-check-updates
e executar:
# Para instalar o pacote:
$ npm install -g npm-check-updates
# Para atualizar:
$ ncu -u
(irá te informar as alterações)
$ npm install
(irá atualizar)
# Teste as novas versões compilando o projeto e corrija incompatibilidades se houver
$ npm run build