✕

运营、管理与连续性

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