Skip to content
SemCue

Art Quest · Horror Cinema · Morpheus · infrastructure

The cloud went down at 03:31.A day later, back to normal.

On 8 October the Yandex Cloud zone hosting the company’s only server lost power. The escape-room, horror-cinema and theatre websites went down with it, along with online booking, the bots, CRM enquiries and the finance tools. There were no disk snapshots. We brought everything back on a new server with another provider and rebuilt the data from exports and external services.

Live · new server since 8 October, daily off-server backups since 9 October 2026

Power failure in the cloud zone. Every site and bot is down
First wave of sites live on the new server with valid HTTPS
Bookings, bonuses and gift cards imported after a backup
Emergency mode off, check: 45 of 45

What went down

At 03:31 Tashkent time (04:31 in Omsk) the provider opened an incident: a power failure in the availability zone. That zone held a single server, and almost everything ran on it: three websites, booking with online payment, bots in Telegram, VK and MAX, the dashboard, payroll and Cash Flow, and SemCue client reports.

Later that day the cloud function that sent website and bot enquiries to amoCRM went down too. It was with the same provider.

Public Yandex Cloud status page: power failure in the ru-central1-b availability zone, status Unavailable, updates from 3:31 to 10:26 GMT+5
The provider’s public status page, captured on 8 October at 15:02 Tashkent time. Excerpts: the incident header and the update history.

Before 8 October

  • One server in one cloud zone. It ran three businesses’ websites, booking, bots, the dashboard and accounting.
  • No disk snapshots. Regular backups sat on the same disk; off the server there were only occasional older copies of some data.
  • Enquiries went through a cloud function with the same provider, and it went down too.
  • Monitoring lived on the same server, so it could not report the outage.
  • Some code existed only on the server and was not in git.

After the move

  • A new server with another provider, with more memory and swap.
  • Every day a backup of databases, data and settings leaves the server and is accepted only after a checksum check.
  • Enquiries now run on our own server: same code, same contract, no cloud function.
  • The live state of the main services was committed to git the day after the move.
  • Monitoring rebuilt from scripts, plus a one-command smoke check of the whole setup.
The weak spots were known before. The outage tested all of them in one night.

A plan first, then a server

Waiting for the zone to return wasn’t an option: the provider gave no timeline, and weekend bookings were still on. While the company was buying a new server, we put together a deployment pack from scratch.

The pack listed every service: how it starts, its ports, data and integrations. For the analytics code, the biggest project, it picked the best source for every file among git, working copies and older snapshots, and proved the choice with checksums. One unpleasant finding: about 400 files existed only inside the image on the dead server. The pack also held settings templates (variable names only, no values), install scripts and a four-level launch plan, each level with its own checks and rollback.

  • Level 1

    Websites and HTTPS

    Static sites, routing, certificates. Checked before the DNS switch with requests sent straight to the new address.

  • Level 2

    Booking, payment, enquiries

    The booking service, YooKassa payments, enquiries. Horror stayed on the old address until the shop keys were in place.

  • Level 3

    Bots and dashboard

    Telegram, VK, MAX. Bot state checked for integrity on start-up.

  • Level 4

    Accounts and reports

    Payroll, Cash Flow, client reports, monitoring.

Logins were key-only, and no passwords were ever tried. When the first key-based login failed, work paused until the company added the key. Secrets were handed over as files with locked-down permissions, and temporary copies were deleted once applied.

Two DNS waves and an emergency mode

Certificates and routes were checked before DNS moved: the new server answered with temporary certificates, and requests went straight to its address. Then the first wave: nine hostnames, including the Art Quest and Morpheus sites, bonuses, the status page and SemCue. They were checked from Moscow, St Petersburg, Germany and the US with real Let’s Encrypt certificates. Every record had a machine-readable rollback. Emergency mode went live with the same wave.

Horror Cinema moved in the second wave, after the company entered the YooKassa shop keys and separately approved the switch. While online booking was down, the sites showed a notice and a form for reaching a manager. The form wrote each enquiry to disk before replying, filtered out bots and duplicates, and let through no more than 5 enquiries a minute from one address. A payment notification was acknowledged only after the payment was checked through the API; otherwise YooKassa was asked to retry later.

The Art Quest website in emergency mode: a recovery notice and a form to reach a manager instead of online booking
Emergency mode on the Art Quest website on the morning of 8 October. Online booking is temporarily replaced by a form, and no enquiry is lost.

Data without the old disk

Code is the easy part. Data is harder: bookings, guest bonuses, gift cards, the payroll journal. The last full backups were on the same disk. A snapshot of the old disk never happened: 39 attempts ended in cloud errors, and 36 more attempts just to stop the machine got “service is overloaded”.

So the data was rebuilt from what we had, following rules agreed with the company in advance. The main one: an unknown balance can be neither zeroed nor guessed.

What we had

Bookings exportthe last copy, from 23 September
amoCRMdeals with dates and contacts for recent weeks
YooKassapaid payments and refunds across three shops
VK bot conversationsbot messages show who received bonuses and when
Google Calendarthe live session calendar

The company’s rules

Never zero or guess an unknown balanceanything unclear goes to manual review
Never add up repeated accrualsone event, one accrual
A redeemed gift card never becomes active againeven if the source is older
“I’ve paid” is not a paymentonly a payment record confirms money
Every record keeps its source and a checksumimport only after a copy of current data

What came out

220 bookings192 from the 23 September copy, 27 from an analytics snapshot 15 hours before the outage (CRM contacts for 22 of them), 1 new
Gift card registerrebuilt from YooKassa payments
Bot bonus walletsrebuilt from the last export and bot messages, following the rules on the left
Not everythingsome data from the last few weeks had nothing to be rebuilt from; that is recorded in the log
Imported into the live system on 8 October at 16:12 Tashkent time, after a copy of the current data. Every rebuilt record links to its source.

Then came a surprise. The old server came back to life and started polling Telegram with the same bot keys. Two servers were pulling the same messages and getting in each other’s way. Only reissuing the tokens fixed it.

Three workstreams and one shared log

Three workstreams ran at once. One brought up the server, bots and apps. The second rebuilt the data. The third switched DNS, republished client reports and kept trying to snapshot the old disk.

To keep them out of each other’s way, every action went into a shared log with UTC, Tashkent and Omsk times. The rules were simple: each stream writes only in its own folder, copies rather than moves, deletes nothing, and keeps an index and checksums in every folder. Payments, messages to customers and DNS changes only after an explicit “yes” from the company.

Mistakes are on record too. For example, the proxy container kept an old copy of its settings file, so the reload command silently ignored changes. The rule changed after that: restart the container and check that the change actually took effect.

  1. The provider opens an incident: power failure in the cloud zone. The server is unreachable.

  2. The task: prepare a full launch pack for new infrastructure. Nothing touches live systems without the company’s “yes”.

  3. The new server responds, but the access key isn’t set up. No password guessing: we wait for the company to add the key.

  4. First DNS wave: 9 hostnames live on the new server with valid HTTPS, checked from Moscow, St Petersburg, Germany and the US. Emergency mode on the sites: a notice and an enquiry form.

  5. Payments: YooKassa shop keys in place, notifications accepted only after an API check. The booking engine runs on the live calendar.

  6. Attempts to snapshot the old disk begin: 39 tries, all cloud errors. Then 36 tries just to stop the machine. No snapshot ever arrives.

  7. Second DNS wave: Horror Cinema, reports, profiles. All 13 hostnames now run on the new server.

  8. Data import after a copy of the current state: 220 bookings, bot state, 33 gift cards.

  9. The enquiries cloud function is down too. Enquiries move to our own server; 48 links in 38 site files are switched.

  10. Monitoring rebuilt from scripts: 61 checks, the active ones all green.

  11. The old machine partly comes back and polls Telegram with the same bot keys. Two servers get in each other’s way.

  12. Bot keys reissued. A minute later, zero conflicts.

  13. Back to normal for websites and booking: notices removed, full check 45 of 45.

  14. Trial restore of the server’s nightly archives from a full snapshot: 53 data files read back without errors.

  15. Sixth daily backup in a row accepted after the checksum check. The network dropped the download five times; half an hour later the script started over.

Times are Tashkent (UTC+5). Taken from the shared recovery log and the backup log.

What changed afterwards

On the night of 9 October the websites and booking went back to normal, and the final check passed all 45 items. Then we turned to on what had made the outage so painful.

  • 6 of 6daily off-server backups of databases, data and settings accepted after verification9–14 October, checksums matched
  • 61monitoring checks rebuilt from scriptsalerts in Telegram
  • 53data files read back after a trial restore of the server’s nightly archives9 October, no errors

Not everything came back: some data from the last few weeks had nothing left to rebuild it from. Exactly what was lost is recorded in the recovery log, not hidden. The code for the main services now matches the live server, and backups are checked, not just counted: on 14 October the network dropped the download five times in a row, so half an hour later the script started over and accepted the copy only after the checksums matched.

How it was built

The company decided, we did the work

The company chose what came back first and which provider to use, entered the keys and gave a “yes” to every step involving money, customers or DNS. We built the pack, brought up services, switched records and rebuilt the data.

Five weeks earlier there was a separate episode: the sites were slow, and the investigation found two separate causes. A throwaway utility container stuck in a loop was eating half the CPU, and the calendar health check downloaded the whole calendar every minute. After the fixes, the slowest responses of that check fell from 4.784 to 0.341 seconds, and false 502 errors, 5,760 a day before, stopped. Same habit: a proven cause first, then the fix.

  • The companyLaunch priorities, choice of provider, keys and passwords, approval for payments, customer messages and DNS.
  • SemCueThe deployment pack, the new server, bots, emergency mode, DNS and certificates in waves, rebuilding bookings, bonuses, gift cards and the payroll journal, the final check.

For technical readers

Under the hood

Deployment pack
A service inventory, the best source for code chosen by checksum, settings templates without secrets, install scripts, a four-level launch plan and a playbook in case the old server came back.
Cutover
Certificates and routes checked before the DNS change, two waves with observation, a machine-readable rollback, checks from several countries.
Emergency mode
A notice on every page and an enquiry form that writes to disk before replying, with bot filtering, rate limits and duplicate protection. Payment notifications were accepted only after checking with YooKassa.
Enquiries
The cloud function was replaced by a small wrapper on our own server that calls the same code, unchanged, with the same timeout.
Data
Rebuilt from copies and external APIs, with a source and checksum on every record. Import only after a copy of the current state.
Afterwards
A daily off-server backup of databases, app data and settings with checksum verification and rotation, monitoring defined in scripts, and a one-command check of the whole setup.

Where the numbers come from

Every number here comes from working documents

Next system

Gift certificates with online payment and a personal link →

SemCue / Let’s talk

What would you like to work on?

Tell us about your project and what you need. A rough idea is enough.

Get in touch on Telegram

We’ll discuss your goals, where things stand and the right next step.

Discuss your project on Telegram
In developmentThis site is still being built, so things may change.