Integrates the CFTC Disaggregated Commitments of Traders reports
(com_disagg_txt_YYYY.zip) which break positions down by Producer/Merchant,
Swap Dealers, Managed Money, and Other Reportables — a different report
type from the existing legacy COT data.
- schema.sql: add disagg_reports, disagg_positions, disagg_concentration tables
- parser.py: add DisaggPositionRow/DisaggBlock dataclasses and
parse_disagg_csv_text()/parse_disagg_zip_file() for c_year.txt format
- importer.py: add import_disagg_block(), import_disagg_zip_file(),
run_disagg_historical_import() for 2019–2026 yearly ZIPs
- cli.py: add import-disagg-history subcommand
- docker-compose.yaml: run import-disagg-history on startup (idempotent
via import_log, so re-deploys skip already-imported years)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Without joining the external 'coolify' network, Traefik cannot reach
the container and the reverse proxy returns 502.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Coolify handles reverse proxying internally, so binding to a host port
is unnecessary and causes conflicts. expose makes port 8000 available
within the Docker network without publishing it to the host.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>