Compare commits

...

15 Commits

Author SHA1 Message Date
ae6d1b775f feat: add pauline ghost and wp 2026-02-18 11:06:14 +00:00
9990b7deab chore: remove jenkins, switch to gitea actions 2026-01-27 20:06:31 +00:00
ca9f7bd31c fix: change personal vaultwarden container name
All checks were successful
jenkins-ci Build successful
2026-01-27 13:41:06 +00:00
530f808907 fix: veloboomboom test change folder name
All checks were successful
jenkins-ci Build successful
2026-01-27 11:39:21 +00:00
7840de0a44 fix: wait gitea to be online before post request
All checks were successful
jenkins-ci Build successful
2026-01-26 12:43:46 +00:00
488cd8eef4 feat: adapt caddyfile to new static sites 2026-01-26 12:39:11 +00:00
ecb0094904 feat: more secure refresh script
All checks were successful
jenkins-ci Build successful
2026-01-26 12:38:38 +00:00
3d56a9014c fix: improve nextcloud security
All checks were successful
jenkins-ci Build successful
2026-01-23 16:05:45 +00:00
2e0b492a31 feat:add public csv support
All checks were successful
jenkins-ci Build successful
2026-01-23 14:52:24 +00:00
7aea3ba11e feat(caddyfile): add spationautes and veloboomboom support
All checks were successful
jenkins-ci Build successful
2026-01-23 14:31:59 +00:00
11ee033ed7 fix(caddyfile): fix uptime kuma support for new dual installation
All checks were successful
jenkins-ci Build successful
2026-01-23 13:55:53 +00:00
977b9d5195 chore(docker): switch to caddy-alpine version
All checks were successful
jenkins-ci Build successful
2026-01-23 11:30:47 +00:00
1b338c9c82 fix(jenkinsfile): add rootless docker socket
Some checks failed
jenkins-ci Build failed
2026-01-23 11:30:29 +00:00
7eed352192 feat(caddyfile): add nextcloud and onlyoffice support
Some checks failed
jenkins-ci Build failed
2026-01-23 11:01:15 +00:00
6c5d460385 feat(caddyfile): add vaultwarden and syncthing support
Some checks failed
jenkins-ci Build failed
2026-01-23 08:43:33 +00:00
5 changed files with 349 additions and 39 deletions

348
Caddyfile
View File

@@ -9,33 +9,6 @@
} }
} }
jenkins.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
}
# Large files
request_body {
max_size 512MB
}
# Compression
encode zstd gzip
# Log
log {
output file /data/jenkins_access.log
}
# Redirect
reverse_proxy jenkins:8080 {
flush_interval -1
}
}
portfolio.lucasroyer.fr { portfolio.lucasroyer.fr {
# Server cache # Server cache
cache { cache {
@@ -119,11 +92,34 @@ kuma.lucasroyer.fr {
# Log # Log
log { log {
output file /data/kuma_access.log output file /data/uptime-kuma-lucas_access.log
} }
# Redirect # Redirect
reverse_proxy uptime-kuma:3001 { reverse_proxy uptime-kuma-lucas:3001 {
}
}
uptime-cyrus.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-XSS-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
}
# Compression
encode zstd gzip
# Log
log {
output file /data/uptime-kuma-cyrus_access.log
}
# Redirect
reverse_proxy uptime-kuma-cyrus:3001 {
} }
} }
@@ -184,3 +180,297 @@ ntfy.lucasroyer.fr {
flush_interval -1 flush_interval -1
} }
} }
syncthing.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
}
# Compression
encode zstd gzip
# Log
log {
output file /data/syncthing_access.log
}
# Redirect
reverse_proxy syncthing:8384 {
header_up Host {host}
header_up X-Real-IP {remote_host}
}
}
vaultwarden.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Permissions-Policy "geolocation=(), microphone=(), camera=()"
}
# Compression
encode zstd gzip
# Log
log {
output file /data/vaultwarden_access.log
}
# Redirect
reverse_proxy vaultwarden-lucas:80 {
header_up Host {host}
header_up X-Real-IP {remote_host}
}
}
motsdepasse.interstices.pro {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Permissions-Policy "geolocation=(), microphone=(), camera=()"
}
# Compression
encode zstd gzip
# Log
log {
output file /data/vaultwarden_access.log
}
# Redirect
reverse_proxy vaultwarden-interstices:80 {
header_up Host {host}
header_up X-Real-IP {remote_host}
}
}
nextcloud.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
X-XSS-Protection "1; mode=block"
Referrer-Policy "no-referrer"
Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
-Server
}
# Large files
request_body {
max_size 10GB
}
# Compression
encode zstd gzip
# Log
log {
output file /data/nextcloud_access.log
}
# Redirect
reverse_proxy nextcloud-web:80 {
header_up Host {host}
header_up X-Real-IP {remote_host}
header_down X-Frame-Options "SAMEORIGIN"
header_down X-Content-Type-Options "nosniff"
}
}
onlyoffice.lucasroyer.fr {
# Security
header {
Content-Security-Policy "frame-ancestors 'self' nextcloud.lucasroyer.fr"
X-Frame-Options "ALLOW-FROM https://nextcloud.lucasroyer.fr"
X-Content-Type-Options nosniff
}
# Compression
encode zstd gzip
# Redirect
reverse_proxy onlyoffice:80 {
header_up Host {host}
header_up X-Real-IP {remote_host}
}
}
spationautes.fr {
root * /srv/site-spationautes/html
# Server cache
cache {
ttl 24h
stale 12h
}
# Security
header {
X-Frame-Options "DENY"
X-XSS-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
}
# Errors
handle_errors {
@service_out expression {err.status_code} >= 502 && {err.status_code} <= 504
handle @service_out {
root * /srv
rewrite * /error.html
file_server
}
}
# Compression
encode zstd gzip
# Log
log {
output file /data/site-spationautes_access.log
}
# Redirect
file_server
}
veloboomboom.internantes.ovh, veloboomboom.lucasroyer.fr {
# Server cache
cache {
ttl 24h
stale 12h
}
# Security
header {
X-Frame-Options "DENY"
X-XSS-Protection "1; mode=block"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
}
# Errors
handle_errors {
# If error is 502, 503 or 504, show error.html without changing client URL
@service_out expression {err.status_code} >= 502 && {err.status_code} <= 504
handle @service_out {
root * /srv
rewrite * /error.html
file_server
}
}
# Compression
encode zstd gzip
# Log
log {
output file /data/site-veloboomboom_access.log
}
# Prod redirect
@prod host veloboomboom.internantes.ovh
handle @prod {
root * /srv/site-veloboomboom/html-prod
file_server
}
# Test redirect
@test host veloboomboom.lucasroyer.fr
handle @test {
basic_auth {
testuser $2a$14$hNv5hbag695p/jcyB.7qeOoCvqxQ0L6zyBptfHU15qnTtmivfXAea
}
root * /srv/site-veloboomboom/html
file_server
}
# Fallback
handle {
respond "Not Found" 404
}
}
csv.lucasroyer.fr {
root * /srv/csv
file_server browse
header Content-Type "text/csv; charset=utf-8"
header Access-Control-Allow-Origin "*"
}
ghost.pauline.lucasroyer.fr {
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Referrer-Policy "strict-origin-when-cross-origin"
X-XSS-Protection "1; mode=block"
Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; img-src 'self' data: https:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com;"
}
# Compression
encode zstd gzip
# Log
log {
output file /data/pauline_ghost_access.log
}
# Redirect
reverse_proxy ghost:2368
}
paulinebouillaud.fr {
root * /var/www/html
# Security
header {
X-Frame-Options "SAMEORIGIN"
X-Content-Type-Options "nosniff"
Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
Referrer-Policy "strict-origin-when-cross-origin"
X-XSS-Protection "1; mode=block"
Content-Security-Policy "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval'; frame-src 'self' https://*.youtube-nocookie.com https://*.youtube.com https://*.vimeo.com https://*.doubleclick.net; img-src 'self' data: https:; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com; frame-ancestors 'self';"
}
# Compression
encode zstd gzip
# Logs
log {
output file /data/pauline_wordpress_access.log
}
# --- Wordpress FPM ---
file_server
php_fastcgi wordpress-app:9000 {
resolve_root_symlink
}
# Security
@forbidden {
path /xmlrpc.php
path /.htaccess
path /wp-config.php
path /readme.html
}
respond @forbidden 403
}

View File

@@ -1,4 +1,4 @@
ARG CADDY_VERSION=2.10.2 ARG CADDY_VERSION=2.10.2-alpine
# --- BUILD --- # --- BUILD ---
# Add cache plugin # Add cache plugin

14
Jenkinsfile vendored
View File

@@ -4,6 +4,7 @@ pipeline {
environment { environment {
GITEA_REPO_PATH = "lucas/reverse-proxy" GITEA_REPO_PATH = "lucas/reverse-proxy"
GITEA_API_URL = "https://gitea.lucasroyer.fr/api/v1" GITEA_API_URL = "https://gitea.lucasroyer.fr/api/v1"
DOCKER_HOST = "unix:///run/user/1001/docker.sock"
} }
stages { stages {
@@ -42,6 +43,19 @@ pipeline {
post { post {
always { always {
script { script {
echo "Waiting for Gitea to be online..."
// Try to reac gitea API for 12 tries of 10s (2 minutes)
timeout(time: 2, unit: 'MINUTES') {
waitUntil {
def status = sh(
script: "curl -s -o /dev/null -w '%{http_code}' ${GITEA_API_URL}/version || true",
returnStdout: true
).trim()
return (status == '200')
}
}
echo "Send Gitea check..." echo "Send Gitea check..."
// Get and store SHA // Get and store SHA
def commitSha = sh(script: 'git rev-parse HEAD', returnStdout: true).trim() def commitSha = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()

View File

@@ -12,24 +12,25 @@ services:
- caddy_config:/config - caddy_config:/config
- /home/lucas/services/reverse-proxy/Caddyfile:/etc/caddy/Caddyfile - /home/lucas/services/reverse-proxy/Caddyfile:/etc/caddy/Caddyfile
- /home/lucas/services/reverse-proxy/error.html:/srv/error.html:ro - /home/lucas/services/reverse-proxy/error.html:/srv/error.html:ro
- /home/lucas/services/exposed_files/n8n/csv:/srv/csv:ro - /home/lucas/services/n8n/local-files/csv:/srv/csv:ro
- /home/lucas/services/static-sites/site-spationautes:/srv/site-spationautes:ro
- /home/lucas/services/static-sites/site-veloboomboom:/srv/site-veloboomboom:ro
- wp_data:/var/www/html:ro
networks: networks:
- reverse-proxy - reverse-proxy
ports: ports:
- "80:80" - "80:80"
- "443:443" - "443:443"
- "443:443/udp" - "443:443/udp"
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
volumes: volumes:
caddy_data: caddy_data:
name: caddy_data name: caddy_data
caddy_config: caddy_config:
name: caddy_config name: caddy_config
wp_data:
external: true
name : wordpress_wp_data
networks: networks:
reverse-proxy: reverse-proxy:

View File

@@ -1,6 +1,11 @@
#!/bin/bash #!/bin/bash
docker exec caddy-reverse-proxy caddy fmt --overwrite /etc/caddy/Caddyfile docker exec caddy-reverse-proxy caddy fmt --overwrite /etc/caddy/Caddyfile
if docker exec caddy-reverse-proxy caddy validate --config /etc/caddy/Caddyfile; then
echo "File checked, reloading..."
docker exec caddy-reverse-proxy caddy reload --config /etc/caddy/Caddyfile docker exec caddy-reverse-proxy caddy reload --config /etc/caddy/Caddyfile
echo "Caddyfile reloaded."
echo 'Caddyfile reloaded' else
echo "ERREUR : invalid config."
docker exec caddy-reverse-proxy caddy validate --config /etc/caddy/Caddyfile
fi