مشاركة: طريقة بسيطة لإعداد صفحة انتظار أثناء التحديث

ملاحظة: لست متأكدًا من مكان وضع هذا، لا تتردد في نقله إلى مكان أكثر ملاءمة إذا فاتني شيء ما.

أردت فقط مشاركة طريقة سريعة وغير تقليدية ابتكرتها في الأسبوع الماضي لوضع صفحة سريعة عند إجراء ترقية لـ Discourse. لقد قرأت جميع الأدلة الموجودة، لكنني لا أعرف شيئًا عن nginx وإعداد حاوية مزدوجة بدا مخيفًا للغاية.

tl;dr؛ لقد صنعت شيئًا، الكود أدناه. :backhand_index_pointing_down:

Node.js للإنقاذ

لذلك فكرت: ما هي أسرع طريقة لتشغيل خادم ويب صغير جدًا بصفحة واحدة؟ ثم تذكرت أن Node.js مثبت على أي حال، هل يمكنني استخدام ذلك فقط؟

بحث سريع ونسخ ولصق من Stackoverflow لاحقًا كان لدي شيء صغير يستمع إلى المنفذ 80!

العملية يدوية للغاية، لكنني أعتقد أنها جيدة، أحتاج إلى مراقبة التسجيل عند تشغيل الترقية على أي حال، لذا أنتظر لرؤية الإشارة:

Stopping old container
+ /usr/bin/docker stop -t 600 app

عند هذه النقطة، سيكون لدي جلسة SSH أخرى مفتوحة حيث أقوم بتشغيل ما يلي بسرعة:

touch index.html
node server.js 80

أقوم بإنشاء ملف index.html حتى أتمكن من قراءة تاريخ التحديث منه، واستبدال عنصر نائب. في ملف index.html الخاص بي، لدي هذا السطر:

<p>تم تحديث هذه الصفحة آخر مرة في: LASTUPDATE</p>

في ملف server.js، أستبدل LASTUPDATE بالتاريخ/الوقت الذي تم فيه تحديث ملف index.html آخر مرة. هذا يعطي الأشخاص فكرة عن وقت بدء الترقية، وأنا أشير في الصفحة إلى أنها ستستغرق 10-15 دقيقة لإكمالها.

هذا جعلني أقوم بتشغيل شيء ما بسهولة على خادم التطوير الخاص بي كاختبار وشعرت أنني مستعد للقيام بذلك على الهواء مباشرة.

أوه، نحتاج إلى https :sweat_smile:

حان الوقت لترقية الخادم المباشر وإظهار صفحتي المؤقتة السريعة الجديدة للناس!

لم يسر الأمر كما هو متوقع. الموقع المباشر خلف Cloudflare ويتطلب توفر شهادات كاملة من طرف إلى طرف، لذا أوقفت المنتدى لمدة 15 دقيقة ولم يظهر سوى صفحة خطأ Cloudflare :person_facepalming:

لحسن الحظ، ساعد المزيد من النسخ واللصق من Stack Overflow. قمت بتبديل الخادم من http إلى https وحصلت على ملفات cert.key و cert.pem للتأكد من أن سلسلة الشهادات سليمة.

كانت الترقية التالية نجاحًا أكبر وظهرت صفحات الانتظار كما هو مصمم:

فقط أظهر لي الكود!

إليك الملفان اللذان أستخدمهما لصفحة الانتظار هذه:

index.html

<!DOCTYPE html>
<html lang="en-US">
<head>
        <meta charset="utf-8">
        <title>We'll be right back</title>
</head>
<body>
        <h1>We'll be right back</h1>
        <p>Sorry for the temporary outage, we're currently applying an update, this usually take 10-15 minutes.</p>
        <p>This page was last updated at: LASTUPDATE</p>
</body>
</html>

server.js

var http = require("http"),
  https = require("https"),
  url = require("url"),
  path = require("path"),
  fs = require("fs"),
  port = process.argv[2] || 81;

const options = {
  key: fs.readFileSync("cert.key").toString(),
  cert: fs.readFileSync("cert.pem").toString(),
};

https
  .createServer(options, function (request, response) {
    var uri = url.parse(request.url).pathname,
      filename = path.join(process.cwd(), uri);

    fs.exists(filename, function (exists) {
      if (!exists) {
        response.writeHead(404, { "Content-Type": "text/plain" });
        response.write("404 Not Found\n");
        response.end();
        return;
      }

      let indexFile = (filename += "index.html");
      if (fs.statSync(filename).isDirectory()) indexFile;

      fs.readFile(filename, "utf8", function (err, file) {
        if (err) {
          response.writeHead(500, { "Content-Type": "text/plain" });
          response.write(err + "\n");
          response.end();
          return;
        }

        var stats = fs.statSync(indexFile);
        var mtime = stats.mtime;

        response.writeHead(200);
        file = file.replace(/LASTUPDATE/g, mtime);
        response.write(file, "utf8");
        response.end();
      });
    });
  })
  .listen(parseInt(port, 10));

console.log(
  "Static file server running at\n  => https://localhost:" +
    port +
    "/\nCTRL + C to shutdown"
);

كما هو مذكور أعلاه، يمكنك تشغيله على النحو التالي:

touch index.html
node server.js 443

الوسيط 443 هو المنفذ الذي تريد تشغيله عليه، افتراضيًا يعمل على المنفذ 81 حتى أتمكن من إجراء curl لاختبار ما ستكون عليه النتيجة، قبل أن أقوم بذلك بالفعل أثناء الترقية:

curl -k https://localhost:81

في مرحلة ما أثناء ترقية Discourse، عند اكتمالها، سترى:

Error starting userland proxy: listen tcp4 0.0.0.0:443: bind: address already in use.

هذا هو الوقت الذي أنهي فيه خادم Node وأبدأ Discourse مرة أخرى:

./launcher restart app

وهذا كل شيء. آمل أن يساعد هذا شخصًا ما!

3 إعجابات