Documentação da infraestrutura: mudanças entre as edições

m
(Criou página com 'trazer para cá sup:Infraestrutura do AddressForAll etc.')
 
 
(21 revisões intermediárias por 3 usuários não estão sendo mostradas)
Linha 1: Linha 1:
trazer para [[sup:Infraestrutura do AddressForAll]] etc.
Esta página pode ser desmembrada em subpáginas. Por hora consolidar e revisar.
 
= Infraestrutura do Instituto AddressForAll =
 
O termo ''infraestrutura'' pode ser referente a:
 
* '''infraestrutura básica''': ambientes &quot;em produção&quot;. Vinculada à manutenção e preservação do patrimônio. Exemplo: gestão técnica dos nomes de domínio, gestão das contas de e-mail <code>fulano@openstreetmap.com.br</code>, gestão dos [https://en.wikipedia.org/wiki/Web_server servidores-web] e dos bancos de dados de uso comum (institucionais ou sendo reutilizados para mais de um projeto).
* '''infraestrutura de desenvolvimento''': todos os projetos ativos em [http://git.addressforall.org repositórios ''git'' AddressForAll] de desenvolvimento de software, servidores-web de teste, bancos de dados temporários, etc.
* '''infraestrutura de comunicação''': ambientes de comunicação do AddressForAll, por hora apenas [https://dadosabertos.social/c/dados-espaciais/12 Comunidade aberta], blogs, caixas postais, e websites presentes nos nossos domínios.
 
Quando, na documentação, ''issues'' ou contratos, o termo ''infraestrutura'' não vier especificado, refere-se ao &quot;caso geral&quot;, dado pela união dos casos listados acima.
 
== Ambientes e ferramentas de uso geral ==
 
Designamos de &quot;ambiente&quot; o sistema operacional, as linguagens de programação e os ''frameworks'' de uso geral. Cada um deles deve ser mantido em conformidade com a respectiva '''versão estável''' (''long term support'' - '''LTS'''). Ambientes que formam o '''núcleo da infraestrutura''' AddressForAll:
 
{| class="wikitable"
! Ambiente
! Nome
! em 2021
! em 2022
! atualmente
! futuramente
|-
| Sistema Operacional (''server'')
| '''Ubuntu'''
| 20.04 LTS
| 22.04 LTS
| 22.04 LTS
| 24.04 LTS
|-
| Banco de dados (''SQL server'')
| '''PostgreSQL'''
| v12
| v14
| v14
| v16
|-
| Banco de dados
| '''PostGIS'''
|
|
| [https://postgis.net/2023/08/PostGIS-3.4.0/ v3.4.0]
| [https://git.osgeo.org/gitea/postgis/postgis/raw/tag/3.4.2/NEWS v3.4.2]
|-
| ''Web Server''
| '''NGINX'''
| v1.21
| v1.22
| v1.18
|-
| ''Microservices'' (API) server
| '''[https://postgrest.org/en/stable/ PostgREST]'''
| v8 stable
| [https://postgrest.org/en/stable/releases/v09.0.0.html v9 stable]
| [https://postgrest.org/en/stable/releases/v11.2.1.html v11.2.1 stable] [https://hub.docker.com/layers/postgrest/postgrest/latest/images/sha256-ded2f8ecea6853f73af1c679cdc6f9b8564978b9a028695bcce001b0a7f7fe3a?context=explore containerized]
|
|-
| Framework, website
| '''ReactJS'''
| v17 stable
| v18 stable
| v18 stable
|
|-
| Framework, website, language
| '''NodeJS''' ([https://github.com/AddressForAll/suporte/blob/master/docs/pt/nodejs.md instalação])
| v16 LTS
| v16 LTS
| v18 LTS
|
|-
| Framework, server-side scripts, low-level language
| GNU '''Bash'''
| v4
| v5
| v5
|
|-
| Framework, server-side scripts, high-level language
| '''Python'''
| v3.8
| v3.9
| v3.9
|
|-
| Framework, server-side orchestration
| GNU '''makefile'''
| v4
| v4
| v4
|
|-
|
| [https://github.com/OSGeo/gdal GDAL]
|
|
| [https://github.com/OSGeo/gdal/pkgs/container/gdal/128539391?tag=latest containerized]
|
|-
|`du -sh * | sort -hr | head -n10` ou ncdu v2
| ncdu
| v2
| v2
| v2
|
|}
 
=== Backup de uma base ===
... apesar do controle de versões por git, se houver alguma confusão, a implementação oficial é aquela que estiver rodando no servidor de produção. Vale o dump, por exemplo <code>pg_dump --schema-only -f dl05_dump_test.sql dl05</code>. Ver [[osmc:Metodologia/Algoritmo SQL|dump AFAcodes]] e [[sup:Wiki-backup]].
 
=== Produção ===
Atualmente, 2024, a máquina Digital Ocean <code>addressforall</code> (IP 165.227.5.135) é o servidor de produção do AFAcodes e o servidor-old de AddressForAll. Nele podemos conferir:
* porta padrão 5432 e versão do PostgreSQL: pelo comando <code>pg_lsclusters</code> temos a porta padrão apontando para versão 14, cluster "main"    usuário postgres, pasta <code>/var/lib/postgresql/14/main</code>  e logs em <code>/var/log/postgresql/postgresql-14-main.log</code>. Demais não deviam estar ocupando espaço, poderiam ser removidos.
 
=== Teste e ingestão ===
... descrever subdomínios e situação .. e máquinas DEV de teste e ingestão...
 
Se o seu servidor DEV está com PostgreSQL v16 na porta padrão 5432, convém pelo menos deixar instalado um PG de versão 14. Em geral a instalação Ubuntu PostgreSQL oferece o seguinte resultado default para <code>pg_lsclusters</code>:
<pre>
14  main    5433 online postgres /var/lib/postgresql/14/main /var/log/postgresql/postgresql-14-main.log
16  main    5432 online postgres /var/lib/postgresql/16/main /var/log/postgresql/postgresql-16-main.log
</pre>
 
Para chamar usando URI na forma <code>postgres[ql]://[username[:password]@][host[:port],]/database</code> temos as seguintes situações típicas:
 
* Para chamar o padrão, <code>psql postgresql://postgres@localhost/base</code><br/> ou <code>psql postgres://localhost/dl05s_main</code> ou <code>psql dl05s_main</code>
* Para chamar a v14, <code>psql postgresql://postgres@localhost:5433/base</code>
 
= Servidores de trabalho =
Para trabalhos de ingestão (ETL) podem ser usadas as máquinas de produção (ainda DigitalOcean) e a remota i7.
 
== Acesso via tailscale ==
 
'''Windows:'''
 
Faça download na url <nowiki>https://tailscale.com/download/windows</nowiki>
 
Instale o tailscale e no icone perto do relógio, clique nele e depois no conect
 
passe a Url para Carlos Rebollo. Seria bom agendar uma hora para falar sobre a VPN e acesso ao servidor.
 
 
 
'''Linux''':
Executar os comandos como root
 
curl -fsSL <nowiki>https://tailscale.com/install.sh</nowiki> | sh
 
 
tailscale up
 
 
irá gerar uma url
 
 
enviar para Carlos Rebollo. Seria bom agendar uma hora para falar sobre a VPN e acesso ao servidor.
 
= Ambiente de trabalho local =
 
Documentação em construção.
 
== Máquina virtual Ubuntu 22.04 ==
 
Utilizamos KVM e imagem cloud do Ubuntu 22.04 num hospedeiro Debian 12.Etapa opcional se já estiver rodando um Ubuntu 22.04.
 
=== Instalação no hospedeiro ===
Exemplo (adaptar à situação local e o valor de $USER).
<syntaxhighlight lang="sh">
sudo apt install libvirt-daemon-system qemu-system-x86 qemu-utils virtinst --no-install-recommends
sudo apt install dnsmasq virt-manager virt-viewer gir1.2-spiceclientgtk-3.0 --no-install-recommends
sudo adduser $USER libvirt
</syntaxhighlight>
 
=== Criação da VM ===
 
<syntaxhighlight lang="sh"># diretórios para imagens
DIRVM_TEMPLATES='~/libvirt/images/templates'
DIRVM_IMAGES='~/libvirt/images'
 
# chave pública para acessar a vm
SSH_PUB_KEY='XXXXXX'
 
# link para download da imagem
IMAGE_LINK='http://cloud-images.ubuntu.com/minimal/releases/jammy/release/ubuntu-22.04-minimal-cloudimg-amd64.img'
SHASUM='http://cloud-images.ubuntu.com/minimal/releases/jammy/release/SHA256SUMS'
 
# download e verificação da imagem
cd $DIRVM_TEMPLATES
wget ${IMAGE_LINK} && wget ${SHASUM}{.gpg,}
gpg --verify ${SHASUM/*\/}{.gpg,}
sha256sum -c SHA256SUMS --ignore-missing
 
# ver infos da imagem
file ${IMAGE_LINK/*\/}
qemu-img info ${IMAGE_LINK/*\/}
 
# metadados da imagem
VM_NAME='servera4a'
VM_DISK="${VM_NAME}_disk.qcow2"
VM_DISK_SIZE='20G'
VM_VCPUS='2'
VM_RAM='3072'
VM_MAC='52:54:00:00:00:46'
VM_BRIDGE='virbr0'
# VM_BRIDGE='br0'
VM_OS_VARIANT='ubuntu22.04'
VM_METADATA='meta-data.yaml'
VM_USERDATA='user-data.yaml'
 
cat > ${VM_METADATA} <<EOF
instance-id: $VM_NAME
local-hostname: $VM_NAME
EOF
 
cat > ${VM_USERDATA} <<EOF
#cloud-config
users:
  - name: x
    password: xyz
    ssh-authorized-keys:
      - $SSH_PUB_KEY
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
EOF
 
# resize da imagem
sudo qemu-img convert -f qcow2 -O qcow2 ${DIRVM_TEMPLATES}/${IMAGE_LINK/*\/} ${DIRVM_IMAGES}/${VM_DISK}
sudo qemu-img resize ${DIRVM_IMAGES}/${VM_DISK} ${VM_DISK_SIZE}
 
# ver infos da imagem
qemu-img info ${DIRVM_IMAGES}/${VM_DISK}
virt-df -h ${DIRVM_IMAGES}/${VM_DISK}
sudo virt-filesystems --long -h --all -a ${DIRVM_IMAGES}/${VM_DISK}
 
# criar vm
sudo virt-install \
  --name ${VM_NAME} \
  --disk ${DIRVM_IMAGES}/${VM_DISK},device=disk,bus=virtio \
  --cloud-init meta-data=${VM_METADATA},user-data=${VM_USERDATA} \
  --virt-type kvm \
  --graphics none \
  --vcpus ${VM_VCPUS} \
  --memory ${VM_RAM} \
  --os-variant=${VM_OS_VARIANT} \
  --network network=default,model=virtio,bridge=${VM_BRIDGE},mac=${VM_MAC} \
  --import \
 
# obtem ip da vm
sudo virsh domifaddr servera4a
 
ssh ipdamaquina</syntaxhighlight>
 
== Software suficiente para realizar a maior parte das ingestões ==
 
<syntaxhighlight lang="sh">sudo apt-get update
 
# postgresql e postgis
sudo apt-get install -y postgresql-14 postgis postgresql-14-postgis-3 postgresql-postgis --no-install-recommends
 
# Extensão plpython
sudo apt-get install -y postgresql-plpython3-14 --no-install-recommends
 
# gdal e proj
sudo apt-get install -y gdal-bin proj-bin --no-install-recommends
 
# chevron para Mustache
sudo apt-get install python3-pip --no-install-recommends
sudo pip3 install chevron
 
# ferramentas diversas
sudo apt-get install -y git make vim wget zip unzip p7zip p7zip-rar p7zip-full --no-install-recommends
 
# opcionais
#sudo apt-get install -y bash-completion tmux silversearcher-ag --no-install-recommends</syntaxhighlight>
== Configuração do banco de dados ==
 
No arquivo <code>/etc/postgresql/14/main/pg_hba.conf</code>
 
Ajustar as linhas
 
<pre>local  all            postgres                                peer
local  all            all                                    peer
host    all            all            127.0.0.1/32            scram-sha-256</pre>
para
 
<pre>local  all            postgres                                trust
local  all            all                                    trust
host    all            all            127.0.0.1/32            trust</pre>
com
 
<syntaxhighlight lang="sh">cat /etc/postgresql/14/main/pg_hba.conf
 
sed -E -i 's/local(\s+)all(\s+)postgres(\s+)peer/local\1all\2postgres\3trust/' /etc/postgresql/14/main/pg_hba.conf
sed -E -i 's/local(\s+)all(\s+)all(\s+)peer/local\1all\2all\3trust/' /etc/postgresql/14/main/pg_hba.conf
sed -E -i 's;host(\s+)all(\s+)all(\s+)127.0.0.1/32(\s+)scram-sha-256;host\1all\2all\3127.0.0.1/32\4trust;' /etc/postgresql/14/main/pg_hba.conf
 
sudo service postgresql restart
 
cat /etc/postgresql/14/main/pg_hba.conf</syntaxhighlight>
 
== Criar diretórios, grupos ==
 
<syntaxhighlight lang="sh"># cria grupo
sudo groupadd www-data
 
# adiciona usuário corrente aos grupos
sudo usermod -aG www-data $USER
sudo usermod -aG postgres $USER
 
cat /etc/group
cat /etc/passwd
 
# cria diretórios e atualiza permissoes
sudo mkdir -p /var/gits/_{a4a,dg,osmc}
ls -la /var/gits
sudo chown -R postgres:www-data /var/gits
sudo chmod -R g+w /var/gits
sudo chmod -R o-x /var/gits
ls -la /var/gits
 
sudo mkdir -p /tmp/{sandbox,pg_io}
sudo chown -R postgres:www-data /tmp/{sandbox,pg_io}
sudo chmod -R o-x /tmp/{sandbox,pg_io}</syntaxhighlight>
 
== Clonar repositórios ==
 
<syntaxhighlight lang="sh">for repo in \
a4a/WS \
a4a/pg_pubLib-v1 \
dg/licenses \
dg/preserv \
dg/preserv-AR \
dg/preserv-BO \
dg/preserv-BR \
dg/preserv-CL \
dg/preserv-CM \
dg/preserv-CO \
dg/preserv-EC \
dg/preserv-PE \
dg/preserv-PY \
dg/preserv-SR \
dg/preserv-UY \
dg/preserv-VE \
dg/preserv-MX \
dg/preservDataViz \
dg/stats \
osmc/benchmark \
osmc/BR_new \
osmc/CO_new \
osmc/CM \
osmc/EC_new \
osmc/GGeohash \
osmc/UY_new \
osmc/WS \
osmc/NaturalCodes
do
echo /var/gits/_${repo%%/*}
    if [[ ${repo%%/*} == 'dg' ]]
    then
        project='digital-guard'
    fi
    if [[ ${repo%%/*} == 'a4a' ]]
    then
        project='AddressForAll'
    fi
    if [[ ${repo%%/*} == 'osmc' ]]
    then
        project='osm-codes'
    fi
 
    echo ${project}
 
    if [ -d "/var/gits/_${repo}" ]; then
        pushd /var/gits/_${repo}
        git pull
        popd
    else
        pushd /var/gits/_${repo%%/*}
        git clone git@github.com:${project}/${repo##*/}.git
        #git clone https://github.com/${project}/${repo##*/}.git
        popd
    fi
done</syntaxhighlight>
== Ajustar permissões ==
 
<syntaxhighlight lang="sh">pushd /var/gits/_dg/preserv/src
    make fix_permissions
popd</syntaxhighlight>
 
== Criar e popular bases ==
 
<syntaxhighlight lang="sh">pushd /var/gits/_dg/preserv/src
make
make ini_ingest pg_db=ingest42
make ini_datalake pg_datalake=dl05s_main
popd
 
wget https://www.addressforall.org/_private/dump.zip
unzip dump.zip
ls
cd dumptabelas
 
 
PROD_DB='dl05s_main'
 
 
# 05. carregar dump de jurisdiction (futuro: carregar de stable)
# psql postgres://postgres@localhost/${PROD_DB} -c"ALTER TABLE optim.jurisdiction DISABLE TRIGGER ALL;"
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_jurisdiction.sql
# psql postgres://postgres@localhost/${PROD_DB} -c"ALTER TABLE optim.jurisdiction ENABLE TRIGGER ALL;"
 
# 06. carregar tabelas de geometrias (futuro: carregar de stable)
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_jurisdiction_geom.sql
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_jurisdiction_eez.sql
 
# 07. carregar tabelas de abreviações (futuro: carregar de stable)
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_jurisdiction_abbrev_ref.sql
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_jurisdiction_abbrev_option.sql
 
# 08. carregar dados de donor e donatePack
psql postgres://postgres@localhost/${PROD_DB} -c"SELECT optim.insert_donor_pack(t) FROM unnest(ARRAY['BO','BR','CL','CO','EC','PE','PY','SR','UY','VE']) t;"
psql postgres://postgres@localhost/${PROD_DB} -c"SELECT optim.insert_codec_type();"
 
# 09. Carregar dados de componentes de pacotes (que já foram publicados e disponiveis para publicar)
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_donated_packcomponent.sql
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_donated_packcomponent_not_approved.sql
 
# 10. Carregar links dos arquivos filtrados
psql postgres://postgres@localhost/${PROD_DB} < pg_dump_donated_packcomponent_cloudcontrol.sql
</syntaxhighlight>
 
== Exemplo de ingestão ==
 
<syntaxhighlight lang="sh"># semente makefile
pushd /var/gits/_dg/preserv-BR/src/
make all
popd
 
pushd /var/gits/_dg/preserv-BR/data/AC/RioBranco/_pk0042.01/
make me pg_db=ingest42 orig=/tmp
make all_layers pg_db=ingest42 orig=/tmp</syntaxhighlight>
 
 
...
 
----
= Ver também =
...
 
[[Categoria:Suporte]]
2 384

edições