From 646fcffeca9b22c32e6e25d89a27a6aa2e65ee51 Mon Sep 17 00:00:00 2001 From: Daniel Luiz Alves Date: Fri, 14 Mar 2025 17:05:32 -0300 Subject: [PATCH] feat: add scripts for generate compose --- Makefile | 3 + README.md | 57 ++++++++++++++++++- .../docker-compose-base.yaml | 22 +++---- .../docker-compose-local.yaml | 0 scripts/generate-docker-compose.sh | 48 ++++++++++++++++ 5 files changed, 118 insertions(+), 12 deletions(-) create mode 100644 Makefile rename docker-compose.yaml => composes/docker-compose-base.yaml (79%) rename docker-compose-local.yaml => composes/docker-compose-local.yaml (100%) create mode 100755 scripts/generate-docker-compose.sh diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..7aa4fc6 --- /dev/null +++ b/Makefile @@ -0,0 +1,3 @@ +gen-compose: + chmod +x ./scripts/generate-docker-compose.sh + ./scripts/generate-docker-compose.sh diff --git a/README.md b/README.md index c06b092..b408b2c 100644 --- a/README.md +++ b/README.md @@ -1 +1,56 @@ -# Palmr. \ No newline at end of file +# Palmr. + +Com a visão de simplificar a execução do projeto e permitir que ele seja executado em qualquer máquina, foi criado um script de inicialização para o docker compose.é necessário ter o docker e docker compose instalados para executar o projeto da maneira que vamos propor a seguir. Essa é a maneira mais simplificada de executar o projeto, porém não é a maneira recomendada para o modo de produção. + +Temos duas maneiras de executar esse script, a primeira delas é executando o script via make file, e a segunda é executando o script diretamente. +Para executar via Make file, basta executar o comando abaixo: + +make gen-compose + +Esse comando irá gerar o arquivo docker-compose.yml na raiz do projeto. Ele tem a principal funcionalidade de gerar senhas seguras para nosso Minio e Postgres. que são nossos object storage e banco de dados respectivamente. + +O compose gerado é uma base e pode ser modificado a qualquer momento por você. Vale lembrar que ele é escrito para executar em seu ambiente local via localhost e não para produção ou ambientes de VPS. Mas o mesmo após gerado pode ser modificado e/ou desmembrado para ser hospedado em qualquer lugar + +A segunda maneira de executar o script é executando o comando abaixo: + +chmod +x ./scripts/generate-docker-compose.sh +./scripts/generate-docker-compose.sh + +esse conjunto de comandos surgem com o mesmo efeito do make gen-compose. + +para executar o projeto após gerar o seu docker-compose.yaml basta executar o comando abaixo na raiz do projeto: + +docker compose up -d + +e para acessar o palmr, em ambnte local basta acessar http://localhost:4173 + +Para rodar em ambiente de produção, recomendamos utilizar Kubernetes, Docker Swarm ou algum orquestrador de containers similar. Para rodar localmente em sua máquina ou em algum ambiente de testes, você pode utilizar o Docker Compose com o arquivo docker-compose.yaml, que busca as imagens mais recentes do Palmr no Docker e as disponibiliza em algumas portas específicas, sendo elas: + +* Frontend: http://localhost:4173 +* Backend: http://localhost:3333 +* MinIO API: http://localhost:9000 +* MinIO Painel: http://localhost:9001 +* Database Postgres: http://localhost:5423 + +Recomendamos que, nesta versão do docker-compose.yaml, nenhuma das portas de funcionamento do frontend e backend seja alterada. Consequentemente, nenhuma das URLs deve ser modificada, pois a imagem do frontend contém uma versão buildada configurada para funcionar na porta 4173, e, por motivos técnicos relacionados ao ReactJS, variáveis de ambiente que são executadas em runtime não podem ser alteradas. Por esse motivo, para garantir o bom funcionamento do sistema como foi planejado, mantenha o docker-compose.yaml inalterado. + +Caso queira fazer alterações nas portas em ambiente local e executar o projeto via Docker com Docker Compose, recomendamos o uso do arquivo docker-compose-dev.yaml, que faz a build com base nos arquivos do repositório clonado. No entanto, certifique-se de fazer todas as configurações corretas de portas e URLs, pois, caso contrário, o Palmr não irá funcionar como planejado para ser executado. + +Não recomendamos de maneira alguma o uso do docker-compose.yaml para ambientes produtivos ou em VPS, pois a tecnologia Docker Compose foi pensada para ambientes de desenvolvimento. +O que mais recomendamos para produção é o uso de Kubernetes, que deve ser configurado manualmente, pois o repositório não contém um modelo pronto para essa configuração. Outra maneira de colocar o software em ambiente produtivo é utilizando serviços separados, como, por exemplo: + +* Hospedar o frontend na Vercel ou AWS Amplify. +* Hospedar o backend na Render.com ou serviços similares. +* Subir o MinIO separadamente em um servidor via Docker ou utilizar um serviço compatível com S3. +* Hospedar o banco de dados em um serviço como o Neon.tech. + +O código é totalmente aberto, e você pode escolher a melhor maneira para fazer o deploy, mas atente-se às variáveis de ambiente (environment variables). A ideia de termos um docker-compose.yaml é apenas para facilitar o uso, a execução e os testes. + + +na pasta composes temos a versão que usa o código local ao invés de buscar nossas imagens no docker hub. + +para executar essa versão, na raiz do projeto voce pode executar: + +cp ./composes/docker-compose-local.yaml ./docker-compose.yaml + +e executar docker compose up -d diff --git a/docker-compose.yaml b/composes/docker-compose-base.yaml similarity index 79% rename from docker-compose.yaml rename to composes/docker-compose-base.yaml index cb1a1ed..3c2d700 100644 --- a/docker-compose.yaml +++ b/composes/docker-compose-base.yaml @@ -9,12 +9,12 @@ services: condition: "service_healthy" environment: - PORT=3333 - - DATABASE_URL=postgresql://palmr:palmr123@postgres:5432/palmr?schema=public + - DATABASE_URL=postgresql://default:{{DB_PASSWORD}}@postgres:5432/palmr_db?schema=public - MINIO_ENDPOINT=127.0.0.1 - MINIO_PORT=9000 - MINIO_USE_SSL=false - - MINIO_ROOT_USER=palmr - - MINIO_ROOT_PASSWORD=palmr123 + - MINIO_ROOT_USER={{MINIO_ROOT_USER}} + - MINIO_ROOT_PASSWORD={{MINIO_ROOT_PASSWORD}} - MINIO_REGION=sa-east-1 - MINIO_BUCKET_NAME=files - FRONTEND_URL=http://localhost:4173 @@ -49,11 +49,11 @@ services: start_period: 10s minio: - image: minio/minio:latest + image: minio/minio:RELEASE.2025-03-12T18-04-18Z container_name: minio environment: - - MINIO_ROOT_USER=palmr - - MINIO_ROOT_PASSWORD=palmr123 + - MINIO_ROOT_USER={{MINIO_ROOT_USER}} + - MINIO_ROOT_PASSWORD={{MINIO_ROOT_PASSWORD}} - MINIO_SITE_REGION=sa-east-1 command: server /data --console-address ":9001" volumes: @@ -69,7 +69,7 @@ services: retries: 5 minio-init: - image: minio/mc:latest + image: minio/mc:RELEASE.2025-03-12T17-29-24Z container_name: minio-init depends_on: minio: @@ -78,7 +78,7 @@ services: entrypoint: > sh -c " sleep 5 && - mc alias set myminio http://minio:9000 palmr palmr123 && + mc alias set myminio http://minio:9000 {{MINIO_ROOT_USER}} {{MINIO_ROOT_PASSWORD}} && mc mb myminio/files --ignore-existing && mc anonymous set download myminio/files " @@ -87,9 +87,9 @@ services: image: bitnami/postgresql:17.2.0 container_name: palmr-postgres environment: - - POSTGRESQL_USERNAME=palmr - - POSTGRESQL_PASSWORD=palmr123 - - POSTGRESQL_DATABASE=palmr + - POSTGRESQL_USERNAME=default + - POSTGRESQL_PASSWORD={{DB_PASSWORD}} + - POSTGRESQL_DATABASE=palmr_db volumes: - postgres_data:/bitnami/postgresql ports: diff --git a/docker-compose-local.yaml b/composes/docker-compose-local.yaml similarity index 100% rename from docker-compose-local.yaml rename to composes/docker-compose-local.yaml diff --git a/scripts/generate-docker-compose.sh b/scripts/generate-docker-compose.sh new file mode 100755 index 0000000..afd7dd0 --- /dev/null +++ b/scripts/generate-docker-compose.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +export LC_ALL=C + +generate_password() { + cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n 1 +} + +generate_minio_user() { + local words=("alpha" "beta" "gamma" "delta" "omega" "light" "dark" "space" "star" "fire" "sky" "moon" "earth" "storm" "wave" "sun" "cloud" "wind" "rain" "shadow" "flame") + local word1="${words[$RANDOM % ${#words[@]}]}" + local word2="${words[$RANDOM % ${#words[@]}]}" + printf "%s_%s" "$word1" "$word2" +} + +MINIO_ROOT_USER=$(generate_minio_user) +MINIO_ROOT_PASSWORD=$(generate_password) +DB_PASSWORD=$(generate_password) + +input_file="composes/docker-compose-base.yaml" +output_file="docker-compose.yaml" + +# Check if docker-compose.yaml already exists +if [ -f "$output_file" ]; then + read -p $'\033[1;33mThe file docker-compose.yaml already exists. Do you want to replace it? (y/N) \033[0m' response + if [[ ! "$response" =~ ^[yY]$ ]]; then + echo -e "\033[1;31mOperation cancelled.\033[0m" + exit 1 + fi +fi + +sed "s/{{MINIO_ROOT_USER}}/$MINIO_ROOT_USER/g; s/{{MINIO_ROOT_PASSWORD}}/$MINIO_ROOT_PASSWORD/g; s/{{DB_PASSWORD}}/$DB_PASSWORD/g" "$input_file" > "$output_file" + + +# Print a styled header +echo -e "\n\033[1;34m┌────────────────────────────────────────────┐" +echo -e "│ Generated Credentials │" +echo -e "└────────────────────────────────────────────┘\033[0m\n" + +# Print variables in a table format with colors +echo -e "\033[1;36m Variable Name │ Value\033[0m" +echo -e "\033[1;36m────────────────────┼───────────────────────\033[0m" +echo -e " MINIO_ROOT_USER │ \033[1;33m$MINIO_ROOT_USER\033[0m" +echo -e " MINIO_ROOT_PASSWORD│ \033[1;33m$MINIO_ROOT_PASSWORD\033[0m" +echo -e " DB_PASSWORD │ \033[1;33m$DB_PASSWORD\033[0m" +echo + +echo -e "\033[1;32m✔ docker-compose.yaml file generated successfully.\033[0m\n"