Add deployment pipeline, maintenance page and project config

- Makefile: install_dev, install_prod, migration/migrate commands
- docker-compose-dev: add Caddy and Bun services
- docker-compose-prod: remove exposed pgbouncer port
- Ansible: Caddy template with maintenance mode (503), vault, deploy playbook
- Gitea workflow: manual deploy to production
- Maintenance page (Neubrutalism style)
- LICENSE: proprietary license

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-03-18 20:40:40 +01:00
parent 8c33641dca
commit f822a9a069
9 changed files with 239 additions and 2 deletions

View File

@@ -0,0 +1,17 @@
name: Deploy to production
on:
workflow_dispatch:
jobs:
deploy:
runs_on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Ansible
run: apt-get update && apt-get install -y ansible
- name: Deploy Caddy config
run: ansible-playbook -i ansible/hosts.ini ansible/deploy-caddy.yml --vault-password-file <(echo "${{ secrets.ANSIBLE_VAULT_PASSWORD }}")

27
LICENSE.md Normal file
View File

@@ -0,0 +1,27 @@
# Licence Propriétaire
Copyright (c) 2026 E-Cosplay. Tous droits réservés.
## Conditions
Ce logiciel et son code source sont la propriété exclusive de E-Cosplay.
**Il est strictement interdit de :**
- Copier, reproduire ou dupliquer tout ou partie du code source
- Modifier, adapter ou créer des œuvres dérivées
- Distribuer, publier ou partager le code source sous quelque forme que ce soit
- Utiliser le code source à des fins commerciales ou non commerciales sans autorisation écrite
- Sous-licencier, vendre ou transférer le code source à des tiers
## Accès au code
L'accès au code source est strictement réservé aux membres autorisés de l'organisation E-Cosplay dans le cadre de leurs fonctions.
## Responsabilité
CE LOGICIEL EST FOURNI "EN L'ÉTAT", SANS GARANTIE D'AUCUNE SORTE, EXPRESSE OU IMPLICITE.
## Contact
Pour toute demande d'autorisation : contact@e-cosplay.fr

View File

@@ -25,3 +25,23 @@ purge_dev: ## Arrete et purge les containers dev (volumes inclus)
stop_prod: ## Arrete les containers prod
docker compose -f docker-compose-prod.yml down
## —— Install ——————————————————————————————————————
install_dev: ## Install les dependances dev via Docker
docker compose -f docker-compose-dev.yml exec php composer install
docker compose -f docker-compose-dev.yml exec bun bun install
install_prod: ## Install les dependances et build les assets pour la prod
composer install --no-dev --optimize-autoloader
bun install
bun run build
## —— Database ——————————————————————————————————————
migration_dev: ## Genere une migration via Docker dev
docker compose -f docker-compose-dev.yml exec php php bin/console make:migration
migrate_dev: ## Execute les migrations via Docker dev
docker compose -f docker-compose-dev.yml exec php php bin/console doctrine:migrations:migrate --no-interaction
migrate_prod: ## Execute les migrations en prod via Docker
docker compose -f docker-compose-prod.yml exec php php bin/console doctrine:migrations:migrate --no-interaction --env=prod

32
ansible/caddy.j2 Normal file
View File

@@ -0,0 +1,32 @@
ticket.e-cosplay.fr {
tls {
dns cloudflare {{ cloudflare_api_token }}
}
@maintenance file /var/www/e-ticket/public/.update
handle @maintenance {
root * /var/www/e-ticket/public
rewrite * /maintenance.html
file_server {
status 503
}
}
handle {
reverse_proxy localhost:9000 localhost:9001 {
lb_policy round_robin
health_uri /
health_interval 10s
}
}
encode gzip
header {
-Server
}
log {
output file /var/log/caddy/ticket.e-cosplay.fr.log
}
}

30
ansible/deploy-caddy.yml Normal file
View File

@@ -0,0 +1,30 @@
---
- name: Deploy Caddy config for e-ticket
hosts: production
become: true
vars_files:
- vault.yml
tasks:
- name: Ensure Caddy sites directory exists
file:
path: /etc/caddy/sites
state: directory
owner: root
group: root
mode: "0755"
- name: Deploy Caddy config
template:
src: caddy.j2
dest: /etc/caddy/sites/e-ticket.conf
owner: root
group: root
mode: "0644"
notify: Reload Caddy
handlers:
- name: Reload Caddy
systemd:
name: caddy
state: reloaded

8
ansible/vault.yml Normal file
View File

@@ -0,0 +1,8 @@
$ANSIBLE_VAULT;1.1;AES256
34376230633964343735383363613430386439326535303762646264333330383166636539643439
3663303564386133313965343530383761353837626632390a323831366566356234626166646234
64316232613836376264363237346433393931623863653562656164346534663666373364626130
3833346535373064660a336234373730383438373233623231363335323162326666346136326162
65303265386365656164323838666239303639333534626264333962386631323531656262633363
64333734326466356236633061663933663962646165313935633361356339326366613731613765
383336626531663034666532636363306130

View File

@@ -72,6 +72,17 @@ services:
redis:
condition: service_healthy
bun:
image: oven/bun:alpine
container_name: e-ticket_bun
working_dir: /app
volumes:
- .:/app
- bun-modules:/app/node_modules
command: sh -c "bun install && bun run dev"
ports:
- "5173:5173"
mailpit:
image: axllent/mailpit
container_name: e-ticket_mailpit
@@ -91,3 +102,4 @@ services:
volumes:
db-data:
redis-data:
bun-modules:

View File

@@ -72,8 +72,6 @@ services:
volumes:
- ./docker/pgsql/pgbouncer.ini:/etc/pgbouncer/pgbouncer.ini
- ./docker/pgsql/userlist.txt:/etc/pgbouncer/userlist.txt
ports:
- "6432:6432"
depends_on:
db-master:
condition: service_healthy

93
public/maintenance.html Normal file
View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Maintenance - E-Ticket</title>
<script src="https://cdn.tailwindcss.com"></script>
<style>
:root {
--fond: #fbfbfb;
--indigo: #4f46e5;
--jaune: #fabf04;
--rose: #ec4899;
--noir: #111827;
}
body {
background-color: var(--fond);
font-family: 'Inter', system-ui, sans-serif;
}
.shadow-brutal {
box-shadow: 8px 8px 0px rgba(0,0,0,1);
}
.shadow-brutal-sm {
box-shadow: 4px 4px 0px rgba(0,0,0,1);
}
@keyframes bounce-slow {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-10px); }
}
.animate-bounce-slow {
animation: bounce-slow 3s ease-in-out infinite;
}
@keyframes spin-slow {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.animate-spin-slow {
animation: spin-slow 4s linear infinite;
}
</style>
</head>
<body class="min-h-screen flex items-center justify-center p-4">
<div class="max-w-xl w-full">
<!-- Logo -->
<div class="flex justify-center mb-8">
<div class="bg-white border-4 border-gray-900 rounded-2xl p-6 shadow-brutal">
<img src="/logo.png" alt="E-Cosplay" class="h-16">
</div>
</div>
<!-- Card principale -->
<div class="bg-white border-4 border-gray-900 rounded-2xl shadow-brutal overflow-hidden">
<!-- Header jaune -->
<div class="p-6 border-b-4 border-gray-900" style="background-color: var(--jaune);">
<div class="flex items-center justify-center gap-3">
<span class="text-4xl animate-bounce-slow">&#9888;</span>
<h1 class="text-2xl md:text-3xl font-black uppercase tracking-tight" style="color: var(--noir);">
Maintenance en cours
</h1>
</div>
</div>
<!-- Contenu -->
<div class="p-8 text-center">
<p class="text-lg font-bold uppercase mb-6" style="color: var(--noir);">
Notre site est en cours de mise a jour.
</p>
<div class="inline-flex items-center gap-3 border-4 border-gray-900 rounded-xl px-6 py-3 shadow-brutal-sm mb-6" style="background-color: var(--indigo);">
<svg class="w-5 h-5 text-white animate-spin-slow" fill="none" viewBox="0 0 24 24">
<circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle>
<path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path>
</svg>
<span class="text-white font-black uppercase text-sm tracking-widest">
Nous revenons tres vite
</span>
</div>
<p class="text-sm font-semibold" style="color: var(--noir);">
Merci de votre patience !
</p>
</div>
<!-- Footer rose -->
<div class="p-4 border-t-4 border-gray-900 text-center" style="background-color: var(--rose);">
<p class="text-sm font-bold uppercase text-white tracking-wide">
contact@e-cosplay.fr
</p>
</div>
</div>
</div>
</body>
</html>