diff --git a/.env.example b/.env.example index 80bc9a3..de362a0 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,7 @@ # Configurações de banco de dados POSTGRES_DB='esus' POSTGRES_USER='postgres' -POSTGRES_PASSWORD='pass' +POSTGRES_PASS='pass' POSTGRES_HOST='host.docker.internal' POSTGRES_PORT=5432 diff --git a/Dockerfile b/Dockerfile index 3aa6dca..d8e8c0c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,6 +35,9 @@ RUN apt-get update && \ apt-get clean && \ rm -rf /usr/share/doc/* /usr/share/man/* /var/lib/apt/lists/* /tmp/* /var/tmp/* +# Instalar cliente PostgreSQL +RUN apt-get update && apt-get install -y postgresql-client + # Substituir o comando `ps` para burlar a verificação de systemd RUN mv /bin/ps /bin/ps.original && \ echo '#!/bin/sh' > /bin/ps && \ @@ -56,16 +59,16 @@ RUN echo '#!/bin/sh' > /bin/systemctl && \ ARG JAR_FILENAME ARG HTTPS_DOMAIN ARG DB_URL -ARG DB_PASS -ARG DB_USER +ARG POSTGRES_PASS +ARG POSTGRES_USER ARG TRAINING # Promovendo ARGS para ENV para uso no install.sh que roda dentro do entrypoint.sh e precisa dessas variáveis ENV JAR_FILENAME=${JAR_FILENAME} ENV TRAINING=${TRAINING} ENV DB_URL=${DB_URL} -ENV DB_PASS=${DB_PASS} -ENV DB_USER=${DB_USER} +ENV POSTGRES_PASS=${POSTGRES_PASS} +ENV POSTGRES_USER=${POSTGRES_USER} ENV HTTPS_DOMAIN=${HTTPS_DOMAIN} # criando diretórios para uso posterior diff --git a/Dockerfile.external-db b/Dockerfile.external-db index 986495f..78778fd 100644 --- a/Dockerfile.external-db +++ b/Dockerfile.external-db @@ -36,14 +36,14 @@ RUN apt-get update && \ ARG JAR_FILENAME ARG HTTPS_DOMAIN ARG DB_URL -ARG DB_PASS -ARG DB_USER +ARG POSTGRES_PASS +ARG POSTGRES_USER # Promovendo ARGS para ENV para uso no install.sh que roda dentro do entrypoint ENV JAR_FILENAME=${JAR_FILENAME} ENV DB_URL=${DB_URL} -ENV DB_PASS=${DB_PASS} -ENV DB_USER=${DB_USER} +ENV POSTGRES_PASS=${POSTGRES_PASS} +ENV POSTGRES_USER=${POSTGRES_USER} ENV HTTPS_DOMAIN=${HTTPS_DOMAIN} # criando diretórios para uso posterior diff --git a/README.md b/README.md index bd023ef..c85eebf 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ Utilize `sh build.sh --help` para mais opções, por exemplo, para instalar a ve sh build.sh -e ``` -Acesse [Live/Demo](https://pec.filipelopes.med.br) +Acesse [Live/Demo](https://dev.esus.noharm.ai) Dúvidas? Colaboração? Ideias? Entre em contato pelo [WhatsApp](https://wa.me/5571986056232?text=Gostaria+de+informa%C3%A7%C3%B5es+sobre+o+projeto+PEC+SUS) ## Sumário @@ -180,59 +180,22 @@ sudo cp data/backups/nome_do_arquivo.backup . Ou pode-se optar por fazer o backup pela própria ferramenta do PEC, use: ```sh -java jar esus-pec.jar -help +# substitua a versão pelo que estiver utilizando dentro do container pec +docker compose exec -it pec java jar esus-pec.jar -help ``` Para mais informações. -2. Exclua todo o banco de dados e dados relacionados em volume +2. Após isso, se seu banco de dados for externo, basta executar ```sh -docker-compose down --remove-orphans --volumes -sudo rm -rf data +sh update.sh docker-compose.local-db.yml ``` -3. Crie o banco de dados +Substitua o termo `docker-compose.local-db.yml` pelo termo `docker-compose.external-db.yml` para executar o script com o banco de dados externo. -```sh -docker-compose up -d psql -``` - -4. Copie o arquivo de backup - -```sh -sudo cp nome_do_arquivo.backup data/backups/ -``` - -5. Crie o banco de dados com base no backup - -```sh -docker exec -it esus_psql bash -pg_restore --verbose -U "postgres" -d "esus" -1 /home/seu_arquivo.backup -``` - -6. Instale o programa - -Fora do container, na pasta raiz do projeto execute, substituindo o nome do pacote `eSUS-AB-PEC-5.0.8-Linux64.jar` para a versão que você vai instalar em sua máquina. - -```sh -sh build.sh -f eSUS-AB-PEC-5.0.14-Linux64.jar -``` - -## Comandos interessantes - -Caso o container tenha sido interrompido sem querer, o comando abaixo pode ser útil - -```sh -# Em linux -make run -# Depois de rodar novamente os containers -docker-compose up -d -# Caso nenhum dos anteriores funcione execute diretamente o executável do sistema pec -docker-compose up -d esus_app /opt/e-SUS/webserver/standalone.sh -``` -## Bugs Conhecidos (Known Issues) / Troubleshoot / Q&A / FAQ +## Bugs Conhecidos (Known Issues) / Troubleshoot / Q&A / FAQ - **BREAKING CHANGE:** Desde a versão 5.3 o [certificado SSL é autogerenciado](https://saps-ms.github.io/Manual-eSUS_APS/docs/%C3%9Altimas%20releases/Vers%C3%A3o%205.3/#novidades---ferramentas-administrativas) e a versão Java utilizada é a 17 LTS. A última versão desse docker não funcionará para versões anteriores - O Java 8 só funciona com OpenSSL 1.1, em caso de uso do OpenSSL mais recente 3.X, não irá funcionar as chaves PKCS12 para SSL, será necessário o uso das chaves *.jks nesses casos diff --git a/aws/.env.example b/aws/.env.example index 13091cf..4284e3c 100644 --- a/aws/.env.example +++ b/aws/.env.example @@ -1,7 +1,7 @@ # Configurações de banco de dados POSTGRES_DB='esus' POSTGRES_USER='postgres' -POSTGRES_PASSWORD='pass' +POSTGRES_PASS='pass' POSTGRES_HOST='db' # host.docker.internal POSTGRES_PORT=5432 TRAINING=true diff --git a/aws/docker-compose.yml b/aws/docker-compose.yml index 02e5267..3acf384 100644 --- a/aws/docker-compose.yml +++ b/aws/docker-compose.yml @@ -24,7 +24,7 @@ services: restart: unless-stopped environment: - POSTGRES_USER=${POSTGRES_USER} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_PASSWORD=${POSTGRES_PASS} - POSTGRES_DB=${POSTGRES_DB} volumes: - ./esus-data/db:/var/lib/postgresql/data diff --git a/aws/install.sh b/aws/install.sh index 821d6d4..b3799dd 100644 --- a/aws/install.sh +++ b/aws/install.sh @@ -19,7 +19,7 @@ echo "Variáveis de ambiente:" echo "*******************" echo "DB_URL: ${DB_URL}" echo "POSTGRES_USER: ${POSTGRES_USER}" -echo "POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}" +echo "POSTGRES_PASS: ${POSTGRES_PASS}" echo "JAR_FILENAME: ${JAR_FILENAME}" echo "TRAINING: ${TRAINING}" echo "*******************\n\n${NC}" @@ -33,8 +33,8 @@ if [ -n "$POSTGRES_USER" ]; then ARGS="$ARGS -username=${POSTGRES_USER}" fi -if [ -n "$POSTGRES_PASSWORD" ]; then - ARGS="$ARGS -password=${POSTGRES_PASSWORD}" +if [ -n "$POSTGRES_PASS" ]; then + ARGS="$ARGS -password=${POSTGRES_PASS}" fi # A ser executado java -jar @@ -52,12 +52,12 @@ if [ -n "$TRAINING" ]; then PSQL_CMD="psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c \"update tb_config_sistema set ds_texto = null, ds_inteiro = 1 where co_config_sistema = 'TREINAMENTO';\"" # Exporta a senha do banco para evitar o prompt - export PGPASSWORD="${POSTGRES_PASSWORD}" + export PGPASSWORD="${POSTGRES_PASS}" # Executa o comando SQL eval $PSQL_CMD if [ $? -eq 0 ]; then - echo -e "${GREEN}Configuração de treinamento aplicada com sucesso.${NC}" + echo -e "${GREEN}Configuração de treinamento aplicada com sucesso!${NC}" else echo -e "${RED}Erro ao aplicar configuração de treinamento.${NC}" fi diff --git a/build.sh b/build.sh index f341de1..56eabc8 100755 --- a/build.sh +++ b/build.sh @@ -34,7 +34,7 @@ while getopts "d:f:h:cpe" flag; do f) filename=${OPTARG} ;; h) https_domain=${OPTARG} ;; c) cache='--no-cache' ;; - p) production=true ;; + p) production=false ;; e) use_external_db=true ;; \?) echo "${RED}Opção inválida! Utilize --help para ajuda.${NC}" @@ -43,6 +43,16 @@ while getopts "d:f:h:cpe" flag; do esac done +# Caso production seja false determina training para true +if [ "$production" = false ]; then + training=true +fi + +# Caso o banco de dados for externo modifica a variável logo para produção +if [ "$use_external_db" = true ]; then + production=true +fi + # Define timeout para o Docker Compose export COMPOSE_HTTP_TIMEOUT=8000 @@ -108,7 +118,7 @@ if command -v psql > /dev/null; then if $use_external_db; then echo "Testando conexão com o banco de dados externo em $POSTGRES_HOST..." POSTGRES_HOST_FOR_TEST=$([ "$POSTGRES_HOST" = "host.docker.internal" ] && echo "localhost" || echo "$POSTGRES_HOST") - if PGPASSWORD=$POSTGRES_PASSWORD psql -h $POSTGRES_HOST_FOR_TEST -U $POSTGRES_USER -p $POSTGRES_PORT -d $POSTGRES_DB -c '\q'; then + if PGPASSWORD=$POSTGRES_PASS psql -h $POSTGRES_HOST_FOR_TEST -U $POSTGRES_USER -p $POSTGRES_PORT -d $POSTGRES_DB -c '\q'; then echo "${GREEN}Conexão ao banco de dados externa bem-sucedida.${NC}" else echo "${RED}Falha ao conectar ao banco de dados externo. Verifique as credenciais.${NC}" @@ -132,12 +142,15 @@ if $use_external_db; then docker compose -f docker-compose.external-db.yml up -d else jdbc_url="jdbc:postgresql://$POSTGRES_HOST:$POSTGRES_PORT/$POSTGRES_DB" - training='' echo "\n${GREEN}Construindo e subindo Docker com banco de dados local...${NC}" - docker compose --progress plain -f docker-compose.local-db.yml build $cache \ + echo "docker compose --progress plain -f docker-compose.local-db.yml build $cache \ --build-arg JAR_FILENAME=$jar_filename \ --build-arg HTTPS_DOMAIN=$https_domain \ --build-arg DB_URL=$jdbc_url \ + --build-arg TRAINING=$training" + docker compose --progress plain -f docker-compose.local-db.yml build $cache \ + --build-arg JAR_FILENAME=$jar_filename \ + --build-arg DB_URL=$jdbc_url \ --build-arg TRAINING=$training docker compose -f docker-compose.local-db.yml up -d fi \ No newline at end of file diff --git a/docker-compose.external-db.yml b/docker-compose.external-db.yml index 5b7b69f..f6f188b 100644 --- a/docker-compose.external-db.yml +++ b/docker-compose.external-db.yml @@ -11,8 +11,8 @@ services: dockerfile: Dockerfile.external-db args: - TZ=${TZ} - - DB_USER=${POSTGRES_USER} - - DB_PASS=${POSTGRES_PASSWORD} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASS=${POSTGRES_PASS} - HTTPS_DOMAIN=${HTTPS_DOMAIN} stdin_open: true tty: true diff --git a/docker-compose.local-db.yml b/docker-compose.local-db.yml index 3dc4011..8f75ae1 100644 --- a/docker-compose.local-db.yml +++ b/docker-compose.local-db.yml @@ -12,9 +12,12 @@ services: dockerfile: Dockerfile args: - TZ=${TZ} - - DB_USER=${POSTGRES_USER} - - DB_PASS=${POSTGRES_PASSWORD} - - HTTPS_DOMAIN=${HTTPS_DOMAIN} + environment: + - POSTGRES_USER=${POSTGRES_USER:-postgres} + - POSTGRES_PASS=${POSTGRES_PASS:-pass} + - POSTGRES_HOST=${POSTGRES_HOST:-db} # host.docker.internal + - POSTGRES_PORT=${POSTGRES_PORT:-5432} + - POSTGRES_DB=${POSTGRES_DB:-esus} privileged: true stdin_open: true tty: true @@ -32,7 +35,7 @@ services: restart: unless-stopped environment: - POSTGRES_USER=${POSTGRES_USER:-postgres} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-pass} + - POSTGRES_PASSWORD=${POSTGRES_PASS:-pass} - POSTGRES_DB=${POSTGRES_DB:-esus} volumes: - ./esus-data/db:/var/lib/postgresql/data diff --git a/install.sh b/install.sh index f1b372b..1263f69 100755 --- a/install.sh +++ b/install.sh @@ -16,8 +16,8 @@ echo "Variáveis de ambiente:" echo "*******************" echo "HTTPS_DOMAIN: ${HTTPS_DOMAIN}" echo "DB_URL: ${DB_URL}" -echo "DB_USER: ${DB_USER}" -echo "DB_PASS: ${DB_PASS}" +echo "POSTGRES_USER: ${POSTGRES_USER}" +echo "POSTGRES_PASS: ${POSTGRES_PASS}" echo "JAR_FILENAME: ${JAR_FILENAME}" echo "TRAINING: ${TRAINING}" echo "*******************\n\n${NC}" @@ -33,17 +33,12 @@ if [ -n "$DB_URL" ]; then ARGS="$ARGS -url=${DB_URL}" fi -if [ -n "$DB_USER" ]; then - ARGS="$ARGS -username=${DB_USER}" +if [ -n "$POSTGRES_USER" ]; then + ARGS="$ARGS -username=${POSTGRES_USER}" fi -if [ -n "$DB_PASS" ]; then - ARGS="$ARGS -password=${DB_PASS}" -fi - -# Verificando variável de treinamento e se não está vazio -if [ -n "$TRAINING" ]; then - ARGS="$ARGS -treinamento" +if [ -n "$POSTGRES_PASS" ]; then + ARGS="$ARGS -password=${POSTGRES_PASS}" fi # A ser executado java -jar @@ -58,10 +53,10 @@ java -jar ${JAR_FILENAME} -console ${ARGS} -continue # Verificando se a variável de treinamento existe, caso sim, executa o SQL if [ -n "$TRAINING" ]; then echo -e "${GREEN}Treinamento habilitado. Executando SQL de configuração...${NC}" - PSQL_CMD="psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${DB_USER} -d ${POSTGRES_DB} -c \"update tb_config_sistema set ds_texto = null, ds_inteiro = 1 where co_config_sistema = 'TREINAMENTO';\"" + PSQL_CMD="psql -h ${POSTGRES_HOST} -p ${POSTGRES_PORT} -U ${POSTGRES_USER} -d ${POSTGRES_DB} -c \"update tb_config_sistema set ds_texto = null, ds_inteiro = 1 where co_config_sistema = 'TREINAMENTO';\"" # Exporta a senha do banco para evitar o prompt - export PGPASSWORD="${DB_PASS}" + export PGPASSWORD="${POSTGRES_PASS}" # Executa o comando SQL eval $PSQL_CMD diff --git a/update.sh b/update.sh index ce5e788..44347be 100644 --- a/update.sh +++ b/update.sh @@ -3,8 +3,8 @@ # Variáveis de ambiente para o banco de dados # DB_URL="jdbc:postgresql://db:5432/esus" # DB_URL="jdbc:postgresql://db:5432/esus?ssl=true&sslmode=allow&sslfactory=org.postgresql.ssl.NonValidatingFactory" -# DB_USER="postgres" -# DB_PASS="pass" +# POSTGRES_USER="postgres" +# POSTGRES_PASS="pass" # Caminhos e URLs WORKDIR="/var/www/html" @@ -96,7 +96,7 @@ docker compose -f "$DOCKER_COMPOSE_FILE" exec pec sh -c " # Realiza o backup do banco de dados echo 'Realizando backup do banco de dados...' - env PGPASSWORD=\$DB_PASS pg_dump -Fc -v -h db -U \$DB_USER -d \$DB_NAME -f $BACKUP_FILE 2> $LOG_FILE + env PGPASSWORD=\$POSTGRES_PASS pg_dump -Fc -v -h db -U \$POSTGRES_USER -d \$DB_NAME -f $BACKUP_FILE 2> $LOG_FILE echo \"Backup realizado em $BACKUP_FILE\" # Filtra apenas warnings e erros no log @@ -112,7 +112,7 @@ docker compose -f "$DOCKER_COMPOSE_FILE" exec pec sh -c " # Atualiza o sistema echo 'Atualizando o sistema...' # Debugando comando de instalação - java -jar $WORKDIR/\$JAR_FILENAME -console -url=\$DB_URL -username=\$DB_USER -password=\$DB_PASS -continue + java -jar $WORKDIR/\$JAR_FILENAME -console -url=\$DB_URL -username=\$POSTGRES_USER -password=\$POSTGRES_PASS -continue " # Reinicia o container