انتقل إلى المحتوى الرئيسي
العودة إلى الفئة

تثبيت Gitea / Forgejo: خادم Git المستضاف ذاتياً

تثبيت Gitea أو Forgejo عبر Docker، إدارة المستودعات، CI/CD (Gitea Actions)، تكوين مفاتيح SSH، إدارة المنظمات والفرق، المرايا والـ webhook.

وقت القراءة: 14 دقيقة الاستضافة الذاتية
giteaforgejogitself-hostingdockerci/cdمستودع
الكاتب
REXE Teknoloji Network & Security Team
المحرر
REXE Teknoloji Technical Editorial
أول نشر
آخر تحديث

تثبيت Gitea / Forgejo: خادم Git المستضاف ذاتياً

Gitea وForgejo هما بديلان مفتوحا المصدر وخفيفا الوزن ومستضافان ذاتياً لـ GitHub وGitLab. يمكنك استضافة مستودعات Git على خادمك الخاص، وتشغيل خطوط CI/CD، والتعاون في الكود مع فريقك. Forgejo هو فرع من Gitea يركز على المجتمع، وكلاهما متوافقان إلى حد بعيد مع بعضهما.

Gitea مقابل Forgejo

الميزةGiteaForgejo
الترخيصMITGPL-3.0
الإدارةمدعوم من شركةيديره المجتمع
التوافقالتطبيق المرجعيمتوافق مع Gitea
التحديثاتمنتظمةأكثر تكراراً
موصى به لـالمؤسساتالمجتمع

كلا المشروعين يستخدمان نفس هيكل docker-compose؛ يختلف فقط اسم الصورة.

متطلبات النظام

  • خادم مثبت عليه Docker وDocker Compose
  • 512 ميغابايت من الذاكرة العشوائية كحد أدنى (يُنصح بـ 1 غيغابايت)
  • PostgreSQL أو MySQL (موصى به) أو SQLite
  • المنفذ 22 أو منفذ مخصص للوصول عبر SSH

التثبيت باستخدام Docker

docker-compose.yml (Gitea)

hljs yaml
version: '3.8'

services:
  gitea:
    image: gitea/gitea:latest
    container_name: gitea
    restart: unless-stopped
    environment:
      - USER_UID=1000
      - USER_GID=1000
      - GITEA__database__DB_TYPE=postgres
      - GITEA__database__HOST=db:5432
      - GITEA__database__NAME=gitea
      - GITEA__database__USER=gitea
      - GITEA__database__PASSWD=كلمة-مرور-قوية
      - GITEA__server__DOMAIN=git.example.com
      - GITEA__server__SSH_DOMAIN=git.example.com
      - GITEA__server__ROOT_URL=https://git.example.com/
      - GITEA__server__SSH_PORT=2222
    volumes:
      - ./gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"
      - "2222:22"
    depends_on:
      - db

  db:
    image: postgres:15
    container_name: gitea-db
    restart: unless-stopped
    environment:
      POSTGRES_DB: gitea
      POSTGRES_USER: gitea
      POSTGRES_PASSWORD: كلمة-مرور-قوية
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

التبديل إلى Forgejo

hljs yaml
# فقط غيّر سطر image:
image: codeberg.org/forgejo/forgejo:latest
hljs bash
# تشغيل الحاوية
docker compose up -d

# فحص السجلات
docker logs gitea -f

Nginx Reverse Proxy

hljs nginx
server {
    listen 80;
    server_name git.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name git.example.com;

    ssl_certificate /etc/letsencrypt/live/git.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/git.example.com/privkey.pem;

    client_max_body_size 512M;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

الإعداد الأولي

بعد التثبيت، انتقل إلى https://git.example.com:

  1. إعدادات قاعدة البيانات تُملأ تلقائياً (من env)
  2. الإعدادات العامة: عنوان الموقع، بريد المشرف
  3. أنشئ حساب المشرف
  4. أكمل الإعداد

التكوين المتقدم عبر app.ini

hljs ini
[server]
DOMAIN = git.example.com
ROOT_URL = https://git.example.com/
SSH_DOMAIN = git.example.com
SSH_PORT = 2222
DISABLE_SSH = false

[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = false

[mailer]
ENABLED = true
FROM = gitea@example.com
SMTP_ADDR = smtp.example.com
SMTP_PORT = 587
USER = gitea@example.com
PASSWD = كلمة-مرور-smtp

تكوين مفاتيح SSH

إضافة مفتاح SSH للمستخدم

hljs bash
# إنشاء مفتاح SSH
ssh-keygen -t ed25519 -C "user@example.com"

# نسخ المفتاح العام
cat ~/.ssh/id_ed25519.pub

في Gitea: الملف الشخصيالإعداداتمفاتيح SSH/GPGإضافة مفتاح SSH

الاستنساخ عبر SSH

hljs bash
# الاستنساخ عبر SSH (المنفذ 2222)
git clone ssh://git@git.example.com:2222/user/repo.git

# التبسيط مع ~/.ssh/config
Host git.example.com
  HostName git.example.com
  User git
  Port 2222
  IdentityFile ~/.ssh/id_ed25519

# بعد الإعداد
git clone git@git.example.com:user/repo.git

إدارة المستودعات

إنشاء مستودع

hljs bash
mkdir myproject && cd myproject
git init
git add .
git commit -m "الإيداع الأول"
git remote add origin https://git.example.com/user/myproject.git
git push -u origin main

مستودع المرآة

مستودع جديد → ترحيل → GitHub/GitLab/Bitbucket
- URL الاستنساخ: https://github.com/user/repo.git
- مرآة (مزامنة تلقائية): مفعّل
- فترة المزامنة: 8 ساعات

Gitea Actions (CI/CD)

إعداد Actions Runner

hljs yaml
runner:
  image: gitea/act_runner:latest
  container_name: gitea-runner
  restart: unless-stopped
  environment:
    - GITEA_INSTANCE_URL=https://git.example.com
    - GITEA_RUNNER_REGISTRATION_TOKEN=RUNNER_TOKEN
    - GITEA_RUNNER_NAME=my-runner
  volumes:
    - ./runner-data:/data
    - /var/run/docker.sock:/var/run/docker.sock

ملف سير العمل

hljs yaml
# .gitea/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: إعداد Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'

      - name: تثبيت التبعيات
        run: npm ci

      - name: تشغيل الاختبارات
        run: npm test

      - name: البناء
        run: npm run build

إدارة المنظمات والفرق

إنشاء منظمة:
+ → منظمة جديدة → الاسم والرؤية

إنشاء فريق:
المنظمة → الفرق → فريق جديد
- الأذونات: مالك، مشرف، كتابة، قراءة
- الوصول إلى المستودع: محدد أو الكل

دعوة عضو:
الفريق → الأعضاء → إضافة مستخدم

النسخ الاحتياطي

hljs bash
# نسخ احتياطي لبيانات Gitea
docker exec gitea gitea dump -c /data/gitea/conf/app.ini

# نسخ احتياطي لقاعدة البيانات
docker exec gitea-db pg_dump -U gitea gitea > gitea-db-$(date +%Y%m%d).sql

# دليل البيانات الكامل
tar -czf gitea-backup-$(date +%Y%m%d).tar.gz ./gitea-data/

مع Gitea/Forgejo على خوادم REXE VPS، يمكنك إدارة البنية التحتية الكاملة لكود فريقك. 1 غيغابايت من الذاكرة مثالي للفرق الصغيرة والمتوسطة.

الأسئلة الشائعة

هل أستخدم Gitea أم Forgejo؟

كلاهما متطابقان تقنياً تقريباً. Forgejo هو فرع من Gitea يديره المجتمع ويتلقى تحديثات أكثر تكراراً. قد يُفضَّل Gitea للدعم المؤسسي أو الاستخدام التجاري. يُنصح بـ Forgejo لمن يفضلون البرمجيات الحرة الموجهة للمجتمع. كلاهما متوافقان مع نفس العملاء والأدوات.

لا أستطيع الاتصال عبر SSH، أحصل على خطأ 'Connection refused'.

إذا كان منفذ SSH مضبوطاً على 2222، يجب تحديد المنفذ في أمر git clone: ssh://git@git.example.com:2222/user/repo.git. يمكنك إضافة إدخال Host إلى ~/.ssh/config لاستخدام المنفذ تلقائياً. تحقق من أن المنفذ 2222 مفتوح في جدار حماية الخادم.

يظهر Gitea Actions runner الخاص بي غير متصل.

تحقق من أن حاوية runner تعمل: docker ps | grep runner. تأكد من صحة قيمة GITEA_RUNNER_REGISTRATION_TOKEN. راجع سجلات runner: docker logs gitea-runner. تحقق من إمكانية الوصول إلى URL مثيل Gitea من runner. أعد تشغيل الحاوية لإعادة تسجيل runner.

لا أستطيع دفع ملفات كبيرة (100 ميغابايت+).

زد client_max_body_size في Nginx (مثلاً: 512M أو 1G). أضف MAX_CREATION_LIMIT إلى قسم [server] في app.ini لـ Gitea. فكّر في استخدام Git LFS: git lfs install && git lfs track '*.zip'. تحقق من تفعيل دعم LFS في Gitea.

كيف أنقل مستودعاتي من GitHub إلى Gitea؟

استخدم ميزة Migrate في Gitea: مستودع جديد → ترحيل → GitHub. يمكنك أيضاً ترحيل المستودعات الخاصة باستخدام GitHub Personal Access Token. مع خيار Mirror، تتزامن التغييرات على GitHub تلقائياً. تُحفظ جميع الفروع والعلامات وتاريخ الإيداعات.

كيف أحدّث Gitea؟

خذ نسخة احتياطية قبل التحديث: docker exec gitea gitea dump. ثم حدّث بـ docker compose pull && docker compose up -d. يُجري Gitea ترحيلات قاعدة البيانات تلقائياً. عند القفز بين إصدارات كبيرة (مثلاً: 1.19 → 1.21)، قد تحتاج إلى المرور بالإصدارات الوسيطة واحداً تلو الآخر. اقرأ ملاحظات الإصدار دائماً.

مقالات ذات صلة

حركة الشبكةالداخل Gbpsالخارج Gbps