Skip to content

Commit fe97291

Browse files
committed
Implement new deployment scripts for improved build and route validation; add 404 status handling and generate valid routes for Nginx configuration. Update frontend build process to include unique build ID generation and enhance error handling in analytics and contact services. Refactor localization files for consistency across multiple languages.
1 parent c1ff8bf commit fe97291

80 files changed

Lines changed: 5122 additions & 1371 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/.scripts/deploy.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,11 @@ set -e
44
echo "Le script commence"
55
cd ~/prod/Lelanation/ &&
66

7-
# Pull la dernière version de l'application.
87
echo "pull origin main"
98
git pull
109

1110
echo "Le déploiement commence ..."
1211

13-
# Vider le cache Redis avant le déploiement
1412
echo "Nettoyage du cache Redis..."
1513
redis-cli FLUSHALL
1614

@@ -20,9 +18,8 @@ cd backend/ && npm install
2018
echo "install frontend"
2119
cd ../frontend/ && npm install
2220

23-
# Générer un hash de build unique pour éviter les problèmes de cache navigateur
2421
BUILD_ID=$(date +"%Y%m%d%H%M%S")
25-
echo "VITE_BUILD_ID=$BUILD_ID" > .env.local
22+
echo "VITE_BUILD_ID=$BUILD_ID" > .env.production
2623
echo "Génération d'un identifiant de build unique: $BUILD_ID"
2724

2825
echo "Construction du frontend avec nouvel ID de build..."
Lines changed: 276 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,276 @@
1+
#!/bin/bash
2+
set -e
3+
4+
echo "🔧 Fixing 404 status codes with backend validation..."
5+
6+
# Backup current configuration
7+
if [ -f /etc/nginx/sites-available/lelanation-new ]; then
8+
sudo cp /etc/nginx/sites-available/lelanation-new /etc/nginx/sites-available/lelanation-new.backup.$(date +"%Y%m%d_%H%M%S")
9+
echo "✅ Configuration backed up"
10+
fi
11+
12+
# Create nginx configuration that uses backend route validation
13+
cat > /tmp/nginx_backend_404.conf << 'EOF'
14+
# Static files first - highest priority
15+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf|webp)$ {
16+
root /home/ubuntu/prod/Lelanation/frontend/dist;
17+
expires max;
18+
add_header Cache-Control "public, max-age=31536000, immutable";
19+
try_files $uri =404;
20+
}
21+
22+
# Service Worker
23+
location = /service-worker.js {
24+
root /home/ubuntu/prod/Lelanation/frontend/dist;
25+
add_header Cache-Control "public, max-age=0, must-revalidate";
26+
default_type application/javascript;
27+
try_files $uri =404;
28+
}
29+
30+
# Backend API routes
31+
location /api/ {
32+
proxy_pass http://localhost:3000;
33+
proxy_http_version 1.1;
34+
proxy_set_header Upgrade $http_upgrade;
35+
proxy_set_header Connection 'upgrade';
36+
proxy_set_header Host $host;
37+
proxy_set_header X-Real-IP $remote_addr;
38+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
39+
proxy_set_header X-Forwarded-Proto $scheme;
40+
proxy_cache_bypass $http_upgrade;
41+
proxy_read_timeout 90s;
42+
}
43+
44+
# SPA routes with backend validation
45+
location / {
46+
root /home/ubuntu/prod/Lelanation/frontend/dist;
47+
48+
# Try to serve static files first
49+
try_files $uri $uri/ @spa_validation;
50+
}
51+
52+
# Backend validation for SPA routes
53+
location @spa_validation {
54+
# Call backend to validate route
55+
access_by_lua_block {
56+
local http = require "resty.http"
57+
local httpc = http.new()
58+
59+
local res, err = httpc:request_uri("http://localhost:3000/api/validate-route", {
60+
method = "GET",
61+
query = "path=" .. ngx.var.uri,
62+
headers = {
63+
["User-Agent"] = "nginx-route-validator"
64+
}
65+
})
66+
67+
if not res then
68+
ngx.log(ngx.ERR, "Failed to validate route: ", err)
69+
ngx.status = 404
70+
ngx.exit(404)
71+
end
72+
73+
local cjson = require "cjson"
74+
local validation = cjson.decode(res.body)
75+
76+
if validation.status == 404 then
77+
ngx.status = 404
78+
ngx.header["X-Route-Status"] = "invalid"
79+
else
80+
ngx.header["X-Route-Status"] = "valid"
81+
end
82+
}
83+
84+
root /home/ubuntu/prod/Lelanation/frontend/dist;
85+
try_files /index.html =404;
86+
}
87+
EOF
88+
89+
echo "⚠️ This approach requires nginx with lua module, which may not be available."
90+
echo "🔧 Let's use a simpler approach with auth_request instead..."
91+
92+
# Create a simpler approach using auth_request
93+
cat > /tmp/nginx_auth_404.conf << 'EOF'
94+
# Static files first
95+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf|webp)$ {
96+
root /home/ubuntu/prod/Lelanation/frontend/dist;
97+
expires max;
98+
add_header Cache-Control "public, max-age=31536000, immutable";
99+
try_files $uri =404;
100+
}
101+
102+
# Service Worker
103+
location = /service-worker.js {
104+
root /home/ubuntu/prod/Lelanation/frontend/dist;
105+
add_header Cache-Control "public, max-age=0, must-revalidate";
106+
default_type application/javascript;
107+
try_files $uri =404;
108+
}
109+
110+
# Backend API routes
111+
location /api/ {
112+
proxy_pass http://localhost:3000;
113+
proxy_http_version 1.1;
114+
proxy_set_header Upgrade $http_upgrade;
115+
proxy_set_header Connection 'upgrade';
116+
proxy_Set_header Host $host;
117+
proxy_set_header X-Real-IP $remote_addr;
118+
proxy_Set_header X-Forwarded-For $proxy_add_x_forwarded_for;
119+
proxy_Set_header X-Forwarded-Proto $scheme;
120+
proxy_cache_bypass $http_upgrade;
121+
proxy_read_timeout 90s;
122+
}
123+
124+
# Internal auth endpoint for route validation
125+
location = /auth-route {
126+
internal;
127+
proxy_pass http://localhost:3000/api/validate-route?path=$request_uri;
128+
proxy_pass_request_body off;
129+
proxy_set_header Content-Length "";
130+
proxy_set_header X-Original-URI $request_uri;
131+
proxy_set_header X-Original-Method $request_method;
132+
}
133+
134+
# SPA routes with validation
135+
location / {
136+
root /home/ubuntu/prod/Lelanation/frontend/dist;
137+
138+
# First try static files
139+
try_files $uri $uri/ @spa_fallback;
140+
}
141+
142+
# SPA fallback with route validation
143+
location @spa_fallback {
144+
auth_request /auth-route;
145+
146+
# If auth_request returns 404, nginx will serve 404
147+
# If auth_request returns 200, serve index.html
148+
149+
root /home/ubuntu/prod/Lelanation/frontend/dist;
150+
try_files /index.html =404;
151+
152+
# Set error page for 404s
153+
error_page 404 = @handle_404;
154+
}
155+
156+
# Handle 404 errors properly
157+
location @handle_404 {
158+
root /home/ubuntu/prod/Lelanation/frontend/dist;
159+
add_header X-Route-Status "invalid" always;
160+
try_files /index.html =404;
161+
return 404;
162+
}
163+
EOF
164+
165+
echo "⚠️ auth_request approach also complex. Using simplest solution..."
166+
167+
# Final approach: simple map-based validation
168+
cat > /tmp/nginx_map_404.conf << 'EOF'
169+
# Static files first
170+
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|otf|webp)$ {
171+
root /home/ubuntu/prod/Lelanation/frontend/dist;
172+
expires max;
173+
add_header Cache-Control "public, max-age=31536000, immutable";
174+
try_files $uri =404;
175+
}
176+
177+
# Service Worker
178+
location = /service-worker.js {
179+
root /home/ubuntu/prod/Lelanation/frontend/dist;
180+
add_header Cache-Control "public, max-age=0, must-revalidate";
181+
default_type application/javascript;
182+
try_files $uri =404;
183+
}
184+
185+
# Backend API routes
186+
location /api/ {
187+
proxy_pass http://localhost:3000;
188+
proxy_http_version 1.1;
189+
proxy_set_header Upgrade $http_upgrade;
190+
proxy_set_header Connection 'upgrade';
191+
proxy_set_header Host $host;
192+
proxy_set_header X-Real-IP $remote_addr;
193+
proxy_Set_header X-Forwarded-For $proxy_add_x_forwarded_for;
194+
proxy_Set_header X-Forwarded-Proto $scheme;
195+
proxy_cache_bypass $http_upgrade;
196+
proxy_read_timeout 90s;
197+
}
198+
199+
# SPA routes - for now serve all as 200, let Vue.js handle 404
200+
# We'll implement proper 404 at the application level
201+
location / {
202+
root /home/ubuntu/prod/Lelanation/frontend/dist;
203+
try_files $uri $uri/ /index.html;
204+
205+
# Add header to identify this is serving index.html
206+
add_header X-Served-By "spa-fallback" always;
207+
}
208+
EOF
209+
210+
echo "🔧 Applying simple configuration and relying on Vue.js 404 handling..."
211+
212+
# Replace the configuration
213+
sudo cp /etc/nginx/sites-available/lelanation-new /tmp/lelanation-new-final
214+
215+
# Remove existing location blocks
216+
sudo sed -i '/# Static files first/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
217+
sudo sed -i '/# Service Worker/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
218+
sudo sed -i '/# Images WebP/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
219+
sudo sed -i '/# Fonts/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
220+
sudo sed -i '/# Static assets/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
221+
sudo sed -i '/# Backend API/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
222+
sudo sed -i '/# Valid SPA routes/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
223+
sudo sed -i '/# SPA routes/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
224+
sudo sed -i '/# Catch-all/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
225+
sudo sed -i '/# Smart SPA/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
226+
sudo sed -i '/location .*@/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
227+
sudo sed -i '/location.*\/.*{/,/^[[:space:]]*}[[:space:]]*$/d' /tmp/lelanation-new-final
228+
229+
# Add new configuration before SSL certificates
230+
sudo sed -i '/ssl_certificate \/etc\/letsencrypt/i\' /tmp/lelanation-new-final
231+
sudo sed -i '/ssl_certificate \/etc\/letsencrypt/r /tmp/nginx_map_404.conf' /tmp/lelanation-new-final
232+
sudo sed -i '/ssl_certificate \/etc\/letsencrypt/i\' /tmp/lelanation-new-final
233+
234+
# Install the new configuration
235+
sudo cp /tmp/lelanation-new-final /etc/nginx/sites-available/lelanation-new
236+
237+
echo "🔍 Testing nginx configuration..."
238+
if sudo nginx -t; then
239+
echo "✅ Nginx configuration is valid"
240+
echo "🔄 Reloading nginx..."
241+
sudo systemctl reload nginx
242+
243+
echo "✅ Configuration applied successfully!"
244+
echo ""
245+
echo "📋 Solution implemented:"
246+
echo " • nginx serves static files normally"
247+
echo " • nginx serves index.html for all SPA routes"
248+
echo " • Vue.js app handles 404 detection and proper status"
249+
echo " • NotFoundView component sets proper meta tags"
250+
echo " • Backend route validation available at /api/validate-route"
251+
echo ""
252+
echo "🧪 The issue is that nginx cannot directly set 404 for SPA routes"
253+
echo " because it must serve index.html for the app to work."
254+
echo " This is a common limitation of SPAs served via nginx."
255+
echo ""
256+
echo "💡 The proper solution requires either:"
257+
echo " 1. Server-side rendering (SSR)"
258+
echo " 2. Pre-rendering static pages"
259+
echo " 3. Custom nginx module with Lua scripting"
260+
echo " 4. Moving SPA serving to the Express backend"
261+
echo ""
262+
echo "🔧 For now, search engines will see 200 status but"
263+
echo " the Vue.js app properly shows 404 content with"
264+
echo " noindex meta tags for invalid routes."
265+
266+
else
267+
echo "❌ Nginx configuration test failed"
268+
echo "🔄 Restoring backup..."
269+
LATEST_BACKUP=$(ls -1t /etc/nginx/sites-available/lelanation-new.backup.* | head -1)
270+
sudo cp "$LATEST_BACKUP" /etc/nginx/sites-available/lelanation-new
271+
exit 1
272+
fi
273+
274+
echo ""
275+
echo "📈 Recommendation: Consider implementing SSR or move to"
276+
echo " Express-served frontend for proper HTTP status codes."

0 commit comments

Comments
 (0)