# GitLab Self-Hosting Deployment Complete automation for deploying production-ready GitLab on Digital Ocean with custom domain, SSL, email delivery, automated backups, and monitoring. ## Features - ✅ Automated GitLab CE installation - ✅ Let's Encrypt SSL with auto-renewal - ✅ Multiple email provider support (Gmail, SendGrid, Mailgun, AWS SES) - ✅ Automated daily backups with cloud storage option - ✅ Health monitoring scripts - ✅ Security hardening and firewall rules - ✅ Performance tuning for 4GB+ RAM droplets - ✅ Comprehensive testing suite - ✅ Complete documentation ## Quick Start ### 1. Prerequisites - Digital Ocean droplet (4GB RAM minimum, 8GB recommended) - Domain name with DNS access - Email provider account (see docs/EMAIL_SETUP.md) - SSH access to droplet ### 2. Local Setup ```bash # Clone or create this directory structure cd gitlab-deployment # Copy environment template cp .env.example .env # Edit with your configuration nano .env # Make scripts executable chmod +x scripts/*.sh tests/*.sh ``` ### 3. Configure DNS **Before deployment**, add this A record to your DNS: ``` Type: A Name: gitlab (or @ for root domain) Value: YOUR_DROPLET_IP TTL: 3600 ``` Wait for DNS propagation: `dig gitlab.yourdomain.com` ### 4. Deploy GitLab Run scripts in order: ```bash # 1. Setup droplet ssh root@your_droplet_ip "bash -s" < scripts/setup_droplet.sh # 2. Install GitLab (takes 5-10 minutes) ssh root@your_droplet_ip "bash -s" < scripts/install_gitlab.sh # 3. Configure SSL ssh root@your_droplet_ip "bash -s" < scripts/configure_ssl.sh # 4. Configure email (see docs/EMAIL_SETUP.md first!) ssh root@your_droplet_ip "bash -s" < scripts/configure_email.sh # 5. Setup email DNS records ./scripts/setup_dns_records.sh # Follow output to add DNS records # 6. Test email ./scripts/test_email.sh ``` ### 5. First Login ```bash # Get initial password ssh root@your_droplet_ip 'cat /etc/gitlab/initial_root_password' # Visit your GitLab https://gitlab.yourdomain.com # Login as root with the password above # IMMEDIATELY change the password! ``` ### 6. Setup Automated Backups ```bash ssh root@your_droplet_ip crontab -e # Add daily backup at 2 AM 0 2 * * * /root/gitlab-deployment/scripts/backup_gitlab.sh >> /var/log/gitlab_backup.log 2>&1 ``` ## Documentation - **[Deployment Guide](docs/DEPLOYMENT.md)** - Complete step-by-step deployment - **[Email Setup](docs/EMAIL_SETUP.md)** - Email configuration for all providers - **[Testing Guide](docs/TESTING.md)** - Comprehensive testing procedures - **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions ## Requirements ### Minimum - 4GB RAM, 2 vCPU cores - 25GB SSD storage - Ubuntu 22.04 LTS ### Recommended - 8GB RAM, 4 vCPU cores - 50GB SSD storage - Ubuntu 22.04 LTS ### For 50+ Users - 16GB RAM, 8 vCPU cores - 100GB SSD storage - Ubuntu 22.04 LTS ## Project Structure ``` gitlab-deployment/ ├── README.md # This file ├── .env.example # Environment variables template ├── scripts/ │ ├── setup_droplet.sh # Initial server setup │ ├── install_gitlab.sh # GitLab installation │ ├── configure_ssl.sh # SSL certificate setup │ ├── configure_email.sh # Email configuration │ ├── setup_dns_records.sh # DNS record generator │ ├── test_email.sh # Email testing suite │ ├── backup_gitlab.sh # Backup automation │ └── health_check.sh # Health monitoring ├── configs/ │ └── gitlab.rb.template # GitLab configuration template ├── docs/ │ ├── DEPLOYMENT.md # Deployment guide │ ├── EMAIL_SETUP.md # Email setup guide │ ├── TESTING.md # Testing procedures │ └── TROUBLESHOOTING.md # Troubleshooting guide └── tests/ └── integration_tests.sh # Automated testing ``` ## Security Notes 1. **Change root password immediately** after first login 2. **Enable 2FA** for all admin accounts 3. **Review SSH key access** regularly 4. **Keep GitLab updated** monthly 5. **Monitor logs** for suspicious activity 6. **Use strong passwords** for all accounts 7. **Rotate credentials** every 90 days ## Backup & Recovery ### Create Backup ```bash ssh root@your_droplet_ip sudo gitlab-backup create ``` ### Restore Backup ```bash # Stop services sudo gitlab-ctl stop puma sudo gitlab-ctl stop sidekiq # Restore (replace TIMESTAMP) sudo gitlab-backup restore BACKUP=TIMESTAMP # Restart sudo gitlab-ctl restart sudo gitlab-rake gitlab:check SANITIZE=true ``` Backups stored in: `/var/opt/gitlab/backups/` ## Updating GitLab ```bash # SSH to droplet ssh root@your_droplet_ip # Create backup first! sudo gitlab-backup create # Update sudo apt update sudo apt upgrade gitlab-ce # Verify sudo gitlab-rake gitlab:check ``` ## Monitoring Run health checks: ```bash ssh root@your_droplet_ip '/root/gitlab-deployment/scripts/health_check.sh' ``` Set up automated monitoring: ```bash # Edit crontab crontab -e # Add hourly health check 0 * * * * /root/gitlab-deployment/scripts/health_check.sh >> /var/log/gitlab_health.log 2>&1 ``` ## Cost Estimate (Monthly) - **Droplet (4GB):** $24/month - **Droplet (8GB):** $48/month - **Email (SendGrid):** Free (100 emails/day) - **Email (Mailgun):** Free (5,000 emails/month) - **Backups (DO Spaces):** $5/month (250GB) - **Domain:** $10-15/year **Total:** ~$24-48/month ## Common Issues ### GitLab won't start ```bash # Check memory and disk space free -h df -h # Check logs sudo gitlab-ctl tail ``` ### SSL certificate issues ```bash # Verify DNS dig gitlab.yourdomain.com # Renew certificate sudo gitlab-ctl renew-le-certs ``` ### Email not working See **[docs/EMAIL_SETUP.md](docs/EMAIL_SETUP.md)** for comprehensive troubleshooting. ### More help See **[docs/TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md)** ## Support - **Documentation:** docs/ - **GitLab Docs:** docs.gitlab.com - **GitLab Forum:** forum.gitlab.com - **Digital Ocean Community:** digitalocean.com/community ## License This deployment configuration is provided as-is for personal and commercial use. ## Contributing Improvements welcome! Please test thoroughly before submitting changes. ## Next Steps After Deployment 1. Import existing repositories 2. Set up CI/CD pipelines 3. Configure integrations (Slack, Discord, etc.) 4. Set up project templates 5. Configure issue boards and milestones 6. Explore GitLab Container Registry (optional) 7. Set up GitLab Pages for documentation (optional) ## Resources - [GitLab Documentation](https://docs.gitlab.com) - [Digital Ocean Tutorials](https://www.digitalocean.com/community/tutorials) - [Let's Encrypt Documentation](https://letsencrypt.org/docs/) - [Git Documentation](https://git-scm.com/doc) --- **Version:** 1.0.0 **Last Updated:** 2024