Complete Migration Checklist: Comprehensive Server Migration Planning Guide

Server migration is a complex operation that requires meticulous planning, coordination, and execution. Whether you're moving a single application or an entire data center, having a comprehensive checklist ensures nothing is overlooked and reduces the risk of downtime, data loss, or security vulnerabilities. This guide provides an exhaustive, production-tested checklist covering every phase of server migration from initial planning to post-migration optimization.

Understanding the Importance of Migration Checklists

Migration failures often stem from overlooked details rather than technical complexity. A thorough checklist serves multiple purposes:

  • Risk Mitigation: Identifies potential issues before they become critical
  • Coordination: Ensures all team members understand their responsibilities
  • Compliance: Maintains audit trails and documentation requirements
  • Efficiency: Prevents rework by catching issues early
  • Communication: Keeps stakeholders informed throughout the process
  • Rollback Preparedness: Ensures you can quickly revert if needed
  • Knowledge Transfer: Documents the process for future migrations

This checklist is designed to be adapted to your specific environment, whether you're migrating web servers, databases, mail servers, or entire application stacks.

Phase 1: Pre-Planning and Discovery (3-4 Weeks Before)

1.1 Business Requirements Assessment

  • Define migration objectives and success criteria
  • Identify business drivers for migration (cost, performance, compliance)
  • Determine acceptable downtime window (zero, minutes, hours)
  • Establish budget for migration project
  • Identify key stakeholders and decision-makers
  • Document service level agreements (SLAs)
  • Define rollback criteria and conditions
  • Establish communication plan for stakeholders
  • Schedule regular status update meetings
  • Document compliance and regulatory requirements

1.2 Current Environment Discovery

# System inventory commands
uname -a > /tmp/migration-docs/system-info.txt
cat /etc/*-release >> /tmp/migration-docs/system-info.txt
lscpu >> /tmp/migration-docs/system-info.txt
free -h >> /tmp/migration-docs/system-info.txt
df -h >> /tmp/migration-docs/system-info.txt
  • Document current server specifications (CPU, RAM, disk)
  • List all installed software and versions
  • Identify all running services and processes
  • Document network configuration (IP, DNS, gateways)
  • Map all storage volumes and mount points
  • Inventory all databases and schemas
  • Document all scheduled cron jobs and systemd timers
  • List all user accounts and permissions
  • Identify SSL/TLS certificates and expiration dates
  • Document API keys and credentials
  • Map all firewall rules and security groups
  • Identify monitoring and alerting configurations
  • Document backup schedules and retention policies
  • List all integrations with external services
  • Identify load balancers and DNS configurations

1.3 Application Assessment

# Application discovery
systemctl list-units --type=service --state=running > /tmp/running-services.txt
netstat -tulpn > /tmp/listening-ports.txt
ps aux > /tmp/running-processes.txt
  • List all applications and their versions
  • Document application dependencies
  • Identify configuration files and locations
  • Map application data storage locations
  • Document application ports and protocols
  • Identify stateful vs stateless components
  • Review application logs and their locations
  • Document environment variables
  • Identify third-party libraries and frameworks
  • Review application documentation
  • Identify session storage mechanisms
  • Document queue systems (RabbitMQ, Redis, etc.)
  • Map CDN and caching layers
  • Identify background job processors

1.4 Data Assessment

# Data volume assessment
du -sh /var/www/* > /tmp/web-data-sizes.txt
du -sh /var/lib/mysql > /tmp/database-sizes.txt
du -sh /home/* > /tmp/user-data-sizes.txt
  • Calculate total data volume to migrate
  • Identify largest files and directories
  • Estimate data growth rate
  • Document database sizes and growth trends
  • Identify static vs dynamic data
  • Review media and asset storage
  • Document temporary and cache directories
  • Identify data retention requirements
  • Review log file sizes and rotation policies
  • Calculate total bandwidth requirements for transfer
  • Estimate transfer time based on bandwidth
  • Identify data that can be archived or deleted

1.5 Dependency Mapping

# Service dependency discovery
systemctl list-dependencies service-name
docker inspect container-name | jq '.[0].HostConfig.Links'
  • Map application to infrastructure dependencies
  • Document database connections and replications
  • Identify file system dependencies
  • Map network dependencies (VPNs, private networks)
  • Document email delivery systems
  • Identify authentication providers (LDAP, OAuth)
  • Map payment gateway integrations
  • Document DNS dependencies
  • Identify content delivery networks
  • Map monitoring system dependencies
  • Document logging system integrations
  • Identify backup system dependencies

Phase 2: Planning and Preparation (2-3 Weeks Before)

2.1 Target Environment Preparation

# Destination server validation
ssh user@new-server "hostname; uname -a; free -h; df -h"
  • Procure new server infrastructure
  • Verify hardware specifications meet requirements
  • Install base operating system
  • Apply latest security updates
  • Configure network settings (IP, DNS, gateway)
  • Set up firewall rules
  • Configure hostname and FQDN
  • Set correct timezone and locale
  • Allocate sufficient disk space (1.5x current usage)
  • Install required software packages
  • Configure user accounts and SSH access
  • Set up monitoring agents
  • Install and configure backup tools
  • Verify network connectivity to source
  • Test bandwidth between source and destination

2.2 Security Preparation

# Security setup
ssh-keygen -t ed25519 -C "migration-key"
ssh-copy-id user@new-server
  • Generate SSH keys for passwordless authentication
  • Configure firewall rules on both servers
  • Set up SSL/TLS certificates
  • Configure fail2ban or similar intrusion prevention
  • Review and harden SSH configuration
  • Set up security scanning tools
  • Configure AppArmor or SELinux
  • Review file and directory permissions
  • Set up encrypted data volumes if required
  • Document security group configurations
  • Configure VPN if required
  • Review and update passwords and secrets
  • Set up two-factor authentication
  • Configure audit logging

2.3 Backup and Recovery Preparation

# Comprehensive backup
sudo tar czf /backup/full-backup-$(date +%F).tar.gz \
  --exclude=/proc \
  --exclude=/sys \
  --exclude=/dev \
  --exclude=/backup \
  /
  • Create full system backup of source server
  • Backup all databases with full dumps
  • Export all configuration files
  • Backup SSL certificates and keys
  • Export cron jobs and scheduled tasks
  • Backup email queues and spools
  • Create inventory of all files to migrate
  • Test backup restoration process
  • Verify backup integrity with checksums
  • Store backups in multiple locations
  • Document backup locations and access methods
  • Create database point-in-time snapshots
  • Backup application configuration files
  • Export environment variables and secrets

2.4 Testing Environment Setup

# Set up testing hosts file entry
echo "new-server-ip test.domain.com" | sudo tee -a /etc/hosts
  • Set up staging environment for testing
  • Configure test domains or host file entries
  • Deploy applications to test environment
  • Test application functionality thoroughly
  • Verify database connectivity
  • Test SSL certificate installation
  • Validate email functionality
  • Test API integrations
  • Verify cron job execution
  • Test backup and restore procedures
  • Perform load testing
  • Test monitoring and alerting
  • Validate security configurations
  • Document test results and issues

2.5 Migration Strategy Planning

  • Choose migration method (cutover, parallel, phased)
  • Define migration timeline with specific dates/times
  • Identify migration dependencies and order
  • Create detailed step-by-step migration plan
  • Assign responsibilities to team members
  • Define communication protocols during migration
  • Establish monitoring procedures
  • Create rollback plan with specific triggers
  • Define success criteria for each step
  • Schedule migration during low-traffic period
  • Notify users of planned maintenance window
  • Prepare status page or notification system
  • Create escalation procedures for issues
  • Document emergency contact information

2.6 DNS Preparation

# Lower DNS TTL
dig +short domain.com | head -1
# Update DNS records to TTL=300
  • Document current DNS configuration
  • Identify all DNS records (A, AAAA, MX, CNAME, TXT)
  • Lower TTL values 48 hours before migration
  • Prepare updated DNS records with new IPs
  • Document SPF, DKIM, DMARC records
  • Verify DNS propagation monitoring tools
  • Set up secondary DNS if not already configured
  • Document DNS provider access credentials
  • Plan DNS cutover sequence
  • Identify split-horizon DNS requirements

Phase 3: Pre-Migration Tasks (1 Week Before)

3.1 Final Validation

# Pre-migration validation
ping -c 5 new-server-ip
ssh user@new-server "echo 'Connection successful'"
df -h /destination/path
  • Verify new server is fully configured
  • Confirm all software is installed and configured
  • Test SSH connectivity from all required locations
  • Verify sufficient disk space on destination
  • Test network connectivity and bandwidth
  • Validate backup completeness
  • Review and update migration documentation
  • Conduct team walkthrough of migration plan
  • Verify all team members have required access
  • Test communication channels
  • Confirm stakeholder availability during migration
  • Verify monitoring is functioning on both servers
  • Test rollback procedures
  • Confirm maintenance window with stakeholders

3.2 Application Preparation

# Application configuration export
cp -r /etc/nginx /tmp/nginx-config-backup/
cp -r /etc/apache2 /tmp/apache-config-backup/
cp /var/www/html/config.php /tmp/app-configs/
  • Export application configurations
  • Document environment-specific settings
  • Prepare application configuration for new server
  • Update connection strings for new environment
  • Prepare database migration scripts
  • Update API endpoints if changing
  • Prepare cache warming procedures
  • Document session migration strategy
  • Prepare maintenance page
  • Test application startup procedures
  • Document application shutdown procedures
  • Prepare health check endpoints

3.3 Communication Preparation

  • Draft migration announcement for users
  • Prepare status update templates
  • Set up war room or communication channel
  • Distribute migration schedule to all stakeholders
  • Prepare rollback announcement template
  • Set up monitoring dashboard for stakeholders
  • Create FAQ document for common concerns
  • Prepare post-migration success notification
  • Schedule pre-migration team meeting
  • Confirm on-call schedules for support

Phase 4: Migration Execution Day

4.1 Pre-Migration Checklist (4 Hours Before)

# Final preparations
sudo systemctl status critical-service
mailq | tail -1  # Check mail queue
mysql -e "SHOW PROCESSLIST;"  # Check active connections
  • Send final migration notification to users
  • Verify all team members are available
  • Confirm rollback procedures are ready
  • Create final backup of source server
  • Document current state of all services
  • Clear unnecessary logs and temporary files
  • Verify monitoring is active on both servers
  • Test communication channels
  • Review migration checklist with team
  • Establish baseline metrics (CPU, memory, disk, network)

4.2 Data Synchronization Phase

# Initial data sync
rsync -avzP --exclude 'cache/*' \
  /source/data/ user@new-server:/destination/data/
  • Begin initial data synchronization
  • Monitor synchronization progress
  • Verify file transfer integrity
  • Check available disk space during transfer
  • Monitor network bandwidth usage
  • Document any transfer errors or warnings
  • Perform incremental synchronization passes
  • Verify critical data has been transferred

4.3 Database Migration Phase

# Database migration
mysqldump -u root -p --single-transaction \
  --all-databases > /tmp/full-db-backup.sql

scp /tmp/full-db-backup.sql user@new-server:/tmp/
  • Stop application writes to database (if required)
  • Create final database dump
  • Transfer database dump to new server
  • Import database on new server
  • Verify row counts match source
  • Test database connectivity
  • Verify stored procedures and triggers
  • Check database user permissions
  • Validate foreign key constraints
  • Test database performance

4.4 Application Migration Phase

# Application deployment
systemctl stop application-service
rsync -avzP /var/www/ user@new-server:/var/www/
  • Stop application services on source
  • Perform final application file synchronization
  • Update application configuration for new server
  • Transfer SSL certificates
  • Configure web server on new server
  • Start application services on new server
  • Verify application starts without errors
  • Check application logs for issues
  • Test basic application functionality
  • Verify file permissions and ownership

4.5 Service Migration Phase

  • Migrate cron jobs to new server
  • Configure email services
  • Set up monitoring on new server
  • Configure log rotation
  • Enable necessary systemd services
  • Configure background job processors
  • Set up queue workers
  • Configure cache services
  • Enable automatic service restart policies

4.6 DNS Cutover Phase

# Monitor DNS propagation
watch -n 5 'dig +short domain.com @8.8.8.8'
  • Update DNS A records to new server IP
  • Update DNS AAAA records if using IPv6
  • Update MX records for mail servers
  • Monitor DNS propagation globally
  • Verify new server receives traffic
  • Monitor both servers during transition
  • Document DNS change time
  • Verify SSL works with new IP

4.7 Parallel Operation Phase (1-4 Hours)

  • Monitor traffic on both servers
  • Verify new server handles requests correctly
  • Check error rates on new server
  • Monitor resource usage (CPU, RAM, disk I/O)
  • Verify database operations
  • Check application logs for errors
  • Test critical user workflows
  • Monitor email delivery
  • Verify API functionality
  • Check cache hit rates
  • Monitor queue processing
  • Verify scheduled jobs execute

Phase 5: Post-Migration Verification (First 24 Hours)

5.1 Immediate Verification (First Hour)

# System health checks
systemctl status nginx mysql php-fpm
tail -100 /var/log/nginx/error.log
htop
  • Verify all services are running
  • Check system resource usage
  • Review application logs for errors
  • Test user login functionality
  • Verify database connectivity
  • Test critical application features
  • Check email sending and receiving
  • Verify API endpoint responses
  • Test payment processing (if applicable)
  • Check SSL certificate functionality
  • Verify CDN integration
  • Test file upload functionality
  • Check search functionality
  • Verify reporting systems

5.2 Functional Testing

# Application testing
curl -I https://domain.com
curl -X POST https://domain.com/api/test
  • Execute end-to-end test scenarios
  • Test user registration and authentication
  • Verify form submissions
  • Test database read and write operations
  • Check file upload and download
  • Test email notifications
  • Verify password reset functionality
  • Test checkout process (e-commerce)
  • Check admin panel functionality
  • Test search and filtering
  • Verify export and report generation
  • Test API integrations
  • Check mobile application connectivity
  • Verify third-party integrations

5.3 Performance Verification

# Performance testing
ab -n 1000 -c 10 https://domain.com/
time curl https://domain.com/slow-page
  • Compare response times to baseline
  • Check page load times
  • Verify database query performance
  • Monitor server resource usage
  • Check cache effectiveness
  • Test under typical load
  • Monitor memory usage trends
  • Check disk I/O performance
  • Verify network latency
  • Monitor error rates

5.4 Security Verification

# Security checks
nmap -sV new-server-ip
openssl s_client -connect domain.com:443
  • Verify firewall rules are active
  • Check SSL certificate validity
  • Test security headers
  • Verify fail2ban is active
  • Check file permissions
  • Review security logs
  • Test intrusion detection
  • Verify encryption is functioning
  • Check authentication mechanisms
  • Review access logs for anomalies

5.5 Monitoring and Alerting

# Set up monitoring
systemctl status monitoring-agent
tail -f /var/log/monitoring.log
  • Verify monitoring agents are reporting
  • Check all monitoring dashboards
  • Test alert notifications
  • Verify metrics are being collected
  • Check log aggregation
  • Test alert escalation procedures
  • Verify uptime monitoring
  • Check performance metrics collection
  • Verify error tracking
  • Test synthetic monitoring

Phase 6: Extended Monitoring (First Week)

6.1 Daily Checks

  • Review system logs daily
  • Monitor error rates and trends
  • Check disk space growth
  • Review backup completion
  • Monitor traffic patterns
  • Check database performance
  • Review user-reported issues
  • Monitor resource utilization trends
  • Check certificate expiration dates
  • Review security logs

6.2 Performance Optimization

# Performance tuning
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
sudo systemctl restart mysql
  • Analyze slow query logs
  • Optimize database indexes
  • Tune web server configuration
  • Optimize caching strategies
  • Review and tune kernel parameters
  • Optimize PHP-FPM settings
  • Configure OPcache settings
  • Tune connection pool sizes
  • Optimize memory allocation
  • Review and adjust worker processes

6.3 Old Server Management

  • Monitor old server for stray traffic
  • Process remaining mail queue
  • Archive old server logs
  • Document old server configuration
  • Create final backup of old server
  • Plan old server decommissioning
  • Update internal documentation
  • Update network diagrams
  • Remove old server from monitoring
  • Cancel old server services (if applicable)

Phase 7: Final Cleanup and Documentation (2-4 Weeks After)

7.1 Documentation Updates

  • Update all technical documentation
  • Document lessons learned
  • Update runbooks and procedures
  • Create post-migration report
  • Document configuration changes
  • Update disaster recovery procedures
  • Create new server documentation
  • Update network diagrams
  • Document new IP addresses
  • Update contact lists and escalation procedures

7.2 Optimization and Tuning

  • Review performance metrics
  • Implement performance improvements
  • Optimize resource allocation
  • Fine-tune monitoring thresholds
  • Optimize backup schedules
  • Review and optimize costs
  • Implement automation improvements
  • Review security configurations
  • Optimize log retention
  • Implement identified enhancements

7.3 Old Server Decommissioning

# Final old server tasks
sudo systemctl stop all-services
sudo tar czf /backup/final-old-server-backup.tar.gz /
  • Verify no traffic reaching old server
  • Create final archival backup
  • Document what was archived
  • Stop all services on old server
  • Remove from DNS (if separate hostname)
  • Cancel hosting/cloud services
  • Update asset inventory
  • Securely wipe sensitive data
  • Document decommissioning date
  • Update license inventories

7.4 Post-Migration Review

  • Conduct team retrospective meeting
  • Document what went well
  • Document what could be improved
  • Calculate actual downtime
  • Review migration costs vs budget
  • Gather stakeholder feedback
  • Update migration procedures
  • Create improved checklist for future migrations
  • Archive migration documentation
  • Celebrate successful migration with team

Emergency Rollback Checklist

If critical issues arise, execute rollback:

  • Announce rollback to stakeholders
  • Revert DNS records to old server
  • Stop services on new server
  • Restart services on old server
  • Verify old server functionality
  • Sync any new data back to old server (if applicable)
  • Test old server thoroughly
  • Document rollback reason and time
  • Notify users of service restoration
  • Schedule post-mortem meeting
  • Analyze root cause
  • Create action plan for re-attempt

Migration Checklist Template for Team Use

Create a shared document with this structure:

Migration Date: [DATE]
Migration Lead: [NAME]
Team Members: [NAMES]
Services Being Migrated: [LIST]
Acceptable Downtime: [DURATION]

Phase 1: Pre-Planning [COMPLETION DATE]
- [ ] Task 1 [Owner: NAME] [Status: Not Started/In Progress/Complete]
- [ ] Task 2 [Owner: NAME] [Status: ]

Phase 2: Planning [COMPLETION DATE]
- [ ] Task 1 [Owner: NAME] [Status: ]

[Continue for all phases]

Notes and Issues:
- [Timestamp] [Issue/Note] [Resolution]

Success Criteria:
- [ ] Criterion 1
- [ ] Criterion 2

Conclusion

A comprehensive migration checklist is your insurance policy against migration failures. This checklist covers:

  1. Thorough Discovery: Understanding what you have before you move it
  2. Careful Planning: Preparing for success and planning for failure
  3. Methodical Execution: Following a proven sequence of operations
  4. Comprehensive Testing: Verifying functionality at every step
  5. Detailed Documentation: Recording decisions and configurations
  6. Continuous Monitoring: Watching for issues throughout the process
  7. Proper Cleanup: Ensuring a clean finish with lessons learned

Adapt this checklist to your specific environment, and maintain it as a living document that improves with each migration. Share it with your team, add organization-specific requirements, and most importantly, actually use it during your migrations.

Remember: The goal isn't just to complete the migration—it's to complete it successfully, safely, and in a way that builds confidence for future infrastructure changes. A thorough checklist makes that possible.