Fix engine daemon exit and UI DuckDB access
All checks were successful
CI/CD Pipeline / test (push) Successful in 1m43s
CI/CD Pipeline / build-engine (push) Has been skipped
CI/CD Pipeline / build-ui (push) Has been skipped

- Add if __name__ == '__main__' guard to main.py (engine exited immediately)
- Update Dockerfile TA-Lib build for ARM64 (config.guess/config.sub)
- Add redis dependency to pyproject.toml
- Add docker-compose.override.yml for local dev with source mounting
- Remove :ro from UI engine volume mount (DuckDB needs write for WAL)
This commit is contained in:
bnair123
2025-12-27 23:27:33 +04:00
parent 2f065df1e9
commit 007633660c
4 changed files with 45 additions and 7 deletions

View File

@@ -11,12 +11,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
wget \
curl \
dpkg-dev \
&& rm -rf /var/lib/apt/lists/*
# Install TA-Lib C library
# Install TA-Lib C library (with ARM64 support)
RUN wget -q http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz \
&& tar -xzf ta-lib-0.4.0-src.tar.gz \
&& cd ta-lib \
&& wget -q -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' \
&& wget -q -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' \
&& ./configure --prefix=/usr \
&& make \
&& make install \

View File

@@ -0,0 +1,31 @@
# Local development override - mounts source code for hot reload
x-engine-image: &engine-image
image: tf-engine:local
x-ui-image: &ui-image
image: tf-ui:local
services:
engine:
<<: *engine-image
volumes:
- /Users/bnair/Documents/Crypto/engine:/data/engine
- /Users/bnair/Documents/Crypto/shared:/data/shared
- /Users/bnair/Documents/TradeFinder/src:/app/src:ro
user: root
ui:
<<: *ui-image
volumes:
- /Users/bnair/Documents/Crypto/engine:/data/engine # DuckDB needs write access for WAL
- /Users/bnair/Documents/Crypto/shared:/data/shared
- /Users/bnair/Documents/TradeFinder/src:/app/src:ro
user: root
optimizer:
<<: *engine-image
user: root
backtester:
<<: *engine-image
user: root

View File

@@ -58,6 +58,9 @@ dependencies = [
"structlog>=24.1.0",
"rich>=13.7.0",
# Redis
"redis>=5.0.0",
# HTTP client
"httpx>=0.26.0",
]

View File

@@ -396,21 +396,18 @@ async def _determine_equity(settings: Settings, adapter: BinanceUSDMAdapter | No
def _register_signal_handlers(shutdown_event: asyncio.Event) -> None:
"""Register signal handlers that trigger a graceful shutdown."""
loop = asyncio.get_running_loop()
def _handle(sig: signal.Signals) -> None:
logger.info("Shutdown signal received", signal=sig.name)
shutdown_event.set()
def _handle_signal(signum: int, frame: object) -> None:
shutdown_event.set()
for sig in (signal.SIGINT, signal.SIGTERM):
try:
loop.add_signal_handler(sig, partial(_handle, sig))
except (NotImplementedError, RuntimeError):
signal.signal(sig, _handle_signal)
logger.debug("Registered async signal handler", signal=sig.name)
except (NotImplementedError, RuntimeError, OSError) as e:
logger.debug("Could not register async signal handler", signal=sig.name, error=str(e))
async def _sleep_or_cancel(delay: float, shutdown_event: asyncio.Event) -> None:
@@ -431,3 +428,7 @@ async def _initialize_adapter(adapter: BinanceUSDMAdapter, symbols: list[str]) -
await adapter.configure_hedge_mode(True)
for symbol in symbols:
await adapter.configure_margin_type(symbol, MarginType.ISOLATED)
if __name__ == "__main__":
main()