Este guia detalha o processo de empacotar e implantar o projeto RuoYi, incluindo suas camadas de backend (Spring Boot) e front end (Vue.js), junto com serviços essenciais como MySQL e Redis, utilizando Docker Compose para uma gestão de contêineres simplificada. A abordagem visa criar um ambiente isolado e de fácil replicação.
Estrutura de Diretórios Essencial
Para manter o projeto organizado e modular, começamos criando uma estrtuura de diretórios para os componentes Dockerizados diretamente na raiz do projeto RuoYi:
docker/mysql: Contém arquivos de inicialização para o banco de dados.docker/backend: Armazena oDockerfilepara a aplicação Spring Boot.docker/frontend: Inclui oDockerfilepara a interface Vue.js e a configuração do Nginx.
Configuração do Banco de Dados MySQL
Os scripts de inicialização do MySQL são cruciais para configurar o esquema e os dados iniciais do RuoYi. Esses arquivos devem ser colocados em docker/mysql/init. Recomenda-se exportar as tabelas e dados existentes do seu ambiente de desenvolvimento.
Exportação de Dados e Tratamento de Codificação
Ao exportar o banco de dados (por exemplo, usando ferramentas como DBeaver), é fundamental garantir que o arquivo SQL gerado seja compatível com a codificação UTF-8 dentro do contêiner MySQL. Para isso, adicione a seguinte linha no início do seu arquivo .sql principal:
/*!40101 SET NAMES utf8 */;
Esta etapa previne problemas de caracteres acentuados ou especiais (caracteres chineses, por exemplo) após a inicialização do banco de dados no contêiner.
Script de Criação e Permissão de Usuário
Além da estrutura do banco de dados, é boa prática criar um usuário dedicado com as permissões mínimas necessárias. Crie um arquivo como 01-init-user.sql dentro de docker/mysql/init:
/*!40101 SET NAMES utf8 */;
-- Este script concede permissões ao usuário 'ruoyi_user' no banco de dados 'ry_vue'.
-- O usuário 'ruoyi_user' pode ser criado automaticamente pelo Docker Compose,
-- se definido nas variáveis de ambiente do serviço MySQL.
GRANT ALL PRIVILEGES ON ry_vue.* TO 'ruoyi_user'@'%';
FLUSH PRIVILEGES; -- Recarrega as permissões para que entrem em vigor imediatamente.
Dockerfile para o Backend (Spring Boot)
O Dockerfile localizado em docker/backend/Dockerfile define como a aplicação Spring Boot será construída e executada. Utilizamos uma abordagem de múltiplas fases (multi-stage build) para otimizar o tamanho final da imagem.
# docker/backend/Dockerfile
# --- Fase de Construção (Build Stage) ---
# Usa uma imagem base com Maven e JDK para compilar o projeto.
FROM maven:3.9.5-openjdk-17 AS build_env
# Define o diretório de trabalho dentro do contêiner.
WORKDIR /app/ruoyi-backend
# Copia os arquivos de configuração do Maven e as estruturas dos módulos.
# O "contexto de construção" (build context) será a raiz do projeto RuoYi.
COPY pom.xml ./
COPY ruoyi-common ./ruoyi-common/
COPY ruoyi-framework ./ruoyi-framework/
COPY ruoyi-system ./ruoyi-system/
COPY ruoyi-quartz ./ruoyi-quartz/
COPY ruoyi-generator ./ruoyi-generator/
COPY ruoyi-admin ./ruoyi-admin/
# Navega para o módulo comum e instala no repositório local Maven.
WORKDIR /app/ruoyi-backend/ruoyi-common
RUN mvn clean install -DskipTests
# Retorna ao diretório raiz do backend e compila o módulo 'ruoyi-admin'.
# '-pl ruoyi-admin' seleciona o módulo principal, '-am' inclui as dependências.
WORKDIR /app/ruoyi-backend
RUN mvn clean package -pl ruoyi-admin -am -DskipTests
# --- Fase de Execução (Runtime Stage) ---
# Usa uma imagem JRE leve para executar a aplicação compilada.
FROM openjdk:17-jre-slim
# Define o diretório de trabalho para a aplicação final.
WORKDIR /app
# Copia o JAR compilado da fase de construção.
COPY --from=build_env /app/ruoyi-backend/ruoyi-admin/target/ruoyi-admin.jar ./app.jar
# Expõe a porta padrão do Spring Boot.
EXPOSE 8080
# Comando de inicialização da aplicação, com injeção de variáveis de ambiente para configuração.
ENTRYPOINT ["java", \
"-Djava.security.egd=file:/dev/./urandom", \
"-jar", \
"app.jar", \
"--spring.datasource.url=jdbc:mysql://${DB_HOST:mysql}:${DB_PORT:3306}/${DB_NAME:ry_vue}?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true", \
"--spring.datasource.username=${DB_USER:ruoyi_user}", \
"--spring.datasource.password=${DB_PASS:ruoyi_user_pass}", \
"--spring.redis.host=${REDIS_HOST:redis}", \
"--spring.redis.port=${REDIS_PORT:6379}", \
"--spring.redis.password=${REDIS_PASS:}" \
]
Dockerfile para o Frontend (Vue.js)
O Dockerfile em docker/frontend/Dockerfile é responsável por construir a aplicação Vue.js e configurá-la para ser servida por um servidor web Nginx.
# docker/frontend/Dockerfile
# --- Fase de Construção (Build Stage) ---
# Usa uma imagem Node.js para compilar a aplicação Vue.js.
FROM node:18.17.0-alpine AS frontend_builder
# Define o diretório de trabalho.
WORKDIR /app/ruoyi-ui
# Define o registro npm para acelerar a instalação de dependências (opcional).
# RUN npm config set registry https://registry.npmmirror.com
# Copia os arquivos de definição de dependências para aproveitar o cache do Docker.
COPY ruoyi-ui/package.json ruoyi-ui/package-lock.json ./
# Instala as dependências do projeto.
RUN npm install
# Copia o restante dos arquivos do frontend.
COPY ruoyi-ui .
# Executa o comando de build do Vue.js. Verifique o package.json para o script correto (geralmente 'build:prod').
RUN npm run build:prod
# --- Fase de Execução (Runtime Stage) ---
# Usa uma imagem Nginx leve para servir os arquivos estáticos.
FROM nginx:1.25-alpine
# Remove a configuração padrão do Nginx.
RUN rm /etc/nginx/conf.d/default.conf
# Copia a configuração personalizada do Nginx.
COPY docker/frontend/nginx.conf /etc/nginx/conf.d/app.conf
# Copia os arquivos estáticos gerados pela fase de construção para o diretório de serviço do Nginx.
COPY --from=frontend_builder /app/ruoyi-ui/dist /usr/share/nginx/html
# Expõe a porta HTTP padrão do Nginx.
EXPOSE 80
# O Nginx é configurado para rodar em primeiro plano por padrão, não sendo necessário um ENTRYPOINT ou CMD explícito.
Configuração do Nginx para o Frontend
O arquivo nginx.conf, localizado em docker/frontend/nginx.conf, define como o Nginx irá servir os arquivos estáticos do Vue.js e como irá rotear as requisições de API para o backend.
# docker/frontend/nginx.conf
server {
listen 80;
server_name localhost; # Pode ser substituído pelo seu domínio
charset utf-8; # Garante que os arquivos estáticos sejam servidos com UTF-8
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log warn;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
# Configuração essencial para aplicações SPA (Single Page Application) com Vue Router
# Garante que as rotas internas do Vue.js funcionem corretamente ao recarregar a página.
try_files $uri $uri/ /index.html;
}
# Proxy reverso para as requisições de API.
# O prefixo '/prod-api/' deve corresponder ao VUE_APP_BASE_API configurado no frontend.
location /prod-api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# O 'ruoyi-backend' é o nome do serviço definido no docker-compose.yml.
proxy_pass http://ruoyi-backend:8080/;
# Se o backend não espera o prefixo /prod-api/, use esta linha:
# rewrite ^/prod-api/(.*)$ /$1 break;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Arquivo docker-compose.yml
O arquivo docker-compose.yml, posicionado na raiz do projeto, orquestra todos os serviços necessários: MySQL, Redis, o backend RuoYi e o frontend com Nginx.
# docker-compose.yml
version: '3.8'
services:
# Serviço de Banco de Dados MySQL
mysql-db:
image: mysql:8.0 # Garanta compatibilidade com o RuoYi
container_name: ruoyi-mysql-container
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-my_root_password}
MYSQL_DATABASE: ${MYSQL_DB_NAME:-ry_vue}
MYSQL_USER: ${MYSQL_USER:-ruoyi_user}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-ruoyi_user_pass}
ports:
- "${MYSQL_EXPOSED_PORT:-3306}:3306"
volumes:
- ruoyi_mysql_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d # Carrega scripts SQL de inicialização
networks:
- ruoyi_network
restart: unless-stopped
command: # Configurações adicionais para o MySQL
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
# Serviço Redis para Cache e Sessões
redis-cache:
image: redis:6.2-alpine # Imagem leve do Redis
container_name: ruoyi-redis-container
command: ["redis-server", "--requirepass", "${REDIS_PASSWORD:-}"] # Define senha se a variável for fornecida
ports:
- "${REDIS_EXPOSED_PORT:-6379}:6379"
volumes:
- ruoyi_redis_data:/data
networks:
- ruoyi_network
restart: unless-stopped
# Serviço Backend da Aplicação RuoYi (Spring Boot)
ruoyi-backend:
container_name: ruoyi-backend-app
build:
context: . # Contexto de construção é a raiz do projeto
dockerfile: docker/backend/Dockerfile
environment:
# Variáveis de ambiente passadas para o ENTRYPOINT do Dockerfile do backend
DB_HOST: mysql-db # Usa o nome do serviço MySQL como hostname
DB_PORT: 3306
DB_NAME: ${MYSQL_DB_NAME:-ry_vue}
DB_USER: ${MYSQL_USER:-ruoyi_user}
DB_PASS: ${MYSQL_PASSWORD:-ruoyi_user_pass}
REDIS_HOST: redis-cache # Usa o nome do serviço Redis como hostname
REDIS_PORT: 6379
REDIS_PASS: ${REDIS_PASSWORD:-}
SERVER_PORT: 8080
ports:
- "${BACKEND_EXPOSED_PORT:-8080}:8080"
depends_on:
- mysql-db
- redis-cache
networks:
- ruoyi_network
restart: unless-stopped
# Serviço Frontend da Aplicação RuoYi (Vue.js com Nginx)
ruoyi-frontend:
container_name: ruoyi-frontend-web
build:
context: . # Contexto de construção é a raiz do projeto
dockerfile: docker/frontend/Dockerfile
ports:
- "${FRONTEND_EXPOSED_PORT:-80}:80"
depends_on:
- ruoyi-backend # Garante que o backend esteja iniciando antes do frontend
networks:
- ruoyi_network
restart: unless-stopped
networks:
ruoyi_network: # Define uma rede interna para comunicação entre os serviços
driver: bridge
volumes: # Define volumes persistentes para dados
ruoyi_mysql_data:
ruoyi_redis_data:
Observações Importantes
- **Gerenciamento de Usuários MySQL:** É fortemente recomendado evitar o uso do usuário
rootpara a aplicação. Odocker-compose.ymle o script de inicialiazção MySQL configuram um usuário específico (ruoyi\_user) com permissões para o banco de dados da aplicação (ry\_vue). - **Consistência de Caminhos e Variáveis:** Verifique cuidadosamente todos os caminhos de arquivos e nomes de variáveis de ambiente. Erros de digitação em portas, hosts ou nomes de serviços podem causar falhas na comunicação entre os contêineres.
- **Conflitos de Portas:** Em ambientes como WSL2 (Windows Subsystem for Linux 2) ou máquinas Windows/macOS, pode haver conflitos se as portas expostas pelos contêineres já estiverem sendo utilizadas por outros serviços no host. Ajuste as variáveis de porta no
docker-compose.yml(ex:MYSQL\_EXPOSED\_PORT,FRONTEND\_EXPOSED\_PORT).
Comandos Úteis do Docker Compose
Após carregar os arquivos do projeto para o servidor, navegue até o diretório raiz do código-fonte onde reside o docker-compose.yml.
# Primeira construção e inicialização de todos os serviços em modo detached (segundo plano).
# O --build garante que as imagens serão construídas a partir dos Dockerfiles.
docker compose up -d --build
# Se houver atualizações no código-fonte ou nos Dockerfiles, você precisará reconstruir as imagens:
docker compose build
# E então, para aplicar as mudanças e reiniciar os serviços:
docker compose up -d
# Para parar e remover todos os contêineres, redes e volumes associados ao projeto Docker Compose:
# ATENÇÃO: '--volumes' removerá os dados persistidos (ex: dados do MySQL).
# Certifique-se de ter feito backup de dados importantes antes de executar.
docker compose down --volumes