Supporto Docker/Unraid: build, healthcheck, docs
Aggiunti Dockerfile multi-stage, .dockerignore e docker-compose.yml per deployment containerizzato (con healthcheck, volumi persistenti, limiti risorse). Script di build per Linux/Mac e Windows. In Program.cs aggiunto endpoint /health e health checks per orchestrazione. Documentazione estesa: guide Unraid, quickstart Docker, workflow Git/DevOps, best practices su sicurezza, backup, monitoring. Progetto ora pronto per deploy e gestione professionale in ambienti Docker/Unraid.
This commit is contained in:
73
TradingBot/.dockerignore
Normal file
73
TradingBot/.dockerignore
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
# Build artifacts
|
||||||
|
**/bin/
|
||||||
|
**/obj/
|
||||||
|
**/out/
|
||||||
|
|
||||||
|
# Visual Studio
|
||||||
|
.vs/
|
||||||
|
.vscode/
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# Files
|
||||||
|
*.log
|
||||||
|
*.cache
|
||||||
|
*.swp
|
||||||
|
*~
|
||||||
|
|
||||||
|
# NuGet
|
||||||
|
*.nupkg
|
||||||
|
**/packages/*
|
||||||
|
!**/packages/build/
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# Test results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
*.trx
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# Node (se usato per build frontend)
|
||||||
|
node_modules/
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Documentation (opzionale - include se vuoi in produzione)
|
||||||
|
*.md
|
||||||
|
!README.md
|
||||||
|
|
||||||
|
# Git
|
||||||
|
.git/
|
||||||
|
.gitignore
|
||||||
|
.gitattributes
|
||||||
|
|
||||||
|
# Docker
|
||||||
|
Dockerfile
|
||||||
|
docker-compose*.yml
|
||||||
|
.dockerignore
|
||||||
|
|
||||||
|
# Temp files
|
||||||
|
*.tmp
|
||||||
|
*.temp
|
||||||
|
*.bak
|
||||||
|
|
||||||
|
# Local settings
|
||||||
|
appsettings.Development.json
|
||||||
|
**/appsettings.local.json
|
||||||
|
|
||||||
|
# IDE
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
141
TradingBot/DOCKER_QUICKSTART.md
Normal file
141
TradingBot/DOCKER_QUICKSTART.md
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
# ?? QUICK START - Docker Deployment
|
||||||
|
|
||||||
|
## Per Sviluppo Locale
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
```powershell
|
||||||
|
# Build
|
||||||
|
.\build-docker.bat
|
||||||
|
|
||||||
|
# Run
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linux/Mac
|
||||||
|
```sh
|
||||||
|
# Build
|
||||||
|
chmod +x build-docker.sh
|
||||||
|
./build-docker.sh
|
||||||
|
|
||||||
|
# Run
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
docker-compose down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Accesso
|
||||||
|
```
|
||||||
|
http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per Unraid (via Portainer)
|
||||||
|
|
||||||
|
### 1. Setup Git Repository
|
||||||
|
```sh
|
||||||
|
git add .
|
||||||
|
git commit -m "Docker ready"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Deploy su Portainer
|
||||||
|
1. Stacks ? Add stack
|
||||||
|
2. Name: `tradingbot`
|
||||||
|
3. Git Repository: `https://192.168.30.23/Alby96/Encelado`
|
||||||
|
4. Compose path: `TradingBot/docker-compose.yml`
|
||||||
|
5. Deploy
|
||||||
|
|
||||||
|
### 3. Accesso
|
||||||
|
```
|
||||||
|
http://[UNRAID-IP]:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Per Unraid (via SSH)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# SSH
|
||||||
|
ssh root@[UNRAID-IP]
|
||||||
|
|
||||||
|
# Clone
|
||||||
|
cd /mnt/user/appdata
|
||||||
|
git clone https://192.168.30.23/Alby96/Encelado.git tradingbot
|
||||||
|
cd tradingbot/TradingBot
|
||||||
|
|
||||||
|
# Deploy
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Check
|
||||||
|
docker ps | grep tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Comandi Utili
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Status
|
||||||
|
docker ps
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
docker logs tradingbot -f
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
docker restart tradingbot
|
||||||
|
|
||||||
|
# Update
|
||||||
|
git pull && docker-compose up -d --build
|
||||||
|
|
||||||
|
# Remove
|
||||||
|
docker-compose down -v
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Environment Variables (opzionali)
|
||||||
|
|
||||||
|
Crea file `.env`:
|
||||||
|
```env
|
||||||
|
TZ=Europe/Rome
|
||||||
|
ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
TRADINGBOT_AUTOSTART=true
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Container non parte
|
||||||
|
```sh
|
||||||
|
docker logs tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
### Porta già usata
|
||||||
|
```sh
|
||||||
|
# Cambia porta in docker-compose.yml
|
||||||
|
ports:
|
||||||
|
- "8081:8080"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rebuild da zero
|
||||||
|
```sh
|
||||||
|
docker-compose down -v
|
||||||
|
docker-compose build --no-cache
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Documentazione completa: [UNRAID_DEPLOYMENT.md](UNRAID_DEPLOYMENT.md)
|
||||||
54
TradingBot/Dockerfile
Normal file
54
TradingBot/Dockerfile
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Dockerfile per TradingBot - Multi-stage build ottimizzato
|
||||||
|
# Stage 1: Build
|
||||||
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
||||||
|
WORKDIR /src
|
||||||
|
|
||||||
|
# Copy csproj e restore dipendenze (layer caching)
|
||||||
|
COPY ["TradingBot.csproj", "./"]
|
||||||
|
RUN dotnet restore "TradingBot.csproj"
|
||||||
|
|
||||||
|
# Copy tutto il codice sorgente
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Build in Release mode
|
||||||
|
RUN dotnet build "TradingBot.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
|
# Stage 2: Publish
|
||||||
|
FROM build AS publish
|
||||||
|
RUN dotnet publish "TradingBot.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
|
# Stage 3: Runtime
|
||||||
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS final
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Crea utente non-root per sicurezza
|
||||||
|
RUN useradd -m -u 1000 tradingbot && \
|
||||||
|
chown -R tradingbot:tradingbot /app
|
||||||
|
|
||||||
|
# Esponi porta
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Copy published app
|
||||||
|
COPY --from=publish /app/publish .
|
||||||
|
|
||||||
|
# Crea directory per persistenza dati
|
||||||
|
RUN mkdir -p /app/data && \
|
||||||
|
chown -R tradingbot:tradingbot /app/data
|
||||||
|
|
||||||
|
# Volume per dati persistenti
|
||||||
|
VOLUME ["/app/data"]
|
||||||
|
|
||||||
|
# Switch a utente non-root
|
||||||
|
USER tradingbot
|
||||||
|
|
||||||
|
# Environment variables
|
||||||
|
ENV ASPNETCORE_URLS=http://+:8080
|
||||||
|
ENV ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
ENV DOTNET_RUNNING_IN_CONTAINER=true
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
|
||||||
|
CMD curl -f http://localhost:8080/health || exit 1
|
||||||
|
|
||||||
|
# Entry point
|
||||||
|
ENTRYPOINT ["dotnet", "TradingBot.dll"]
|
||||||
410
TradingBot/GIT_WORKFLOW.md
Normal file
410
TradingBot/GIT_WORKFLOW.md
Normal file
@@ -0,0 +1,410 @@
|
|||||||
|
# ?? WORKFLOW: Sviluppo ? Gitea ? Unraid
|
||||||
|
|
||||||
|
## Flusso di Lavoro Completo
|
||||||
|
|
||||||
|
```
|
||||||
|
PC Sviluppo ? Git Commit ? Gitea Push ? Unraid Pull ? Docker Deploy
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP BY STEP
|
||||||
|
|
||||||
|
### 1. Sviluppo Locale (PC)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Lavora sul codice
|
||||||
|
code .
|
||||||
|
|
||||||
|
# Test locale
|
||||||
|
dotnet run
|
||||||
|
# Oppure
|
||||||
|
docker-compose up
|
||||||
|
|
||||||
|
# Verifica funzionamento
|
||||||
|
http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Commit e Push su Gitea
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Status modifiche
|
||||||
|
git status
|
||||||
|
|
||||||
|
# Stage files
|
||||||
|
git add .
|
||||||
|
|
||||||
|
# Commit
|
||||||
|
git commit -m "Feature: Descrizione modifiche"
|
||||||
|
|
||||||
|
# Push su Gitea
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Deploy su Unraid
|
||||||
|
|
||||||
|
#### Opzione A: Automatico (Portainer Webhook)
|
||||||
|
|
||||||
|
**Setup iniziale** (una volta):
|
||||||
|
```
|
||||||
|
1. Portainer ? Stacks ? tradingbot ? Webhooks
|
||||||
|
2. Create webhook
|
||||||
|
3. Copy URL
|
||||||
|
|
||||||
|
4. Gitea ? Settings ? Webhooks ? Add Webhook
|
||||||
|
5. Paste URL
|
||||||
|
6. Trigger: Push events
|
||||||
|
7. Save
|
||||||
|
```
|
||||||
|
|
||||||
|
**Uso**: Ogni push su Gitea ? Auto-deploy su Unraid!
|
||||||
|
|
||||||
|
#### Opzione B: Manuale (SSH)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# SSH su Unraid
|
||||||
|
ssh root@[UNRAID-IP]
|
||||||
|
|
||||||
|
# Vai nella directory
|
||||||
|
cd /mnt/user/appdata/tradingbot/TradingBot
|
||||||
|
|
||||||
|
# Pull modifiche
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# Rebuild e restart
|
||||||
|
docker-compose down
|
||||||
|
docker-compose build
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Opzione C: Script Automatico
|
||||||
|
|
||||||
|
Crea `/root/scripts/deploy-tradingbot.sh`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/bin/bash
|
||||||
|
cd /mnt/user/appdata/tradingbot/TradingBot
|
||||||
|
|
||||||
|
echo "?? Pulling latest changes..."
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "?? Rebuilding container..."
|
||||||
|
docker-compose down
|
||||||
|
docker-compose build
|
||||||
|
docker-compose up -d
|
||||||
|
echo "? Deployment completed!"
|
||||||
|
else
|
||||||
|
echo "? Git pull failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
Usa:
|
||||||
|
```sh
|
||||||
|
chmod +x /root/scripts/deploy-tradingbot.sh
|
||||||
|
/root/scripts/deploy-tradingbot.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? WORKFLOW GIORNALIERO
|
||||||
|
|
||||||
|
### Mattina - Modifiche
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# PC
|
||||||
|
git pull origin main # Sync
|
||||||
|
code . # Sviluppa
|
||||||
|
dotnet run # Test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Pomeriggio - Deploy
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# PC
|
||||||
|
git add .
|
||||||
|
git commit -m "Daily improvements"
|
||||||
|
git push origin main
|
||||||
|
|
||||||
|
# Unraid (se non auto-deploy)
|
||||||
|
ssh root@unraid
|
||||||
|
/root/scripts/deploy-tradingbot.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Sera - Monitoring
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check logs
|
||||||
|
docker logs tradingbot -f
|
||||||
|
|
||||||
|
# Check stats
|
||||||
|
docker stats tradingbot
|
||||||
|
|
||||||
|
# Backup (opzionale)
|
||||||
|
/root/scripts/backup-tradingbot.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? BRANCHING STRATEGY
|
||||||
|
|
||||||
|
### Main Branch (Production)
|
||||||
|
```sh
|
||||||
|
# Solo codice stabile e testato
|
||||||
|
git checkout main
|
||||||
|
git pull origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Development Branch
|
||||||
|
```sh
|
||||||
|
# Crea branch per nuove feature
|
||||||
|
git checkout -b feature/nome-feature
|
||||||
|
|
||||||
|
# Sviluppa e testa
|
||||||
|
# ...
|
||||||
|
|
||||||
|
# Merge in main quando pronto
|
||||||
|
git checkout main
|
||||||
|
git merge feature/nome-feature
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Hotfix
|
||||||
|
```sh
|
||||||
|
# Per fix urgenti
|
||||||
|
git checkout -b hotfix/descrizione
|
||||||
|
# Fix
|
||||||
|
git checkout main
|
||||||
|
git merge hotfix/descrizione
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? RELEASE VERSIONING
|
||||||
|
|
||||||
|
### Tagging
|
||||||
|
```sh
|
||||||
|
# Tag versione
|
||||||
|
git tag -a v1.0.0 -m "Release v1.0.0"
|
||||||
|
git push origin v1.0.0
|
||||||
|
|
||||||
|
# Build con tag
|
||||||
|
docker build -t tradingbot:v1.0.0 .
|
||||||
|
docker tag tradingbot:v1.0.0 tradingbot:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### Rollback
|
||||||
|
```sh
|
||||||
|
# Lista tags
|
||||||
|
git tag -l
|
||||||
|
|
||||||
|
# Checkout versione precedente
|
||||||
|
git checkout v0.9.0
|
||||||
|
|
||||||
|
# Deploy versione specifica
|
||||||
|
docker-compose down
|
||||||
|
docker-compose build
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? BEST PRACTICES
|
||||||
|
|
||||||
|
### 1. Non Committare Secrets
|
||||||
|
```sh
|
||||||
|
# .gitignore già configurato per:
|
||||||
|
appsettings.Development.json
|
||||||
|
*.env
|
||||||
|
*.key
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Test Prima di Push
|
||||||
|
```sh
|
||||||
|
# Sempre test locale prima
|
||||||
|
dotnet build
|
||||||
|
dotnet test # Se hai tests
|
||||||
|
docker-compose up # Test container
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Commit Messages Descrittivi
|
||||||
|
```sh
|
||||||
|
# ? Buoni
|
||||||
|
git commit -m "Fix: Sidebar toggle button not working"
|
||||||
|
git commit -m "Feature: Add Docker support"
|
||||||
|
git commit -m "Docs: Update deployment guide"
|
||||||
|
|
||||||
|
# ? Cattivi
|
||||||
|
git commit -m "fix"
|
||||||
|
git commit -m "update"
|
||||||
|
git commit -m "changes"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Pull Prima di Push
|
||||||
|
```sh
|
||||||
|
# Sempre sync prima
|
||||||
|
git pull origin main
|
||||||
|
# Risolvi conflitti se presenti
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? TROUBLESHOOTING
|
||||||
|
|
||||||
|
### Conflitto Git
|
||||||
|
```sh
|
||||||
|
# Pull con conflitti
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# Risolvi manualmente i file in conflitto
|
||||||
|
# Cerca <<<<<<< HEAD
|
||||||
|
|
||||||
|
# Dopo risolto
|
||||||
|
git add .
|
||||||
|
git commit -m "Resolve merge conflicts"
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Push Rifiutato
|
||||||
|
```sh
|
||||||
|
# Se remote è avanti
|
||||||
|
git pull --rebase origin main
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
### Reset Completo (ATTENZIONE!)
|
||||||
|
```sh
|
||||||
|
# Solo in caso di emergenza
|
||||||
|
git fetch origin
|
||||||
|
git reset --hard origin/main
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? MONITORING WORKFLOW
|
||||||
|
|
||||||
|
### Check Health
|
||||||
|
```sh
|
||||||
|
# Local
|
||||||
|
curl http://localhost:8080/health
|
||||||
|
|
||||||
|
# Unraid
|
||||||
|
curl http://[UNRAID-IP]:8080/health
|
||||||
|
```
|
||||||
|
|
||||||
|
### View Logs
|
||||||
|
```sh
|
||||||
|
# Real-time
|
||||||
|
docker logs -f tradingbot
|
||||||
|
|
||||||
|
# Last 100 lines
|
||||||
|
docker logs --tail 100 tradingbot
|
||||||
|
|
||||||
|
# Since timestamp
|
||||||
|
docker logs --since 2024-12-12T10:00:00 tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
### Resource Usage
|
||||||
|
```sh
|
||||||
|
# Stats
|
||||||
|
docker stats tradingbot
|
||||||
|
|
||||||
|
# Processes
|
||||||
|
docker top tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? CHECKLIST COMPLETO
|
||||||
|
|
||||||
|
### Pre-Development
|
||||||
|
- [ ] Git repository synced (`git pull`)
|
||||||
|
- [ ] Branch corretto (`git branch`)
|
||||||
|
- [ ] Dependencies updated (`dotnet restore`)
|
||||||
|
|
||||||
|
### Development
|
||||||
|
- [ ] Codice scritto e testato
|
||||||
|
- [ ] Build successful (`dotnet build`)
|
||||||
|
- [ ] Test locale OK (`dotnet run`)
|
||||||
|
- [ ] Docker test OK (`docker-compose up`)
|
||||||
|
|
||||||
|
### Pre-Commit
|
||||||
|
- [ ] Codice formattato
|
||||||
|
- [ ] No secrets committati
|
||||||
|
- [ ] .gitignore aggiornato
|
||||||
|
- [ ] README aggiornato se necessario
|
||||||
|
|
||||||
|
### Commit & Push
|
||||||
|
- [ ] `git status` verificato
|
||||||
|
- [ ] Commit message descrittivo
|
||||||
|
- [ ] Push successful
|
||||||
|
- [ ] Verifica su Gitea web UI
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
- [ ] Pull su Unraid OK
|
||||||
|
- [ ] Docker build successful
|
||||||
|
- [ ] Container running
|
||||||
|
- [ ] Health check passing
|
||||||
|
- [ ] WebUI accessibile
|
||||||
|
|
||||||
|
### Post-Deployment
|
||||||
|
- [ ] Logs verificati
|
||||||
|
- [ ] Nessun errore critico
|
||||||
|
- [ ] Funzionalità testate
|
||||||
|
- [ ] Performance OK
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? MAINTENANCE
|
||||||
|
|
||||||
|
### Giornaliero
|
||||||
|
- Check logs per errori
|
||||||
|
- Verifica health endpoint
|
||||||
|
- Monitor resource usage
|
||||||
|
|
||||||
|
### Settimanale
|
||||||
|
- Git pull updates
|
||||||
|
- Review commits
|
||||||
|
- Check disk space
|
||||||
|
|
||||||
|
### Mensile
|
||||||
|
- Full backup
|
||||||
|
- Review performance metrics
|
||||||
|
- Update dependencies
|
||||||
|
- Security audit
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? COMANDI RAPIDI
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Development
|
||||||
|
git status
|
||||||
|
git add .
|
||||||
|
git commit -m "message"
|
||||||
|
git push origin main
|
||||||
|
|
||||||
|
# Local Test
|
||||||
|
dotnet run
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Unraid Deploy
|
||||||
|
ssh root@unraid "/root/scripts/deploy-tradingbot.sh"
|
||||||
|
|
||||||
|
# Check Status
|
||||||
|
docker ps | grep tradingbot
|
||||||
|
docker logs tradingbot --tail 50
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
docker restart tradingbot
|
||||||
|
|
||||||
|
# Update
|
||||||
|
git pull && docker-compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**?? Workflow pronto! Sviluppo ? Gitea ? Unraid automatizzato!**
|
||||||
@@ -13,8 +13,8 @@ builder.Services.AddSingleton<ITradingStrategy, SimpleMovingAverageStrategy>();
|
|||||||
builder.Services.AddSingleton<TradingBotService>();
|
builder.Services.AddSingleton<TradingBotService>();
|
||||||
builder.Services.AddSingleton<SettingsService>();
|
builder.Services.AddSingleton<SettingsService>();
|
||||||
|
|
||||||
// Alternative: Use real market data from CoinGecko (uncomment below and comment above)
|
// Add health checks for Docker
|
||||||
// builder.Services.AddHttpClient<IMarketDataService, CoinGeckoMarketDataService>();
|
builder.Services.AddHealthChecks();
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
@@ -25,12 +25,15 @@ if (!app.Environment.IsDevelopment())
|
|||||||
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
|
||||||
app.UseHsts();
|
app.UseHsts();
|
||||||
}
|
}
|
||||||
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
|
|
||||||
app.UseHttpsRedirection();
|
app.UseHttpsRedirection();
|
||||||
|
|
||||||
|
app.UseStaticFiles();
|
||||||
app.UseAntiforgery();
|
app.UseAntiforgery();
|
||||||
|
|
||||||
app.MapStaticAssets();
|
// Health check endpoint for Docker
|
||||||
|
app.MapHealthChecks("/health");
|
||||||
|
|
||||||
app.MapRazorComponents<App>()
|
app.MapRazorComponents<App>()
|
||||||
.AddInteractiveServerRenderMode();
|
.AddInteractiveServerRenderMode();
|
||||||
|
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ Un'applicazione Blazor Server avanzata per simulare e testare strategie di tradi
|
|||||||
- .NET 10 SDK
|
- .NET 10 SDK
|
||||||
- Visual Studio 2022+ o VS Code
|
- Visual Studio 2022+ o VS Code
|
||||||
|
|
||||||
### Installazione
|
### Installazione Locale
|
||||||
```bash
|
```bash
|
||||||
# Clone repository
|
# Clone repository
|
||||||
git clone https://192.168.30.23/Alby96/Encelado
|
git clone https://192.168.30.23/Alby96/Encelado
|
||||||
@@ -105,6 +105,25 @@ dotnet restore
|
|||||||
dotnet run
|
dotnet run
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### ?? Deployment Docker
|
||||||
|
|
||||||
|
#### Development
|
||||||
|
```sh
|
||||||
|
# Build
|
||||||
|
docker-compose build
|
||||||
|
|
||||||
|
# Run
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Access
|
||||||
|
http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Production (Unraid)
|
||||||
|
Vedi documentazione completa:
|
||||||
|
- ?? [UNRAID_DEPLOYMENT.md](UNRAID_DEPLOYMENT.md) - Guida completa Unraid + Gitea
|
||||||
|
- ?? [DOCKER_QUICKSTART.md](DOCKER_QUICKSTART.md) - Quick start rapido
|
||||||
|
|
||||||
### Uso
|
### Uso
|
||||||
1. L'applicazione si avvia automaticamente in modalità simulazione
|
1. L'applicazione si avvia automaticamente in modalità simulazione
|
||||||
2. Tutti i 15 asset sono attivi di default
|
2. Tutti i 15 asset sono attivi di default
|
||||||
|
|||||||
517
TradingBot/UNRAID_DEPLOYMENT.md
Normal file
517
TradingBot/UNRAID_DEPLOYMENT.md
Normal file
@@ -0,0 +1,517 @@
|
|||||||
|
# ?? DEPLOYMENT GUIDE - Unraid + Gitea + Docker
|
||||||
|
|
||||||
|
Guida completa per deployare TradingBot su **Unraid** usando **Gitea** come sistema di controllo versione.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? PREREQUISITI
|
||||||
|
|
||||||
|
### Su Unraid
|
||||||
|
- ? Docker installato (Community Applications)
|
||||||
|
- ? Gitea installato e configurato
|
||||||
|
- ? Accesso SSH abilitato
|
||||||
|
- ? Portainer installato (opzionale ma consigliato)
|
||||||
|
|
||||||
|
### Sul PC di Sviluppo
|
||||||
|
- ? Git installato
|
||||||
|
- ? Accesso al server Unraid
|
||||||
|
- ? Repository Gitea configurato
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 1: Configurazione Gitea
|
||||||
|
|
||||||
|
### 1.1 Crea Repository su Gitea
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Accedi a Gitea (esempio)
|
||||||
|
http://192.168.30.23:3000
|
||||||
|
|
||||||
|
# Crea nuovo repository
|
||||||
|
Nome: TradingBot
|
||||||
|
Descrizione: Automated Crypto Trading Bot
|
||||||
|
Privato: ? (consigliato)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.2 Configura Git Remote (già fatto)
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd /path/to/TradingBot
|
||||||
|
|
||||||
|
# Verifica remote (dovresti già averlo)
|
||||||
|
git remote -v
|
||||||
|
# Output:
|
||||||
|
# origin https://192.168.30.23/Alby96/Encelado (fetch)
|
||||||
|
# origin https://192.168.30.23/Alby96/Encelado (push)
|
||||||
|
|
||||||
|
# Se non configurato:
|
||||||
|
git remote add origin https://192.168.30.23/Alby96/Encelado
|
||||||
|
```
|
||||||
|
|
||||||
|
### 1.3 Push del Codice
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Commit delle modifiche Docker
|
||||||
|
git add Dockerfile docker-compose.yml .dockerignore
|
||||||
|
git add build-docker.sh build-docker.bat
|
||||||
|
git add UNRAID_DEPLOYMENT.md
|
||||||
|
|
||||||
|
git commit -m "Add Docker support and Unraid deployment"
|
||||||
|
|
||||||
|
# Push su Gitea
|
||||||
|
git push origin main
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 2: Deployment su Unraid
|
||||||
|
|
||||||
|
### Metodo A: Via Portainer (CONSIGLIATO)
|
||||||
|
|
||||||
|
#### 2.1 Accedi a Portainer
|
||||||
|
```
|
||||||
|
http://[UNRAID-IP]:9000
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 Crea Stack
|
||||||
|
1. **Stacks** ? **Add stack**
|
||||||
|
2. **Name**: `tradingbot`
|
||||||
|
3. **Build method**: `Git Repository`
|
||||||
|
4. **Repository URL**: `https://192.168.30.23/Alby96/Encelado`
|
||||||
|
5. **Repository reference**: `refs/heads/main`
|
||||||
|
6. **Compose path**: `TradingBot/docker-compose.yml`
|
||||||
|
7. **Authentication**:
|
||||||
|
- Username: `Alby96`
|
||||||
|
- Personal access token: (crea su Gitea)
|
||||||
|
|
||||||
|
#### 2.3 Environment Variables (opzionali)
|
||||||
|
```
|
||||||
|
TZ=Europe/Rome
|
||||||
|
ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.4 Deploy
|
||||||
|
Click **Deploy the stack**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Metodo B: Via SSH + Docker Compose
|
||||||
|
|
||||||
|
#### 2.1 Connettiti a Unraid via SSH
|
||||||
|
|
||||||
|
```sh
|
||||||
|
ssh root@[UNRAID-IP]
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 Crea Directory Progetto
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Vai nella directory appropriata
|
||||||
|
cd /mnt/user/appdata/
|
||||||
|
|
||||||
|
# Crea directory per TradingBot
|
||||||
|
mkdir -p tradingbot
|
||||||
|
cd tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.3 Clone Repository da Gitea
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Clone del repository
|
||||||
|
git clone https://192.168.30.23/Alby96/Encelado.git .
|
||||||
|
|
||||||
|
# Entra nella directory del progetto
|
||||||
|
cd TradingBot
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.4 Build e Run
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Build immagine Docker
|
||||||
|
docker-compose build
|
||||||
|
|
||||||
|
# Avvia container
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Verifica logs
|
||||||
|
docker-compose logs -f
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Metodo C: Via Unraid Docker Template
|
||||||
|
|
||||||
|
#### 2.1 Crea Template Personalizzato
|
||||||
|
|
||||||
|
Crea file: `/boot/config/plugins/dockerMan/templates-user/my-TradingBot.xml`
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<Container version="2">
|
||||||
|
<Name>TradingBot</Name>
|
||||||
|
<Repository>tradingbot:latest</Repository>
|
||||||
|
<Registry>https://192.168.30.23:5000/</Registry>
|
||||||
|
<Network>bridge</Network>
|
||||||
|
<MyIP/>
|
||||||
|
<Shell>sh</Shell>
|
||||||
|
<Privileged>false</Privileged>
|
||||||
|
<Support>https://192.168.30.23/Alby96/Encelado</Support>
|
||||||
|
<Project>https://192.168.30.23/Alby96/Encelado</Project>
|
||||||
|
<Overview>Automated Crypto Trading Bot con strategie personalizzabili</Overview>
|
||||||
|
<Category>Tools:</Category>
|
||||||
|
<WebUI>http://[IP]:[PORT:8080]</WebUI>
|
||||||
|
<TemplateURL/>
|
||||||
|
<Icon>https://raw.githubusercontent.com/docker-library/docs/master/dotnet/logo.png</Icon>
|
||||||
|
<ExtraParams/>
|
||||||
|
<PostArgs/>
|
||||||
|
<CPUset/>
|
||||||
|
<DateInstalled>1234567890</DateInstalled>
|
||||||
|
<DonateText/>
|
||||||
|
<DonateLink/>
|
||||||
|
<Requires/>
|
||||||
|
<Config Name="WebUI Port" Target="8080" Default="8080" Mode="tcp" Description="Port per accedere alla WebUI" Type="Port" Display="always" Required="true" Mask="false">8080</Config>
|
||||||
|
<Config Name="Data Volume" Target="/app/data" Default="/mnt/user/appdata/tradingbot/data" Mode="rw" Description="Volume per dati persistenti" Type="Path" Display="always" Required="true" Mask="false">/mnt/user/appdata/tradingbot/data</Config>
|
||||||
|
<Config Name="Timezone" Target="TZ" Default="Europe/Rome" Mode="" Description="Timezone" Type="Variable" Display="always" Required="false" Mask="false">Europe/Rome</Config>
|
||||||
|
</Container>
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 2.2 Usa Template da Unraid UI
|
||||||
|
1. Docker ? Add Container
|
||||||
|
2. Select: `TradingBot`
|
||||||
|
3. Configure ports and volumes
|
||||||
|
4. Apply
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 3: Aggiornamenti Automatici
|
||||||
|
|
||||||
|
### 3.1 Setup Webhook su Gitea (opzionale)
|
||||||
|
|
||||||
|
#### Su Gitea:
|
||||||
|
```
|
||||||
|
Settings ? Webhooks ? Add Webhook
|
||||||
|
Payload URL: http://[UNRAID-IP]:9000/api/webhooks/[webhook-id]
|
||||||
|
Content type: application/json
|
||||||
|
Events: Push events
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Su Portainer:
|
||||||
|
```
|
||||||
|
Stacks ? tradingbot ? Webhooks ? Create webhook
|
||||||
|
Copia URL generato
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.2 Script di Aggiornamento Manuale
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/bin/bash
|
||||||
|
# update-tradingbot.sh
|
||||||
|
|
||||||
|
cd /mnt/user/appdata/tradingbot/TradingBot
|
||||||
|
|
||||||
|
# Pull latest changes
|
||||||
|
git pull origin main
|
||||||
|
|
||||||
|
# Rebuild
|
||||||
|
docker-compose down
|
||||||
|
docker-compose build
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
echo "? TradingBot aggiornato!"
|
||||||
|
```
|
||||||
|
|
||||||
|
Salva come: `/root/scripts/update-tradingbot.sh`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
chmod +x /root/scripts/update-tradingbot.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 4: Monitoraggio e Gestione
|
||||||
|
|
||||||
|
### 4.1 Verifica Status Container
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Via SSH
|
||||||
|
docker ps | grep tradingbot
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
docker logs tradingbot -f
|
||||||
|
|
||||||
|
# Stats
|
||||||
|
docker stats tradingbot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Accesso WebUI
|
||||||
|
|
||||||
|
```
|
||||||
|
http://[UNRAID-IP]:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.3 Health Check
|
||||||
|
|
||||||
|
```sh
|
||||||
|
curl http://[UNRAID-IP]:8080/health
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 5: Configurazione Avanzata
|
||||||
|
|
||||||
|
### 5.1 Reverse Proxy (opzionale)
|
||||||
|
|
||||||
|
Se usi **Nginx Proxy Manager** o **Traefik**:
|
||||||
|
|
||||||
|
#### docker-compose.yml aggiornato:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
tradingbot:
|
||||||
|
# ... altre configurazioni
|
||||||
|
labels:
|
||||||
|
- "traefik.enable=true"
|
||||||
|
- "traefik.http.routers.tradingbot.rule=Host(`trading.tuodominio.com`)"
|
||||||
|
- "traefik.http.services.tradingbot.loadbalancer.server.port=8080"
|
||||||
|
networks:
|
||||||
|
- traefik_proxy
|
||||||
|
- tradingbot-network
|
||||||
|
|
||||||
|
networks:
|
||||||
|
traefik_proxy:
|
||||||
|
external: true
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5.2 Backup Automatico
|
||||||
|
|
||||||
|
Script backup: `/root/scripts/backup-tradingbot.sh`
|
||||||
|
|
||||||
|
```sh
|
||||||
|
#!/bin/bash
|
||||||
|
BACKUP_DIR="/mnt/user/backups/tradingbot"
|
||||||
|
DATE=$(date +%Y%m%d_%H%M%S)
|
||||||
|
|
||||||
|
mkdir -p $BACKUP_DIR
|
||||||
|
|
||||||
|
# Backup volume dati
|
||||||
|
docker run --rm \
|
||||||
|
-v tradingbot_tradingbot-data:/data \
|
||||||
|
-v $BACKUP_DIR:/backup \
|
||||||
|
alpine tar czf /backup/tradingbot-data-$DATE.tar.gz -C /data .
|
||||||
|
|
||||||
|
echo "? Backup completato: tradingbot-data-$DATE.tar.gz"
|
||||||
|
|
||||||
|
# Mantieni solo ultimi 7 backup
|
||||||
|
find $BACKUP_DIR -name "tradingbot-data-*.tar.gz" -mtime +7 -delete
|
||||||
|
```
|
||||||
|
|
||||||
|
Aggiungi a crontab:
|
||||||
|
```sh
|
||||||
|
crontab -e
|
||||||
|
# Backup giornaliero alle 3 AM
|
||||||
|
0 3 * * * /root/scripts/backup-tradingbot.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? TROUBLESHOOTING
|
||||||
|
|
||||||
|
### Container non si avvia
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Check logs
|
||||||
|
docker logs tradingbot
|
||||||
|
|
||||||
|
# Check network
|
||||||
|
docker network ls
|
||||||
|
docker network inspect tradingbot_tradingbot-network
|
||||||
|
|
||||||
|
# Rebuild da zero
|
||||||
|
docker-compose down -v
|
||||||
|
docker-compose build --no-cache
|
||||||
|
docker-compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
### Problemi di permessi
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Fix ownership
|
||||||
|
docker exec tradingbot chown -R tradingbot:tradingbot /app/data
|
||||||
|
```
|
||||||
|
|
||||||
|
### Porta già in uso
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Trova processo che usa porta 8080
|
||||||
|
netstat -tulpn | grep 8080
|
||||||
|
|
||||||
|
# Cambia porta in docker-compose.yml
|
||||||
|
ports:
|
||||||
|
- "8081:8080" # Usa 8081 invece
|
||||||
|
```
|
||||||
|
|
||||||
|
### Out of Memory
|
||||||
|
|
||||||
|
Aumenta limits in docker-compose.yml:
|
||||||
|
```yaml
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
memory: 2G # Da 1G a 2G
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? STEP 6: Registry Privato (opzionale)
|
||||||
|
|
||||||
|
### 6.1 Setup Docker Registry su Unraid
|
||||||
|
|
||||||
|
```sh
|
||||||
|
docker run -d \
|
||||||
|
-p 5000:5000 \
|
||||||
|
--restart=always \
|
||||||
|
--name registry \
|
||||||
|
-v /mnt/user/appdata/registry:/var/lib/registry \
|
||||||
|
registry:2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.2 Build e Push
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Tag image
|
||||||
|
docker tag tradingbot:latest 192.168.30.23:5000/tradingbot:latest
|
||||||
|
|
||||||
|
# Push to registry
|
||||||
|
docker push 192.168.30.23:5000/tradingbot:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
### 6.3 Deploy da Registry
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-compose.yml
|
||||||
|
services:
|
||||||
|
tradingbot:
|
||||||
|
image: 192.168.30.23:5000/tradingbot:latest
|
||||||
|
# ... resto configurazione
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? SECURITY BEST PRACTICES
|
||||||
|
|
||||||
|
### 1. Non esporre porte pubblicamente
|
||||||
|
```sh
|
||||||
|
# Usa solo rete interna Unraid
|
||||||
|
# Accesso via VPN o Wireguard
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. SSL/TLS
|
||||||
|
```sh
|
||||||
|
# Usa reverse proxy con certificati SSL
|
||||||
|
# Let's Encrypt via Nginx Proxy Manager
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Credenziali
|
||||||
|
```sh
|
||||||
|
# Non committare secrets in Git
|
||||||
|
# Usa Docker secrets o environment variables
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Firewall
|
||||||
|
```sh
|
||||||
|
# Limita accesso solo a IP fidati
|
||||||
|
# Configura in Unraid Settings ? Network
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? MONITORING
|
||||||
|
|
||||||
|
### Grafana + Prometheus (opzionale)
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# monitoring-stack.yml
|
||||||
|
version: '3.8'
|
||||||
|
services:
|
||||||
|
prometheus:
|
||||||
|
image: prom/prometheus
|
||||||
|
volumes:
|
||||||
|
- ./prometheus.yml:/etc/prometheus/prometheus.yml
|
||||||
|
ports:
|
||||||
|
- "9090:9090"
|
||||||
|
|
||||||
|
grafana:
|
||||||
|
image: grafana/grafana
|
||||||
|
ports:
|
||||||
|
- "3001:3000"
|
||||||
|
volumes:
|
||||||
|
- grafana-data:/var/lib/grafana
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
grafana-data:
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? CHECKLIST DEPLOYMENT
|
||||||
|
|
||||||
|
### Pre-Deployment
|
||||||
|
- [ ] Codice committed su Gitea
|
||||||
|
- [ ] Dockerfile testato localmente
|
||||||
|
- [ ] docker-compose.yml configurato
|
||||||
|
- [ ] .dockerignore presente
|
||||||
|
- [ ] Environment variables definite
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
- [ ] Repository clonato su Unraid
|
||||||
|
- [ ] Docker image built
|
||||||
|
- [ ] Container avviato correttamente
|
||||||
|
- [ ] WebUI accessibile
|
||||||
|
- [ ] Health check passing
|
||||||
|
|
||||||
|
### Post-Deployment
|
||||||
|
- [ ] Logs verificati (no errori)
|
||||||
|
- [ ] Dati persistono dopo restart
|
||||||
|
- [ ] Backup configurato
|
||||||
|
- [ ] Monitoring attivo
|
||||||
|
- [ ] Documentazione aggiornata
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? COMANDI UTILI
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Build
|
||||||
|
./build-docker.sh [tag]
|
||||||
|
|
||||||
|
# Start
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
# Stop
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
# Logs
|
||||||
|
docker-compose logs -f
|
||||||
|
|
||||||
|
# Restart
|
||||||
|
docker-compose restart
|
||||||
|
|
||||||
|
# Update
|
||||||
|
git pull && docker-compose up -d --build
|
||||||
|
|
||||||
|
# Clean
|
||||||
|
docker-compose down -v
|
||||||
|
docker system prune -a
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ?? RISORSE
|
||||||
|
|
||||||
|
- **Unraid Docs**: https://docs.unraid.net/
|
||||||
|
- **Docker Docs**: https://docs.docker.com/
|
||||||
|
- **Gitea Docs**: https://docs.gitea.io/
|
||||||
|
- **Portainer Docs**: https://docs.portainer.io/
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**?? Deployment completato! Il tuo TradingBot è ora in produzione su Unraid!**
|
||||||
29
TradingBot/build-docker.bat
Normal file
29
TradingBot/build-docker.bat
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
@echo off
|
||||||
|
REM Script di build Docker per Windows
|
||||||
|
|
||||||
|
echo Building TradingBot Docker Image...
|
||||||
|
|
||||||
|
SET IMAGE_NAME=tradingbot
|
||||||
|
SET TAG=%1
|
||||||
|
IF "%TAG%"=="" SET TAG=latest
|
||||||
|
|
||||||
|
echo Building image: %IMAGE_NAME%:%TAG%
|
||||||
|
|
||||||
|
docker build -t %IMAGE_NAME%:%TAG% -f Dockerfile .
|
||||||
|
|
||||||
|
IF %ERRORLEVEL% NEQ 0 (
|
||||||
|
echo Build failed!
|
||||||
|
exit /b %ERRORLEVEL%
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Build completed successfully!
|
||||||
|
|
||||||
|
REM Tag come latest se diverso
|
||||||
|
IF NOT "%TAG%"=="latest" (
|
||||||
|
echo Tagging as latest...
|
||||||
|
docker tag %IMAGE_NAME%:%TAG% %IMAGE_NAME%:latest
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Done! Run with: docker-compose up -d
|
||||||
|
|
||||||
|
pause
|
||||||
49
TradingBot/build-docker.sh
Normal file
49
TradingBot/build-docker.sh
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Script di build Docker per TradingBot
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "?? Building TradingBot Docker Image..."
|
||||||
|
|
||||||
|
# Colori per output
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Variabili
|
||||||
|
IMAGE_NAME="tradingbot"
|
||||||
|
TAG="${1:-latest}"
|
||||||
|
REGISTRY="${DOCKER_REGISTRY:-}" # Opzionale: tuo registry privato
|
||||||
|
|
||||||
|
echo -e "${BLUE}?? Building image: ${IMAGE_NAME}:${TAG}${NC}"
|
||||||
|
|
||||||
|
# Build dell'immagine
|
||||||
|
docker build \
|
||||||
|
--build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
|
||||||
|
--build-arg VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") \
|
||||||
|
-t ${IMAGE_NAME}:${TAG} \
|
||||||
|
-f Dockerfile \
|
||||||
|
.
|
||||||
|
|
||||||
|
echo -e "${GREEN}? Build completato con successo!${NC}"
|
||||||
|
|
||||||
|
# Tag con latest
|
||||||
|
if [ "$TAG" != "latest" ]; then
|
||||||
|
echo -e "${BLUE}??? Tagging as latest...${NC}"
|
||||||
|
docker tag ${IMAGE_NAME}:${TAG} ${IMAGE_NAME}:latest
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Mostra info immagine
|
||||||
|
echo -e "${BLUE}?? Image info:${NC}"
|
||||||
|
docker images | grep ${IMAGE_NAME} | head -n 2
|
||||||
|
|
||||||
|
# Se registry è configurato, push
|
||||||
|
if [ ! -z "$REGISTRY" ]; then
|
||||||
|
echo -e "${BLUE}?? Pushing to registry: ${REGISTRY}${NC}"
|
||||||
|
docker tag ${IMAGE_NAME}:${TAG} ${REGISTRY}/${IMAGE_NAME}:${TAG}
|
||||||
|
docker push ${REGISTRY}/${IMAGE_NAME}:${TAG}
|
||||||
|
echo -e "${GREEN}? Pushed to registry!${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}?? Done! Run with: docker-compose up -d${NC}"
|
||||||
52
TradingBot/docker-compose.yml
Normal file
52
TradingBot/docker-compose.yml
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
tradingbot:
|
||||||
|
container_name: tradingbot
|
||||||
|
image: tradingbot:latest
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
ports:
|
||||||
|
- "8080:8080"
|
||||||
|
volumes:
|
||||||
|
# Persistenza dati applicazione
|
||||||
|
- tradingbot-data:/app/data
|
||||||
|
# Opzionale: mount locale per sviluppo
|
||||||
|
# - ./logs:/app/logs
|
||||||
|
environment:
|
||||||
|
# Configurazioni applicazione
|
||||||
|
- ASPNETCORE_ENVIRONMENT=Production
|
||||||
|
- ASPNETCORE_URLS=http://+:8080
|
||||||
|
# Fuso orario (importante per trading!)
|
||||||
|
- TZ=Europe/Rome
|
||||||
|
# Opzionali - Configurazioni avanzate
|
||||||
|
# - TRADINGBOT__SimulationMode=true
|
||||||
|
# - TRADINGBOT__AutoStartBot=true
|
||||||
|
# - TRADINGBOT__UpdateIntervalSeconds=3
|
||||||
|
restart: unless-stopped
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 10s
|
||||||
|
networks:
|
||||||
|
- tradingbot-network
|
||||||
|
# Resource limits (opzionali ma consigliati per Unraid)
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '2.0'
|
||||||
|
memory: 1G
|
||||||
|
reservations:
|
||||||
|
cpus: '0.5'
|
||||||
|
memory: 256M
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
tradingbot-data:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
tradingbot-network:
|
||||||
|
driver: bridge
|
||||||
Reference in New Issue
Block a user