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 \
|
build-essential \
|
||||||
wget \
|
wget \
|
||||||
curl \
|
curl \
|
||||||
|
dpkg-dev \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& 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 \
|
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 \
|
&& tar -xzf ta-lib-0.4.0-src.tar.gz \
|
||||||
&& cd ta-lib \
|
&& 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 \
|
&& ./configure --prefix=/usr \
|
||||||
&& make \
|
&& make \
|
||||||
&& make install \
|
&& 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",
|
"structlog>=24.1.0",
|
||||||
"rich>=13.7.0",
|
"rich>=13.7.0",
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
"redis>=5.0.0",
|
||||||
|
|
||||||
# HTTP client
|
# HTTP client
|
||||||
"httpx>=0.26.0",
|
"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:
|
def _register_signal_handlers(shutdown_event: asyncio.Event) -> None:
|
||||||
"""Register signal handlers that trigger a graceful shutdown."""
|
"""Register signal handlers that trigger a graceful shutdown."""
|
||||||
|
|
||||||
loop = asyncio.get_running_loop()
|
loop = asyncio.get_running_loop()
|
||||||
|
|
||||||
def _handle(sig: signal.Signals) -> None:
|
def _handle(sig: signal.Signals) -> None:
|
||||||
logger.info("Shutdown signal received", signal=sig.name)
|
logger.info("Shutdown signal received", signal=sig.name)
|
||||||
shutdown_event.set()
|
shutdown_event.set()
|
||||||
|
|
||||||
def _handle_signal(signum: int, frame: object) -> None:
|
|
||||||
shutdown_event.set()
|
|
||||||
|
|
||||||
for sig in (signal.SIGINT, signal.SIGTERM):
|
for sig in (signal.SIGINT, signal.SIGTERM):
|
||||||
try:
|
try:
|
||||||
loop.add_signal_handler(sig, partial(_handle, sig))
|
loop.add_signal_handler(sig, partial(_handle, sig))
|
||||||
except (NotImplementedError, RuntimeError):
|
logger.debug("Registered async signal handler", signal=sig.name)
|
||||||
signal.signal(sig, _handle_signal)
|
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:
|
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)
|
await adapter.configure_hedge_mode(True)
|
||||||
for symbol in symbols:
|
for symbol in symbols:
|
||||||
await adapter.configure_margin_type(symbol, MarginType.ISOLATED)
|
await adapter.configure_margin_type(symbol, MarginType.ISOLATED)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|||||||
Reference in New Issue
Block a user