Skip to content

Технологічні ризики у production: як не програти, коли проект застаріє

Декілька місяців тому я будував систему версіонування даних для EMM (Expert Memory Machine) - платформи де AI-агенти автоматично класифікують файли. Вибрав lakeFS як Git для S3, MinIO як локальний object storage, PostgreSQL для metadata.

Все добре працює. Тести зелені. Deployment готовий. І тут колега запитав: "А що якщо lakeFS застаріє через 5 років?"

Це змусило мене зупинитись і подумати. Не про features, не про performance, а про те що насправді важливо: що станеться коли технологія застаріє?

Чому це питання важливе

Код живе довго. Набагато довше ніж ми думаємо коли пишемо його.

Той Python 2.7 script який я написав в 2015 і забув? Він досі працює в production. Python 2.7 EOL був в 2020. Але script працює. І тепер треба мігрувати, бо security patches закінчились.

Той MongoDB 2.4 instance який ніхто не чіпав? Він теж десь працює. MongoDB 2.4 вийшов в 2013. Support закінчився в 2016. Але хтось забув його upgrade'нути, і він тихо працює, доки хтось не спробує його підключити до нового driver.

Dependencies застарівають. Projects закриваються. Companies міняють ліцензії. Startups банкрутіють.

Коли вибираєш технологію, треба думати не "чи це працює зараз", а "що станеться через 5 років".

Три компоненти, три рівні ризику

Моя система має три ключові dependencies: PostgreSQL, MinIO, lakeFS. Вони виглядають схоже (databases, storage, versioning), але їх ризики абсолютно різні.

PostgreSQL - коли ризик практично нульовий

PostgreSQL існує з 1986 року. Він старший за більшість людей які його використовують.

Age: 35+ років.
Backing: PostgreSQL Global Development Group + десятки enterprise sponsors.
Adoption: Apple, Instagram, Spotify, Reddit, Netflix, тисячі інших.
Release cycle: major version щороку, підтримка 5+ років.
Community: 1000+ активних contributors.

Якщо PostgreSQL зникне завтра, у нас всіх будуть набагато більші проблеми ніж EMM database. Весь internet впаде.

Ризик: 🟢 практично нульовий.

Alternatives: MySQL, MariaDB - також mature, схожий API, легка міграція через SQL standard.

Для PostgreSQL питання "що якщо він застаріє" виглядає абсурдно. Він не застаріє. Він є стандартом.

MinIO - коли ризик існує, але controlled

MinIO з'явився в 2014. 10 років - це непогано. GitHub показує 47k stars, active development, стабільні releases кожні 2-3 тижні.

Але є нюанс. В травні 2021 MinIO поміняв ліцензію з Apache 2.0 на AGPLv3.

AGPLv3 означає: якщо ти деплоїш MinIO і даєш доступ через мережу - ти маєш open-source весь свій код. Всю систему. Включно з proprietary business logic.

Для enterprise це red flag. Для open-source projects це нормально. Для production deployment commercial license коштує гроші.

Але ось що важливо: MinIO - це S3-compatible storage. Ключове слово: S3-compatible.

S3 - це не просто AWS service. Це industry standard. S3 API - це те що всі розуміють. Boto3, AWS CLI, s3cmd - всі працюють з будь-яким S3-compatible storage.

Це означає: якщо MinIO AGPLv3 стає проблемою, я можу замінити його на:

AWS S3 - managed service, 99.999999999% durability, expensive egress але zero ops.

Cloudflare R2 - S3-compatible, zero egress fees, 50% дешевше за AWS S3, managed service.

Wasabi - S3-compatible storage, дешевше за Amazon, predictable pricing.

Ceph - self-hosted S3-compatible, складний але потужний.

Міграція виглядає так:

# Старий конфіг
S3_ENDPOINT=http://minio:9000
S3_ACCESS_KEY_ID=minioadmin
S3_SECRET_ACCESS_KEY=minioadmin123

# Новий конфіг (Cloudflare R2)
S3_ENDPOINT=https://[account].r2.cloudflarestorage.com
S3_ACCESS_KEY_ID=your_r2_key
S3_SECRET_ACCESS_KEY=your_r2_secret

Код не змінюється. Boto3 не знає різниці. Це той самий S3 API.

Ризик: 🟡 середній (license change, single vendor), але легко мітігується через S3 standard.

Моє рішення: використовую MinIO для local development (Docker Compose), Cloudflare R2 для production. Zero AGPLv3 complications.

lakeFS - коли ризик вищий, але manageable

lakeFS - молодий project. Founded 2020. Age: 5 років.

GitHub: 4.4k stars. Funding: $31M Series B від VCs. Компанія: Treeverse (Israeli startup, ~50 людей).

Production adoption: Lockheed Martin, NASA, Microsoft, Adobe. Це добрий знак. Enterprise companies не беруть unstable tools.

Але факт залишається: це startup. Startups можуть закритись. VCs можуть припинити funding. Project може стати unmaintained.

Що тоді?

Тут я зробив дві речі.

Перше: abstraction layer

Я не писав import lakefs скрізь в коді агентів. Я створив abstraction:

# storage_backend.py
class StorageBackend(ABC):
    @abstractmethod
    def write_file(self, path: str, content: bytes): pass

    @abstractmethod
    def read_file(self, path: str) -> bytes: pass

class LocalStorageBackend(StorageBackend): ...
class LakeFSStorageBackend(StorageBackend): ...
class S3StorageBackend(StorageBackend): ...

Agent code використовує StorageBackend, не LakeFSBackend. Різниця критична.

Якщо lakeFS застаріє, я не переписую agents. Я створюю DVCStorageBackend або DeltaLakeStorageBackend, і змінюю конфіг:

# Було
OUTPUT_BACKEND=lakefs
LAKEFS_REPO=emm-vault

# Стало
OUTPUT_BACKEND=dvc
DVC_REPO=emm-vault

Agent code залишається unchanged. Це сила abstractions.

Друге: data ownership

lakeFS не зберігає мої дані. Він зберігає їх в S3.

lakeFS architecture виглядає так:

lakeFS API → S3 (data) + PostgreSQL (metadata)

DATA живе в S3 bucket як content-addressed objects. METADATA (branches, commits, refs) живе в PostgreSQL.

Це означає: якщо lakeFS зникне завтра, мої дані не зникнуть. Вони в S3. Я можу читати їх напряму. Можу написати migration script. Можу переключитись на інше versioning tool.

Я не locked in lakeFS proprietary format. Дані в S3 - це звичайні files. PostgreSQL - це звичайні таблиці.

Data ownership - це insurance policy проти vendor lock-in.

Принципи для production dependencies

З цього досвіду я сформував кілька правил для вибору production dependencies:

1. Чим старіша технологія, тим менший ризик

PostgreSQL (35 років) > MinIO (10 років) > lakeFS (5 років).

Це не означає "ніколи не використовуй нові технології". Це означає "знай ризик і мітігуй його".

Якщо technology молода (<5 років) - треба abstraction layer. Якщо середнього віку (5-15 років) - треба моніторити project health. Якщо старша (15+ років) - можна покластись на stability.

2. Open source дає options

Всі три компоненти - open source. PostgreSQL (PostgreSQL License), MinIO (AGPLv3), lakeFS (Apache 2.0).

Open source означає: якщо maintainers зникнуть, я можу форкнути project. Або хтось інший форкне. Community підтримає.

Proprietary software не дає цього. Коли vendor закривається, software мертвий. Немає source code = немає options.

3. Standards beats features

MinIO не найшвидший object storage. Але він S3-compatible. Це важливіше за performance.

S3 API - це standard. Boto3, AWS SDK, s3cmd - ecosystem величезний. Якщо я використовую S3 API, я можу switch backends без code changes.

Features приходять і йдуть. Standards залишаються.

4. Abstraction layers - це investment, не overhead

storage_backend.py займає 400 lines. Здається як overhead. "Навіщо abstraction, якщо я знаю що використовую lakeFS?"

Тому що за 3 роки ти НЕ знаєш що використовуватимеш. lakeFS може застаріти. Може з'явитись кращий tool. Може requirements зміняться.

Abstraction layer - це insurance. Ти платиш 400 lines зараз, щоб не платити 10,000 lines rewrite потім.

5. Data ownership > convenience

Є tools які "спрощують життя" через proprietary formats. "Just use our platform, we handle everything!"

Це зручно short-term. Це disaster long-term.

Якщо твої дані в proprietary format, ти locked in. Коли vendor підвищує ціни, ти платиш. Коли vendor закривається, ти screwed.

lakeFS зберігає дані в S3 (standard) + metadata в PostgreSQL (standard). Я можу export в будь-який момент.

Data ownership означає: я контролюю свої дані, не vendor.

Monitoring strategy - early warning system

Вибрати правильні technologies недостатньо. Треба моніторити їх health.

Я створив monitor_tech_health.py - script який кожні 6 місяців перевіряє:

def check_project_health(repo: str) -> dict:
    # GitHub API calls
    stats = {
        "stars": get_star_count(repo),
        "commits_last_year": get_commit_count(repo, since="1y"),
        "releases_last_year": get_release_count(repo, since="1y"),
        "open_issues": get_issue_count(repo, state="open"),
        "contributors": get_contributor_count(repo)
    }
    return stats

Metrics для lakeFS: - Stars: 4,400+ (growing) - Commits/year: 500+ (active) - Releases/year: 50+ (2-week cycle) - Open issues: ~150 (manageable) - Contributors: 50+ (good diversity)

Red flags (коли бити тривогу): - Stars падають або stagnant - Commits < 50/year (project dying) - No releases 6+ months (abandoned) - Open issues > 500 (overwhelmed maintainers) - Contributors < 10 (bus factor risk)

Якщо red flags з'являються - час готувати migration.

Fallback plans - що робити коли все гірше

Навіть з правильними technologies і monitoring, треба fallback plan. Що робити якщо project закривається?

Сценарій 1: lakeFS стає unmaintained

Plan A: Freeze на останній стабільній версії. Self-host indefinitely. lakeFS - stateless, легко deploy'ити.

Plan B: Fork repository (Apache 2.0 license дозволяє). Підтримувати internally або знайти community fork.

Plan C: Мігрувати на альтернативу: - DVC (Data Version Control) - 13k GitHub stars, mature - Delta Lake - Databricks backing, enterprise-grade - Apache Iceberg - Netflix, Apple, Adobe backing - AWS S3 Versioning - native feature, обмежені можливості

Plan D: Fallback до direct S3 без versioning. Functionality втрачається, але система працює.

Migration script (sketch):

def migrate_from_lakefs_to_s3():
    # Export latest commit from lakeFS
    files = lakefs.list_files(repo="emm-vault", branch="main")

    for file in files:
        content = lakefs.read_file(file.path)
        s3.write_file(bucket="emm-vault", key=file.path, data=content)

    # Switch backend
    os.environ["OUTPUT_BACKEND"] = "s3"
    os.environ["S3_BUCKET"] = "emm-vault"

Час міграції: декілька годин для 10GB vault. Acceptable.

Сценарій 2: MinIO AGPLv3 стає проблемою

Просто зміни endpoint config:

# docker-compose.yml - development
services:
  minio:
    image: minio/minio

# production - Kubernetes ConfigMap
data:
  s3-endpoint: "https://[account].r2.cloudflarestorage.com"

Code не змінюється. Boto3 працює. Migration = config change.

Сценарій 3: PostgreSQL... ну PostgreSQL не failing

Але якби потрібна була міграція:

# Export
pg_dump lakefs_db > lakefs_backup.sql

# Import to MySQL (if needed)
# Або до будь-якої іншої SQL DB

SQL standard означає portability.

Real-world example - що сталось з іншими projects

Це не theoretical exercise. Technology obsolescence happens regularly.

CentOS - коли reliable OS зникає

CentOS існував 17 років (2004-2021). Industry standard для enterprise Linux. Тисячі production servers.

В 2020 Red Hat announced: CentOS 8 EOL в 2021 (замість 2029). Migration до CentOS Stream (rolling release) або RHEL.

Сотні тисяч servers потрібна міграція. Decommission dates, emergency planning, testing.

Companies які покладались на CentOS stability отримали 1 рік для migration. Ті, хто мали abstraction (containerized workloads) - мігрували швидко. Ті, хто hardcoded CentOS assumptions - suffered.

Docker Hub rate limits

2020: Docker Hub announces rate limits для anonymous pulls. 100 pulls / 6 hours для anonymous, 200 для authenticated free users.

CI/CD pipelines globally почали failing. "Error: toomanyrequests: too many failed login attempts for username or IP address".

Companies які використовували Docker Hub безпосередньо в production pipelines - broken builds. Ті, хто мали registry mirror або private registry - unaffected.

Dependency на free service стала bottleneck overnight.

MongoDB license change

2018: MongoDB changed license з AGPLv3 на SSPL (Server Side Public License). Це більш restrictive ніж AGPL - cloud providers не можуть надавати MongoDB as-a-service без contribution.

AWS response: створили DocumentDB (MongoDB-compatible) але без MongoDB source code.

MongoDB compatibility стала fragmented. Деякі features працюють на MongoDB, не працюють на DocumentDB.

Companies locked in MongoDB API змушені platform'нути або платити MongoDB Atlas fees.

Висновки з production experience

Технологічні ризики - це не "що якщо" питання. Це "коли" питання.

Dependencies застарівають. Startups закриваються. Companies міняють ліцензії. Free services вводять rate limits.

Правильний підхід:

Вибирай mature technologies де можливо. PostgreSQL існує 35 років не просто так.

Для нових technologies - додай abstraction layer. storage_backend.py захищає від lakeFS obsolescence.

Використовуй standards, не proprietary APIs. S3 API дає flexibility, MinIO-specific API дає lock-in.

Data ownership - critical. Якщо vendor контролює формат даних, ти locked in.

Monitoring project health. Red flags дають early warning для migration.

Мій fallback plan готовий. Коли lakeFS failing, я знаю що робити.

Для EMM я маю: - PostgreSQL (zero risk) - MinIO → Cloudflare R2 migration готова (config change) - lakeFS → S3/DVC migration documented (abstraction layer працює)

Якщо всі три dependencies зникнуть завтра, я можу відновити систему за 1 день.

Це і є мета правильної архітектури: minimize blast radius коли dependencies failing.

Technology choices today визначають operational burden через 5 років. Вибирай з головою.


Related: Data versioning з lakeFS, Kubernetes deployment


Author: Igor Gorovyy
Role: DevOps Engineer Lead & Senior Solutions Architect
LinkedIn: linkedin.com/in/gorovyyigor

Risk analysis summary

Component Age Risk Level Mitigation Strategy
PostgreSQL 35 years 🟢 Very Low Standard SQL, easy migration
MinIO 10 years 🟡 Medium S3 API, Cloudflare R2 ready
lakeFS 5 years 🟡 Medium-High Abstraction layer, fallbacks

Worst-case recovery time: 1 day to restore full functionality with alternative backends.