✕

العمليّات والإدارة والاستمراريّة

Infrastructure

يبقى العمل ملكك. والآلة التي تحته هي لنا لنُشغّلها.

Systems يبني الأرض ويؤمّنها. وInfrastructure يمسك المقاليد: نُنشئها، ونُبقيها تعمل يومًا بعد يوم، ونحن من يسهر حين يتحرّك شيء. قاعة تداول، أو شركة، أو شخصٌ واحد لديه متجرٌ على الإنترنت — ذات الأيدي وذات المراقبة.

أنت تقرأ بيتًا نُشغّله بأنفسنا. كان يراقب أصلًا حين وصلت — ·

ما الذي تكفّ عن حمله

ستّة أشياء تغادر يديك في اليوم الأول ولا تعود.

الآلات

أين تعمل، وبأيّ حجم، وما ينبغي أن يكلّفه ذلك. نختارها، ونُنشئها، ونعيد قياسها حين تتغيّر حركة مرورك — قبل أن تصير مشكلةً تراها.

العنوان

النطاق، والشهادات، وبريدٌ يصل بدلًا من أن يهبط في مجلّد الرسائل المزعجة. يُجدَّد قبل أن تتذكّر أنه موجود، لأن اسمًا منتهيًا هو عملٌ مغلق.

المتجر

الدفع، ووسائل السداد، بلدًا بلدًا، والطلب الذي يجب ألّا يضيع أبدًا. يُبنى مرةً، ثم يبقى يعمل — حتى في اليوم الذي يغيّر فيه مورّدك شيئًا.

النسخ

نسخٌ احتياطيّة لا تضطرّ للتفكير فيها أبدًا، واستعادةٌ أجريناها فعلًا. نسخةٌ لم يُعِدها أحدٌ قطّ ليست نسخة — بل أمنية.

السرعة

صفحاتٌ تُفتَح بسرعةٍ أينما كان الزائر واقفًا. البطء مالٌ يخرج من الباب، فالسرعة جزءٌ من تشغيل البيت، لا بندٌ إضافيّ يُشترى.

الترقيع

التحديثات، والشهادات التي توشك أن تنتهي، والمكوّن الذي فيه ثغرة. نُغلِقها نحن، على تقويمنا — لا على قلقك، ولا في الثالثة فجرًا على تقويمك.

مَن يراقب، ومتى

ما الذي يحدث فعلًا بين لحظة تعطّل شيءٍ ولحظة عودته واقفًا من جديد.

لحظة وقوعه

النظام يلاحظ

كلّ طلب، وكلّ باب، وكلّ مفتاح يُسجَّل عند الحافة فور حدوثه. لا شيء ينتظر مهمّةً ليليّة تكتشفه في الصباح.

في النَّفَس ذاته

هاتفٌ يرنّ في Zürich

لا صندوق بريد، ولا لوحةٌ قد يفتحها أحدٌ غدًا. ينطلق التنبيه إلى حيث لا يمكن تجاهله بهدوء.

قبل أن تسأل

تسمعه منّا

ما الذي حدث، وما الذي مسّه، وما الذي فُعِل حياله بالفعل. لا تعلم أن بيتك متوقّف من عملائك أنت.

حتى يعود واقفًا

يُصلَح، لا يُصعَّد

ذات الأيدي التي أنشأته تدخل وتُصلحه. لا طبقة فوقنا نُحيله إليها، فلا أحد ننتظره.

في آخر الشهر

يُكتَب

ما الذي فشل، ولماذا، وما الذي غيّرناه كي لا يفشل على النحو ذاته مرتين. والعطل الذي لا يُكتَب يعود.

ما الذي يصلك مكتوبًا، كلّ شهر

ورقةٌ واحدة. يقرؤها من ليس مهندسًا، لأن هذا هو من كُتِبت له.

ساعات الوقوف
الساعات التي كان فيها عاملًا، والدقائق التي لم يكن — مقيسةً من خارج بيتك، فالرقم ليس لنا لنُجمّله.
ما الذي غيّرناه
كلّ تغييرٍ أجريناه، بلغةٍ واضحة. تقرؤه في دقيقة ومع ذلك تعرف تمامًا ما الذي تحرّك.
ما الذي تعطّل
ما الذي فشل، وما الذي مسّه، وما الذي فعلناه — بما في ذلك الأعطال التي لم تلحظها قطّ، وهي معظمها.
ما يأتي بعده
ما نعتزم فعله الشهر القادم، مكتوبًا قبل أن نفعله. لا شيء يحدث لبيتك على حين غرّة.
ما الذي يكلّفه
ذات الرقم كالشهر الماضي، إلّا إن طلبت شيئًا جديدًا. لا بند يظهر على هذه الورقة من تلقاء نفسه أبدًا.

الواجهة

ما نُسلّمه إليك هو النصف الذي يعمل في بيتك: التمرين الذي يختبر نسخك كلّ ليلة، والنداء الواحد الذي يضع بيتًا تحت الإدارة. غرفة عملياتنا تبقى مغلقة — وما يعمل في جانبك هو لك لتقرأه قبل أن تثق به.
يبقى الكود بالإنجليزية — اللغة العالمية للتقنية.

"""MatchTop · restore drill — the piece that proves a copy is a copy.
Standard library only. It runs in your house, on your own copies, where you can watch it."""

import hashlib, hmac, json, os, subprocess, time
from pathlib import Path
from urllib.request import Request, urlopen

KEY    = bytes.fromhex(os.environ["MT_KEY"])    # one key per house, never on disk
EDGE   = os.environ["MT_EDGE"]                   # no address baked into the build
SHADOW = Path(os.environ["MT_SHADOW"])            # a shadow copy. never the live house.


def newest_copy(vault: Path) -> Path:
    """Drill the copy you would actually reach for, not a convenient one."""
    copies = sorted(vault.glob("*.dump"), key=lambda p: p.stat().st_mtime)
    if not copies:
        raise FileNotFoundError("the vault is empty")   # the loudest fault there is
    return copies[-1]


def fingerprint(copy: Path) -> str:
    """So that tomorrow we can prove this was the file we brought back."""
    h = hashlib.sha256()
    with copy.open("rb") as f:
        for block in iter(lambda: f.read(1 << 20), b""):
            h.update(block)
    return h.hexdigest()


def bring_it_back(copy: Path) -> dict:
    """Restore into the shadow, then ask it a question only a live house can answer."""
    SHADOW.mkdir(parents=True, exist_ok=True)
    started = time.monotonic()
    subprocess.run(["pg_restore", "--clean", "-d", "mt_shadow", str(copy)],
                   check=True, timeout=1800)
    asked = subprocess.run(["psql", "-d", "mt_shadow", "-tAc",
                            "select count(*) from orders"],
                           capture_output=True, text=True, check=True)
    return {"seconds": round(time.monotonic() - started, 1),
            "orders":  int(asked.stdout.strip())}   # a restore nobody queried is not a restore


def file_it(result: dict) -> str:
    """Signed and filed, pass or fail. The month's sheet is written from these."""
    body = json.dumps(result, separators=(",", ":"), sort_keys=True).encode()
    call = Request(EDGE, body, {
        "Content-Type": "application/json",
        "X-MT-House":   os.environ["MT_HOUSE"],
        "X-MT-Seal":    hmac.new(KEY, body, hashlib.sha256).hexdigest(),
    })
    with urlopen(call, timeout=8) as answer:        # we dial out. nothing dials in.
        return json.load(answer)["filed"]


def drill(vault: Path) -> None:
    copy   = newest_copy(vault)
    result = {"copy":        copy.name,
              "age_hours":   round((time.time() - copy.stat().st_mtime) / 3600, 1),
              "fingerprint": fingerprint(copy)[:16]}
    try:
        result |= bring_it_back(copy)
        result["verdict"] = "came back"
    except Exception as fault:
        result["verdict"] = "did not come back"      # the drill exists for this branch
        result["fault"]   = str(fault)[:200]           # and this is the night we are worth it
    file_it(result)


if __name__ == "__main__":
    drill(Path(os.environ["MT_VAULT"]))               # every night, watched or not

مقيسٌ في بيتنا نحن

لا أرقام عملاء على هذه الصفحة. لا نسعّر ما لم نقِسه بأنفسنا، فهذه الأربعة من البيوت التي نُشغّلها بأيدينا.

2
بيتان نُشغّلهما
هذا وبيت عيادة — نحن عميلنا الأول، وشكوانا الأولى
7
أبوابٌ على هذا
بابٌ لكل لغة، جميعها تحت مراقبةٍ واحدة وفاتورةٍ واحدة
0
لوحاتٌ لتتعلّمها
لا شيء تدخل إليه ولا شيء تحفظه — تطلب، فيُنجَز
1
شخصٌ يجيب
لا طبقة، ولا تذكرة، ولا أحد يقف أمامه يدوّن ملاحظات

ما لا يمكن نسخه

ليست مقارنة أسعار. بل مقارنةٌ لكيف بُني البيتان.

الترتيب المعتاد
هنا
مَن يجيب
نوبةُ مناوبةٍ لا تلتقي أحدها قطّ. ومن يردّ عليك عليه أن يُخبَر بماهيّة نظامك قبل أن يستطيع المساعدة.
الشخص الذي أنشأه. يعرف نظامك عن ظهر قلب، فلا شيء يُشرَح أولًا.
ساعات العمل
عطلٌ في الـ23:40 هو تذكرةٌ تُقرأ في الـ09:00. والليل ملكك، وحدك.
المراقبة لا تلتزم ساعات عمل. ينطلق التنبيه إلى هاتف، والهاتف ليس مُطفأً.
كلّ عام
مقعدٌ آخر، ووحدةٌ أخرى، وطبقةٌ أخرى. والترتيب لا يمكنه إلا أن يزداد ثقلًا.
نُخرِج ما لم تعد تحتاجه. فتخفّ العمليّة — ويخفّ معها ما يكلّفك.
حين يتعطّل
يخبرونك أنه تعطّل. وإصلاحه يُسعَّر على حدة، من شخصٍ آخر.
نحن بنينا المحرّك أيضًا، فندخل ونصلحه. بيتٌ واحد يجيب عن النصفَين.
يوم رحيلك
وحدة تحكّمهم، وصيغهم، ورسم خروجهم. والرحيل يكلّف مشروعًا بأكمله.
حسابك، ونطاقك، وبياناتك. نحتفظ بالمفاتيح التي سُلّمناها، ونعيدها يوم تطلب.

لا شيء من ذلك قائمةُ ميزات، ولهذا بالضبط لا يُزاحَم بالسعر. شركةٌ لها نوبةُ مناوبة لا تستطيع أن تمنحك من بنى نظامك. وشركةٌ يجب أن تنمو فاتورتها كلّ عام لا تستطيع أن تُخرِج بندًا منها. وشركةٌ لا تفعل إلا المراقبة لا تستطيع أن تصلح. هم ليسوا خلفنا — بل مبنيّون على نحوٍ مختلف، ولا يمكنهم العبور دون أن يكفّوا عن كونهم أنفسهم.

ولهذا أيضًا لا توجد قائمة أسعار على هذه الصفحة. ننظر إلى ما يجب ألّا يتوقّف، ونقيس العمليّة، ثم نسعّر ما قِسناه. كلٌّ يدفع بمقدار حجمه — متجرٌ يديره شخصٌ واحد لا يُحاسَب كأنه قاعة تداول.

قل لنا ما الذي تفضّل أن تُسلّمه

سطران يكفيان. نقرؤهما بأنفسنا ونجيب بأنفسنا — لا طابور يقف خلف هذه النافذة.

تصل إلى شخصٍ واحد، وذلك الشخص يجيب. لا شيء هنا يُشارَك أو يُباع أو يُمرَّر.

Mr. MatchTop · matchtopalgorithm.ai