Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/rest-api.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Build and Test REST API

on:
push:
branches: [ main, develop ]
paths:
- 'rest-api/**'
- '.github/workflows/rest-api.yml'
pull_request:
branches: [ main, develop ]
paths:
- 'rest-api/**'

jobs:
build:
runs-on: ubuntu-latest

defaults:
run:
working-directory: rest-api

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 21
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: maven

- name: Build with Maven
run: mvn -B clean package

- name: Run tests
run: mvn test

- name: Build Docker image
run: docker build -t agrimap-api:${{ github.sha }} .

- name: Test Docker image
run: |
docker run -d --name test-api -p 8080:8080 agrimap-api:${{ github.sha }}
sleep 30
docker exec test-api wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1
docker stop test-api
docker rm test-api

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: agrimap-jar
path: rest-api/target/*.jar
retention-days: 7
41 changes: 41 additions & 0 deletions rest-api/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Maven
target/
!target/*.jar
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar

# IDE
.idea/
*.iml
.vscode/
.eclipse/
.settings/
.classpath
.project

# OS
.DS_Store
Thumbs.db

# Git
.git/
.gitignore

# Docker
Dockerfile
.dockerignore

# Documentation
README.md
*.md

# Logs
*.log
logs/
39 changes: 39 additions & 0 deletions rest-api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar

# IDE
.idea/
*.iml
.vscode/
.eclipse/
.settings/
.classpath
.project
*.iws
*.ipr

# OS
.DS_Store
Thumbs.db

# Logs
*.log
logs/

# Spring Boot
spring.log
application-local.yaml
application-local.yml

# Environment
.env
.env.local
127 changes: 127 additions & 0 deletions rest-api/DEPLOY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Déploiement de l'API AgriMap sur Render

Ce guide explique comment déployer l'API REST Spring Boot sur Render.

## Configuration Docker

L'application utilise un build multi-stage pour optimiser la taille de l'image :
- **Stage 1** : Build avec Maven et OpenJDK 21
- **Stage 2** : Runtime avec JRE 21 Alpine (image légère)

### Fichiers importants

- `Dockerfile` : Configuration Docker multi-stage
- `render.yaml` : Configuration Render (Blueprint)
- `.dockerignore` : Fichiers à exclure du contexte Docker

## Déploiement sur Render

### Option 1 : Déploiement via Blueprint (Recommandé)

1. Connectez-vous à [Render](https://dashboard.render.com/)
2. Cliquez sur "New" → "Blueprint"
3. Connectez votre dépôt GitHub
4. Render détectera automatiquement le fichier `render.yaml`
5. Cliquez sur "Apply"

### Option 2 : Déploiement manuel

1. Connectez-vous à [Render](https://dashboard.render.com/)
2. Cliquez sur "New" → "Web Service"
3. Connectez votre dépôt GitHub
4. Configurez les paramètres suivants :
- **Name** : agrimap-api
- **Runtime** : Docker
- **Region** : Frankfurt (ou votre choix)
- **Branch** : main
- **Dockerfile Path** : ./rest-api/Dockerfile
- **Docker Context** : ./rest-api
- **Plan** : Free

5. Variables d'environnement (optionnelles) :
```
SPRING_PROFILES_ACTIVE=prod
SERVER_PORT=8080
JAVA_OPTS=-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0
```

6. Health Check Path : `/actuator/health`

7. Cliquez sur "Create Web Service"

## Test local avec Docker

### Construire l'image
```bash
cd rest-api
docker build -t agrimap-api .
```

### Exécuter le conteneur
```bash
docker run -p 8080:8080 agrimap-api
```

### Tester l'application
```bash
# Health check
curl http://localhost:8080/actuator/health

# Documentation API (Swagger)
open http://localhost:8080/swagger-ui.html
```

## Endpoints disponibles

- **API** : `https://your-app.onrender.com`
- **Health Check** : `https://your-app.onrender.com/actuator/health`
- **API Documentation** : `https://your-app.onrender.com/swagger-ui.html`
- **OpenAPI Spec** : `https://your-app.onrender.com/v3/api-docs`

## Notes importantes

### Plan gratuit Render
- Le service s'endort après 15 minutes d'inactivité
- Premier démarrage peut prendre 30-60 secondes
- 750 heures gratuites par mois

### CORS
L'application est configurée pour accepter les requêtes depuis :
- `localhost:*`
- `*.onrender.com`

Pour ajouter d'autres origines, modifiez `application.yaml`.

### Monitoring
- Les logs sont disponibles dans le dashboard Render
- Le health check s'exécute toutes les 30 secondes
- Metrics disponibles via `/actuator/info`

## Mise à jour de l'application

Les déploiements automatiques sont activés :
1. Poussez vos changements sur la branche `main`
2. Render détecte automatiquement les changements
3. Build et déploiement automatique

## Troubleshooting

### L'application ne démarre pas
- Vérifiez les logs dans le dashboard Render
- Vérifiez que le port 8080 est bien exposé
- Vérifiez les variables d'environnement

### Health check échoue
- Assurez-vous que Spring Boot Actuator est dans les dépendances
- Vérifiez que `/actuator/health` retourne un status 200

### Build échoue
- Vérifiez que Java 21 est spécifié dans le Dockerfile
- Vérifiez que toutes les dépendances Maven sont disponibles
- Consultez les logs de build

## Support

Pour plus d'informations :
- [Documentation Render](https://render.com/docs)
- [Spring Boot Docker](https://spring.io/guides/topicals/spring-boot-docker/)
41 changes: 41 additions & 0 deletions rest-api/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Multi-stage build for optimized image size
FROM maven:3.9-eclipse-temurin-21-alpine AS build

# Set working directory
WORKDIR /app

# Copy pom.xml and download dependencies (cached layer)
COPY pom.xml .
RUN mvn dependency:go-offline -B

# Copy source code
COPY src ./src

# Build the application
RUN mvn clean package -DskipTests -B

# Runtime stage
FROM eclipse-temurin:21-jre-alpine

# Set working directory
WORKDIR /app

# Create non-root user for security
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

# Copy the built jar from build stage
COPY --from=build /app/target/*.jar app.jar

# Expose port
EXPOSE 8080

# Set JVM options for containerized environments
ENV JAVA_OPTS="-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/./urandom"

# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:8080/actuator/health || exit 1

# Run the application
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
Loading