Fix engine daemon exit and UI DuckDB access
- 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:
@@ -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 \
|
||||
|
||||
31
docker-compose.override.yml
Normal file
31
docker-compose.override.yml
Normal 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
|
||||
@@ -58,6 +58,9 @@ dependencies = [
|
||||
"structlog>=24.1.0",
|
||||
"rich>=13.7.0",
|
||||
|
||||
# Redis
|
||||
"redis>=5.0.0",
|
||||
|
||||
# HTTP client
|
||||
"httpx>=0.26.0",
|
||||
]
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user