merge avec adrien

This commit is contained in:
Theouche 2024-09-13 15:32:30 +02:00
commit ea24accbc4
10 changed files with 323 additions and 29 deletions

View File

@ -1,6 +1,5 @@
FROM python:latest
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
@ -10,6 +9,7 @@ RUN apt update && apt upgrade -y
COPY requirements.txt .
COPY manage.py .
COPY certs/ certs/
RUN python3 -m venv venv
RUN venv/bin/pip3 install --upgrade pip

View File

@ -0,0 +1,31 @@
-----BEGIN CERTIFICATE-----
MIIFazCCA1OgAwIBAgIUOD9IAcHJzD9Me6OP7fbTThgZHUAwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yNDA5MTExNDEwMzJaFw0yNTA5
MTExNDEwMzJaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggIiMA0GCSqGSIb3DQEB
AQUAA4ICDwAwggIKAoICAQDGwtY16ighyAqcLI+uci4oJovChHN1I61aPqATcTNC
L98ydVF+dkPMlgS+No1tjBthFQKJ54U733AxgauJ2UDoc27oQpJQiuALf0ui9AjH
+82v5thtWrQBUgsOQGGqu7lmFncIH3cZ5AiwVHu3O7JSYEm4l+P4uyJaRzIwi9ab
dSRJ9hjaa1UydEUlMWhpICc2U8r/BVTt8W1mc3eMu6rB429NuKrL0mQ2tgwqKdMV
904PlAF4dPKeEwl8VkXq/IJd9qr/97GfCJYPw+bJS3vnjD5JfBJoSh6o+BSck/ps
GnThf79kZtc29FoWmgtT7K5s5bDOuM6YzqPNGEkNxWh4D5Qtb5J6HIhea92U5/QN
/4PsBOAP1GrPpXkssMIPQEButK/qx1mtPHNaVC+wNRGH1kbaqbVVSiH0akidArhv
2BRP0Ajg8wNUZkCgDKoM60ZgHpchwYQ6GcKZ9IvRZFCuvl/8/Nuw2RzesIAoaxWn
G5CVZFsPvbHd80weeCisBSdDXN140iwru/h9vBrNQRo+1M+Q3gy1odsZqth3ip6B
PNdqUU/tgcPZzHRdE7YSP1UnSCGu45aMYAKHPngDJ6N08m25iSW0Dc0yVnRpgAeD
6q0K1IQQZYIr+W+UtJX8u4I1eW0kthRY7dLXTjYSgcDKHZaoUkT9/qyAeTHsLv0c
xwIDAQABo1MwUTAdBgNVHQ4EFgQUOr0WUb3fJYxL62kdhryTUmXwHCMwHwYDVR0j
BBgwFoAUOr0WUb3fJYxL62kdhryTUmXwHCMwDwYDVR0TAQH/BAUwAwEB/zANBgkq
hkiG9w0BAQsFAAOCAgEAkJlH857I2PkUja57cWEvEh2gsNKi74oxz5RH7psPPUma
kY4SImuGkFTdCYFHxD5Qvjag4kpeT8XXq4jBBqHR41cA1cyvK0K4F4ln5bhqVCQk
hFI7UBnZjRRa6hl5367YR3I4A45E+TAIzBhBo5W7dBJ+hJNyrADB/nQ3J1skbZ5b
pdsMfAWZ44VoHJE4evg2V5BS374UDiqdyCR3suauxmhedipNXu6r9nO1Q9Wij1+h
7rawHLgKXBR9/mJ4UWLkBswb8kptpcrm2cpqWprGFdGAeNCspSXmotYRya5tNu7W
wm25NJyni1O86dvMxiWuRY+sap8nqe7Hz83goQ2Yd1YgT1G2UwQx2e64SGjt0AaV
/bt9pya+W0FHB++w4wJVZcJRZt4LynufjHkqNLiSbB8XM+hIr9M/LDjx8xWHjiKD
oSFNj1K6Fr9TcvObIn//LXM1P1aegKBsOylYFFqKh3RVtSjOZXhJQm98gdERT2CZ
sD1fY6KvsGGVEKk1eSZKeJJowO6k4cZH4wrlIK7W8dnCmlhPmvXEDX1KiV7dSeFC
7lynyjyZihukuMYBYxBhT7mDZLMiy1of319SPOlY0GlZdoXJ7lcvWdFgXLSi6MIk
Y+yhMG4nTRIGGEWQP5EONkIp30i488csL/ivK8OxULZyrn6ZNByY/EPEFllWfqI=
-----END CERTIFICATE-----

52
certs/ssl/backend-key.pem Normal file
View File

@ -0,0 +1,52 @@
-----BEGIN PRIVATE KEY-----
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
f+i8icq3eKXI5Sr+Go3P8JjawtkHfA==
-----END PRIVATE KEY-----

182
docker-compose-elk.yml Normal file
View File

@ -0,0 +1,182 @@
services:
setup:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: setup
user: "0"
volumes:
- certs:/usr/share/elasticsearch/config/certs
command: >
bash -c '
if [ x${ELASTIC_PASSWORD} == x ]; then
echo "Set the ELASTIC_PASSWORD environment variable in the .env file";
exit 1;
elif [ x${KIBANA_PASSWORD} == x ]; then
echo "Set the KIBANA_PASSWORD environment variable in the .env file";
exit 1;
fi;
if [ ! -f config/certs/ca.zip ]; then
echo "Creating CA";
bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip;
unzip config/certs/ca.zip -d config/certs;
fi;
if [ ! -f config/certs/certs.zip ]; then
echo "Creating certs";
echo -ne \
"instances:\n"\
" - name: es01\n"\
" dns:\n"\
" - es01\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
" - name: kibana\n"\
" dns:\n"\
" - kibana\n"\
" - localhost\n"\
" ip:\n"\
" - 127.0.0.1\n"\
> config/certs/instances.yml;
bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key;
unzip config/certs/certs.zip -d config/certs;
fi;
echo "Setting file permissions"
chown -R root:root config/certs;
find . -type d -exec chmod 750 \{\} \;;
find . -type f -exec chmod 640 \{\} \;;
echo "Waiting for Elasticsearch availability";
until curl -s --cacert config/certs/ca/ca.crt https://es01:9200 | grep -q "missing authentication credentials"; do sleep 30; done;
echo "Setting kibana_system password";
until curl -s -X POST --cacert config/certs/ca/ca.crt -u "elastic:${ELASTIC_PASSWORD}" -H "Content-Type: application/json" https://es01:9200/_security/user/kibana_system/_password -d "{\"password\":\"${KIBANA_PASSWORD}\"}" | grep -q "^{}"; do sleep 10; done;
echo "All done!";
'
healthcheck:
test: ["CMD-SHELL", "[ -f config/certs/es01/es01.crt ]"]
interval: 1s
timeout: 5s
retries: 120
networks:
- app-network
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
container_name: es01
depends_on:
setup:
condition: service_healthy
volumes:
- certs:/usr/share/elasticsearch/config/certs:ro
- pong_es_data_01:/usr/share/elasticsearch/data
labels:
co.elastic.logs/module: elasticsearch
ports:
- 9200:9200
environment:
- node.name=es01
- cluster.name=${CLUSTER_NAME}
- discovery.type=single-node
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- bootstrap.memory_lock=true
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=true
- xpack.security.http.ssl.key=certs/es01/es01.key
- xpack.security.http.ssl.certificate=certs/es01/es01.crt
- xpack.security.http.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.key=certs/es01/es01.key
- xpack.security.transport.ssl.certificate=certs/es01/es01.crt
- xpack.security.transport.ssl.certificate_authorities=certs/ca/ca.crt
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.license.self_generated.type=${LICENSE}
healthcheck:
test:
[
"CMD-SHELL",
"curl -s --cacert config/certs/ca/ca.crt https://localhost:9200 | grep -q 'missing authentication credentials'",
]
interval: 10s
timeout: 10s
retries: 120
networks:
- app-network
kibana:
image: docker.elastic.co/kibana/kibana:${STACK_VERSION}
container_name: kibana
labels:
co.elastic.logs/module: kibana
depends_on:
es01:
condition: service_healthy
volumes:
- certs:/usr/share/kibana/config/certs:ro
- pong_kibana:/usr/share/kibana/data
ports:
- 5601:5601
environment:
- SERVERNAME=kibana
- ELASTICSEARCH_HOSTS=https://es01:9200
- ELASTICSEARCH_USERNAME=${KIBANA_USERNAME}
- ELASTICSEARCH_PASSWORD=${KIBANA_PASSWORD}
- ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES=config/certs/ca/ca.crt
- XPACK_SECURITY_ENCRYPTIONKEY=${ENCRYPTION_KEY}
- XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY=${ENCRYPTION_KEY}
- XPACK_REPORTING_ENCRYPTIONKEY=${ENCRYPTION_KEY}
healthcheck:
test:
[
"CMD-SHELL",
"curl -s -I http://localhost:5601 | grep -q 'HTTP/1.1 302 Found'"
]
interval: 10s
timeout: 10s
retries: 120
networks:
- app-network
logstash01:
image: docker.elastic.co/logstash/logstash:${STACK_VERSION}
container_name: logstash01
labels:
co.elastic.logs/module: logstash
user: root
depends_on:
es01:
condition: service_healthy
kibana:
condition: service_healthy
volumes:
- certs:/usr/share/logstash/certs
- pong_logstash_data01:/usr/share/logstash/data
- ./config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
- pong_django_logs:/usr/share/logstash/logs
ports:
- "5044:5044/udp"
command: logstash -f /usr/share/logstash/pipeline/logstash.conf
environment:
- NODE_NAME="logstash"
- ELASTIC_HOSTS=https://es01:9200
- ELASTIC_USER=${ELASTIC_USERNAME}
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- xpack.monitoring.enabled=false
networks:
- app-network
volumes:
pong_django_logs:
pong_es_data_01:
driver: local
pong_kibana:
driver: local
pong_logstash_data01:
driver: local
certs:
driver: local
networks:
app-network:
name: app-network
external: true

View File

@ -1,5 +1,4 @@
services:
backend:
build:
context: .
@ -11,7 +10,7 @@ services:
venv/bin/python manage.py makemigrations --noinput &&
venv/bin/python manage.py migrate --noinput &&
venv/bin/python manage.py collectstatic --noinput &&
venv/bin/daphne -b 0.0.0.0 -p 8080 pong.asgi:application"
venv/bin/daphne -e ssl:8080:privateKey=./certs/ssl/backend-key.pem:certKey=./certs/ssl/backend-cert.pem pong.asgi:application"
volumes:
- pong:/transcendence/pong
- pong_django_logs:/transcendence/logs
@ -25,6 +24,10 @@ services:
DB_NAME: ${POSTGRES_DB}
DB_USER: ${POSTGRES_USER}
DB_PASSWORD: ${POSTGRES_PASSWORD}
SECURE_SSL_REDIRECT: True
SECURE_HSTS_SECONDS: 31536000
SECURE_HSTS_INCLUDE_SUBDOMAINS: True
SECURE_HSTS_PRELOAD: True
depends_on:
- db
healthcheck:
@ -53,9 +56,7 @@ services:
interval: 10s
timeout: 5s
retries: 5
volumes:
pong:
driver: local

View File

@ -1,5 +1,12 @@
MAIN_PROJECT_NAME=main_project
ELK_PROJECT_NAME=elk_project
COMPOSE_FILE=docker-compose.yml
COMPOSE=docker compose -f $(COMPOSE_FILE)
ELK_COMPOSE_FILE=docker-compose-elk.yml
COMPOSE=docker compose -f $(COMPOSE_FILE) -p $(MAIN_PROJECT_NAME)
ELK_COMPOSE=docker compose -f $(ELK_COMPOSE_FILE) -p $(ELK_PROJECT_NAME)
CONTAINER=$(c)
up:
@ -9,18 +16,23 @@ up:
build:
$(COMPOSE) build $(CONTAINER)
start:
$(COMPOSE) start $(CONTAINER)
stop:
$(COMPOSE) stop $(CONTAINER)
down:
$(COMPOSE) down $(CONTAINER)
destroy:
$(COMPOSE) down -v --rmi all
# Manage ELK stack
elk-up:
$(ELK_COMPOSE) up -d --remove-orphans || true
elk-down:
$(ELK_COMPOSE) down --remove-orphans
elk-destroy:
$(ELK_COMPOSE) down --remove-orphans -v --rmi all
kill-pid:
sudo lsof -i :5432 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true
sudo lsof -i :5601 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true
@ -28,17 +40,12 @@ kill-pid:
sudo lsof -i :8080 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true
sudo lsof -i :5044 | awk 'NR>1 {print $$2}' | xargs sudo kill -9 || true
logs:
$(COMPOSE) logs -f $(CONTAINER)
ps:
$(COMPOSE) ps
db-shell:
$(COMPOSE) exec db psql -U 42student players_db
re: destroy up
help:
@echo "Usage:"
@echo " make build [c=service] # Build images"

View File

@ -152,7 +152,5 @@ def update_tournament(name_tournoi, winner_name):
tournoi.save()
def getlen():
return Tournoi.objects.count()

View File

@ -136,6 +136,32 @@ CHANNEL_LAYERS = {
},
}
LOGGING = {
'version': 1, # Django requires this key
'disable_existing_loggers': False, # Keep Django's default loggers
'formatters': {
'simple': {
'format': '{levelname} {message}',
'style': '{', # Allows to use Python's new style string formatting
},
},
'handlers': {
'console': { # Log to the console
'level': 'DEBUG', # Minimum level of messages that should be handled
'class': 'logging.StreamHandler',
'formatter': 'simple', # Use the simple formatter defined above
},
},
'loggers': {
'django': { # The main logger for Django itself
'handlers': ['console'],
'level': 'DEBUG', # Minimum log level to be logged
'propagate': False, # Prevents log propagation to other loggers
},
},
}
"""
LOGGING = {
'version': 1, # The version of the logging configuration schema
'disable_existing_loggers': False, # Allows existing loggers to keep logging
@ -170,3 +196,4 @@ LOGGING = {
},
},
}
"""

View File

@ -103,11 +103,10 @@ document.addEventListener('DOMContentLoaded', () => {
console.log('Displaying matches:');
const matchListBody = document.querySelector('#match-list tbody');
matchListBody.innerHTML = '';
if (matches.length != 0) {
matches.forEach(match => {
const row = document.createElement('tr');
const row = document.createElement('tr');
row.innerHTML = `
<td>${match.id}</td>
<td>${match.player1__name}</td>
@ -137,11 +136,10 @@ document.addEventListener('DOMContentLoaded', () => {
console.log('Displaying players:');
const playersListBody = document.querySelector('#player-list tbody');
playersListBody.innerHTML = '';
if (players.length != 0) {
players.forEach(player => {
const row = document.createElement('tr');
const row = document.createElement('tr');
row.innerHTML = `
<td>${player.id}</td>
<td>${player.name}</td>
@ -169,9 +167,7 @@ document.addEventListener('DOMContentLoaded', () => {
if (tournois.length != 0) {
tournois.forEach(tournoi => {
console.log('Winner:', tournoi.winner); //debug !!!!!!!!!!!!!!!!!
console.log('Winner:', tournoi.winner__name); //debug !!!!!!!!!!!!!!!!!
const row = document.createElement('tr');
const row = document.createElement('tr');
row.innerHTML = `
<td>${tournoi.id}</td>
<td>${tournoi.name}</td>
@ -395,4 +391,4 @@ document.addEventListener('DOMContentLoaded', () => {
return color;
}
});
});

View File

@ -360,7 +360,7 @@ document.addEventListener('DOMContentLoaded', () => {
}
function startWebSocketConnection(token, players) {
socket = new WebSocket(`ws://${window.location.host}/ws/game/`);
socket = new WebSocket(`wss://${window.location.host}/ws/game/`);
socket.onopen = function (event) {
console.log('WebSocket connection established');