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

De Documentação
Sem resumo de edição
Linha 112: Linha 112:


passe a Url para Carlos Rebollo. Seria bom agendar uma hora para falar sobre a VPN e acesso ao servidor.
passe a Url para Carlos Rebollo. Seria bom agendar uma hora para falar sobre a VPN e acesso ao servidor.


'''Linux''':  
'''Linux''':  

Edição das 19h58min de 19 de maio de 2024

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 "em produção". 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 fulano@openstreetmap.com.br, gestão dos 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 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 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 "caso geral", dado pela união dos casos listados acima.

Ambientes e ferramentas de uso geral

Designamos de "ambiente" 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:

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 v3.4.0 v3.4.2
Web Server NGINX v1.21 v1.22 v1.18
Microservices (API) server PostgREST v8 stable v9 stable v11.2.1 stable containerized
Framework, website ReactJS v17 stable v18 stable v18 stable
Framework, website, language NodeJS (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
GDAL containerized

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 https://tailscale.com/download/windows

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 https://tailscale.com/install.sh | 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).

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

Criação da VM

# 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

Software suficiente para realizar a maior parte das ingestões

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

Configuração do banco de dados

No arquivo /etc/postgresql/14/main/pg_hba.conf

Ajustar as linhas

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             127.0.0.1/32            scram-sha-256

para

local   all             postgres                                trust
local   all             all                                     trust
host    all             all             127.0.0.1/32            trust

com

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

Criar diretórios, grupos

# 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}

Clonar repositórios

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

Ajustar permissões

pushd /var/gits/_dg/preserv/src
    make fix_permissions
popd

Criar e popular bases

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

Exemplo de ingestão

# 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


...


Ver também

...