@@ -96,25 +96,95 @@ export class ProxyMiddleware {
96
96
private handleProxyError ( err : Error , req : Request , res : Response ) : void {
97
97
console . error ( '❌ Error during proxy operation:' , err ) ;
98
98
99
- // Send a nicer error page
100
- const errorHtml = `
101
- <!DOCTYPE html>
102
- <html>
103
- <head>
104
- <title>Service Temporarily Unavailable</title>
105
- <style>
106
- body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
107
- text-align: center; padding-top: 50px; }
108
- h1 { color: #333; }
109
- p { color: #666; }
110
- </style>
111
- </head>
112
- <body>
113
- <h1>Service Temporarily Unavailable</h1>
114
- <p>The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later.</p>
115
- </body>
116
- </html>
117
- ` ;
99
+ // The error page resembles the Ghost error page
100
+ // @see : https://github.com/TryGhost/Ghost/blob/ec62120b94ccce06b56ae1ca6944ab87644437bd/ghost/core/core/server/views/maintenance.html#L84
101
+ const errorHtml = `<!DOCTYPE html>
102
+ <html>
103
+ <head>
104
+ <meta charset="utf-8">
105
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
106
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
107
+ <title>We'll be right back</title>
108
+ <style type="text/css">
109
+ * {
110
+ box-sizing: border-box;
111
+ }
112
+ html {
113
+ font-size: 62.5%;
114
+ background: #f1f2f3;
115
+ -ms-text-size-adjust: 100%;
116
+ -webkit-text-size-adjust: 100%;
117
+ -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
118
+ }
119
+ body {
120
+ display: flex;
121
+ flex-direction: column;
122
+ justify-content: center;
123
+ align-items: center;
124
+ height: 100vh;
125
+ width: 100vw;
126
+ margin: 0;
127
+ padding: 4vmin;
128
+ color: #15171A;
129
+ font-size: 2rem;
130
+ line-height: 1.4em;
131
+ font-family: sans-serif;
132
+ background: #f1f2f3;
133
+ scroll-behavior: smooth;
134
+ -webkit-font-smoothing: antialiased;
135
+ -moz-osx-font-smoothing: grayscale;
136
+ }
137
+
138
+ ::selection {
139
+ text-shadow: none;
140
+ background: #cbeafb;
141
+ }
142
+
143
+ .content {
144
+ display: flex;
145
+ flex-direction: column;
146
+ justify-content: center;
147
+ max-width: 500px;
148
+ min-height: 360px;
149
+ margin: 0 0 4vmin;
150
+ padding: 40px;
151
+ text-align: center;
152
+ background: #fff;
153
+ border-radius: 20px;
154
+ box-shadow:
155
+ 0 50px 100px -20px rgb(50 50 93 / 8%),
156
+ 0 30px 60px -30px rgb(0 0 0 / 13%),
157
+ 0 10px 20px -10px rgb(0 0 0 / 8%);
158
+ }
159
+ h1 {
160
+ margin: 0 0 0.3em;
161
+ font-size: 4rem;
162
+ line-height: 1em;
163
+ font-weight: 700;
164
+ letter-spacing: -0.02em;
165
+ }
166
+ p {
167
+ margin: 0;
168
+ opacity: 0.7;
169
+ font-weight: 400;
170
+ }
171
+ img {
172
+ display: block;
173
+ margin: 0 auto 40px;
174
+ }
175
+ @media (max-width: 500px) {
176
+ body { font-size: 1.8rem; }
177
+ h1 { font-size: 3.4rem; }
178
+ }
179
+ </style>
180
+ </head>
181
+ <body>
182
+ <div class="content">
183
+ <h1>We'll be right back.</h1>
184
+ <p>We're busy updating our site to give you the best experience, and will be back soon.</p>
185
+ </div>
186
+ </body>
187
+ </html>` ;
118
188
119
189
res . status ( 503 ) . send ( errorHtml ) ;
120
190
}
0 commit comments