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:
- Thorough Discovery: Understanding what you have before you move it
- Careful Planning: Preparing for success and planning for failure
- Methodical Execution: Following a proven sequence of operations
- Comprehensive Testing: Verifying functionality at every step
- Detailed Documentation: Recording decisions and configurations
- Continuous Monitoring: Watching for issues throughout the process
- 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.


