bingo: move the public site to the datacenterbingo repo
The public card now runs from its own repo and container, with a Traefik router of its own. Drop BingoWeb, its views, icons, Host dispatch and the asxpio-bingo router here; keep the admin, the schema and the photo pipeline, which the new site reads through a read-only role. BINGO_HOST stays for IndexNow pings and the admin's site link. Assisted-by: Claude:opus-5
This commit is contained in:
parent
510998c0ed
commit
849980042e
19 changed files with 34 additions and 1007 deletions
101
lib/bingo.rb
101
lib/bingo.rb
|
|
@ -46,98 +46,8 @@ module Bingo
|
|||
[(0...SIZE).map { |i| i * SIZE + i }, (0...SIZE).map { |i| i * SIZE + SIZE - 1 - i }]
|
||||
).freeze
|
||||
|
||||
T = {
|
||||
'ru' => {
|
||||
seo_title: 'Бинго ЦОДов — атаки, пожары и аварии дата-центров России',
|
||||
seo_desc: '%{hit} из %{total} крупнейших дата-центров России уже зачёркнуты. Бинго-карточка ЦОДов IXcellerate, Яндекса, Ростелекома, Росатома и других: атаки БПЛА, пожары и отключения с источниками.',
|
||||
og_locale: 'ru_RU',
|
||||
title: 'Бинго ЦОДов', accent: 'ЦОДов', lead: 'Бинго',
|
||||
tagline: 'Атаки БПЛА, пожары и аварии в 25 крупнейших дата-центрах России',
|
||||
desc: 'Рейтинг по мощности. Клетка зачёркивается после публично подтверждённого инцидента.',
|
||||
crossed: 'Зачёркнуто', lines: 'линий', updated: 'обновлено',
|
||||
log: 'Журнал инцидентов', empty: 'Пока всё работает. Пока.',
|
||||
bingo: 'БИНГО!', bingo_n: 'БИНГО ×%d!', full: 'ПОЛНАЯ КАРТА. Интернета больше нет.',
|
||||
planned: 'планируется', mva: 'МВА',
|
||||
mw_types: { 'it' => 'ИТ', 'connected' => 'подв.', 'total' => 'общ.', 'design' => 'проект' },
|
||||
building: 'строится', mw: 'МВт', since: 'с %d г.', photo: 'Фото', source: 'Источник',
|
||||
close: 'Закрыть', no_incidents: 'Инцидентов не зафиксировано.',
|
||||
credits_ai: 'Информация собрана и проверена с помощью Claude (Anthropic).',
|
||||
credits_hym: 'Спасибо %{link} (данные Cat Eyes OSINT) за часть списка: каждая запись перепроверена по сайтам операторов и прессе.',
|
||||
footer: 'Данные из открытых источников (2025–2026). Клетка зачёркивается только по публичному источнику.',
|
||||
kinds: { 'strike' => 'Атака БПЛА', 'fire' => 'Пожар', 'outage' => 'Отключение', 'flood' => 'Затопление', 'cooling' => 'Перегрев', 'other' => 'Инцидент' },
|
||||
letters: %w[Б И Н Г О],
|
||||
providers_label: 'Собрать карточку из провайдеров', providers_apply: 'Показать', providers_reset: 'Все провайдеры',
|
||||
view_all: 'Все', view_operational: 'Только действующие', view_label: 'Какие ЦОДы показывать',
|
||||
dc_title: '%{name} (%{city}) — инциденты ЦОДа | Бинго ЦОДов',
|
||||
dc_title_hit: '%{name} (%{city}) — %{kind}, %{date} | Бинго ЦОДов',
|
||||
dc_intro: '%{name} — дата-центр в городе %{city}, оператор — %{operator}.',
|
||||
dc_capacity: 'Мощность: %{mw}.', dc_building: 'Строится.', dc_planned: 'Планируется.',
|
||||
dc_since: 'Работает с %d года.',
|
||||
dc_rank: '№ %{pos} по мощности среди крупнейших дата-центров России.',
|
||||
dc_latest: 'Последний инцидент (%{date}): %{title}', incidents: 'Инциденты',
|
||||
back: '← К карточке', dc_page: 'Страница ЦОДа →'
|
||||
},
|
||||
'en' => {
|
||||
seo_title: 'Datacenter Bingo — strikes, fires and outages at Russian datacenters',
|
||||
seo_desc: '%{hit} of Russia\'s %{total} largest datacenters are already crossed out. A bingo card of IXcellerate, Yandex, Rostelecom, Rosatom and other datacenters: drone strikes, fires and outages, each with a source.',
|
||||
og_locale: 'en_US',
|
||||
title: 'Datacenter Bingo', accent: 'Bingo', lead: 'Datacenter',
|
||||
tagline: "Drone strikes, fires and outages at Russia's 25 largest datacenters",
|
||||
desc: "Ranked by power. A cell is crossed out after a publicly reported incident.",
|
||||
crossed: 'Crossed out', lines: 'lines', updated: 'updated',
|
||||
log: 'Incident log', empty: 'Everything is up. For now.',
|
||||
bingo: 'BINGO!', bingo_n: 'BINGO ×%d!', full: 'FULL CARD. There is no more internet.',
|
||||
planned: 'planned', mva: 'MVA',
|
||||
mw_types: { 'it' => 'IT', 'connected' => 'connected', 'total' => 'total', 'design' => 'design' },
|
||||
building: 'under construction', mw: 'MW', since: 'since %d', photo: 'Photo', source: 'Source',
|
||||
close: 'Close', no_incidents: 'No incidents recorded.',
|
||||
credits_ai: 'Information collected and verified with the help of Claude (Anthropic).',
|
||||
credits_hym: 'Thanks to %{link} (data by Cat Eyes OSINT) for part of the list; every entry was re-verified against operator sites and the press.',
|
||||
footer: 'Open-source data (2025–2026). A cell is crossed out only with a public source.',
|
||||
kinds: { 'strike' => 'Drone strike', 'fire' => 'Fire', 'outage' => 'Outage', 'flood' => 'Flood', 'cooling' => 'Overheating', 'other' => 'Incident' },
|
||||
letters: %w[B I N G O],
|
||||
providers_label: 'Build a card from providers', providers_apply: 'Show', providers_reset: 'All providers',
|
||||
view_all: 'All', view_operational: 'Operational only', view_label: 'Which datacenters to show',
|
||||
dc_title: '%{name} (%{city}) — datacenter incidents | Datacenter Bingo',
|
||||
dc_title_hit: '%{name} (%{city}) — %{kind}, %{date} | Datacenter Bingo',
|
||||
dc_intro: '%{name} is a datacenter in %{city} operated by %{operator}.',
|
||||
dc_capacity: 'Capacity: %{mw}.', dc_building: 'Under construction.', dc_planned: 'Planned.',
|
||||
dc_since: 'In service since %d.',
|
||||
dc_rank: "No. %{pos} by power among Russia's largest datacenters.",
|
||||
dc_latest: 'Latest reported incident (%{date}): %{title}', incidents: 'Incidents',
|
||||
back: '← Back to the card', dc_page: 'Datacenter page →'
|
||||
},
|
||||
'uk' => {
|
||||
seo_title: 'Бінго ЦОДів — атаки, пожежі та аварії дата-центрів Росії',
|
||||
seo_desc: '%{hit} з %{total} найбільших дата-центрів Росії вже закреслено. Бінго-картка ЦОДів IXcellerate, Яндекса, Ростелекому, Росатому та інших: атаки БПЛА, пожежі й відключення з джерелами.',
|
||||
og_locale: 'uk_UA',
|
||||
title: 'Бінго ЦОДів', accent: 'ЦОДів', lead: 'Бінго',
|
||||
tagline: 'Атаки БПЛА, пожежі та аварії у 25 найбільших дата-центрах Росії',
|
||||
desc: 'Рейтинг за потужністю. Клітинка закреслюється після публічно підтвердженого інциденту.',
|
||||
crossed: 'Закреслено', lines: 'ліній', updated: 'оновлено',
|
||||
log: 'Журнал інцидентів', empty: 'Поки що все працює. Поки що.',
|
||||
bingo: 'БІНГО!', bingo_n: 'БІНГО ×%d!', full: 'ПОВНА КАРТКА. Інтернету більше немає.',
|
||||
planned: 'планується', mva: 'МВА',
|
||||
mw_types: { 'it' => 'ІТ', 'connected' => 'підв.', 'total' => 'заг.', 'design' => 'проєкт' },
|
||||
building: 'будується', mw: 'МВт', since: 'з %d р.', photo: 'Фото', source: 'Джерело',
|
||||
close: 'Закрити', no_incidents: 'Інцидентів не зафіксовано.',
|
||||
credits_ai: 'Інформацію зібрано й перевірено за допомогою Claude (Anthropic).',
|
||||
credits_hym: 'Дякуємо %{link} (дані Cat Eyes OSINT) за частину списку: кожен запис перевірено за сайтами операторів і пресою.',
|
||||
footer: 'Дані з відкритих джерел (2025–2026). Клітинка закреслюється лише за публічним джерелом.',
|
||||
kinds: { 'strike' => 'Атака БПЛА', 'fire' => 'Пожежа', 'outage' => 'Відключення', 'flood' => 'Затоплення', 'cooling' => 'Перегрів', 'other' => 'Інцидент' },
|
||||
letters: %w[Б І Н Г О],
|
||||
providers_label: 'Зібрати картку з провайдерів', providers_apply: 'Показати', providers_reset: 'Усі провайдери',
|
||||
view_all: 'Усі', view_operational: 'Лише діючі', view_label: 'Які ЦОДи показувати',
|
||||
dc_title: '%{name} (%{city}) — інциденти ЦОДу | Бінго ЦОДів',
|
||||
dc_title_hit: '%{name} (%{city}) — %{kind}, %{date} | Бінго ЦОДів',
|
||||
dc_intro: '%{name} — дата-центр у місті %{city}, оператор — %{operator}.',
|
||||
dc_capacity: 'Потужність: %{mw}.', dc_building: 'Будується.', dc_planned: 'Планується.',
|
||||
dc_since: 'Працює з %d року.',
|
||||
dc_rank: '№ %{pos} за потужністю серед найбільших дата-центрів Росії.',
|
||||
dc_latest: 'Останній інцидент (%{date}): %{title}', incidents: 'Інциденти',
|
||||
back: '← До картки', dc_page: 'Сторінка ЦОДу →'
|
||||
}
|
||||
}.freeze
|
||||
# UI strings (T) and the public views live in the datacenterbingo repo,
|
||||
# which reads these tables; keep PROVIDERS, Board and the models in step.
|
||||
|
||||
# Localized column with fallback to ru.
|
||||
module Localized
|
||||
|
|
@ -250,8 +160,8 @@ module Bingo
|
|||
end
|
||||
end
|
||||
|
||||
# Photos live in the app's MinIO bucket under bingo/ and are proxied by the
|
||||
# app, so the bucket stays private.
|
||||
# Photos live in the app's MinIO bucket under bingo/ and are proxied by
|
||||
# the bingo site (and /admin/bingo/p here), so the bucket stays private.
|
||||
module Photo
|
||||
PREFIX = 'bingo/'.freeze
|
||||
MAX_BYTES = 8 * 1024 * 1024
|
||||
|
|
@ -448,7 +358,8 @@ module Bingo
|
|||
|
||||
# Tells IndexNow engines (Bing, Yandex, Seznam, ...) which bingo URLs
|
||||
# changed, so new incidents get recrawled within minutes. The key comes
|
||||
# from INDEXNOW_KEY and BingoWeb serves it at /<key>.txt; without the key
|
||||
# from INDEXNOW_KEY; the bingo site (datacenterbingo repo, same key)
|
||||
# serves it at /<key>.txt. Without the key
|
||||
# or BINGO_HOST (dev, tests) this does nothing.
|
||||
module IndexNow
|
||||
ENDPOINT = URI('https://api.indexnow.org/indexnow')
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
require 'uri'
|
||||
|
||||
# /admin/bingo/* on asxp.io: edit the card and record incidents for BingoWeb.
|
||||
# /admin/bingo/* on asxp.io: edit the card and record incidents for the public bingo site (datacenterbingo repo).
|
||||
# Registered into AsxpioWeb, so AdminAuth (HTTP Basic) and CSRF apply.
|
||||
module BingoAdmin
|
||||
DC_TEXT = %w[name_ru name_en name_uk city_ru city_en city_uk operator provider mw mw_type status
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue