Files
GiecChallenge/README.md
Maxime Boulay 1f4c0a49af Create README
2026-05-01 14:51:20 +02:00

4.9 KiB
Raw Permalink Blame History

GiecChallenge

A fullstack demo application consisting of an ASP.NETCore backend and a React frontend.
The project is containerbased and can be run locally with DockerCompose or built and deployed through GitLab CI.

Table of Contents


Overview

  • Backend: ASP.NETCore 10.0 API (backend/GiecChallenge).
    Handles authentication, JWT generation, and CRUD operations for products, purchases, etc.
  • Frontend: React (createreactapp) (frontend).
    Consumes the API and provides a UI for managing data.
  • Infrastructure: Docker containers for backend, frontend, and PostgreSQL database, orchestrated with dockercompose.yml.

All secrets (DB credentials, JWT secret, passwords, etc.) are externalised to environment variables and never committed to source control.


Prerequisites

  • Docker Engine (>=20.10) with DockerCompose support
  • Git (to clone the repository)
  • (Optional) GitLab Runner with DockerinDocker for CI pipelines
  • Node14+ (for local frontend development)
  • .NET10 SDK (for local backend development)

Environment Variables

Create a .env file at the repository root (or supply variables to your CI environment). Example:

# Database
POSTGRES_USER=your_user
POSTGRES_PASSWORD=your_password

# Connection string (used by the backend)
ConnectionStrings__PostgreSQL=Host=giecchallenge_db;Port=14432;Database=GiecChallenge;User ID=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Pooling=true

# JWT configuration
JWT__ValidAudience=https://giecchallenge-backend.maximeboulay.com
JWT__ValidIssuer=https://giecchallenge-backend.maximeboulay.com
JWT__Secret=super_secret_jwt_key

# UI configuration
REACT_APP_API_URL=http://localhost:17020   # points to the backend container

# Misc
OriginAllowed=http://localhost:3000
PasswordHash=some_hash_value

The appsettings.Development.json and appsettings.Docker.json files reference these variables using the ${VARIABLE_NAME} syntax.


Running Locally

  1. Start the stack
docker compose up --build
  • Backend API: http://localhost:17020 (HTTP) & https://localhost:17021 (HTTPS)
  • Frontend UI: http://localhost:13000
  • PostgreSQL: localhost:14432
  1. Access the UI in a browser at http://localhost:13000.

  2. Stop the stack

docker compose down

Building & Testing

Backend

dotnet restore backend/GiecChallenge/GiecChallenge.csproj
dotnet build backend/GiecChallenge/GiecChallenge.csproj -c Release
dotnet test backend/GiecChallenge.test/GiecChallenge.test.csproj

Frontend

cd frontend
npm ci
npm run build   # produces ./frontend/build

Deploying with GitLab CI

The repository contains a .gitlab-ci.yml defining the following stages:

  1. restore restores NuGet packages and installs Node dependencies.
  2. build builds the .NET project and the React app.
  3. test runs backend unit tests.
  4. docker_build builds Docker images for both services and pushes them to the GitLab Container Registry.
  5. deploy placeholder stage for your production deployment (e.g., Kubernetes, Docker Swarm, or a VM).

The CI pipeline expects the following CI/CD variables to be defined in GitLab:

  • CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_REGISTRY, CI_REGISTRY_IMAGE (provided automatically by GitLab).
  • All custom variables from the .env file (e.g., POSTGRES_USER, POSTGRES_PASSWORD, JWT__Secret, etc.).

Push a branch, and GitLab will automatically run the pipeline. Merge to main to trigger the deploy stage placeholder.


Project Structure

├── backend/
│   └── GiecChallenge/
│       ├── Dockerfile          # Backend container image
│       ├── appsettings.*.json  # Configuration files (environmentvariable placeholders)
│       ├── Controllers/ ...
│       └── *.csproj
├── frontend/
│   ├── Dockerfile              # Frontend container image
│   ├── package.json
│   └── src/ …
├── docker-compose.yml          # Local orchestration
├── .gitlab-ci.yml              # CI pipeline definition
├── .env                        # Example env file (do not commit secrets)
└── README.md                   # You are reading it now

License

This project is provided for educational purposes. Feel free to adapt and extend it under the terms of the MIT License.


Enjoy! If you encounter any issues, verify that all required environment variables are defined and that Docker is running with sufficient resources.