From 8f172a65a63ce6eea62382dfc67309f5ebc35808 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rog=C3=A9rio=20Lima?= Date: Sun, 22 Feb 2026 17:47:38 -0300 Subject: [PATCH] Jasper Server 8.2 Docker Image --- .dockerignore | 29 ++++++++ .env.sample | 18 +++++ .gitignore | 28 ++++++++ Dockerfile | 65 +++++++++++++++++ Makefile | 38 ++++++++++ README.md | 115 +++++++++++++++++++++++++++++++ config/default_master.properties | 25 +++++++ docker-compose.yml | 70 +++++++++++++++++++ downloads/download.sh | 44 ++++++++++++ entrypoint.sh | 92 +++++++++++++++++++++++++ 10 files changed, 524 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.sample create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100644 config/default_master.properties create mode 100644 docker-compose.yml create mode 100755 downloads/download.sh create mode 100755 entrypoint.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..008c2fd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,29 @@ +# Ignorar no contexto do Docker build + +# Arquivos grandes que não devem ir para o contexto do Docker +# (exceto o ZIP do instalador que está em downloads/) +*.log +*.tmp + +# Arquivos de desenvolvimento +.git +.gitignore +*.md + +# Ambientes Python (caso exista) +__pycache__/ +*.py[cod] +.env.* +!.env + +# IDE +.vscode/ +.idea/ + +# Sistema +.DS_Store +Thumbs.db + +# Dados persistidos (bind mounts) +deploy/ +Makefile \ No newline at end of file diff --git a/.env.sample b/.env.sample new file mode 100644 index 0000000..d8c72e4 --- /dev/null +++ b/.env.sample @@ -0,0 +1,18 @@ +# ============================================= +# JasperReports Server - Variáveis de Ambiente +# ============================================= + +# --- PostgreSQL --- +POSTGRES_USER= +POSTGRES_PASSWORD= +POSTGRES_DB= + +# --- Conexão do JasperServer com o banco --- +JS_DB_HOST= +JS_DB_PORT= +JS_DB_USERNAME= +JS_DB_PASSWORD= +JS_DB_NAME= + +# --- JasperReports Server --- +JS_ADMIN_PASSWORD= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a72c6a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,28 @@ +# ================================================================ +# .gitignore — JasperReports Server Docker +# ================================================================ + +# Dados persistidos (bind mounts) +deploy/ + +# Instalador do JasperReports (muito grande para o Git) +downloads/*.zip + +# Variáveis de ambiente (contém senhas) +.env + +# Logs +*.log +wget-log + +# IDE +.vscode/ +.idea/ +*.swp +*~ + +# Sistema +.DS_Store +Thumbs.db + +GEMINI.md \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d1dcd6c --- /dev/null +++ b/Dockerfile @@ -0,0 +1,65 @@ +# ================================================================ +# Dockerfile — JasperReports Server 8.2.0 Community Edition +# +# Base: tomcat:9.0-jdk11-temurin (contém Tomcat 9 + JDK 11) +# +# Referências: +# - GEMINI.md (guia de instalação standalone) +# - https://sourceforge.net/projects/jr-community-installers/ +# ================================================================ + +FROM tomcat:9.0-jdk11-temurin + +LABEL maintainer="jasperserver-docker" \ + version="8.2.0" \ + description="JasperReports Server 8.2.0 CE no Tomcat 9" + +# ── Variáveis de ambiente ──────────────────────────────────────────────────── +ENV JASPER_VERSION=8.2.0 \ + JASPER_INSTALL_DIR=/opt/jasperreports-server-cp-8.2.0-bin \ + JAVA_OPTS="-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom" \ + CATALINA_OPTS="-Xms1024M -Xmx2048M -server -XX:+UseParallelGC" + +# ── Instalar dependências ──────────────────────────────────────────────────── +RUN apt-get update && apt-get install -y --no-install-recommends \ + unzip \ + wget \ + postgresql-client \ + dos2unix \ + && rm -rf /var/lib/apt/lists/* + +# ── Remover webapps padrão do Tomcat ──────────────────────────────────────── +RUN rm -rf ${CATALINA_HOME}/webapps/* + +# ── Copiar e extrair o instalador do JasperReports ────────────────────────── +# O arquivo deve existir em ./downloads/ antes de executar o build +COPY downloads/TIB_js-jrs-cp_8.2.0_bin.zip /tmp/ + +RUN echo "📦 Extraindo JasperReports Server ${JASPER_VERSION}..." \ + && unzip -q /tmp/TIB_js-jrs-cp_8.2.0_bin.zip -d /opt/ \ + && rm /tmp/TIB_js-jrs-cp_8.2.0_bin.zip \ + && echo "✅ Extração concluída." + +# ── Ajustar permissões dos scripts (conforme GEMINI.md) ───────────────────── +RUN chmod -R u+rwx ${JASPER_INSTALL_DIR}/ \ + && find ${JASPER_INSTALL_DIR}/buildomatic -name "*.sh" -exec chmod +x {} \; + +# ── Copiar arquivo de configuração base ───────────────────────────────────── +# (o entrypoint.sh aplica as variáveis de ambiente em tempo de execução) +COPY config/default_master.properties /config/default_master.properties + +# ── Backup dos libs originais do Tomcat (necessário para bind mounts) ──── +RUN cp -r ${CATALINA_HOME}/lib /opt/tomcat-lib-orig + +# ── Criar diretório para o marcador de instalação ─────────────────────────── +RUN mkdir -p /var/jasperserver /var/log + +# ── Copiar e preparar entrypoint ──────────────────────────────────────────── +COPY entrypoint.sh /entrypoint.sh +RUN dos2unix /entrypoint.sh && chmod +x /entrypoint.sh + +# ── Porta do Tomcat ───────────────────────────────────────────────────────── +EXPOSE 8080 + +# ── Ponto de entrada ──────────────────────────────────────────────────────── +ENTRYPOINT ["/entrypoint.sh"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6486edc --- /dev/null +++ b/Makefile @@ -0,0 +1,38 @@ +# ================================================================ +# Makefile — JasperReports Server Docker +# ================================================================ + +.PHONY: build up down restart logs clean reinstall + +## Constrói a imagem Docker +build: + docker compose build + +## Sobe os containers em background +up: + docker compose up -d + +## Para e remove os containers +down: + docker compose down + +## Reinicia os containers +restart: + docker compose restart + +## Exibe os logs do JasperServer em tempo real +logs: + docker compose logs -f jasperserver + + +## Com grandes poderes vem grandes responsabilidades! +## Para, remove containers e volumes (reset completo) +clean: + docker compose down -v + +## Limpa tudo e reinstala do zero +reinstall: + docker compose down -v + sudo rm -rf deploy + docker compose build + docker compose up -d diff --git a/README.md b/README.md new file mode 100644 index 0000000..1a1f9a3 --- /dev/null +++ b/README.md @@ -0,0 +1,115 @@ +# JasperReports Server - Docker + +Ambiente Dockerizado do **JasperReports Server 8.2.0 Community Edition** usando: +- **Tomcat 9** (imagem base `tomcat:9.0-jdk11-temurin`) +- **PostgreSQL 14** (container separado) +- **Docker Compose** para orquestração + +--- + +## 📂 Estrutura do Projeto + +``` +jasperserver/ +├── Dockerfile +├── docker-compose.yml +├── .env ← variáveis de ambiente +├── entrypoint.sh ← inicialização automática +├── config/ +│ └── default_master.properties ← configuração do instalador +├── downloads/ +│ ├── download.sh ← script de download do instalador +│ └── TIB_js-jrs-cp_8.2.0_bin.zip ← (você deve baixar este arquivo) +└── README.md +``` + +--- + +## 🚀 Passo a Passo + +### 1. Baixar o instalador do JasperReports + +```bash +chmod +x downloads/download.sh +bash downloads/download.sh +``` + +> Se o download automático falhar, baixe manualmente de: +> https://sourceforge.net/projects/jr-community-installers/files/Server/ +> e coloque o arquivo `TIB_js-jrs-cp_8.2.0_bin.zip` na pasta `downloads/`. + +### 2. Configurar variáveis de ambiente + +Edite o arquivo `.env` se necessário (senhas, portas, etc.): + +```bash +nano .env +``` + +### 3. Fazer o build da imagem + +```bash +docker compose build +``` + +> ⚠️ O build copia o ZIP (~700MB) e extrai dentro da imagem. Pode levar alguns minutos. + +### 4. Subir os containers + +```bash +docker compose up -d +``` + +### 5. Acompanhar os logs + +```bash +docker compose logs -f jasperserver +``` + +A **primeira inicialização** instala o JasperReports Server no banco de dados PostgreSQL — isso pode levar **3 a 5 minutos**. + +### 6. Acessar o JasperReports Server + +Após a inicialização: + +- **URL:** http://localhost:8080/jasperserver +- **Usuário:** `jasperadmin` +- **Senha:** `jasperadmin` + +--- + +## 🛑 Parar os Containers + +```bash +docker compose down +``` + +Para remover também os volumes (banco de dados): + +```bash +docker compose down -v +``` + +--- + +## ⚙️ Configurações Disponíveis no `.env` + +| Variável | Padrão | Descrição | +|---|---|---| +| `POSTGRES_USER` | `jasper` | Usuário do PostgreSQL | +| `POSTGRES_PASSWORD` | `12345678@a` | Senha do PostgreSQL | +| `POSTGRES_DB` | `jasperserver` | Nome do banco de dados | +| `JS_DB_HOST` | `postgres` | Host do banco (nome do serviço Docker) | +| `JS_DB_PORT` | `5432` | Porta do PostgreSQL | +| `JS_DB_USERNAME` | `jasper` | Usuário para conexão do JasperServer | +| `JS_DB_PASSWORD` | `12345678@a` | Senha para conexão do JasperServer | +| `JS_DB_NAME` | `jasperserver` | Nome do banco do JasperServer | + +--- + +## 📋 Referências + +- [GEMINI.md](./GEMINI.md) — Guia de instalação standalone (base deste projeto) +- [JasperReports Server no SourceForge](https://sourceforge.net/projects/jr-community-installers/) +- [Imagem Docker Tomcat 9](https://hub.docker.com/_/tomcat) +- [Imagem Docker PostgreSQL 14](https://hub.docker.com/_/postgres) diff --git a/config/default_master.properties b/config/default_master.properties new file mode 100644 index 0000000..9a3c717 --- /dev/null +++ b/config/default_master.properties @@ -0,0 +1,25 @@ +# ================================================================ +# default_master.properties - JasperReports Server 8.2.0 +# Baseado no guia de instalação do GEMINI.md +# ================================================================ + +# Tomcat (imagem base Docker) +CATALINA_HOME=/usr/local/tomcat +CATALINA_BASE=/usr/local/tomcat + +# Tipo de banco de dados +dbType=postgresql + +# Configurações de conexão (serão substituídas por variáveis de ambiente via entrypoint) +dbHost=${JS_DB_HOST} +dbPort=${JS_DB_PORT} +dbUsername=${JS_DB_USERNAME} +dbPassword=${JS_DB_PASSWORD} +js.dbName=${JS_DB_NAME} + +# Porta do appserver (padrão Tomcat) +appServerPort=8080 +appServerType=tomcat + +# Desabilitar instalação de amostras (opcional, comente para incluir) +# installSampleData=false diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f73748d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,70 @@ +# ================================================================ +# docker-compose.yml — JasperReports Server 8.2.0 +# +# Serviços: +# - postgres: PostgreSQL 14 (persistência via volume) +# - jasperserver: JasperReports Server no Tomcat 9 +# +# Uso: +# docker compose up -d +# ================================================================ + +services: + + # ── Banco de Dados ──────────────────────────────────────────── + postgres: + image: postgres:16 + container_name: jasper_postgres + # restart: always + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - jasper-net + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] + interval: 10s + timeout: 5s + retries: 10 + start_period: 30s + + # ── JasperReports Server ────────────────────────────────────── + jasperserver: + build: + context: . + dockerfile: Dockerfile + container_name: jasper_server + # restart: always + depends_on: + postgres: + condition: service_healthy + environment: + JS_DB_HOST: ${JS_DB_HOST} + JS_DB_PORT: ${JS_DB_PORT} + JS_DB_USERNAME: ${JS_DB_USERNAME} + JS_DB_PASSWORD: ${JS_DB_PASSWORD} + JS_DB_NAME: ${JS_DB_NAME} + ports: + - "8080:8080" + volumes: + # Bind mounts para ./deploy (facilita migração de servidor) + - ./deploy/webapps:/usr/local/tomcat/webapps # WAR do JasperServer + - ./deploy/lib:/usr/local/tomcat/lib # Driver JDBC PostgreSQL + - ./deploy/jasperserver:/var/jasperserver # Marcador de instalação + - ./deploy/keystore:/root # Keystore (.jrsksp) + - ./deploy/logs:/var/log # Logs + networks: + - jasper-net + +# ── Volumes ─────────────────────────────────────────────────────── +volumes: + postgres_data: + driver: local + +# ── Rede Interna ────────────────────────────────────────────────── +networks: + jasper-net: + driver: bridge diff --git a/downloads/download.sh b/downloads/download.sh new file mode 100755 index 0000000..a8f6f47 --- /dev/null +++ b/downloads/download.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# ============================================================= +# Script de download do JasperReports Server 8.2.0 CE +# Fonte: SourceForge (conforme indicado no GEMINI.md) +# ============================================================= + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +FILENAME="TIB_js-jrs-cp_8.2.0_bin.zip" +DOWNLOAD_URL="https://master.dl.sourceforge.net/project/jr-community-installers/Server/${FILENAME}" +DEST="${SCRIPT_DIR}/${FILENAME}" + +if [ -f "$DEST" ]; then + echo "✅ Arquivo já existe: $DEST" + echo " Nenhum download necessário." + exit 0 +fi + +echo "📥 Baixando JasperReports Server 8.2.0 Community Edition..." +echo " URL: ${DOWNLOAD_URL}" +echo " Destino: ${DEST}" +echo "" + +wget \ + --progress=bar:force \ + --content-disposition \ + -O "${DEST}" \ + "${DOWNLOAD_URL}" + +if [ $? -eq 0 ] && [ -f "$DEST" ]; then + echo "" + echo "✅ Download concluído: ${DEST}" + echo " Tamanho: $(du -sh "${DEST}" | cut -f1)" +else + echo "" + echo "❌ Falha no download automático." + echo "" + echo "📌 Para download manual:" + echo " 1. Acesse: https://sourceforge.net/projects/jr-community-installers/files/Server/" + echo " 2. Baixe o arquivo: ${FILENAME}" + echo " 3. Coloque-o nesta pasta: ${SCRIPT_DIR}/" + exit 1 +fi diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..6fdd506 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# ================================================================ +# entrypoint.sh — JasperReports Server Docker +# +# Responsável por: +# 1. Aguardar o PostgreSQL ficar disponível +# 2. Na primeira execução: criar o schema e instalar o JasperServer +# 3. Nas execuções seguintes: apenas iniciar o Tomcat +# ================================================================ + +set -eo pipefail + +JASPER_INSTALL_DIR="/opt/jasperreports-server-cp-8.2.0-bin" +INSTALL_MARKER="/var/jasperserver/.installed" + +# ── Substituir variáveis de ambiente no default_master.properties ────────── +prepare_config() { + echo "⚙️ Configurando default_master.properties..." + + # Garante que o diretório buildomatic seja acessível + cp /config/default_master.properties "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + + # Substitui as variáveis de ambiente no arquivo de configuração + sed -i "s|\${JS_DB_HOST}|${JS_DB_HOST}|g" "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + sed -i "s|\${JS_DB_PORT}|${JS_DB_PORT:-5432}|g" "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + sed -i "s|\${JS_DB_USERNAME}|${JS_DB_USERNAME}|g" "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + sed -i "s|\${JS_DB_PASSWORD}|${JS_DB_PASSWORD}|g" "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + sed -i "s|\${JS_DB_NAME}|${JS_DB_NAME}|g" "${JASPER_INSTALL_DIR}/buildomatic/default_master.properties" + + echo "✅ Configuração aplicada." +} + +# ── Aguardar PostgreSQL ──────────────────────────────────────────────────── +wait_for_postgres() { + echo "⏳ Aguardando PostgreSQL em ${JS_DB_HOST}:${JS_DB_PORT:-5432}..." + until pg_isready -h "${JS_DB_HOST}" -p "${JS_DB_PORT:-5432}" -U "${JS_DB_USERNAME}" -q; do + echo " PostgreSQL ainda não está pronto. Tentando novamente em 3s..." + sleep 3 + done + echo "✅ PostgreSQL aceitando conexões!" + + # Aguardar o banco jasperserver estar acessível (necessário para reinícios) + echo "⏳ Verificando acesso ao banco ${JS_DB_NAME}..." + until PGPASSWORD="${JS_DB_PASSWORD}" psql -h "${JS_DB_HOST}" -p "${JS_DB_PORT:-5432}" \ + -U "${JS_DB_USERNAME}" -d "${JS_DB_NAME}" -c "SELECT 1" > /dev/null 2>&1; do + echo " Banco ${JS_DB_NAME} ainda não acessível. Tentando em 3s..." + sleep 3 + done + echo "✅ PostgreSQL disponível!" +} + +# ── Instalação inicial ───────────────────────────────────────────────────── +install_jasperserver() { + echo "🚀 Primeira execução detectada. Iniciando instalação do JasperReports Server..." + + cd "${JASPER_INSTALL_DIR}/buildomatic" + + # Executa o instalador CE no modo minimal (sem dados de exemplo) + # O "echo y" responde automaticamente ao prompt de recriação do banco + echo "y" | ./js-install-ce.sh minimal 2>&1 | tee /var/log/jasper-install.log + INSTALL_RC=${PIPESTATUS[1]} + + if [ $INSTALL_RC -eq 0 ]; then + mkdir -p "$(dirname "$INSTALL_MARKER")" + touch "$INSTALL_MARKER" + echo "✅ Instalação concluída com sucesso!" + else + echo "❌ Falha na instalação! (exit code: $INSTALL_RC) Verifique /var/log/jasper-install.log" + exit 1 + fi +} + +# ── Main ──────────────────────────────────────────────────────────────────── + +# Popula o bind mount de lib com os JARs originais do Tomcat se estiver vazio +if [ -z "$(ls -A ${CATALINA_HOME}/lib 2>/dev/null)" ]; then + echo "📦 Populando ${CATALINA_HOME}/lib com JARs originais do Tomcat..." + cp -r /opt/tomcat-lib-orig/* "${CATALINA_HOME}/lib/" + echo "✅ Libs do Tomcat restaurados." +fi + +prepare_config +wait_for_postgres + +if [ ! -f "$INSTALL_MARKER" ]; then + install_jasperserver +else + echo "✅ JasperReports Server já instalado. Pulando instalação." +fi + +echo "🚀 Iniciando Tomcat..." +exec catalina.sh run