Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
827 commits
Select commit Hold shift + click to select a range
d73e49a
test(p1): five-message 4MiB-plus-one real Telegram Bot binary roundtrip
babico Oct 13, 2026
0a2c901
ci(p1): full real Bot multipart, twelve-object soak and Telethon larg…
babico Oct 13, 2026
7ad4abb
test(p1): independent SQL snapshot DR preserves signed browser tags a…
babico Oct 14, 2026
8650d3b
ci(p1): full signed tag DR and real Telegram soak acceptance [p0-live…
babico Oct 14, 2026
037fc0b
feat(p1): verify lost Bot ACK with independent channel history and Bo…
babico Oct 14, 2026
c47d2e2
feat(p1): query exact unresolved Bot send intent for verified recovery
babico Oct 14, 2026
66e2de3
feat(p1): opt-in operator CLI for cross-client Telegram lost-ACK evid…
babico Oct 14, 2026
837a243
test(p1): independent ACK proof, replay resistance and negative chann…
babico Oct 14, 2026
c99908f
ci(p1): require independent lost-ACK evidence tests in security, rele…
babico Oct 14, 2026
ce8562f
ci(p1): require independent lost-ACK evidence tests in security, rele…
babico Oct 14, 2026
63cf66e
ci(p1): require independent lost-ACK evidence tests in security, rele…
babico Oct 14, 2026
80eb8a1
feat(p1): read-only verified SQLite staging restore with real Telegra…
babico Oct 14, 2026
74aa054
test(p1): staging SQL restore real engine roundtrips, tampered remote…
babico Oct 14, 2026
4b29b3d
feat(p1): SQL-backed cross-process Telegram Bot per-chat start-rate r…
babico Oct 14, 2026
fe51bce
feat(p1): distribute Telegram 429 cooldown across independent SQL wor…
babico Oct 14, 2026
1f1ba39
test(p1): SQL cross-process Bot pacing and propagated 429 cooldown
babico Oct 14, 2026
6659e40
test(p1): concurrent six-client Bot pacing and 429 on PostgreSQL 17/M…
babico Oct 14, 2026
dd55b8d
feat(p1): read-only full-source legacy cutover verification against T…
babico Oct 14, 2026
22b103a
feat(p1): explicit read-only all-file Telegram legacy cutover accepta…
babico Oct 14, 2026
4b0b6cf
test(p1): full-source cutover acceptance, SHA integrity, mutations an…
babico Oct 14, 2026
448945f
fix(p1): SQL write-first Bot chat slot reservation with bounded SQLit…
babico Oct 14, 2026
9482e74
ci(p1): gate loss-ACK, SQL throttle, staging DR and legacy cutover ac…
babico Oct 14, 2026
c6313cb
ci(p1): gate loss-ACK, SQL throttle, staging DR and legacy cutover ac…
babico Oct 14, 2026
5a8292f
ci(p1): gate loss-ACK, SQL throttle, staging DR and legacy cutover ac…
babico Oct 14, 2026
706812c
ci(p1): gate real lost-ACK cross-client channel proof behind explicit…
babico Oct 14, 2026
03530e9
test(p1): real independent Telegram user verifies missing Bot ACK bef…
babico Oct 14, 2026
fc5bd8e
test(p1): three real PostgreSQL worker processes share Bot pacing and…
babico Oct 14, 2026
a222c07
ci(p1): opt-in three-process real Bot soak over PostgreSQL with byte …
babico Oct 14, 2026
75c574a
ci(p1): serialize regular and multiworker real Bot tests against one …
babico Oct 14, 2026
326e72a
test(ci): enforce production acceptance gates, opt-in real workers an…
babico Oct 14, 2026
94a88a8
fix(p1): bind operator Telegram message proof to original Bot send ca…
babico Oct 14, 2026
bdf7a29
test(p1): reject channel post with incorrect upload-intent caption
babico Oct 14, 2026
92a4703
feat(p1): production-scoped Telethon receipt reconciliation credentia…
babico Oct 14, 2026
8490c5a
test(p1): simulate expired distributed 429 throttle without CI 61-sec…
babico Oct 14, 2026
d6cf3f8
fix(p1): fence source changes made during remote cutover acceptance r…
babico Oct 14, 2026
a8586d9
docs(p1): actionable lost-ACK proof, cross-host soak, real DR and leg…
babico Oct 14, 2026
199dd7e
fix(p1): preserve zero-pacing test transports while sharing positive …
babico Oct 14, 2026
ad985e4
test(p1): supply required HEAD publish timestamp in staging DR fixture
babico Oct 14, 2026
beb7b43
ci(p1): comprehensive real Bot multipart+soak, Telethon sizes, cross-…
babico Oct 14, 2026
367d8b6
ci(p1): skip-only multiworker workflow must not cancel pending Bot ac…
babico Oct 14, 2026
d4d9be6
test(ci): prove skipped live multiworker cannot evict pending Bot E2E
babico Oct 14, 2026
0e2ae25
test(p1): real Telegram Bot disaster restore from independently seale…
babico Oct 14, 2026
8400a0a
ci(p1): bound extended real Bot multipart, cross-client proof and sta…
babico Oct 14, 2026
df92eda
test(ci): enforce bounded 25-minute real Bot acceptance deadline
babico Oct 14, 2026
91dec6f
ci(p1): final real Bot ACK cross-client and full soak, Telethon large…
babico Oct 14, 2026
84b670d
test(ci): align second Bot acceptance timeout assertion with 25-minut…
babico Oct 14, 2026
35d90d2
ci(p1): final real Bot cross-client ACK, 12-object soak, 5/16MiB and …
babico Oct 14, 2026
3a47e63
security(p1): source live Telegram target exclusively from masked Act…
babico Oct 14, 2026
95e200c
security(p1): source live Telegram target exclusively from masked Act…
babico Oct 14, 2026
7848b6c
security(p1): migrate numeric Bot target from visible Actions variabl…
babico Oct 14, 2026
7279f7a
test(security): enforce masked Actions secret and pre-step redaction …
babico Oct 14, 2026
26ab962
test(security): clean static assertions for legacy GitHub variable mi…
babico Oct 14, 2026
b272293
security(p1): keep optional Telegram user peer target in masked Actio…
babico Oct 14, 2026
a07839e
test(security): verify secret-only Telegram peer config and no-echo m…
babico Oct 14, 2026
dbc8b46
docs(security): hidden Telegram E2E peer ID secret migration and fail…
babico Oct 14, 2026
8a36276
security(p1): verify and fail closed when old unmasked Actions peer v…
babico Oct 14, 2026
52be6ae
test(security): redact old peer value and fail-closed on Actions vari…
babico Oct 14, 2026
e0cd1a1
test(security): assert both stdout and stderr never disclose Telegram…
babico Oct 14, 2026
7f7f88e
security(p1): migrate existing Actions channel ID to Secret without p…
babico Oct 14, 2026
43f8bec
test(security): import already stored Actions peer silently and rejec…
babico Oct 14, 2026
13cc29e
docs(security): one-command non-echoing migration from existing peer …
babico Oct 14, 2026
b70d071
fix(p1): recheck distributed Telegram 429 after shared SQL slot sleep…
babico Oct 14, 2026
3c1827d
test(p1): late cross-worker 429 cannot bypass prebooked send slot, va…
babico Oct 14, 2026
9fd3ff8
fix(p1): operator lost-ACK receipt applies only while its original SQ…
babico Oct 14, 2026
44e6229
fix(p1): enforce immutable pre-send fence during independent Telegram…
babico Oct 14, 2026
5ce548c
fix(p1): publish shared Bot send-slot 429 and sleeping-worker cooldow…
babico Oct 14, 2026
f2540f8
test(p1): prevent stale independently verified Bot ACK from resurrect…
babico Oct 14, 2026
6d76835
test(p1): SQL trigger fault proves atomic shared Telegram 429 rollbac…
babico Oct 14, 2026
ac163aa
fix(p1): bound legacy cutover scan memory and reject source-tree addi…
babico Oct 14, 2026
6210269
test(p1): late legacy source arrival and bounded enumeration deny fal…
babico Oct 14, 2026
098ddca
test(p1): real PostgreSQL/MySQL sessions observe 429 issued after res…
babico Oct 14, 2026
97162bf
ci(p1): final distributed 429 atomicity, cutover and ACK race accepta…
babico Oct 14, 2026
b2f5e1e
fix(p1): verify GitHub bot ID variable deletion and fail closed on un…
babico Oct 14, 2026
5ccd9e1
test(p1): assert secret migration fail-closed and re-check variable d…
babico Oct 14, 2026
e240037
test(p1): exercise real 19 MiB Telegram download boundary opt-in
babico Oct 14, 2026
0b1a044
docs(p1): document verified redacted bot ID secret migration
babico Oct 14, 2026
9f33161
docs(p1): refresh bot secret migration and live test acceptance bound…
babico Oct 14, 2026
c3e77db
fix(p1): allow secure Telegram ID migration without Telethon installed
babico Oct 14, 2026
a35a591
test(p1): exercise GitHub-only bot secret migration with Python -S
babico Oct 14, 2026
3a316cb
fix(p1): enforce shared Telegram 429 cooldown with zero local throttle
babico Oct 14, 2026
7e8ef1d
test(p1): multi-session server cooldown with disabled local Bot pacing
babico Oct 14, 2026
9e4a306
docs(p1): record zero-gap cross-worker Telegram 429 regression coverage
babico Oct 14, 2026
c141201
merge(main): reconcile E2E workflow with hardened P1 branch
babico Oct 14, 2026
3f4ead6
fix(p1): avoid GitHub CLI variable pagination hiding unmasked bot target
babico Oct 14, 2026
06af1c5
test(p1): detect Bot ID in GitHub Actions variable pagination
babico Oct 14, 2026
e1f51a4
fix(p1): use supported GitHub CLI variable list options
babico Oct 14, 2026
dde5a03
test(p1): validate large Actions variable listing with supported CLI …
babico Oct 14, 2026
9d9e146
Merge TeleDrive P1 storage and E2E hardening (#4)
babico Oct 14, 2026
7908238
ci(p1): run database-ci.yml on every commit for immutable SHA acceptance
babico Oct 14, 2026
6f632d9
ci(p1): run desktop-ci.yml on every commit for immutable SHA acceptance
babico Oct 14, 2026
ee0d028
ci(p1): run storage-api-ci.yml on every commit for immutable SHA acce…
babico Oct 14, 2026
92ef867
ci(p1): run release.yml on every commit for immutable SHA acceptance
babico Oct 14, 2026
142e638
ci(p1): consolidate mainline workflows and serialize Bot writers acro…
babico Oct 14, 2026
7e6cdd0
test(ci): enforce all-SHA gates, full test inventory, shared live cha…
babico Oct 14, 2026
18dc8bc
ci(e2e): serialize real Telegram test channel across workflows and br…
babico Oct 14, 2026
7e6a1fe
ci(e2e): serialize real Telegram test channel across workflows and br…
babico Oct 14, 2026
413d506
ci(e2e): serialize real Telegram test channel across workflows and br…
babico Oct 14, 2026
c927f8a
docs(p1): record real Bot E2E success and full-SHA CI audit
babico Oct 14, 2026
ce733b0
fix(ci): avoid GitHub pending E2E cancellation while isolating bot wo…
babico Oct 14, 2026
07cb5df
fix(ci): avoid GitHub pending E2E cancellation while isolating bot wo…
babico Oct 14, 2026
1acb3e3
fix(ci): avoid GitHub pending E2E cancellation while isolating bot wo…
babico Oct 14, 2026
4caef87
test(ci): prevent pending User/Bot E2E cancellation from shared GitHu…
babico Oct 14, 2026
3239f82
docs(ci): distinguish Bot and User E2E concurrency to prevent cancell…
babico Oct 14, 2026
163132e
merge(main): preserve merged P1 baseline while continuing CI hardening
babico Oct 14, 2026
08f137f
test(p1): verify live 5/16/19MiB multipart, ACK proof and mixed-size …
babico Oct 14, 2026
22e6ac3
fix(ci): remove stale path-filter assertions after P1 always-on gates…
babico Oct 14, 2026
2a6dafe
fix(p1): repair 19 MiB single-chunk E2E and retire stale CI branch tr…
babico Oct 14, 2026
fc582f4
Merge P1 CI hardening and 19 MiB E2E boundary fix (#5)
babico Oct 14, 2026
243d691
ci(p1): isolate one-shot real PostgreSQL/Bot multiworker acceptance […
babico Oct 14, 2026
900ab49
test(p1): validate 5/16/19 MiB SQL restart and live acceptance [p0-li…
babico Oct 14, 2026
13cdefb
feat(p2): fail-closed GC previews for unresolved Telegram Bot ACK own…
babico Oct 14, 2026
7e6510f
feat(p2): account for Bot ACK orphan messages in GC admin audit
babico Oct 14, 2026
294717a
fix(p2): return fail-closed 409 for incomplete Bot reconciliation GC …
babico Oct 14, 2026
5b32b45
fix(p1): rehash all legacy sources after Telegram verification and fo…
babico Oct 14, 2026
1f3bcff
fix(p1): revalidate live HEAD generation and durable job after legacy…
babico Oct 14, 2026
9688acc
feat(p1): durable shared SQL Telegram 429 evidence counter and redact…
babico Oct 14, 2026
f048e64
test(p1): verify durable Bot 429 evidence across PostgreSQL, MySQL an…
babico Oct 14, 2026
73135b0
feat(p1): guarded multi-host production soak evidence and native SQL …
babico Oct 14, 2026
973c45d
test(p1): rerun real three-process PostgreSQL and Telegram acceptance…
babico Oct 14, 2026
482b51e
feat(p1): interactive private production acceptance wizard with isola…
babico Oct 14, 2026
3bf9dd4
fix(p1): require -100 channel, preserve native DB passwords and fence…
babico Oct 14, 2026
f34ff32
test(p1): fix wizard fixture to use private session permissions and s…
babico Oct 14, 2026
8873e8a
feat(p1): Docker-first disposable development acceptance with real SQ…
babico Oct 14, 2026
a0aa7f3
fix(p1-dev): writable isolated config for secure startup and Docker f…
babico Oct 14, 2026
fc255a8
refactor(ci): make Docker fault injection reusable across all roadmap…
babico Oct 14, 2026
1f32159
fix(p1-dev): reserve shared SQL Bot send slot before synthetic Docker…
babico Oct 14, 2026
89d8dae
fix(p1-dev): generate complete Web config and preflight both Docker n…
babico Oct 14, 2026
c9e7cb6
test(p1): extend disposable Docker acceptance with real SIGKILL, PG r…
babico Oct 14, 2026
69309e9
fix(ci): fail Docker development acceptance when evidence verificatio…
babico Oct 14, 2026
d9c9593
ci(p1): run real Telegram PostgreSQL multiworker E2E on main pushes
babico Oct 14, 2026
c17d9a2
test(ci): align P1 multiworker workflow assertions with automatic mai…
babico Oct 14, 2026
72e5e7c
fix(ci): separate Telegram multiworker queue to prevent pending job c…
babico Oct 14, 2026
4caafc9
test(ci): assert independent live multiworker concurrency group
babico Oct 14, 2026
a7e3adf
fix(ci): update remaining live-worker concurrency regression assertion
babico Oct 14, 2026
4e5d325
ci(ui): group workflows by purpose and add per-job run summaries
babico Oct 14, 2026
cd5c808
fix(ci): deduplicate release build job name after CI display regrouping
babico Oct 14, 2026
a1b597f
docs: close bounded P0/P1 development acceptance and consolidate P2 b…
babico Oct 14, 2026
4554003
release: prepare v1.0.7 with verified P0/P1 same-SHA publishing gate
babico Oct 14, 2026
7477476
release: request CI-gated v1.0.7 publication [publish-release]
babico Oct 14, 2026
3582913
fix(gc): refuse destructive cleanup when historical SQL or bot ACK re…
babico Oct 14, 2026
f34192c
feat(dr): verify original Telegram chunks and rebuild isolated catalo…
babico Oct 14, 2026
fc0aa7f
feat(ops): dual-attested fail-closed production evidence bundle verifier
babico Oct 14, 2026
3d0ac9c
fix(validation): anchor SHA-256 and source commit regexes correctly
babico Oct 14, 2026
e6fef85
fix(validation): anchor SHA-256 and source commit regexes correctly
babico Oct 14, 2026
36eb9af
feat(dr): require Telegram marker proof and add original-session rebu…
babico Oct 14, 2026
4106123
docs: consolidate production runbook, P2 recovery scope and release s…
babico Oct 14, 2026
a1faaa0
feat(p2): add opt-in one-hour isolated capacity soak and truthful lat…
babico Oct 14, 2026
ef0c93a
fix(gc): preserve dry-run preview and recheck SQL references before e…
babico Oct 14, 2026
2436f07
feat(p2): atomic multi-object Telegram rebuild with full proof and bo…
babico Oct 14, 2026
35d5b8d
test(dr): enforce private atomic publication and rollback on partial …
babico Oct 14, 2026
27d53c8
feat(p2): retain synthetic Telegram data and rehearse SQL restart rec…
babico Oct 14, 2026
2650cc8
test(dr): use equal-length tampered chunk to exercise SHA mismatch br…
babico Oct 14, 2026
54b1895
docs: consolidate CI and P0-P2 acceptance into two guides; remove spl…
babico Oct 14, 2026
e3bfcc9
refactor(repo): group CI workflows, relocate Docker assets and securi…
babico Oct 14, 2026
b24f30e
test(ci): inspect dependency entries rather than comments in split ma…
babico Oct 14, 2026
d882e2c
feat(docker): serve Web, REST, and S3 from one container and verify s…
babico Oct 14, 2026
d8c1abb
fix(security): bind unified server to loopback unless Docker explicit…
babico Oct 14, 2026
aa44bd6
fix(storage): bounded SHA-checked re-download for transient Telegram …
babico Oct 14, 2026
9d6a010
docs: standardize all public guides in English and enforce documentat…
babico Oct 14, 2026
43bd7b7
feat(recovery): add bounded read-only Telegram history candidate inve…
babico Oct 14, 2026
d9f6410
feat(gc): harden retention graph and automate Telegram inventory CI
babico Oct 14, 2026
c341559
fix(gc): protect remote cleanup against outstanding writer leases
babico Oct 14, 2026
57e1036
feat(recovery): compare untrusted history candidates against external…
babico Oct 14, 2026
32e42f0
test(recovery): live independent-plan restore and optional inventory …
babico Oct 14, 2026
e1d7f56
fix(gc): include unattributed Bot file IDs in read-only audit and tes…
babico Oct 14, 2026
52db8fc
feat(s3): support safe immutable bucket versioning control API
babico Oct 14, 2026
3cb96a3
test(s3): verify bucket versioning SDK checksums and selector isolation
babico Oct 14, 2026
2abff5a
feat(s3): enforce private-only bucket Public Access Block API
babico Oct 14, 2026
8cf1c7a
feat(unified): expose lease-fenced legacy ingestion in single-contain…
babico Oct 14, 2026
fcecba3
fix(s3): return immutable VersionId after PutObject publication
babico Oct 14, 2026
449243d
feat(s3): safe lifecycle configuration and hourly SQL-only MPU abort
babico Oct 14, 2026
587835f
docs: add full S3 operation compatibility matrix and P2 advanced roadmap
babico Oct 14, 2026
3238b5a
docs: link S3 compatibility matrix from project guides
babico Oct 14, 2026
cf198cf
docs: link S3 compatibility matrix from project guides
babico Oct 14, 2026
e381a82
docs: reference P2 S3 compatibility backlog
babico Oct 14, 2026
6cb2677
test(lifecycle): retain staged Telegram chunks after SQL-only abort
babico Oct 14, 2026
7e10c99
docs(s3): align 116-operation matrix with safe lifecycle subset
babico Oct 14, 2026
aa1ab29
feat(s3): fail-closed subresource routing and 116-operation compatibi…
babico Oct 14, 2026
8866f62
test(s3): allow empty HTTP HEAD error response bodies
babico Oct 14, 2026
3839449
fix(s3): reject unsupported governance and SSE headers on all HTTP me…
babico Oct 14, 2026
d6984e5
feat(s3): private-only GetBucketPolicyStatus with scoped boto3 coverage
babico Oct 14, 2026
9a0a989
fix(s3): validate CLI checksum-mode using immutable SHA-256 on reads
babico Oct 14, 2026
cef1ca0
test(s3): distinguish valid checksum-mode from unsupported headers
babico Oct 14, 2026
36be4f4
fix(s3): classify invalid V1/V2 cursor combinations as HTTP 400
babico Oct 14, 2026
104fc50
feat(s3): complete bucket tagging 50-tag contract and repair Markdown…
babico Oct 14, 2026
af2d4f1
test(s3): require supported bucket tagging matrix coverage in both CI…
babico Oct 14, 2026
dadad58
test(s3): import pytest in bucket tagging boto3 regression
babico Oct 14, 2026
f82b10c
feat(s3): complete private-region ListBuckets pagination and signed c…
babico Oct 14, 2026
cfb9121
test(s3): initialize bucket schema and align root prefix guard with L…
babico Oct 14, 2026
986d3c9
docs(s3): repair split operation matrix and enforce Markdown table in…
babico Oct 14, 2026
64ee4c5
test(docs): correct Markdown delimiter assertions without fragile reg…
babico Oct 14, 2026
ec01607
feat(s3): enrich GetObjectAttributes for checksum and historical vers…
babico Oct 15, 2026
868778e
feat(s3): support immutable multipart GetObjectAttributes (#7)
babico Oct 15, 2026
e151a0d
feat(s3): supported multipart listings and owner-local acceptance pla…
babico Oct 15, 2026
2463942
feat(storage): authenticated-user MTProto unified transport (#9)
babico Oct 15, 2026
63f5d30
fix(live): initialize catalog schema for user-MTProto GC audit (#10)
babico Oct 15, 2026
d7fc6c0
feat(recovery): admin-only paginated user channel history (#11)
babico Oct 15, 2026
c2b7688
feat(storage): unified Telethon-only transport and merged PR cleanup …
babico Oct 15, 2026
a430212
docs: audit Telethon-only status, remaining recovery gates, CI eviden…
babico Oct 15, 2026
2b7e201
feat(recovery): read-only Telethon USER original-media DR without Bot…
babico Oct 15, 2026
1b3f19c
test(recovery): Telethon USER read-only DR, wrong-channel and bot-ses…
babico Oct 15, 2026
68379a3
feat(gc): fence active durable upload jobs in the reference graph
babico Oct 15, 2026
f31aed0
test(recovery): fence durable jobs and MTProto intents from physical …
babico Oct 15, 2026
cb21336
refactor(telethon-only): remove Bot transport from storage, GC, recov…
babico Oct 15, 2026
6f3aaa7
feat(telethon-only): MTProto rate guard, flood journal and test conve…
babico Oct 15, 2026
3a748af
refactor(telethon-only): convert scripts, workflows and CI contracts …
babico Oct 15, 2026
56813a8
docs(release): drop Bot workflow from release matrix and owner runbook
babico Oct 15, 2026
1e4d4cb
Merge pull request #15 from babico/feat/telethon-only
babico Oct 15, 2026
02c83cc
refactor(service-only): remove the desktop application and unify requ…
babico Oct 15, 2026
643b148
Merge pull request #16 from babico/feat/service-only-no-desktop
babico Oct 15, 2026
a9be9b9
feat(mtproto): multiple api_id/api_hash credential sets with rotation
babico Oct 15, 2026
cf00113
chore: remove the original author's marketing website from this fork
babico Oct 15, 2026
0c0947c
Merge pull request #17 from babico/feat/multi-mtproto-credentials
babico Oct 15, 2026
938f01e
Merge pull request #18 from babico/feat/remove-website
babico Oct 15, 2026
a8ca12f
refactor(layout): regroup tests into s3/storage/web/e2e/meta and scri…
babico Oct 15, 2026
4b57a46
refactor(layout): regroup tests and scripts; fix release packaging af…
babico Oct 15, 2026
6caab3f
fix(e2e): resolve multiworker test channel by name or numeric target
babico Oct 15, 2026
a36f9a5
docs: point owner-runbook script path at scripts/ops
babico Oct 15, 2026
57bf06e
docs(status): reflect merged Telethon-only, service-only and layout c…
babico Oct 15, 2026
0067930
docs(todo): mark Telethon-only purge and owner directives complete
babico Oct 15, 2026
331aea1
fix(fault): resolve repository root from the scripts/dev runner location
babico Oct 15, 2026
357a24a
docs: seven-workflow matrix; update USER-MTProto DR wording in runbook
babico Oct 15, 2026
a24b49b
docs(contributing): point fault-injection command at scripts/dev
babico Oct 15, 2026
bd9ad5c
Merge pull request #19 from babico/feat/regroup-layout
babico Oct 15, 2026
413b561
fix(live): serialize USER session connections across multiworker E2E …
babico Oct 15, 2026
00da769
fix(live): repair embedded multiworker worker script and add compile …
babico Oct 15, 2026
851ba93
fix(live): worker runtime construction and end-to-end fake-telethon r…
babico Oct 15, 2026
819f867
fix(live): tolerate Telegram flood waits and isolate fake-telethon env
babico Oct 15, 2026
e3411e7
fix(live): enable flood auto-sleep in the embedded worker client
babico Oct 15, 2026
d1418dc
fix(live): single event-loop scope for the parent readback client
babico Oct 15, 2026
ead6c5a
feat(config): storage section with apis list and tidy root config tem…
babico Oct 16, 2026
14586bc
fix(config): default config lookup path for baremetal deployments
babico Oct 16, 2026
37c0a4e
Merge pull request #20 from babico/feat/docs-refresh
babico Oct 16, 2026
15ee0b2
docs(todo): track the config-only settings overhaul
babico Oct 16, 2026
610cbe8
feat(config-only): all service settings from config.yaml; parallel st…
babico Oct 16, 2026
381b427
fix(ci): fault harness writes config-only settings; bandit B104 exemp…
babico Oct 16, 2026
8352a6e
fix(ci): smoke container now receives its settings via config mount
babico Oct 16, 2026
9be0142
fix(settings): accept empty db_extra_packages default
babico Oct 16, 2026
881e682
fix(web): dynamic trusted-host check and mount-friendly config hardening
babico Oct 16, 2026
9180cac
fix(config): no legacy default account for explicit empty accounts lists
babico Oct 16, 2026
484dbf2
feat(config-only): strategies single/parallel and verification
babico Oct 17, 2026
4f826f9
fix(config): absolute default log path under /data
babico Oct 17, 2026
42b9bfd
fix(ci): smoke container needs writable /data for SQLite state
babico Oct 17, 2026
8ce2964
Merge pull request #21 from babico/feat/docs-refresh
babico Oct 17, 2026
7c5510c
fix(e2e): user live test config uses the storage section
babico Oct 17, 2026
9608bb1
feat(gc): complete non-destructive GC machinery (plan/verify_plan + r…
babico Oct 20, 2026
f06e39e
feat(test): add large-file S3 round-trip acceptance script (100 MiB–4…
babico Oct 20, 2026
cedd1cb
feat: remove legacy direct-send uploader; config-only settings stay i…
babico Oct 20, 2026
cf98e1a
merge: remove legacy direct-send uploader
babico Oct 20, 2026
59af1cb
docs: record legacy uploader removal (cf98e1a) and final SHA
babico Oct 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
.git
__pycache__
*.pyc
data
uploads
config
.env
dist
build

# Keep the runtime image context minimal
app/
scripts/
installer/
tests/
examples/
.github/
*.md
12 changes: 12 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Host process identity and timezone. The ONLY service settings that live
# here; every other setting comes from config/config.yaml (copy the
# config.example.yaml template). Do not commit real values.
PUID=1000
PGID=1000
TZ=Europe/Istanbul

# Host-side bind ports for the loopback port mapping. The service itself
# binds 0.0.0.0 inside the container; keep 127.0.0.1 unless a reverse
# proxy or private network explicitly publishes the ports.
TELEDRIVE_WEB_PORT=8080
TELEDRIVE_S3_PORT=9000
9 changes: 9 additions & 0 deletions .github/ci/fault-injection/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM python:3.12.14-slim@sha256:eeb8088e67610b37583880c7627e3931f087cba55a35810819e34a398f624a47
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PYTHONPATH=/app
WORKDIR /app
COPY requirements.txt /app/requirements-server.txt
RUN pip install --no-cache-dir -r /app/requirements-server.txt
COPY teledrive /app/teledrive
COPY scripts /app/scripts
COPY tests /app/tests
USER 10001:10001
20 changes: 20 additions & 0 deletions .github/ci/fault-injection/Dockerfile.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
.git
__pycache__/
*.pyc
data/
uploads/
config/
.env
*.session
*.session-journal
*.log
dist/
build/
.venv/
website/
app/
installer/
examples/
.github/
*.md
.docker-fault-evidence/
87 changes: 87 additions & 0 deletions .github/ci/fault-injection/compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
# Compose file is under .github/ci/fault-injection; ../../.. is the repo root.
# Isolated Docker fault-injection and acceptance test ONLY. No host ports, no production credentials,
# no real Telegram messages, unique Compose project/ephemeral workspace.
x-web: &web
build:
context: ../../..
dockerfile: Dockerfile
user: "${TELEDRIVE_FAULT_UID:?}:${TELEDRIVE_FAULT_GID:?}"
read_only: true
cap_drop: [ALL]
security_opt: ["no-new-privileges:true"]
environment: &web-env
TELEDRIVE_CONFIG: /config/config.yaml
# All other settings live in /config/config.yaml generated by the runner.
depends_on:
postgres:
condition: service_healthy
networks: [dev-isolated]
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request;urllib.request.urlopen('http://127.0.0.1:8080/api/health',timeout=4)"]
interval: 5s
timeout: 5s
retries: 24
start_period: 15s

services:
postgres:
image: postgres:17-alpine
environment:
POSTGRES_USER: teledrive
POSTGRES_DB: teledrive_dev
POSTGRES_PASSWORD: ${TELEDRIVE_FAULT_DB_PASSWORD:?}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U teledrive -d teledrive_dev"]
interval: 3s
timeout: 3s
retries: 30
networks: [dev-isolated]
volumes:
- db-state:/var/lib/postgresql/data
security_opt: ["no-new-privileges:true"]
# No ports: never expose the test database on the host.
web-a:
<<: *web
volumes:
- ${TELEDRIVE_FAULT_WORKSPACE:?}/config:/config
- ${TELEDRIVE_FAULT_WORKSPACE:?}/web-a:/data
- ${TELEDRIVE_FAULT_WORKSPACE:?}/uploads:/uploads:ro
web-b:
<<: *web
volumes:
- ${TELEDRIVE_FAULT_WORKSPACE:?}/config:/config
- ${TELEDRIVE_FAULT_WORKSPACE:?}/web-b:/data
- ${TELEDRIVE_FAULT_WORKSPACE:?}/uploads:/uploads:ro
scenarios:
build:
context: ../../..
dockerfile: .github/ci/fault-injection/Dockerfile
user: "${TELEDRIVE_FAULT_UID:?}:${TELEDRIVE_FAULT_GID:?}"
depends_on:
postgres:
condition: service_healthy
web-a:
condition: service_healthy
web-b:
condition: service_healthy
environment:
TELEDRIVE_FAULT_DB_URL: postgresql+psycopg://teledrive:${TELEDRIVE_FAULT_DB_PASSWORD:?}@postgres:5432/teledrive_dev
TELEDRIVE_FAULT_RESTORED_DB_URL: postgresql+psycopg://teledrive:${TELEDRIVE_FAULT_DB_PASSWORD:?}@postgres:5432/teledrive_restore
TELEDRIVE_FAULT_WEB_PASSWORD: ${TELEDRIVE_FAULT_WEB_PASSWORD:?}
TELEDRIVE_FAULT_REMOTE_DIR: /work-data/remote
TELEDRIVE_FAULT_EVIDENCE_DIR: /work-data/evidence
TELEDRIVE_FAULT_SOURCES: /work-data/sources
volumes:
- ${TELEDRIVE_FAULT_WORKSPACE:?}/scenario:/work-data
networks: [dev-isolated]
security_opt: ["no-new-privileges:true"]
cap_drop: [ALL]
read_only: true
tmpfs:
- /tmp:rw,nosuid,nodev,size=128m
entrypoint: ["python", "scripts/dev/docker_fault_scenarios.py"]
networks:
dev-isolated:
internal: true
volumes:
db-state:
17 changes: 17 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
213 changes: 213 additions & 0 deletions .github/workflows/delivery-release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
name: 05 · Delivery | Release Gate & Packages

on:
push:
tags:
- "v*.*.*"
# On these branch updates validate the release gate without publishing.
branches:
- main

permissions:
contents: read

jobs:
verify:
name: Release gate · regression and security
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- name: Check out source and history
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
with:
fetch-depth: 0
persist-credentials: false
- name: Require release tags to point into main
if: github.ref_type == 'tag'
shell: bash
run: |
set -euo pipefail
git show-ref --verify --quiet refs/remotes/origin/main
if ! git merge-base --is-ancestor HEAD refs/remotes/origin/main; then
echo "::error::Release tag does not point to a commit reachable from main"
exit 1
fi
- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1
with:
python-version: "3.13"
cache: pip
cache-dependency-path: requirements.txt
- name: Install test runtime
run: |
python -m pip install -r requirements.txt
python -m pip install pytest httpx bandit pip-audit boto3
python -m pip check
- name: Compile application
run: python -m compileall -q teledrive web tests
- name: Offline storage, API, recovery and security regression tests
run: |
python -m pytest -q \
tests/web/test_security.py tests/web/test_openapi.py \
tests/storage/test_storage_engine.py \
tests/storage/test_storage_recovery.py tests/storage/test_storage_rebuild.py tests/storage/test_storage_pending_admin.py tests/storage/test_storage_jobs.py tests/storage/test_storage_versions.py tests/storage/test_storage_ops_health.py tests/meta/test_host_soak.py tests/meta/test_acceptance_cli.py tests/storage/test_storage_gc_retention.py tests/s3/test_s3_version_reads.py tests/storage/test_storage_catalog.py \
tests/storage/test_storage_user_mode.py tests/storage/test_mtproto_rate_guard.py tests/storage/test_mtproto_multi_credentials.py tests/storage/test_telegram_dr_rehearsal.py tests/meta/test_production_bundle.py tests/meta/test_capacity_probe.py tests/storage/test_legacy_cutover_acceptance.py tests/storage/test_telegram_target_resolution.py tests/meta/test_ci_workflows.py tests/meta/test_release_matrix.py \
tests/web/test_api_keys.py tests/web/test_rest_api.py tests/web/test_rest_transfer.py tests/web/test_unified_service.py \
tests/s3/test_s3_fail_closed.py tests/s3/test_s3_contract.py tests/storage/test_metadata_backup.py tests/storage/test_storage_sigkill.py tests/storage/test_metadata_snapshot_rehearsal.py tests/s3/test_s3_multipart_preconditions.py
- name: Security checks
run: |
bandit -q -r teledrive web -ll
pip-audit -r requirements.txt

- name: Publish CI run summary
if: always()
shell: bash
run: |
echo '### 05 · Delivery | Release Gate & Packages' >> "$GITHUB_STEP_SUMMARY"
echo '| Detail | Value |' >> "$GITHUB_STEP_SUMMARY"
echo '| --- | --- |' >> "$GITHUB_STEP_SUMMARY"
echo '| Scope | Mainline release gate; no publishing on branch push |' >> "$GITHUB_STEP_SUMMARY"
echo '| Result | ${{ job.status }} |' >> "$GITHUB_STEP_SUMMARY"
printf '| Ref | %s |\n' "$GITHUB_REF_NAME" >> "$GITHUB_STEP_SUMMARY"
printf '| Commit | %s |\n' "$GITHUB_SHA" >> "$GITHUB_STEP_SUMMARY"

cleanup-merged-branches:
name: Housekeeping · delete merged PR branches
needs: verify
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
timeout-minutes: 5
permissions:
contents: write
pull-requests: read
steps:
- name: Checkout reviewed cleanup script
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
with:
persist-credentials: false
- name: Remove only closed and merged same-head PR branches
env:
GH_TOKEN: ${{ github.token }}
run: python scripts/ops/cleanup_merged_branches.py --execute
- name: Publish CI run summary
if: always()
shell: bash
run: |
echo '### 05 · Housekeeping | Merged PR branches' >> "$GITHUB_STEP_SUMMARY"
echo '| Detail | Value |' >> "$GITHUB_STEP_SUMMARY"
echo '| --- | --- |' >> "$GITHUB_STEP_SUMMARY"
echo '| Scope | Deleted only verified merged, unchanged and unprotected branches |' >> "$GITHUB_STEP_SUMMARY"
echo '| Result | ${{ job.status }} |' >> "$GITHUB_STEP_SUMMARY"
printf '| Ref | %s |\\n' "$GITHUB_REF_NAME" >> "$GITHUB_STEP_SUMMARY"
printf '| Commit | %s |\\n' "$GITHUB_SHA" >> "$GITHUB_STEP_SUMMARY"

build:
name: Package · single-container Docker image
needs: verify
if: github.ref_type == 'tag' || (github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[publish-release]'))
runs-on: ubuntu-latest
steps:
- name: Check out source
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
with:
persist-credentials: false

- name: Build the single teledrive service image
shell: bash
run: |
mkdir -p dist
docker build -t teledrive:service .
docker save -o dist/teledrive-service-image.tar teledrive:service

- name: Upload package artifact
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: TeleDrive-docker-image
path: dist/teledrive-service-image.tar
if-no-files-found: error

- name: Publish CI run summary
if: always()
shell: bash
run: |
echo '### 05 · Delivery | Release Gate & Packages' >> "$GITHUB_STEP_SUMMARY"
echo '| Detail | Value |' >> "$GITHUB_STEP_SUMMARY"
echo '| --- | --- |' >> "$GITHUB_STEP_SUMMARY"
echo '| Scope | Single-container Docker image package |' >> "$GITHUB_STEP_SUMMARY"
echo '| Result | ${{ job.status }} |' >> "$GITHUB_STEP_SUMMARY"
printf '| Ref | %s |\n' "$GITHUB_REF_NAME" >> "$GITHUB_STEP_SUMMARY"
printf '| Commit | %s |\n' "$GITHUB_SHA" >> "$GITHUB_STEP_SUMMARY"

publish:
name: Publish · GitHub Release
needs: build
if: github.event_name == 'push' && (github.ref_type == 'tag' || (github.ref == 'refs/heads/main' && contains(github.event.head_commit.message, '[publish-release]')))
runs-on: ubuntu-latest
timeout-minutes: 25
permissions:
contents: write
actions: read
steps:
- name: Checkout approved release source
uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09
with:
persist-credentials: false

- name: Verify complete same-SHA P0/P1 matrix
if: github.ref_type != 'tag'
shell: bash
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
ready=0
for attempt in $(seq 1 30); do
gh api "repos/${GITHUB_REPOSITORY}/actions/runs?head_sha=${GITHUB_SHA}&per_page=100" > "$RUNNER_TEMP/release-runs.json"
set +e
python scripts/ops/check_release_matrix.py --input "$RUNNER_TEMP/release-runs.json" --sha "$GITHUB_SHA"
result=$?
set -e
if [[ "$result" -eq 0 ]]; then ready=1; break; fi
if [[ "$result" -eq 1 ]]; then exit 1; fi
sleep 20
done
if [[ "$ready" -ne 1 ]]; then echo "::error::Release blocked: incomplete same-SHA acceptance"; exit 1; fi

- name: Download built packages
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093
with:
path: release-assets
merge-multiple: true

- name: Publish release and attach packages
env:
GH_TOKEN: ${{ github.token }}
run: |
set -euo pipefail
version="$(python -c 'import tomllib; print(tomllib.load(open("pyproject.toml","rb"))["project"]["version"])')"
tag="v$version"
if [[ "$GITHUB_REF_TYPE" == "tag" && "$GITHUB_REF_NAME" != "$tag" ]]; then
echo "::error::Tag/version mismatch"; exit 1
fi
if gh release view "$tag" --repo "$GITHUB_REPOSITORY" >/dev/null 2>&1; then
if [[ "$GITHUB_REF_TYPE" != "tag" ]]; then
echo "::error::Existing release cannot be overwritten"; exit 1
fi
gh release upload "$tag" release-assets/* --repo "$GITHUB_REPOSITORY" --clobber
else
gh release create "$tag" release-assets/* \
--repo "$GITHUB_REPOSITORY" --target "$GITHUB_SHA" \
--generate-notes \
--title "TeleDrive $tag"
fi
- name: Publish CI run summary
if: always()
shell: bash
run: |
echo '### 05 · Delivery | Release Gate & Packages' >> "$GITHUB_STEP_SUMMARY"
echo '| Detail | Value |' >> "$GITHUB_STEP_SUMMARY"
echo '| --- | --- |' >> "$GITHUB_STEP_SUMMARY"
echo '| Scope | Version-tagged GitHub release assets |' >> "$GITHUB_STEP_SUMMARY"
echo '| Result | ${{ job.status }} |' >> "$GITHUB_STEP_SUMMARY"
printf '| Ref | %s |\n' "$GITHUB_REF_NAME" >> "$GITHUB_STEP_SUMMARY"
printf '| Commit | %s |\n' "$GITHUB_SHA" >> "$GITHUB_STEP_SUMMARY"
Loading