Skip to content
Open
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -71,3 +71,6 @@ venv.bak/

# Poetry
poetry.lock

# Logs
logs/
23 changes: 21 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[English](#english) | [Français](#français)

<a name="english"></a>
<a id="english"></a>
## 🏆 FossBadge - Open Badge Platform

FossBadge is a free and open source platform for creating, managing, and sharing digital badges. It allows organizations to recognize skills and achievements through a simple, accessible interface.
Expand Down Expand Up @@ -66,6 +66,15 @@ Run the tests :
uv run python manage.py test
```

### Launch in production
1. Set `Debug` to `False` in `fossbadge/settings.py`.
2. Install [docker](https://docs.docker.com/engine/install/)
3. Create à `.env` file : `$ cp env_exemple .env` and edit its values
4. Create a network in docker : `$ docker network create frontend`
5. Run the docker compose : `$ docker compose -f docker-compose-prod.yml up`

After that, nginx will run on port 80.

### 📁 Project Structure

- `core/`: Main application with views, models, and templates
Expand All @@ -84,7 +93,7 @@ This project is licensed under the AGPLv3 License - see the LICENSE file for det

---

<a name="français"></a>
<a id="français"></a>
## 🏆 FossBadge - Plateforme de Badges Ouverts

FossBadge est une plateforme libre et open source pour créer, gérer et partager des badges numériques. Elle permet aux organisations de reconnaître les compétences et les réalisations à travers une interface simple et accessible.
Expand Down Expand Up @@ -148,6 +157,16 @@ Lancer les tests :
uv run python manage.py test
```


### Lancer en production
1. Mettre `Debug` à `False` dans `fossbadge/settings.py`.
2. Installer [docker](https://docs.docker.com/engine/install/)
3. Créer un fichier `.env` : `$ cp env_exemple .env` et éditer ses valeurs
4. Créer un réseau dans docker : `$ docker network create frontend`
5. Lancer le docker compose : `$ docker compose -f docker-compose-prod.yml up`

Après ça, nginx tournera sur le port 80.

### 📁 Structure du Projet

- `core/` : Application principale avec les vues, modèles et templates
Expand Down
66 changes: 66 additions & 0 deletions docker-compose-prod.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
services:
fossbadge_django:
build: .
container_name: fossbadge_django
hostname: fossbadge_django
restart: always
env_file: .env
user: fossbadge
volumes:
- ./ssh:/home/fossbadge/.ssh
- ./:/home/fossbadge/FossBadge
- static_volume:/home/fossbadge/FossBadge/staticfiles
depends_on:
- postgres
command: "bash start.sh"
networks:
- fossbadge_backend

postgres:
image: postgres
restart: always
container_name: postgres
hostname: postgres
ports:
- "5432:5432"
env_file:
- .env
environment:
- "POSTGRES_HOST_AUTH_METHOD=trust"
networks:
- fossbadge_backend

fossbadge_nginx:
image: nginx
restart: always
ports:
- 80:80
container_name: fossbadge_nginx
hostname: fossbadge_nginx
volumes:
- ./media:/www/media
- static_volume:/www/static
- ./logs:/logs
- ./nginx:/etc/nginx/conf.d
depends_on:
- fossbadge_django
links:
- fossbadge_django:fossbadge_django
labels:
- traefik.enable=true
- traefik.docker.network=frontend
- traefik.http.routers.fossbadge_nginx.tls.certresolver=myresolver
- traefik.http.routers.fossbadge_nginx.rule=Host(`$DOMAIN`)
- traefik.http.services.fossbadge_nginx.loadbalancer.server.port=80
- traefik.http.routers.fossbadge_nginx.middlewares=crowdsec@file
networks:
- frontend
- fossbadge_backend

volumes:
static_volume:

networks:
frontend:
external: true
fossbadge_backend:
6 changes: 6 additions & 0 deletions env_exemple
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
DOMAIN="" # your domain

# POSTGRES settings
POSTGRES_USER=
POSTGRES_DBNAME=
POSTGRES_PASSWORD=
26 changes: 19 additions & 7 deletions fossbadge/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"""

from pathlib import Path

import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

Expand Down Expand Up @@ -105,13 +105,25 @@
# Database
# https://docs.djangoproject.com/en/5.2/ref/settings/#databases

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}

if DEBUG:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
},
}
else:
DATABASES = {
'default': {
"ENGINE": "django.db.backends.postgresql",
"NAME": os.getenv("POSTGRES_DBNAME"),
"USER": os.getenv("POSTGRES_USER"),
"PASSWORD": os.getenv("POSTGRES_PASSWORD"),
"HOST": "postgres",
"PORT": 5432
}
}

# Password validation
# https://docs.djangoproject.com/en/5.2/ref/settings/#auth-password-validators
Expand Down
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ dependencies = [
"django-cleanup (>=9.0.0,<10.0.0)",
"gunicorn (>=23.0.0,<24.0.0)",
"beautifulsoup4>=4.14.3",
"psycopg[binary]>=3.3.2",
"sweetify>=2.3.1",
]

Expand Down
13 changes: 5 additions & 8 deletions start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,14 @@ export PATH="/home/fossbadge/.local/bin:$PATH"
uv sync
echo "UV install ok"

# Migrate
uv run python3 manage.py migrate

# Install if no asset created :
uv run python3 manage.py install
# New static for nginx ?
# Add static to nginx
uv run python3 manage.py collectstatic --noinput

echo "Run GUNICORN"
echo "You should be able to see the Fedow dashbord at :"
echo "https://$DOMAIN/dashboard/"
sqlite3 ./database/db.sqlite3 'PRAGMA journal_mode=WAL;'
sqlite3 ./database/db.sqlite3 'PRAGMA synchronous=normal;'
uv run gunicorn fossbadge.wsgi --log-level=info --log-file /home/fossbadge/FossBadge/logs/gunicorn.logs -w 3 -b 0.0.0.0:8000
echo "You should be able to see the fossbadge home at :"
echo "https://$DOMAIN/"

uv run gunicorn fossbadge.wsgi --log-level=info --log-file /home/fossbadge/FossBadge/logs/gunicorn.logs -w 3 -b 0.0.0.0:8000
2 changes: 2 additions & 0 deletions start_dev.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ echo "UV install ok"
sqlite3 ./db.sqlite3 'PRAGMA journal_mode=WAL;'
sqlite3 ./db.sqlite3 'PRAGMA synchronous=normal;'

uv run python manage.py migrate

if [[ "$GUNICORN" == "1" ]]; then
echo "→ Gunicorn activé, démarrage…"
uv run python3 manage.py collectstatic --noinput
Expand Down
37 changes: 37 additions & 0 deletions uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.