gitlab-deployment/README.md

294 lines
6.8 KiB
Markdown

# 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