# Installing BTC Bot on Synology NAS Tested on Synology DS218+ (DSM 7.x, 2 GB RAM). The system runs three Docker containers: TimescaleDB, a data collector (WebSocket to Hyperliquid), and a FastAPI server with a web dashboard. ## Prerequisites 1. **Docker** -- install from Synology Package Center. 2. **SSH access** -- enable in DSM: Control Panel > Terminal & SNMP > Enable SSH. 3. **Git** (optional) -- install the Git Server package, or copy files manually. ## Step 1 -- Set NAS DNS Docker on Synology often can't resolve hostnames during image builds. Fix this before anything else: **DSM > Control Panel > Network > General tab > set DNS Server:** | Field | Value | |-------|-------| | Preferred DNS | `8.8.8.8` | | Alternate DNS | `8.8.4.4` | Click Apply. ## Step 2 -- Get the code onto the NAS SSH into the NAS and clone/copy the project: ```bash ssh your_user@nas_ip cd /volume1/homes/your_user # or wherever you prefer git clone btc_bot cd btc_bot ``` Or copy files via SMB/SCP to `/volume1/homes/your_user/btc_bot`. ## Step 3 -- Create directories ```bash sudo mkdir -p /volume1/btc_bot/{data,backups,logs,exports} ``` These are mounted as volumes by the containers. ## Step 4 -- Configure environment ```bash cp .env.example .env nano .env # or vi ``` At minimum, set a strong password for these two values: ``` DB_PASSWORD=your_secure_password_here API_SECRET_KEY=your_secret_key_here ``` The remaining values can stay at their defaults for data collection. ## Step 5 -- Build images The standard `docker-compose build` may fail with DNS errors inside the build container. Use `docker build` with `--network host` to bypass this: ```bash cd ~/btc_bot # Build both images (uses host network for DNS resolution) docker build --network host -f docker/Dockerfile.collector -t btc_collector . docker build --network host -f docker/Dockerfile.api -t btc_api . ``` If you make code changes later, re-run these two commands to rebuild. ## Step 6 -- Start services ```bash cd ~/btc_bot/docker docker-compose up -d --no-build ``` The `--no-build` flag tells compose to use the images you built in Step 5 instead of trying to build through its own (potentially broken) network. TimescaleDB will initialize the schema automatically from `docker/init-scripts/01-schema.sql` on first start. ## Step 7 -- Verify ```bash # Check all three containers are running docker-compose ps # Watch collector logs (Ctrl+C to stop) docker-compose logs -f data_collector # Check database health docker exec btc_timescale pg_isready -U btc_bot -d btc_data # Run the health check script bash ~/btc_bot/scripts/health_check.sh ``` The API dashboard is available at: **http://nas_ip:8000/dashboard** API docs (Swagger): **http://nas_ip:8000/docs** ## Setting up automated backups The backup script dumps the database every run and keeps 30 days of history. ### Option A -- DSM Task Scheduler (recommended) 1. Open DSM > Control Panel > Task Scheduler 2. Create > Scheduled Task > User-defined script 3. Set schedule: every 6 hours 4. User-defined script: ``` /bin/bash /volume1/homes/your_user/btc_bot/scripts/backup.sh ``` 5. Run as: `root` (needed for docker exec) ### Option B -- Cron (via SSH) ```bash sudo crontab -e ``` Add this line (runs every 6 hours): ``` 0 */6 * * * /bin/bash /volume1/homes/your_user/btc_bot/scripts/backup.sh >> /volume1/btc_bot/logs/backup.log 2>&1 ``` Backups are stored in `/volume1/btc_bot/backups/`. ## Setting up health monitoring Add another scheduled task (every 5 minutes) to check if everything is running: ``` /bin/bash /volume1/homes/your_user/btc_bot/scripts/health_check.sh ``` ## Common operations ### View logs ```bash cd ~/btc_bot/docker docker-compose logs -f data_collector # collector docker-compose logs -f api_server # API docker-compose logs -f timescaledb # database ``` ### Restart a single service ```bash cd ~/btc_bot/docker docker-compose restart data_collector ``` ### Stop everything ```bash cd ~/btc_bot/docker docker-compose down ``` ### Rebuild after code changes ```bash cd ~/btc_bot docker build --network host -f docker/Dockerfile.collector -t btc_collector . docker build --network host -f docker/Dockerfile.api -t btc_api . cd docker docker-compose up -d --no-build ``` ### Reset database (destroys all data) Only do this if you need a fresh schema: ```bash cd ~/btc_bot/docker docker-compose down -v docker-compose up -d --no-build ``` ### Restore from backup ```bash gunzip /volume1/btc_bot/backups/btc_data_YYYYMMDD_HHMM.dump.gz docker exec -i btc_timescale pg_restore -U btc_bot -d btc_data --clean < /volume1/btc_bot/backups/btc_data_YYYYMMDD_HHMM.dump ``` ## Resource usage The system is tuned for the DS218+ (2 GB RAM, dual-core): | Container | Memory limit | Typical usage | |-----------|-------------|---------------| | TimescaleDB | 1.5 GB | ~400-800 MB | | Data Collector | 256 MB | ~50-100 MB | | API Server | 512 MB | ~50-100 MB | PostgreSQL settings in `docker/timescaledb.conf` are optimized for this hardware. If running on a more powerful NAS, increase `shared_buffers` and `effective_cache_size` proportionally. ## Troubleshooting ### DNS errors during build Use `--network host` when building (Step 5). If it still fails, check that your NAS can resolve DNS from the host: ```bash nslookup pypi.org ``` If that fails, fix DNS in DSM (Step 1). ### Container keeps restarting ```bash docker logs btc_collector # check error output docker logs btc_api ``` Common causes: wrong `DB_PASSWORD` in `.env`, database not ready yet (wait 30 seconds after first start), or port 5432/8000 already in use. ### No data appearing 1. Check collector logs: `docker-compose logs data_collector` 2. Verify WebSocket connectivity: the NAS needs outbound access to `wss://api.hyperliquid.xyz/ws` (port 443) 3. Check database: `docker exec btc_timescale psql -U btc_bot -d btc_data -c "SELECT COUNT(*) FROM candles;"` ### Ports used | Port | Service | Direction | |------|---------|-----------| | 5432 | PostgreSQL | Internal (+ exposed to host) | | 8000 | API/Dashboard | Inbound from LAN | | 443 | PyPI, Hyperliquid WS | Outbound | | 53 | DNS | Outbound |