Funding-Fee Dashboard es una aplicación Next.js autoalojada diseñada para mostrar y actualizar en tiempo real las funding rates de protocolos como Lighter, Hyperliquid, Paradex y Pacifica.
Se ejecuta en tu propio servidor Ubuntu, con un backend que guarda los datos localmente en SQLite y un sistema de actualización automatizado cada hora mediante systemd.
Todo está contenedorizado y asegurado con:
- 🐳 Docker Compose
- 🌐 NGINX Proxy (Reverse Proxy Automático)
- 🔒 Certificados SSL de Let’s Encrypt
- ⚡ Dominio personalizado y HTTPS completo
- 🧠 Updater automático con systemd
/opt/funding-fee
├── app/ # Next.js source code
├── dist-updater/ # Código compilado del updater
├── funding.db # Base de datos persistente SQLite
├── Dockerfile # Build instructions
├── docker-compose.yml # Orquestación de servicios
├── run-updater.sh # Script systemd de actualización
├── updater.log # Registro de actualizaciones
└── ...
sudo apt update && sudo apt install -y \
curl git docker.io docker-compose-pluginOpcional (para compilar en local):
curl -fsSL https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash
nvm install 22
nvm use 22cd /opt
git clone https://github.com/amis13/funding-fee.git
cd funding-feeLimpia posibles instalaciones previas:
rm -rf node_modules package-lock.json pnpm-lock.yamlOptimizado para Next.js en producción:
# Etapa 1: Build
FROM node:22-slim AS builder
RUN apt-get update && apt-get install -y python3 make g++ sqlite3 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY . .
RUN npm install --legacy-peer-deps && npm run build
# Etapa 2: Producción
FROM node:22-slim
RUN apt-get update && apt-get install -y sqlite3 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY --from=builder /app ./
ENV NODE_ENV=production
EXPOSE 3000
CMD ["npm", "run", "start"]Define tres contenedores:
- 🧠
funding-fee→ la aplicación Next.js - 🌐
funding-proxy→ proxy inverso NGINX - 🔒
funding-letsencrypt→ emisión y renovación automática SSL
services:
funding-fee:
build: .
container_name: funding-fee
restart: always
environment:
- NODE_ENV=production
- PORT=3000
- VIRTUAL_HOST=fundingfees.web3crypt.net
- LETSENCRYPT_HOST=fundingfees.web3crypt.net
- LETSENCRYPT_EMAIL=amis13og@web3crypt.net
- FUNDING_DB_PATH=/data/funding.db
expose:
- "3000"
volumes:
- ./funding.db:/data/funding.db
networks:
- funding-net
depends_on:
- nginx-proxy
nginx-proxy:
image: nginxproxy/nginx-proxy:alpine
container_name: funding-proxy
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- certs:/etc/nginx/certs
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
networks:
- funding-net
letsencrypt:
image: nginxproxy/acme-companion
container_name: funding-letsencrypt
restart: always
environment:
- DEFAULT_EMAIL=amis13og@web3crypt.net
- NGINX_PROXY_CONTAINER=funding-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- certs:/etc/nginx/certs
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
depends_on:
- nginx-proxy
networks:
- funding-net
volumes:
certs:
vhost:
html:
networks:
funding-net:
driver: bridgeEn tu panel DNS:
A record → fundingfees.web3crypt.net → tu_IP_pública
Y en tu router, habilita el reenvío de puertos:
| WAN Port | LAN Port | IP Interna | Protocolo |
|---|---|---|---|
| 80 | 80 | 192.168.1.150 | TCP |
| 443 | 443 | 192.168.1.150 | TCP |
⚠️ Asegúrate de que el servidor tenga IP LAN estática.
docker compose up -d --buildEsto construirá la imagen, levantará los contenedores y solicitará automáticamente tu certificado SSL.
docker logs -f funding-letsencryptBusca el mensaje:
fundingfees.web3crypt.net: Verify success.
Certificate successfully issued.
Una vez emitido el certificado:
https://fundingfees.web3crypt.net
✅ HTTPS activo ✅ Base de datos persistente ✅ Certificados auto-renovables
El updater cada hora usa un servicio systemd + timer.
Archivo del servicio: /etc/systemd/system/funding-updater.service
[Unit]
Description=Funding Fee Updater - Refresh funding data hourly
After=network.target
[Service]
Type=simple
ExecStart=/opt/funding-fee/run-updater.sh
WorkingDirectory=/opt/funding-fee
StandardOutput=append:/opt/funding-fee/updater.log
StandardError=append:/opt/funding-fee/updater.log
User=amis13
Restart=on-failureTimer: /etc/systemd/system/funding-updater.timer
[Unit]
Description=Run Funding Fee Updater every hour
[Timer]
OnCalendar=hourly
Persistent=true
[Install]
WantedBy=timers.targetActivación:
sudo systemctl daemon-reload
sudo systemctl enable --now funding-updater.timerVerifica logs:
tail -f /opt/funding-fee/updater.log| Problema | Causa | Solución |
|---|---|---|
Timeout during connect |
Puerto 80 bloqueado | Verifica NAT o firewall |
Invalid status en letsencrypt |
DNS o redirección incorrecta | Confirma que fundingfees.web3crypt.net apunte al servidor |
| Certificado no se instala | Error en nginx-proxy | Reinicia funding-proxy y revisa logs |
| No guarda datos | Permisos en funding.db |
chmod 664 funding.db y chown $USER:$USER |
# Ver contenedores activos
docker ps
# Logs principales
docker logs -f funding-proxy
docker logs -f funding-letsencrypt
docker logs -f funding-fee
# Reiniciar todo
docker compose down -v
docker compose up -d --build| Componente | Descripción |
|---|---|
| Frontend | Next.js 15 (Node 22) |
| Base de datos | SQLite (persistente) |
| Proxy | nginx-proxy + acme-companion |
| SSL | Let’s Encrypt (auto-renewal) |
| Updater | systemd timer (cada hora) |
| Host OS | Ubuntu 22 / 24 LTS |
Funding-Fee Dashboard 🟢 Self-hosted 🔐 HTTPS + SSL automático ⚙️ Actualización horaria ☁️ Cero dependencias externas
🛠️ Maintained by @amis13
⭐ Si te resultó útil, deja una estrella en el repositorio.