8.9 KiB
🔄 Gitea → GitHub Synchronization
Automatic repository synchronization from Gitea to GitHub after each push.
📋 Available Methods
| Method | Complexity | Speed | Reliability | Recommendation |
|---|---|---|---|---|
| 1. Git Hooks | ⭐⭐ | ⚡ Instant | ✅ High | Recommended |
| 2. GitHub Actions | ⭐⭐⭐ | ⏱️ 1-5 min | ✅ High | Complex scenarios |
| 3. Gitea Mirror | ⭐ | ⏱️ Scheduled | ⭐⭐ Medium | Simplest |
| 4. Double Remote | ⭐ | ⚡ Instant | ⭐⭐ Medium | Local work |
🚀 Method 1: Git Hooks (Recommended)
Installation
1. On Gitea server, find repository path:
# Usually:
/var/lib/gitea/data/gitea-repositories/username/configure_nginx_manager.git
# Or
/home/git/gitea-repositories/username/configure_nginx_manager.git
2. Create post-receive hook:
cd /path/to/gitea/repos/username/configure_nginx_manager.git/hooks/
nano post-receive
3. Insert content from gitea-hooks/post-receive file (in this repository)
4. Configure parameters:
# In post-receive file, change:
GITHUB_REPO="git@github.com:YOUR_USERNAME/configure_nginx_manager.git"
# Or for HTTPS with token:
GITHUB_REPO="https://YOUR_TOKEN@github.com/YOUR_USERNAME/configure_nginx_manager.git"
5. Make script executable:
chmod +x post-receive
6. Create log directory:
mkdir -p /var/log/gitea
chown git:git /var/log/gitea
SSH Key Setup (for git@github.com)
On Gitea server:
Step 1: Identify Gitea user
# Check which user runs Gitea
ps aux | grep gitea | grep -v grep
# Usually one of:
# - git (standard installation)
# - gitea (Docker/LXC installation)
Step 2: Switch to that user
# Try git:
sudo su - git
# If that doesn't work, try gitea:
sudo su - gitea
# Verify current user
whoami # Should be: git or gitea
Step 3: Create SSH key
# Create SSH key (if not exists)
ssh-keygen -t ed25519 -C "gitea-to-github-sync" -f ~/.ssh/id_ed25519 -N ""
# Copy public key
cat ~/.ssh/id_ed25519.pub
On GitHub:
- Settings → SSH and GPG keys
- New SSH key
- Paste public key
- Save
⚠️ IMPORTANT: Add GitHub to known_hosts:
# From the same user (git or gitea)
ssh-keyscan -H github.com >> ~/.ssh/known_hosts
# Verify key was added
cat ~/.ssh/known_hosts | grep github.com
Verify connection:
ssh -T git@github.com
# Should output: Hi username! You've successfully authenticated...
Token Setup (for HTTPS)
On GitHub:
- Settings → Developer settings → Personal access tokens → Tokens (classic)
- Generate new token
- Select scope:
repo(full repository access) - Copy token
In hook file:
GITHUB_REPO="https://ghp_YOUR_TOKEN_HERE@github.com/username/configure_nginx_manager.git"
Testing
# Make test commit in Gitea
cd /tmp
git clone http://gitea.example.com/username/configure_nginx_manager.git
cd configure_nginx_manager
echo "test" >> README.md
git add README.md
git commit -m "Test sync to GitHub"
git push
# Check log
tail -f /var/log/gitea/github-sync.log
# Check GitHub - changes should appear
🔄 Method 2: GitHub Actions
Installation
1. Create workflow in GitHub repository:
File already created: .github/workflows/sync-from-gitea.yml
2. Configure secrets in GitHub:
GitHub Repository → Settings → Secrets and variables → Actions → New repository secret
Add:
-
Name:
GITEA_URL- Value:
https://gitea.example.com/username/configure_nginx_manager.git
- Value:
-
Name:
GITEA_TOKEN- Value: Gitea access token
Getting Gitea Token
In Gitea:
- Settings → Applications → Generate New Token
- Token Name: "GitHub Sync"
- Select permissions:
read:repository - Generate Token
- Copy token
Running Sync
Automatically (scheduled):
- Checks for changes every hour
Manually:
- GitHub → Actions
- Select workflow "Sync from Gitea"
- Run workflow
Via Gitea webhook:
In Gitea repository:
- Settings → Webhooks → Add Webhook → Gitea
- Target URL:
https://api.github.com/repos/USERNAME/configure_nginx_manager/dispatches - HTTP Method:
POST - POST Content Type:
application/json - Trigger On:
Push events - Body:
{
"event_type": "gitea-push"
}
🪞 Method 3: Gitea Mirror (Built-in)
Setup
In Gitea repository:
- Settings → Repository
- Scroll to "Mirror Settings"
- Click "Add Push Mirror"
- Fill in:
- Git Remote Repository URL:
https://github.com/username/configure_nginx_manager.git - Username: your GitHub username
- Password: GitHub Personal Access Token
- Sync Interval:
8h(every 8 hours) or0(manual only)
- Git Remote Repository URL:
- Save
Manual Sync
Settings → Repository → Mirror Settings → Sync Now
Advantages
- ✅ Built-in feature
- ✅ No scripts required
- ✅ Web interface management
Disadvantages
- ⚠️ Works on schedule (not instant)
- ⚠️ Not available in all Gitea versions
🔀 Method 4: Double Remote
For Local Work
Setup:
# In your local repository
cd configure_nginx_manager
# Add GitHub as second remote
git remote add github git@github.com:username/configure_nginx_manager.git
# Or configure push to both repositories simultaneously
git remote set-url --add --push origin git@github.com:username/configure_nginx_manager.git
# Verify
git remote -v
Usage:
# Normal push (Gitea only)
git push origin main
# Push to GitHub
git push github main
# Push to both repositories
git push origin main
git push github main
# Or create alias
git config alias.pushall '!git push origin main && git push github main'
git pushall
🔍 Sync Verification
Check via Git
# Compare commits
git ls-remote git@gitea.example.com:username/configure_nginx_manager.git
git ls-remote git@github.com:username/configure_nginx_manager.git
# Should have identical SHA
Check Logs (Method 1 - Hooks)
# On Gitea server
tail -f /var/log/gitea/github-sync.log
Check GitHub Actions (Method 2)
- GitHub Repository → Actions
- View recent runs
- Check execution logs
⚙️ Recommended Configuration
For maximum reliability, use combination of methods:
- Git Hook (primary) - instant sync
- GitHub Actions (backup) - hourly check in case of hook failure
Installing Both Methods
# 1. Install Git Hook on Gitea server
# (see Method 1)
# 2. Configure GitHub Actions
# (see Method 2)
# 3. GitHub Actions will catch missed changes
🐛 Troubleshooting
Problem: Hook not firing
Check:
# On Gitea server
ls -la /path/to/repo.git/hooks/post-receive
# Should be -rwxr-xr-x
# Check permissions
chmod +x /path/to/repo.git/hooks/post-receive
chown git:git /path/to/repo.git/hooks/post-receive
# Check Gitea error log
tail -f /var/log/gitea/gitea.log
Problem: Permission denied (SSH)
Solution:
# Ensure SSH key is added to GitHub
ssh -T git@github.com
# Check .ssh permissions
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
Problem: Authentication failed (HTTPS)
Solution:
- Check GitHub token (should have
reposcope) - Token not expired
- Correct URL format:
https://TOKEN@github.com/user/repo.git
Problem: GitHub Actions not triggering
Solution:
- Check secrets in Settings → Secrets
- Verify webhook format from Gitea
- Run manually for test
📊 Method Comparison
Sync Speed
- Git Hooks: ⚡ < 1 second
- GitHub Actions (webhook): ⏱️ 10-30 seconds
- GitHub Actions (schedule): ⏱️ up to 1 hour
- Gitea Mirror: ⏱️ scheduled
Reliability
- Git Hooks: ⭐⭐⭐⭐⭐ (when properly configured)
- GitHub Actions: ⭐⭐⭐⭐⭐ (very reliable)
- Gitea Mirror: ⭐⭐⭐ (depends on Gitea version)
- Double Remote: ⭐⭐ (requires manual action)
🎯 Final Recommendation
For configure_nginx_manager project:
1. Primary method: Git Hook
- Fast
- Reliable
- Automatic
2. Backup method: GitHub Actions
- Hourly check
- Catches missed changes
- Can run manually
3. Monitoring:
# Weekly verification
git ls-remote origin | head -1
git ls-remote github | head -1
# SHA should match
📝 Quick Setup
# On Gitea server
sudo su - git
cd /path/to/gitea-repositories/username/configure_nginx_manager.git/hooks/
# Download hook
wget https://raw.githubusercontent.com/username/configure_nginx_manager/main/gitea-hooks/post-receive
# Configure
nano post-receive
# Change GITHUB_REPO
# Permissions
chmod +x post-receive
# Test
echo "test" | ./post-receive
Done! 🎉
📚 Additional Resources
Version: 1.0
Author: Фофанов Дмитрий
Date: October 27, 2025