# Complete Deployment Task List

This document provides a detailed checklist of all tasks required to deploy the ChainID 138 Explorer Platform using LXC, Nginx, Cloudflare DNS, SSL, and Cloudflare Tunnel.

---

## 📋 Complete Task List (71 Tasks)

### PRE-DEPLOYMENT (5 tasks)

#### Task 1: Verify Prerequisites
- [ ] Access to Proxmox VE host with LXC support
- [ ] Cloudflare account created and domain added
- [ ] Domain DNS managed by Cloudflare
- [ ] Cloudflare API token created (with DNS edit permissions)
- [ ] SSH access to Proxmox host configured

---

### PHASE 1: LXC CONTAINER SETUP (8 tasks)

#### Task 2: Create LXC Container
- [ ] Log into Proxmox host
- [ ] Download Ubuntu 22.04 template (if not exists)
- [ ] Run container creation command
- [ ] Verify container created successfully
- [ ] Note container ID for future reference

#### Task 3: Start and Access Container
- [ ] Start container: `pct start <CONTAINER_ID>`
- [ ] Access container: `pct enter <CONTAINER_ID>`
- [ ] Verify network connectivity
- [ ] Update system: `apt update && apt upgrade -y`

#### Task 4: Install Base Packages
- [ ] Install essential packages (curl, wget, git, vim, etc.)
- [ ] Install firewall: `apt install -y ufw`
- [ ] Install fail2ban: `apt install -y fail2ban`
- [ ] Install security updates tool: `apt install -y unattended-upgrades`

#### Task 5: Configure System Settings
- [ ] Set timezone: `timedatectl set-timezone UTC`
- [ ] Configure hostname: `hostnamectl set-hostname explorer-prod`
- [ ] Configure locale settings

#### Task 6: Create Deployment User
- [ ] Create user: `adduser explorer`
- [ ] Add to sudo group: `usermod -aG sudo explorer`
- [ ] Configure SSH access for new user
- [ ] Disable root SSH login in `/etc/ssh/sshd_config`
- [ ] Restart SSH service

---

### PHASE 2: APPLICATION INSTALLATION (12 tasks)

#### Task 7: Install Go 1.21+
- [ ] Download Go 1.21.6: `wget https://go.dev/dl/go1.21.6.linux-amd64.tar.gz`
- [ ] Extract to `/usr/local/go`
- [ ] Add Go to PATH in `/etc/profile` and `~/.bashrc`
- [ ] Source profile or logout/login
- [ ] Verify: `go version` (should show 1.21.6+)

#### Task 8: Install Node.js 20+
- [ ] Add NodeSource repository
- [ ] Install Node.js 20.x
- [ ] Verify: `node --version` (should show v20.x.x+)
- [ ] Verify: `npm --version`

#### Task 9: Install Docker & Docker Compose
- [ ] Add Docker GPG key
- [ ] Add Docker repository
- [ ] Install Docker CE
- [ ] Install Docker Compose plugin
- [ ] Start Docker service: `systemctl start docker`
- [ ] Enable Docker on boot: `systemctl enable docker`
- [ ] Add `explorer` user to docker group
- [ ] Verify: `docker --version` and `docker compose version`

#### Task 10: Clone Repository
- [ ] Switch to deployment user: `su - explorer`
- [ ] Navigate to home: `cd /home/explorer`
- [ ] Clone repository: `git clone <repo-url> explorer-monorepo`
- [ ] Verify repository cloned correctly

#### Task 11: Install Dependencies
- [ ] Navigate to backend: `cd explorer-monorepo/backend`
- [ ] Download Go modules: `go mod download`
- [ ] Navigate to frontend: `cd ../frontend`
- [ ] Install npm packages: `npm ci --production`

#### Task 12: Build Applications
- [ ] Build indexer: `go build -o /usr/local/bin/explorer-indexer ./indexer/main.go`
- [ ] Build API: `go build -o /usr/local/bin/explorer-api ./api/rest/main.go`
- [ ] Build gateway: `go build -o /usr/local/bin/explorer-gateway ./api/gateway/main.go`
- [ ] Build search service: `go build -o /usr/local/bin/explorer-search ./api/search/main.go`
- [ ] Build frontend: `cd frontend && npm run build`
- [ ] Verify all binaries exist and are executable

---

### PHASE 3: DATABASE SETUP (10 tasks)

#### Task 13: Install PostgreSQL 16
- [ ] Add PostgreSQL APT repository
- [ ] Add PostgreSQL GPG key
- [ ] Update package list
- [ ] Install PostgreSQL 16: `apt install -y postgresql-16 postgresql-contrib-16`

#### Task 14: Install TimescaleDB
- [ ] Add TimescaleDB repository
- [ ] Add TimescaleDB GPG key
- [ ] Update package list
- [ ] Install TimescaleDB: `apt install -y timescaledb-2-postgresql-16`
- [ ] Run TimescaleDB tuner: `timescaledb-tune --quiet --yes`
- [ ] Restart PostgreSQL: `systemctl restart postgresql`

#### Task 15: Create Database and User
- [ ] Switch to postgres user: `su - postgres`
- [ ] Create database user: `CREATE USER explorer WITH PASSWORD '<SECURE_PASSWORD>'`
- [ ] Create database: `CREATE DATABASE explorer OWNER explorer;`
- [ ] Connect to database: `\c explorer`
- [ ] Enable TimescaleDB extension: `CREATE EXTENSION IF NOT EXISTS timescaledb;`
- [ ] Enable UUID extension: `CREATE EXTENSION IF NOT EXISTS "uuid-ossp";`
- [ ] Grant privileges: `GRANT ALL PRIVILEGES ON DATABASE explorer TO explorer;`

#### Task 16: Run Database Migrations
- [ ] Return to deployment user
- [ ] Navigate to backend: `cd /home/explorer/explorer-monorepo/backend`
- [ ] Run migrations: `go run database/migrations/migrate.go`
- [ ] Verify migrations completed successfully
- [ ] Check database tables exist

#### Task 17: Configure PostgreSQL
- [ ] Edit `postgresql.conf`: `/etc/postgresql/16/main/postgresql.conf`
- [ ] Set `max_connections = 100`
- [ ] Set `shared_buffers = 4GB`
- [ ] Set `effective_cache_size = 12GB`
- [ ] Set other performance tuning parameters
- [ ] Edit `pg_hba.conf` for local connections
- [ ] Restart PostgreSQL: `systemctl restart postgresql`
- [ ] Verify PostgreSQL is running: `systemctl status postgresql`

---

### PHASE 4: INFRASTRUCTURE SERVICES (6 tasks)

#### Task 18: Deploy Elasticsearch/OpenSearch
- [ ] Navigate to deployment directory: `cd /home/explorer/explorer-monorepo/deployment`
- [ ] Start Elasticsearch: `docker compose -f docker-compose.yml up -d elasticsearch`
- [ ] Wait for Elasticsearch to be ready
- [ ] Verify Elasticsearch: `curl http://localhost:9200`

#### Task 19: Deploy Redis
- [ ] Start Redis: `docker compose -f docker-compose.yml up -d redis`
- [ ] Verify Redis: `redis-cli ping`
- [ ] Verify both services running: `docker ps`

---

### PHASE 5: APPLICATION SERVICES (10 tasks)

#### Task 20: Create Environment Configuration
- [ ] Copy `.env.example` to `.env`: `cp .env.example .env`
- [ ] Edit `.env` file with production values
- [ ] Set database credentials
- [ ] Set RPC URLs and Chain ID
- [ ] Set API URLs and ports
- [ ] Verify all required variables are set
- [ ] Set proper file permissions: `chmod 600 .env`

#### Task 21: Create Systemd Service Files
- [ ] Create `/etc/systemd/system/explorer-indexer.service`
- [ ] Create `/etc/systemd/system/explorer-api.service`
- [ ] Create `/etc/systemd/system/explorer-frontend.service`
- [ ] Set proper ownership: `chown root:root /etc/systemd/system/explorer-*.service`
- [ ] Set proper permissions: `chmod 644 /etc/systemd/system/explorer-*.service`

#### Task 22: Enable and Start Services
- [ ] Reload systemd: `systemctl daemon-reload`
- [ ] Enable indexer: `systemctl enable explorer-indexer`
- [ ] Enable API: `systemctl enable explorer-api`
- [ ] Enable frontend: `systemctl enable explorer-frontend`
- [ ] Start indexer: `systemctl start explorer-indexer`
- [ ] Start API: `systemctl start explorer-api`
- [ ] Start frontend: `systemctl start explorer-frontend`

#### Task 23: Verify Services
- [ ] Check indexer status: `systemctl status explorer-indexer`
- [ ] Check API status: `systemctl status explorer-api`
- [ ] Check frontend status: `systemctl status explorer-frontend`
- [ ] Check indexer logs: `journalctl -u explorer-indexer -f`
- [ ] Check API logs: `journalctl -u explorer-api -f`
- [ ] Verify API responds: `curl http://localhost:8080/health`
- [ ] Verify frontend responds: `curl http://localhost:3000`

---

### PHASE 6: NGINX REVERSE PROXY (9 tasks)

#### Task 24: Install Nginx
- [ ] Install Nginx: `apt install -y nginx`
- [ ] Verify installation: `nginx -v`

#### Task 25: Create Nginx Configuration
- [ ] Copy config template: `cp deployment/nginx/explorer.conf /etc/nginx/sites-available/explorer`
- [ ] Edit configuration file (update domain if needed)
- [ ] Enable site: `ln -s /etc/nginx/sites-available/explorer /etc/nginx/sites-enabled/`
- [ ] Remove default site: `rm /etc/nginx/sites-enabled/default`
- [ ] Test configuration: `nginx -t`
- [ ] If test passes, reload Nginx: `systemctl reload nginx`

#### Task 26: Configure Rate Limiting
- [ ] Verify rate limiting zones in config
- [ ] Adjust rate limits as needed
- [ ] Test rate limiting (optional)

#### Task 27: Test Nginx Proxy
- [ ] Verify Nginx is running: `systemctl status nginx`
- [ ] Test HTTP endpoint: `curl -I http://localhost`
- [ ] Test API proxy: `curl http://localhost/api/v1/blocks`
- [ ] Check Nginx access logs: `tail -f /var/log/nginx/explorer-access.log`
- [ ] Check Nginx error logs: `tail -f /var/log/nginx/explorer-error.log`

---

### PHASE 7: CLOUDFLARE CONFIGURATION (18 tasks)

#### Task 28: Set Up Cloudflare DNS Records
- [ ] Login to Cloudflare Dashboard
- [ ] Select domain
- [ ] Go to DNS → Records
- [ ] Add A record for `explorer` (or `@`):
  - Type: A
  - Name: explorer
  - IPv4: [Your server IP] (if direct) or leave empty (if tunnel)
  - Proxy: Proxied (orange cloud)
  - TTL: Auto
- [ ] Add CNAME for `www`:
  - Type: CNAME
  - Name: www
  - Target: explorer.d-bis.org
  - Proxy: Proxied
  - TTL: Auto
- [ ] Save DNS records
- [ ] Verify DNS propagation

#### Task 29: Configure Cloudflare SSL/TLS
- [ ] Go to SSL/TLS → Overview
- [ ] Set encryption mode to: **Full (strict)**
- [ ] Go to SSL/TLS → Edge Certificates
- [ ] Enable: "Always Use HTTPS"
- [ ] Enable: "Automatic HTTPS Rewrites"
- [ ] Enable: "Opportunistic Encryption"
- [ ] Enable: "TLS 1.3"
- [ ] Save settings

#### Task 30: Install Cloudflare Tunnel (cloudflared)
- [ ] Download cloudflared: `wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb`
- [ ] Install: `dpkg -i cloudflared-linux-amd64.deb`
- [ ] Verify: `cloudflared --version`

#### Task 31: Authenticate Cloudflare Tunnel
- [ ] Run: `cloudflared tunnel login`
- [ ] Follow browser authentication
- [ ] Verify authentication successful

#### Task 32: Create Cloudflare Tunnel
- [ ] Create tunnel: `cloudflared tunnel create explorer-tunnel`
- [ ] List tunnels: `cloudflared tunnel list`
- [ ] Note tunnel ID

#### Task 33: Configure Cloudflare Tunnel
- [ ] Create config directory: `mkdir -p /etc/cloudflared`
- [ ] Copy tunnel config template: `cp deployment/cloudflare/tunnel-config.yml /etc/cloudflared/config.yml`
- [ ] Edit config file with tunnel ID
- [ ] Update hostnames in config
- [ ] Verify config: `cloudflared tunnel --config /etc/cloudflared/config.yml ingress validate`

#### Task 34: Install Cloudflare Tunnel as Service
- [ ] Install service: `cloudflared service install`
- [ ] Enable service: `systemctl enable cloudflared`
- [ ] Start service: `systemctl start cloudflared`
- [ ] Check status: `systemctl status cloudflared`
- [ ] View logs: `journalctl -u cloudflared -f`

#### Task 35: Verify Cloudflare Tunnel
- [ ] Check tunnel is running: `cloudflared tunnel info explorer-tunnel`
- [ ] Verify DNS routes are configured in Cloudflare dashboard
- [ ] Test domain access: `curl -I https://explorer.d-bis.org`
- [ ] Verify SSL certificate is active

#### Task 36: Configure Cloudflare WAF
- [ ] Go to Security → WAF
- [ ] Enable Cloudflare Managed Ruleset
- [ ] Enable OWASP Core Ruleset
- [ ] Create custom rate limiting rule (if needed)
- [ ] Save rules

#### Task 37: Configure Cloudflare Caching
- [ ] Go to Caching → Configuration
- [ ] Set Caching Level: Standard
- [ ] Go to Caching → Cache Rules
- [ ] Create rule for static assets (Cache everything, Edge TTL: 1 year)
- [ ] Create rule for API endpoints (Bypass cache)
- [ ] Create rule for frontend pages (Cache HTML for 5 minutes)

#### Task 38: Configure DDoS Protection
- [ ] Go to Security → DDoS
- [ ] Enable DDoS protection
- [ ] Configure protection level (Medium recommended)
- [ ] Review and adjust as needed

---

### PHASE 8: SECURITY HARDENING (12 tasks)

#### Task 39: Configure Firewall (UFW)
- [ ] Enable UFW: `ufw --force enable`
- [ ] Allow SSH: `ufw allow 22/tcp`
- [ ] Allow HTTP: `ufw allow 80/tcp` (if direct connection)
- [ ] Allow HTTPS: `ufw allow 443/tcp` (if direct connection)
- [ ] Add Cloudflare IP ranges (if direct connection)
- [ ] Check status: `ufw status verbose`

#### Task 40: Configure Fail2ban
- [ ] Create Nginx jail config: `/etc/fail2ban/jail.d/nginx.conf`
- [ ] Configure nginx-limit-req jail
- [ ] Configure nginx-botsearch jail
- [ ] Restart fail2ban: `systemctl restart fail2ban`
- [ ] Check status: `fail2ban-client status`

#### Task 41: Configure Automatic Updates
- [ ] Configure `/etc/apt/apt.conf.d/50unattended-upgrades`
- [ ] Enable security updates only
- [ ] Disable automatic reboot
- [ ] Enable service: `systemctl enable unattended-upgrades`
- [ ] Start service: `systemctl start unattended-upgrades`

#### Task 42: Configure Log Rotation
- [ ] Create logrotate config: `/etc/logrotate.d/explorer`
- [ ] Set rotation schedule (daily)
- [ ] Set retention (30 days)
- [ ] Configure compression
- [ ] Test: `logrotate -d /etc/logrotate.d/explorer`

#### Task 43: Set Up Backup Script
- [ ] Create backup script: `/usr/local/bin/explorer-backup.sh`
- [ ] Configure database backup
- [ ] Configure config file backup
- [ ] Set cleanup of old backups
- [ ] Make executable: `chmod +x /usr/local/bin/explorer-backup.sh`
- [ ] Test backup script manually
- [ ] Add to crontab: Daily at 2 AM

#### Task 44: Secure Environment File
- [ ] Set proper permissions: `chmod 600 /home/explorer/explorer-monorepo/.env`
- [ ] Verify only owner can read: `ls -l .env`
- [ ] Add .env to .gitignore (verify)

#### Task 45: Configure SSH Hardening
- [ ] Edit `/etc/ssh/sshd_config`
- [ ] Disable root login: `PermitRootLogin no`
- [ ] Disable password authentication (use keys only): `PasswordAuthentication no`
- [ ] Set SSH port (optional, change from 22)
- [ ] Restart SSH: `systemctl restart sshd`
- [ ] Test SSH connection before closing session

---

### PHASE 9: MONITORING & MAINTENANCE (8 tasks)

#### Task 46: Create Health Check Script
- [ ] Create script: `/usr/local/bin/explorer-health-check.sh`
- [ ] Configure API health check
- [ ] Configure service restart on failure
- [ ] Add alert mechanism (email/Slack)
- [ ] Make executable: `chmod +x /usr/local/bin/explorer-health-check.sh`
- [ ] Test script manually

#### Task 47: Configure Health Check Cron Job
- [ ] Add to crontab: Every 5 minutes
- [ ] Verify cron job added: `crontab -l`

#### Task 48: Set Up Log Monitoring
- [ ] Install logwatch: `apt install -y logwatch`
- [ ] Configure logwatch
- [ ] Set up daily log summaries (optional)

#### Task 49: Configure Cloudflare Analytics
- [ ] Access Cloudflare Analytics dashboard
- [ ] Set up custom dashboards
- [ ] Configure alert thresholds

#### Task 50: Set Up Alerts
- [ ] Configure email alerts in Cloudflare
- [ ] Set up high error rate alerts
- [ ] Set up DDoS detection alerts
- [ ] Set up certificate expiration alerts
- [ ] Test alert mechanism

---

### POST-DEPLOYMENT VERIFICATION (13 tasks)

#### Task 51: Verify All Services
- [ ] Check all systemd services: `systemctl status explorer-*`
- [ ] Verify no service errors
- [ ] Check service logs for warnings

#### Task 52: Verify Database
- [ ] Test database connection: `psql -U explorer -d explorer -h localhost`
- [ ] Check database tables exist
- [ ] Verify migrations applied

#### Task 53: Verify Infrastructure Services
- [ ] Check Elasticsearch: `curl http://localhost:9200`
- [ ] Check Redis: `redis-cli ping`
- [ ] Check Docker containers: `docker ps`

#### Task 54: Verify API
- [ ] Test health endpoint: `curl https://explorer.d-bis.org/api/health`
- [ ] Test blocks endpoint: `curl https://explorer.d-bis.org/api/v1/blocks`
- [ ] Test transactions endpoint
- [ ] Test search endpoint

#### Task 55: Verify Frontend
- [ ] Open browser: `https://explorer.d-bis.org`
- [ ] Verify homepage loads
- [ ] Test navigation
- [ ] Verify static assets load

#### Task 56: Verify DNS
- [ ] Check DNS resolution: `dig explorer.d-bis.org`
- [ ] Verify DNS points to Cloudflare IPs
- [ ] Test from multiple locations

#### Task 57: Verify SSL/TLS
- [ ] Check SSL certificate: `openssl s_client -connect explorer.d-bis.org:443 -servername explorer.d-bis.org`
- [ ] Verify certificate is valid
- [ ] Verify TLS 1.3 is enabled
- [ ] Check SSL Labs rating (optional): https://www.ssllabs.com/ssltest/

#### Task 58: Verify Cloudflare Tunnel
- [ ] Check tunnel status: `systemctl status cloudflared`
- [ ] View tunnel info: `cloudflared tunnel info explorer-tunnel`
- [ ] Check tunnel logs for errors

#### Task 59: Verify Nginx
- [ ] Check Nginx status: `systemctl status nginx`
- [ ] Test configuration: `nginx -t`
- [ ] Check access logs
- [ ] Check error logs

#### Task 60: Verify Security
- [ ] Test firewall: `ufw status`
- [ ] Test fail2ban: `fail2ban-client status`
- [ ] Verify security headers present
- [ ] Test rate limiting (optional)

#### Task 61: Verify Performance
- [ ] Test response times
- [ ] Verify caching working
- [ ] Check Cloudflare cache hit ratio
- [ ] Monitor resource usage

#### Task 62: Verify Monitoring
- [ ] Test health check script
- [ ] Verify cron jobs running
- [ ] Check log rotation working
- [ ] Verify backups running

#### Task 63: Documentation
- [ ] Document deployed version
- [ ] Document configuration changes
- [ ] Document known issues
- [ ] Update deployment checklist

---

### OPTIONAL ENHANCEMENTS (8 tasks)

#### Task 64: Set Up Let's Encrypt Certificates (Optional)
- [ ] Install certbot: `apt install -y certbot python3-certbot-nginx`
- [ ] Obtain certificate: `certbot --nginx -d explorer.d-bis.org -d www.explorer.d-bis.org`
- [ ] Test renewal: `certbot renew --dry-run`
- [ ] Set up auto-renewal cron job

#### Task 65: Configure CDN for Static Assets
- [ ] Configure Cloudflare cache rules
- [ ] Set up custom cache headers
- [ ] Verify CDN serving static assets

#### Task 66: Set Up Monitoring Dashboard (Optional)
- [ ] Install Prometheus (optional)
- [ ] Install Grafana (optional)
- [ ] Configure dashboards
- [ ] Set up alerts

#### Task 67: Configure Database Replication (Optional)
- [ ] Set up read replica
- [ ] Configure connection pooling
- [ ] Update application config

#### Task 68: Set Up Load Balancing (Optional)
- [ ] Configure multiple API instances
- [ ] Set up load balancer
- [ ] Configure health checks

#### Task 69: Configure Auto-Scaling (Optional)
- [ ] Set up monitoring metrics
- [ ] Configure scaling rules
- [ ] Test auto-scaling

#### Task 70: Set Up Disaster Recovery
- [ ] Configure automated backups
- [ ] Set up backup verification
- [ ] Document recovery procedures
- [ ] Test recovery process

#### Task 71: Performance Optimization
- [ ] Optimize database queries
- [ ] Configure Redis caching
- [ ] Optimize Nginx config
- [ ] Review and optimize Cloudflare settings

---

## 📊 Deployment Summary

- **Total Tasks**: 71
- **Required Tasks**: 63
- **Optional Tasks**: 8
- **Estimated Time**: 6-8 hours (first deployment)

## 🚀 Quick Start Commands

```bash
# 1. Run automated deployment script (Phase 1-2)
./deployment/scripts/deploy-lxc.sh

# 2. Follow manual steps for remaining phases
# See DEPLOYMENT_GUIDE.md for detailed instructions

# 3. Use checklist to track progress
# See DEPLOYMENT_CHECKLIST.md
```

## 📝 Notes

- Tasks marked with ⚠️ require careful attention
- Tasks marked with ✅ can be automated
- Always test in staging before production
- Keep backups before major changes
- Document any deviations from standard procedure

---

**Last Updated**: 2024-12-23
**Version**: 1.0.0

