Karanlık bir İskandinav taş kasasında bir sunucu rafının yanında duran, bir pençesini üç birleşen çizgiye sahip bir Git geçmişinin havada duran camgöbeği holografik dal diyagramının üzerine koymuş, yanındaki tezgahta kaynak kodundan oluşan mühürlü rünik bir kasa bulunan ve yüksek kemerli bir pencereden aurora ışığının süzüldüğü NordBastion kutup ayısı maskotu
Nasıl yapılır · Geliştirici altyapısı·18 dakikalık okuma · 45 dakikalık uygulama

Kendi Git sunucunuz.
Depo, organizasyon şemasıdır.

Özel bir depo, ne inşa ettiğinizin, kiminle inşa ettiğinizin ve ne kadar ilerlediğinizin tarihli bir kaydıdır — ve bir platformda bu kayıt, başkasının yargı alanındaki bir şirket tarafından tutulur. Bunu anonim olarak kiraladığınız bir sunucuya taşımak için altı adım: Caddy arkasında Forgejo, altında PostgreSQL, kendine ait bir portta SSH gönderimi, üretim sırlarınızı asla görmeyen bir Actions runner'ı ve gerçekten geri yüklediğiniz bir yedek. Sunucunun maliyeti ayda $3.90. Debian 12 üzerinde test edilmiştir.

Altı adım
  1. 01

    Seçim

    Çıplak depo, Forgejo, GitLab

  2. 02

    Sağla

    Açılıştan önce belirlenen portlar

  3. 03

    Devreye al

    Forgejo, Postgres, Caddy

  4. 04

    Gönderim

    SSH, dağıtım anahtarları, imzalar

  5. 05

    Derleme

    Uzak tutulan bir runner

  6. 06

    Koru

    Yansılar, yedekler, yükseltmeler

Başlamadan önce · Platformun elinde tuttuğu şey

Kod, en az ilginç olan kısımdır. Asıl varlık meta veridir.

Git'i kendi başınıza barındırma konusundaki neredeyse her tartışma kaynak kod hakkındadır, oysa kaynak kod en az önemli olan kısımdır. Çoğu sıradandır, büyük bir bölümü açık kaynak kütüphanelerin üzerine ince bir katmandır ve yarın sızdırılsaydı pratik zarar genellikle gerçek bir hasardan çok mahcubiyet olurdu. İşte bu yüzden "kodum gizli değil" sözü eksiksiz bir yanıt gibi görünür — ve işte tam da bu yüzden değildir.

İlginç olan kısım, kodun etrafındakidir. Bir depo, çalışmanın tarihli, kime ait olduğu belli, yüksek çözünürlüklü bir kaydıdır: ne zaman uyuduğunuzu anlatan commit zaman damgaları, kiminle çalıştığınızı anlatan ortak yazar satırları, kimsenin duyurmadığı ürünleri anlatan dal adları, neyin ne kadar bozuk olduğunu anlatan bir sorun izleyici ve tüm projenin tarihini veren bir ilk commit. Yüz depoyu bu şekilde okuduğunuzda artık yazılım okumuyorsunuzdur — bir şirketi, onun yol haritasını, çalışan sayısını ve derdini okuyorsunuzdur.

Bir platformda, bu kayıt anlamlı hiçbir şekilde size ait değildir. Kontrol etmediğiniz bir altyapı üzerinde, doğruladığınız bir kimliğe bağlı bir hesabın altında, yasal sürecinin ona ulaşabildiği bir yargı alanında, kapsamı değiştirilebilir bir belgeyle belirlenen sistemler tarafından taranarak durur. Bunların hiçbiri kimsenin kötü niyetli olmasını gerektirmez: bu sadece izleyiciyi kiralamanın ne anlama geldiğidir. Dört düzenleme, ve her birinin gerçekte neyi ele verdiği:

Deponun yaşadığı yer Geçmişi kim tutuyor Yasal kimliğinize bağlı mı Nasıl ters gider
Bir platform, kişisel hesapPlatform, kendi yargı alanındaEvet — e-posta, fatura bilgisi, çoğu zaman bir telefon numarasıTek bir askıya alma, her remote'u da beraberinde götürür
Bir platform, organizasyon hesabıPlatform, artı organizasyonu yöneten herkesEvet, ve işvereninize deİşten çıkış, kendi çalışmanıza erişiminizi de kaldırır
Kendi barındırdığınız, bir hyperscaler üzerindeSiz, uygulama katmanındaEvet — fatura hesabı kimliğin ta kendisidirAnlık görüntü, kapatılabilecek bir hesapta yaşar
Kendi barındırdığınız, KYC gerektirmeyen bir VPS üzerindeSiz, ve yalnızca sizHayır — kimlik yok, kart yok, kripto ile ödenirArtık sistem yöneticisi sizsiniz. Kötü bir yedek nihaidir

Üçüncü satır, bunu zaten çözdüğünü düşünen ekipleri yakalayan satırdır. Doğrulanmış bir şirket hesabı altında kurumsal bir kartla kiralanan bir makinede kendi kurduğunuz bir forge, uygulamayı platformdan çıkarmış ama kimliği tam olarak olduğu yerde bırakmıştır. Bu, kontrolde gerçek bir kazanç ve ifşada hiçbir kazanç değildir.

Ve dördüncü satır kendi bedelini açıkça ortaya koyar, çünkü bu kılavuzun geri kalanı büyük ölçüde onu ödemekle ilgilidir. Kendi kendine barındırmanın başarısızlık biçimi gözetim değil, kayıptır. Bir platform, hiç düşünmediğiniz yedekleri tutar. Sunucunuz ise yalnızca sizin yapılandırdığınız yedekleri tutar. Adım 06, sonda yer alan isteğe bağlı bir rötuş değildir — diğer beşini güvenli kılan adımdır.

Adım 01 · Seçim

Ne kadar forge'a ihtiyacınız var? Dürüst cevap çoğu zaman "hiç"tir.

Sorununuzu çözen en küçük şeyle başlayın, çünkü onun üzerindeki her katman işletmeniz gereken bir hizmettir. SSH üzerinden çıplak bir depo, zaten sahip olduğunuz bir sunucuda tek bir komuttur ve size kimlik doğrulaması, geçmiş ve gönderim erişimi olan gerçek bir Git remote'u verir. Web uygulaması yok, veritabanı yok, yükseltme koşu bandı yok, sshd'nin ötesinde yamalanacak bir şey yok. Commit'lerinizi bir dizüstü bilgisayardan ve bir platformdan uzaklaştırmak isteyen tek bir kişiyseniz, bu eksiksiz bir cevaptır ve adım 02'den sonra okumayı bırakabilirsiniz.

# On the server, as an unprivileged user:
mkdir -p ~/git/project.git && cd ~/git/project.git
git init --bare

# On your laptop:
git remote add origin ssh://user@git.example.com/~/git/project.git
git push -u origin main

İkinci bir kişi işin içine girdiğinde ya da çıplak depolardan oluşan bir dizinin yapamadığı dört şeyden herhangi birini istediğinizde bir forge'a ihtiyacınız olur: geçmişi bir tarayıcıda gözden geçirmek, değişiklikleri pull request olarak incelemek, sorunları kodun yanında takip etmek ve bir kişiye tek bir depoya erişim vermek. Bu, yetenekte gerçek bir sıçrama ve operasyonel yükte gerçek bir artıştır. Bilerek seçin:

Özellik SSH üzerinden çıplak depo Forgejo Gitea GitLab CE
Web arayüzü, pull request'ler, sorunlarHiçbiriEvetEvetEvet, ve çok daha fazlası
Boşta bellekNeredeyse sıfırBirkaç yüz MBBirkaç yüz MBCI öncesinde birkaç GB
Yerleşik CIyazarsanız git hook'larıForgejo ActionsGitea ActionsGitLab CI, olgunlaşmış olan
Projeyi kim yönetiyorGit projesiCodeberg e.V., kâr amacı gütmeyen bir kuruluşKâr amacı güden bir şirket, açık çekirdekHalka açık bir şirket, açık çekirdek
LisansGPLv2v9.0'dan beri GPLv3+ (öncesinde MIT)MIT, tescilli eklentilerleMIT çekirdek, tescilli katmanlar
Ne zaman seçilirYalnızsınız ve sıfır bakım istiyorsunuzKüçük bir sunucuda gerçek bir forge istiyorsunuzZaten onu çalıştırıyorsunuz ve işe yarıyorKurumsal özellik setine ihtiyacınız var

Forgejo ve Gitea aynı atadan gelir ve günlük kullanımda hâlâ neredeyse birbirinin aynısı görünür. Forgejo, 2024'ün başında bir hard fork haline geldi ve Berlin'de kayıtlı kâr amacı gütmeyen bir dernek olan Codeberg e.V. tarafından yürütülür; Gitea ise ticari markasının sahibi olan ve katkıda bulunanlardan telif hakkı devri isteyen kâr amacı güden bir şirket tarafından geliştirilir. İkisi de iyi yazılımdır. Yalnızca birinin koruyucusunun teşvikleri, bu sayfayı okuma nedeninizle örtüşür.

Bu kılavuzun geri kalanı Forgejo kullanır. 02 ila 06 arasındaki adımlardaki her şey Gitea için de neredeyse birebir geçerlidir — konteyner adı ve birkaç ortam değişkeni değişir, şekil değişmez.

Adım 02 · Tedarik

Portlara forge sizin için karar vermeden önce siz karar verin. İkisi SSH'tır.

Önce sunucuyu sipariş edin. Panelde: Sipariş → VPS → Sentinel, imaj Debian 12, geçmişin yaşamasını istediğiniz hangi kaledeyse orada — Helsinki, Stockholm, Oslo veya Reykjavík. Hesabı açmak için e-posta adresi gerekmez ve fatura Monero, Bitcoin, Lightning veya desteklenen başka herhangi bir varlıkla ödenir. Bu, çoğu iş yükünden daha fazla burada önem taşır: bir forge, tüm değer önerisi çalışmanızın kaydının bir isme bağlı olmaması olan tek hizmettir.

Ardından ilk saat sıkılaştırma kontrol listesini uygulayın — taşınmış bir portta yalnızca anahtarla SSH, gözetimsiz güncellemeler, varsayılan olarak reddeden bir güvenlik duvarı — çünkü aşağıdaki her şey, zaten başkasına ait olmayan bir sunucu olduğunu varsayar.

İnternete gerçekte koyduğunuz şey

Bir forge, girişi olan statik bir site değildir. Kendine cıvatalanmış bir kod çalıştırma motoruna sahip herkese açık bir web uygulamasıdır. Kendi haline bırakılan iki varsayılan, onu yabancılar için ücretsiz bir hizmete dönüştürür: sertifika şeffaflık günlüklerinde göründükten sonraki günler içinde kurulumu spam hesaplarla dolduran açık kayıt ve kendi barındırılan bir runner'ın başkası için kripto para madenciliği yapmasıyla sonuçlanan, pull request açabilen herkesten gelen iş akışlarını çalıştıran CI. İkisi de gizli bir saldırı değildir ve ikisi de nadir değildir. İkisi de adım 03 ve adım 05'te birer ayarla kapatılır — ama onları kapatacağınıza şimdi karar verin, çünkü "çalışıyor" ile "kullanılıyor" arasındaki pencere günlerle ölçülür.

Sunucuya bir host adı yönlendirin — bir A kaydı ve IPv6 üzerinden erişilebilir olmasını istiyorsanız bir AAAA kaydı — ve başlamadan önce bunun yayılmasını bekleyin, çünkü ters proxy ilk açılışında o isim için bir sertifika almaya çalışacaktır ve başarısız bir doğrulama kafa karıştırıcı bir başlangıç olur. Ardından henüz hiçbir şey dinlemiyorken güvenlik duvarı kurallarını yazın.

İki-SSH sorunu. Bir forge, Git için SSH konuşur ve sunucunuz zaten yönetim için SSH konuşur. İkisi de 22 numaralı portu birden sahiplenemez ve bunları karıştırmak, insanların Git'i de anlamak zorunda olan bir yönetim daemon'uyla sonuçlanmasının yoludur. Onları ayrı tutun: sıkılaştırma kılavuzundaki taşınmış portta yönetim, konteynere eşlenen ayrı, herkese açık bir portta Git. 2222 geleneksel seçimdir ve onda kutsal hiçbir şey yoktur.

ufw default deny incoming
ufw allow 47222/tcp                  # administrative SSH, moved
ufw allow 80/tcp                     # ACME HTTP-01 challenge
ufw allow 443/tcp                    # the web interface
ufw allow 2222/tcp                   # git over SSH, into the container
ufw enable
ufw status numbered

# Nothing else is open. In particular: PostgreSQL stays on the Docker
# network and is never published to the host, let alone the internet.

Docker'ı dağıtım paketi yerine resmi depodan kurun, böylece Compose v2 mevcut olur ve sürüm güncel kalır. Ardından yığın için bir dizin oluşturun ve onu sunucuda durum tutan tek yer yapın — bu, adım 06'nın yedeklediği dizindir.

curl -fsSL https://get.docker.com | sh
docker compose version

install -d -m 0750 /srv/forgejo
cd /srv/forgejo
Adım 03 · Dağıtım

Üç konteyner. Biri asla erişilebilir olmamalı.

Forgejo, PostgreSQL ve Caddy. Forgejo depoları tutar ve arayüzü sunar, PostgreSQL bir Git nesnesi olmayan her şeyi tutar ve Caddy TLS'i sonlandırır ve sertifikayı iki kez sorulmadan alır. PostgreSQL bilerek host'a açılmaz: yalnızca Compose ağı üzerinden, isimle, ona ihtiyaç duyan tek konteynerden erişilebilir.

/srv/forgejo/.env

FORGEJO_DOMAIN=git.example.com
FORGEJO_VERSION=15                             # the LTS line; 16 is current stable
POSTGRES_PASSWORD=$(openssl rand -base64 32)   # paste the value, do not leave the $( )

/srv/forgejo/docker-compose.yml

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:${FORGEJO_VERSION}
    container_name: forgejo
    environment:
      USER_UID: 1000
      USER_GID: 1000
      FORGEJO__database__DB_TYPE: postgres
      FORGEJO__database__HOST: db:5432
      FORGEJO__database__NAME: forgejo
      FORGEJO__database__USER: forgejo
      FORGEJO__database__PASSWD: ${POSTGRES_PASSWORD}
      FORGEJO__server__DOMAIN: ${FORGEJO_DOMAIN}
      FORGEJO__server__ROOT_URL: https://${FORGEJO_DOMAIN}/
      FORGEJO__server__SSH_DOMAIN: ${FORGEJO_DOMAIN}
      FORGEJO__server__SSH_PORT: "2222"          # what clones will say
      FORGEJO__server__SSH_LISTEN_PORT: "22"     # what the container listens on
      FORGEJO__service__DISABLE_REGISTRATION: "true"
      FORGEJO__repository__DEFAULT_PRIVATE: private
      FORGEJO__security__INSTALL_LOCK: "true"
    restart: unless-stopped
    volumes:
      - ./data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "127.0.0.1:3000:3000"    # web, reached only by Caddy
      - "2222:22"                # git over SSH, public
    depends_on:
      - db

  db:
    image: postgres:16-alpine
    container_name: forgejo-db
    environment:
      POSTGRES_USER: forgejo
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: forgejo
    restart: unless-stopped
    volumes:
      - ./postgres:/var/lib/postgresql/data
    # No ports: block. This is the point.

  caddy:
    image: caddy:2-alpine
    container_name: forgejo-caddy
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-data:/data
      - ./caddy-config:/config

/srv/forgejo/Caddyfile

git.example.com {
    encode zstd gzip
    request_body {
        max_size 512MB          # raise it if you push large repositories
    }
    reverse_proxy 127.0.0.1:3000
}

İnsanların yanlış yaptığı yer bu iki SSH satırıdır, bu yüzden iki kez okumaya değerler. SSH_LISTEN_PORT, Forgejo'nun yerleşik SSH sunucusunun bağlandığı, konteynerin içindeki porttur. SSH_PORT ise Forgejo'nun size gösterdiği klon URL'lerinde yazdırdığı porttur — port eşlemesinin herkese açık tarafıyla eşleşmelidir. Bunları birbirinden kopardığınızda, kullanıcıların kopyalayıp yapıştırdığı tek şey dışında her şey çalışır.

Onu ayağa kaldırın, ardından yöneticiyi komut satırından oluşturun. Web kurulum aracını kullanmayın. Yeni bir kurulumda host adını bulan herkes tarafından erişilebilir olur ve onun üzerinden oluşturulan ilk hesap yönetici olur — girmeniz gerekmeyen bir yarış. Yukarıdaki dosyadaki INSTALL_LOCK, konteyner daha başlamadan onu kapatır.

docker compose up -d
docker compose logs -f forgejo        # wait for "Starting new Web server"

docker compose exec -u git forgejo forgejo admin user create \
  --admin --username you --email you@example.com --random-password

Host adını bir tarayıcıda açın, yazdırılan parolayla oturum açın ve onu değiştirin. Ardından çalışan bir kurulumu kapalı bir kuruluma dönüştüren ayarları gözden geçirin — çoğu zaten yukarıdaki ortam bloğu tarafından ayarlanmıştır ve varsaymak yerine her birini doğrulamaya değer:

Kayıt

DISABLE_REGISTRATION = true. Hesapları siz oluşturursunuz; kimse kendi kendine kayıt olamaz. Ara sıra kayıtlara ihtiyacınız varsa, kapıyı açmak yerine davet akışını kullanın.

Varsayılan görünürlük

DEFAULT_PRIVATE = private. Yeni depolar kapalı başlar. Yayımlamak, bir varsayılanın sonucu değil, bilinçli bir eylem haline gelir.

Anonim gezinme

REQUIRE_SIGNIN_VIEW = true, oturum açmamış ziyaretçilerden herkese açık depoları bile gizler. Özel bir ekip forge'u için doğrudur; herhangi bir şey yayımlamak istiyorsanız yanlıştır.

İki faktör

Başka her şeyden önce bunu yönetici hesabında etkinleştirin. Artık forge, sahip olduğunuz her dalı yeniden yazabilecek makinedir.

Ezberlemeye değer bir yol: canlı yapılandırma, host üzerinde ./data/gitea/conf/app.ini konumundadır. Forgejo, mevcut kurulumlarla uyumluluk için gitea dizin adını korudu; bu da herkesi tam olarak bir kez şaşırtır. FORGEJO__section__KEY biçimindeki ortam değişkenleri, başlangıçta o dosyaya yazılır, böylece tüm yapılandırmayı Compose dosyasından yönetebilirsiniz — ama app.ini'yi elle düzenlerseniz, aynı anahtar için bir ortam değişkeni bir sonraki yeniden başlatmada düzenlemenizin üzerine yazar. İkisinden birini seçin ve tutarlı olun.

Adım 04 · Gönderim

SSH üzerinden gönderin. Ardından imzalayın, böylece geçmiş sunucuya bağlı olmaz.

Genel anahtarınızı profil ayarlarına yapıştırın, ardından istemcinize forge'un nerede yaşadığını öğretin. Git standart olmayan bir portta olduğu için SSH yapılandırmanıza bir girdi eklemek otuz saniyeye değer — bu, portu yazacağınız her URL'nin dışında tutar ve remote'ları taşınabilir kılar.

# ~/.ssh/config
Host git.example.com
    Port 2222
    User git
    IdentityFile ~/.ssh/id_ed25519

# Then, in any repository:
git remote set-url origin git@git.example.com:you/project.git
git push -u origin main
ssh -T git@git.example.com        # expect a greeting, not a shell

O son komut, port eşlemesinin, konteynerin SSH sunucusunun ve anahtarınızın hepsinin uyuştuğunu size söyleyen komuttur. Forgejo'dan bir selamlama, tüm zincirin çalıştığı anlamına gelir. Bir parola istemi ise bunun yerine host'un yönetimsel sshd'sine ulaştığınız ve port eşlemesinin yanlış olduğu anlamına gelir.

Şimdi commit'lerinizi imzalayın. Bu, çoğu kendi kendine barındırma kılavuzunun atladığı adımdır ve kendi barındırdığınız bir forge'da bir platformda olduğundan daha fazla önem taşır. Bir commit'in yazar alanı serbest metindir — gönderim yapabilen herkes adınızı oraya yazabilir. Bir imza, belirli bir anahtarın belirli bir commit'i yaptığının kanıtıdır ve gönderildiği sunucu ele geçirilse, taşınsa veya atılsa bile kanıt olmaya devam eder. Git, zaten sahip olduğunuz SSH anahtarıyla imzalayabilir, artık bir PGP dolambacına gerek yok:

git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
git config --global tag.gpgsign true

git commit --allow-empty -m "signed"
git log --show-signature -1

Ardından aynı genel anahtarı forge'a bir kez daha, bir kimlik doğrulama anahtarı değil bir imzalama anahtarı olarak ekleyin. Forgejo imzayı sunucu tarafında doğrular ve commit'i doğrulanmış olarak gösterir; bu ikinci girdi olmadan imzayı hesabınızla ilişkilendirmenin bir yolu yoktur ve doğru şekilde imzalanmış olsa bile her commit doğrulanmamış görünür.

Yalnızca okuyan makineler için dağıtım anahtarları. Bir üretim sunucusunun, bir derleme sunucusunun veya bir yansının forge'da bir kullanıcı hesabına ihtiyacı yoktur. Bunun yerine ona bir dağıtım anahtarı verin: tek bir depoya eklenen, siz açıkça yazma izni vermedikçe salt okunur olan ve kurulumdaki başka hiçbir şeye erişim vermeyen bir anahtar çifti. İptal etmek tek bir girdiyi silmektir. Bu, kendi barındırdığınız bir forge'u düzenli tutmanın tek en etkili alışkanlığıdır, çünkü kullanıcı hesapları izin biriktirir, dağıtım anahtarları ise biriktiremez.

Bir platformdan taşınmak, bütün bunları doğru şekilde yapmak için iyi bir andır. Forgejo'nun Yeni Taşıma akışı bir depo URL'si ve bir erişim belirteci alır ve dalları, etiketleri, sorunları, yorumları, etiketleri, kilometre taşlarını, sürümleri ve pull request'leri karşıya taşır. Sonucun neye benzediğini görmek için önce bir depoyu çalıştırın, büyük grupların API hız sınırlamalarına takılıp yavaşlamasını bekleyin ve kaynağı aynı gün silmek yerine birkaç hafta salt okunur tutun.

Adım 05 · Derleme

Bir CI runner'ı, yabancıların kodunu çalıştıran bir makinedir. Ona göre yerleştirin.

Forgejo Actions, iş akışı dosyalarını GitHub Actions ile aynı biçimde, .forgejo/workflows/ içinden okur ve bunları Forgejo Runner adlı ayrı bir programa devreder. Runner, forge'un bir parçası değildir ve aynı makinede yaşamak zorunda değildir — bütün tasarım budur ve bu adımın bir omuz silkme yerine bir uyarıyla gelmesinin nedeni de budur.

Actions'ı kurulumda etkinleştirin, ardından yönetim panelinden bir kayıt belirteci alın — kurulum geneli veya tek bir organizasyona ya da tek bir depoya kapsamlandırılmış, emin değilseniz bu daha iyi bir varsayılandır. Runner, forge'a dışa doğru bağlanır, bu yüzden hiçbir gelen porta ihtiyacı yoktur ve herkese açık adresi olmayan bir makine dahil, istediğiniz herhangi bir güvenlik duvarının arkasında oturabilir.

# In the Compose environment of the forge, or app.ini:
#   FORGEJO__actions__ENABLED: "true"
# Then: Site administration -> Actions -> Runners -> Create new runner

# On the runner machine:
forgejo-runner generate-config > config.yml

forgejo-runner register --no-interactive \
  --instance https://git.example.com \
  --token <REGISTRATION_TOKEN> \
  --name runner-01 \
  --labels docker:docker://node:22-bookworm,debian:docker://debian:12

forgejo-runner --config config.yml daemon

Etiketler, iş akışı ile runner arasındaki sözleşmedir: runs-on: docker isteyen bir iş, sağ taraftaki imajdan derlenmiş bir konteyner alır. Yalnızca gerçekten sunmaya hazır olduğunuz etiketleri tanımlayın, çünkü kimsenin sunmadığı bir etiketi isteyen bir iş, başarısız olmak yerine sonsuza dek bekler; bu da uzun bir günün sonunda hata ayıklaması kafa karıştırıcı bir şeydir.

.forgejo/workflows/ci.yml

on: [push, pull_request]

jobs:
  test:
    runs-on: docker
    container:
      image: node:22-bookworm
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test
Farkı yaratan kural

Bir runner, iş akışı dosyasının söylediği her şeyi çalıştırır ve iş akışı dosyası bir pull request ile gelir. Ekibiniz dışından biri bunu açabiliyorsa, runner forge'dan farklı bir makinede bulunmalıdır — ayda $3.90'a ikinci bir Sentinel, forge'un veri dizinine erişimi olmayan, veritabanı kimlik bilgisi olmayan ve bir derleme günlüğünde okunmasını istemeyeceğiniz hiçbir şeyin ortamında bulunmadığı bir makine. Forge'un kendisinde, ilk kez katkıda bulunanlar için iş akışları çalıştırılmadan önce onay şartı koyun. İki standart başarısızlık da hem sıradan hem de pahalıdır: bir pull request'in içine gömülü bir madencilik iş yükü ve birinin bilerek eklediği bir adım tarafından yazdırılan bir sır.

Sırları da aynı şekilde kapsamlandırın. Forgejo bunları depo, organizasyon ve kurulum seviyesinde saklar; yalnızca bir deponun ihtiyaç duyduğu bir dağıtım anahtarı yalnızca o depoda bulunmalıdır, böylece ilgisiz bir projedeki ele geçirilmiş bir iş akışı onu okuyamaz. Hedef destekliyorsa uzun ömürlü belirteçler yerine kısa ömürlü olanları tercih edin ve bir sırrı asla bir iş akışı dosyasına koymayın — iş akışı dosyası deponun içindedir ve deponun bir geçmişi vardır.

Derlemeleriniz her çalıştırmada aynı temel imajları çekiyorsa, bunları önbelleğe alın. Yerel bir kayıt yansısı veya kalıcı bir runner önbelleği, iki dakikalık bir imaj çekme işlemini iki saniyeliğe indirir ve bu, üzerine yüklendiğiniz üst akış kayıt sistemlerine karşı kibarca yapılması gereken şeydir. Ve bütün tasarımın davet ettiği örüntüye dikkat edin; bu kılavuzun ajan çalışma zamanı kılavuzunun yanında yer almasının nedeni de budur: runner, forge'unuzdan iş çeken genel amaçlı bir işçidir, bu yüzden zamanlanmış bakım, veri pipeline'ları ve ajan iş yüklerinin de ait olduğu yer burasıdır.

Adım 06 · Saklama

Her klon, kodun bir yedeğidir. Hiçbir şey konuşmanın yedeği değildir.

Git burada alışılmadık derecede bağışlayıcıdır ve nedenini net bir şekilde ortaya koymaya değer. Her klon, geçmişin eksiksiz bir kopyasıdır, bu yüzden bir geliştiricinin güncel bir çalışma kopyası olduğu sürece kod sunucudan sağ çıkar. Bu gerçekten güven vericidir ve forge'unuzun tuttuğu iki şeyden tam olarak birini kapsar. Diğeri — sorunlar, pull request tartışmaları, inceleme dizileri, sürümler, wiki sayfaları, kullanıcılar, ekipler, izinler, CI geçmişi — yalnızca veritabanında var olur, kimsenin bunun bir klonu yoktur ve genellikle birikmesi üç yıl süren kısım budur.

İlk olarak, bir gönderim yansısı. Ücretsizdir ve kendi kendine çalışır. Bir depoda: Ayarlar → Yansı ayarları → hedef için URL ve bir erişim belirteciyle bir gönderim yansısı ekleyin. Forgejo ardından her gönderimden sonra her dalı ve etiketi ikinci bir Forgejo'ya, Codeberg'e veya bir yuva yerine bir vitrin olarak tutmaya karar verdiğiniz bir platforma çoğaltır. Açıkça belirtilmeye değer bir uyarı: bir gönderim yansısı, kaldırmayı amaçladığınız bir sır dahil olmak üzere geçmişi sadakatle yeniden yayımlar.

Ardından, yerleşik arşiv olmayan gerçek bir yedek. Forgejo, yapılandırmayı, depoları, verileri ve bir veritabanı dökümünü tek bir zip dosyasına paketleyen bir forgejo dump komutu sunar. Bir hata bildirirken bir sürdürücüye vermek için gerçekten faydalı bir şeydir. Ölümden dönmek için güvenmeniz gereken şey değildir: ürettiği SQL'in yeniden içe aktarmada uzun süredir bilinen sorunları vardır ve arşiv her çalıştırmada tüm depo kümesini yeniden yazar, bu da gerçek bir kurulumda her gece sıfırdan yazılan büyük bir dosya anlamına gelir. Bunun yerine sıkıcı ama doğrulanabilir yolu kullanın — veritabanını kendi aracıyla dökün ve veri dizinini dosyalar olarak yedekleyin:

#!/bin/sh
# /usr/local/bin/forgejo-backup — run from a systemd timer, nightly
set -eu
cd /srv/forgejo

# 1. Consistent database dump, written next to the data.
docker compose exec -T db pg_dump -U forgejo -Fc forgejo > ./db.dump

# 2. Everything that matters, to an encrypted offsite repository.
restic backup ./data ./db.dump ./docker-compose.yml ./.env ./Caddyfile

# 3. Retention, then prove the repository is still readable.
restic forget --keep-daily 7 --keep-weekly 4 --keep-monthly 12 --prune
restic check

Bunu forge'dan farklı bir yargı alanındaki bir makineye, forge'un ele geçirilmesinin kendi geçmişini silememesi için yalnızca eklemeye izin veren bir depo üzerinden gönderin — şifreli yedekler kılavuzu, systemd zamanlayıcısı ve yalnızca eklemeye izin veren anahtar kısıtlaması dahil olmak üzere yukarıdaki üç satırın uzun versiyonudur.

Ardından bunu bir kez, bilerek geri yükleyin. Bir taslak VPS sipariş edin, anlık görüntüyü onun içine geri yükleyin, aynı Compose dosyasını geri yüklenen veri dizinine karşı ayağa kaldırın, veritabanı dökümünü yükleyin, bir hosts dosyası girdisini ona yönlendirin ve oturum açın. Bütün bunun süresini ölçün. O sayı — yedekleme işinin var olması değil — sizin gerçek kurtarma konumunuzdur ve bu alıştırmayı yapan herkes ilk seferinde dahil etme listesinden eksik en az bir şey bulmuştur.

# restic keeps absolute paths, so the stack reappears under the target.
restic restore latest --target /srv/restore
cd /srv/restore/srv/forgejo

docker compose up -d db                # empty volume: the entrypoint creates the database
docker compose exec -T db pg_restore -U forgejo -d forgejo \
  --clean --if-exists --no-owner < db.dump

docker compose up -d                   # then sign in and walk the issue tracker

Kısaca, yükseltmeler. İmajı :latest yerine büyük bir sürüme sabitleyin, böylece gözetimsiz bir çekme işlemi siz uyurken sizi bir kırılma değişikliğinin öte tarafına taşıyamaz. Büyük bir sınırı geçmeden önce sürüm notlarını okuyun, önce bir anlık görüntü alın ve bir veritabanı taşıma işleminin yeni sürümün ilk başlangıcında çalıştığını unutmayın — bu tek yönlü bir kapıdır. Watchtower tarzı otomatik güncelleme statik bir site için iyi bir fikirdir ama sahip olduğunuz her dalı tutan makine için kötü bir fikirdir.

Bitti demeden önce dört kontrol. Oturumu kapatın ve kurulumun hesap oluşturmanın hiçbir yolunu sunmadığını doğrulayın. Oturumu olmayan bir tarayıcıdan, özel bir deponun sadece yasak değil, görünmez olduğunu doğrulayın. Runner'ın forge'un veri dizinini okuyamadığını doğrulayın. Ve son restic kontrolünün başarılı olduğunu doğrulayın — sessizce başarısız olan yedekleme işi, ihtiyaç duyulduğu güne kadar herkesin sahip olduğu şeydir.

Dürüst kısım · Bunun yapmadığı şey

Bir tarafı ortadan kaldırdınız. Binayı ortadan kaldırmadınız.

Bir forge'u kendi kendine barındırmak, çalışmanızı kimin tuttuğu konusunda gerçek bir değişikliktir ve bu görünmezlik değildir. Yukarıdaki her şey yapıldıktan sonra dört şey doğru kalmaya devam eder ve bunları bilmek, gerçek bir savunma ile kendinize anlattığınız bir hikaye arasındaki farktır.

Disk, birinin binasındadır. Kiralık bir sunucu, kapıları ve personeli olan bir veri merkezindeki donanım üzerinde çalışır. NordBastion müşteri iş yüklerini incelemez ve şeffaflık raporu ile arama emri kanaryası bize sorulması halinde ne olacağını anlatır — ama dürüst olan ifade mimari olandır: değişen şey, depolarınızın ürün düzeyinde bir dizininin, commit'leriniz üzerinde bir analiz hattının ve değiştirilebilecek bir gizlilik politikasının olmamasıdır. Değişmeyen şey ise makinenin fiziksel olduğu ve evinizde olmadığıdır.

Sertifika verilir verilmez host adı herkese açık hale gelir. Güvenilir her herkese açık sertifika, herkesin arayabileceği sertifika şeffaflığı günlüklerinde yayımlanır, bu yüzden git.yourproject.com ona hiç bağlantı vermeseniz bile keşfedilebilir. Bu, kodunuzun bir sızıntısı değildir, ama projenin var olduğu ve kabaca ne zaman başladığı gerçeğinin bir sızıntısıdır. Zaten yayımladığınız bir ismin alt alan adını kullanın ya da herkese açık sertifikayı tamamen atlayıp forge'a WireGuard veya bir onion hizmeti üzerinden ulaşın.

Artık bir web uygulamasını yamalıyorsunuz. Forge; bir giriş sayfası, güvenilmeyen biçimlendirme için bir render hattı, bir SSH sunucusu ve bir CI motorudur, hepsi internetten erişilebilir durumdadır. Bu, adım 01'deki çıplak depodan önemli ölçüde daha büyük bir yüzeydir ve güncel tutmanız gereken bir yüzeydir. Sürüm duyurularına abone olun ve bir güvenlik sürümünü aynı çeyrek değil aynı hafta içinde halledilecek bir iş olarak ele alın.

Federasyon henüz burada değil. Forgejo, forge federasyonu üzerinde gerçek bir çalışma yürütüyor ve ilerlemesini yayımlıyor, ama bugün itibarıyla ortak bir platformda yapabildiğiniz gibi kendi kurulumunuzdan başkasının kurulumunda bir pull request açamazsınız. Pratikte bu, dış bir katkıda bulunanın hâlâ forge'unuzda bir hesaba ihtiyaç duyduğu, ya da yamaları e-posta ile kabul ettiğiniz, ya da rastgele katkılar için herkese açık bir yansı tuttuğunuz anlamına gelir. Buna şaşırmak yerine projenize uyan üçünden hangisiyse ona göre plan yapın.

Gerçekte satın aldığınız şey, tam olarak: ne inşa ettiğinizin, kiminle ve ne zaman inşa ettiğinizin tarihli kaydı, artık iş modeli onu analiz etmeyi içeren bir şirket tarafından tutulmuyor. Bu dar bir iddiadır ve gerçek bir iddiadır. Yalnızca adım 06 yapıldıysa değdiği bedele değer — test edilmiş bir geri yüklemesi olmayan kendi barındırdığınız bir forge, bir gizlilik iyileştirmesi değildir, daha iyi bir markalamaya sahip tek bir hata noktasıdır.

Boyutlandırma · Ne sipariş etmeli

Forge küçüktür. CI öyle değildir.

Katman Aylık Kaynaklar Rahatça çalıştırdığı şey
Sentinel$3.902 vCPU · 4 GB · 120 GBTek bir kişi veya küçük bir ekip için Forgejo + PostgreSQL. Doğru başlangıç.
İkinci bir Sentinel$3.90Kendi sunucusundaki runnerBir kahve fiyatına, gerçekten önemli olan izolasyon
Garrison$7.904 vCPU · 8 GB · 240 GBOn kişilik bir forge, bir konteyner kayıt sistemi ve artifact'ler
Ravelin$16.908 vCPU · 16 GB · 480 GBYoğun CI, büyük depolar, birkaç paralel iş

Bu tabloda hiçbir şey Git için boyutlandırılmamıştır. Forgejo ve PostgreSQL birlikte boşta birkaç yüz megabayt kullanır; bir sunucuyu dolduran şey CI'dır — konteyner katmanları, derleme önbellekleri, artifact'ler — ve kaynak kod olmayan depo içeriğidir. Önce disk için, sonra çekirdek için, en son bellek için boyutlandırın. Burada iki küçük sunucu bir büyük sunucuyu geride bırakır, çünkü ikincisi kapasiteden çok bir güvenlik sınırıdır.

Saha notları · Altı tuzak

Bunun ters gidebileceği altı yol. İkisi paraya mal olur.

Tuzak 01 · Gürültülü

Açık kayıt ve yabancılarla dolu bir forge

Sertifika şeffaflık günlüklerinde görünür, tarayıcılar günler içinde onu takip eder ve kayıtların etkin olduğu bir kurulum spam hesaplar ve spam depolarla dolar. DISABLE_REGISTRATION'ı ilk olaydan sonra değil, ilk açılıştan önce ayarlayın.

Tuzak 02 · Pahalı

Başkası için kripto para madenciliği yapan runner

Herhangi bir pull request'ten gelen iş akışlarını çalıştıran CI, onu bulan herkes için ücretsiz bir hesaplamadır. İlk kez katkıda bulunanlar için onay şartı koyun, runner'ı kendi sunucusunda tutun ve ara sıra iş sürelerini okuyun.

Tuzak 03 · Sessiz

ROOT_URL yanlış, ve her şey yarı yarıya çalışır

Klon URL'leri yanlış host'u işaret eder, webhook'lar yanlış adrese ateşlenir, OAuth geri çağırmaları başarısız olur ve avatarlar bozulur. Arayüz sorunsuz göründüğü için kimse tek bir satırdan şüphelenmez. DOMAIN, ROOT_URL, SSH_DOMAIN ve SSH_PORT'u birlikte ayarlayın ve arayüzde bir klon URL'sini kontrol edin.

Tuzak 04 · Kafa karıştırıcı

İki SSH sunucusu, bir port

Konteyner 22'yi ister ve host onu zaten kullanıyordur, bu yüzden eşleme sessizce beklenmedik bir yere düşer ve git push bir parola ister. Önce yönetimsel SSH'ı taşıyın, konteyneri kendine ait bir portta yayımlayın ve ssh -T ile doğrulayın.

Tuzak 05 · Ölümcül

Hiç geri yüklenmemiş bir döküm

Yerleşik arşiv bir destek artefaktıdır, test edilmiş bir kurtarma yolu değildir ve SQL'inin bilinen yeniden içe aktarma sorunları vardır. Veritabanını pg_dump ile dökün, veri dizinini dosyalar olarak yedekleyin ve bütün her şeyi bir kez bir taslak sunucuya geri yükleyin.

Tuzak 06 · Yavaş

Disk kodla değil, derleme katmanlarıyla dolar

Kaynak kod küçüktür; konteyner katmanları, artifact'ler ve CI önbellekleri değildir. Hevesli bir pipeline'a sahip 120 GB'lık bir sunucu haftalar içinde dolar. İmajları bir zamanlayıcıyla budayın, artifact saklama süresini sınırlayın ve CPU yerine diski izleyin.

SSS · Özel Git barındırma

Sorular, yanıtlandı.

Bunu kurarken karşınıza çıkan on bir soru — bunu kurup kurmamanız gerektiğine karar veren iki soruyla başlayarak.

Forgejo mu Gitea mı — gerçekte hangisini kurmalıyım?

Çoğu kişi için Forgejo, ve bunun nedeni özellikler değil yönetişimdir. İki proje aynı atadan gelir ve kullanımda hâlâ neredeyse birbirinin aynısı gibi hissettirir: aynı Go ikili dosyası, aynı hafif kaynak kullanımı, aynı web arayüzü, benzer CI. Farklı olan, onları kimin yönettiğidir. Forgejo, Berlin'de kayıtlı kâr amacı gütmeyen bir dernek olan Codeberg e.V. tarafından yürütülür ve 2024'ün başında bir hard fork haline geldi; her şeyi özgür yazılım olarak yayımlar ve katkıda bulunanlardan telif hakkı devri istemez. Gitea ise ticari markayı ve alan adını elinde tutan, kâr amacı güden bir şirket tarafından geliştirilir, katkıda bulunanlardan telif hakkı devri ister ve ücretsiz temelin etrafında ücretli özelliklerle açık çekirdek modeliyle çalışır. Bu gerçeklerin hiçbiri Gitea'yı yazılım olarak kusurlu kılmaz. Ama depolarınızı bir platformdan taşımanın bütün amacı bir şirketin yol haritasına bağımlı olmaktan kurtulmaktır; bu yüzden koruyucusu kâr amacı gütmeyen bir kuruluş olan çatalı seçmek, burada olma nedeninizle örtüşen seçimdir. Daha sonra geçiş yapacaksanız pratik bir not: Forgejo, mevcut bir Gitea veri dizininin üzerine kurulabilir, ancak tersi desteklenmez.

Gerçekten bir forge'a ihtiyacım var mı? SSH üzerinden çıplak bir depo yetmez mi?

Tek bir dizüstü bilgisayarı olan ve iyi commit mesajları yazma alışkanlığındaki tek bir kişi için çıplak bir depo gerçekten yeterlidir ve bu kılavuzdaki en sağlam çözümdür: sunucuda git init --bare, normal bir SSH hesabı, yamalanacak bir web uygulaması yok, yedeklenecek bir veritabanı yok ve sshd'nin ötesinde bir saldırı yüzeyi yok. Bu kurulumla ilgili hiçbir şey asla kullanım ömrünü doldurmaz. İkinci bir insan işin içine girdiği anda ya da çıplak bir deponun haberi bile olmadığı dört şeyden herhangi birini istediğiniz anda bir forge'a ihtiyacınız olur — taranabilir bir geçmiş, incelemeli pull request'ler, kodun yanında yaşayan bir sorun izleyici ve depo bazında erişim denetimi. Bu küçük bir adım değildir; depolama ile iş birliği arasındaki farktır. Hangisini çözmeye çalıştığınız konusunda dürüst olun, çünkü bir forge artık işlettiğiniz bir hizmettir, çıplak bir depo ise sadece bir dizindir.

GitHub depolarımı, sorunlar ve pull request'ler dahil olmak üzere taşıyabilir miyim?

Evet, ve bu kendi kendine barındırmadaki daha iyi taşıma hikayelerinden biridir. Forgejo'nun yerleşik taşıma aracı bir depo URL'si ve kişisel bir erişim belirteci alır ve koddan çok daha fazlasını çeker: dallar ve etiketler, yorumlarıyla birlikte sorunlar, pull request'ler, etiketler, kilometre taşları ve sürümler. Ona salt okuma kapsamına sahip bir belirteç verin, sonucun neye benzediğini görmek için önce bir depoyu çalıştırın, ardından geri kalanını tamamlayın. Beklenecek üç şey var. Büyük veya çok sayıdaki taşıma işlemleri kaynak platformun API hız sınırlamalarına takılır ve sadece daha uzun sürer — onları başlatın ve kendi hallerine bırakın. Sorunlardaki ekler ağ üzerinden alınır, bu yüzden kısıtlayıcı bir çıkış güvenlik duvarının arkasındaki bir kurulum, bozuk görsellere sahip sorunlar üretir. Ve inceleme dizileri iki veri modeli birebir aynı olmadığı için her zaman tam olarak oldukları yere yerleşmez. Kaynak depoları aynı öğleden sonra silmek yerine birkaç hafta salt okunur tutmayı planlayın.

Kendi barındırdığınız bir forge gerçekten daha mı özel, yoksa sadece farklı mı?

Belirli ve önemli bir açıdan gerçekten farklıdır: dizini sizden başka kimse tutmaz. Bir platformda, özel depo diğer kullanıcılara karşı özeldir — onu depolayan, tarayan, ondan bir bağımlılık grafiği çıkaran ve kendi yargı alanındaki bir mahkeme tarafından ibraz etmeye zorlanabilecek platforma karşı özel değildir. Kod sıradan olsa bile o dizin alışılmadık derecede açık edicidir: commit zaman damgaları çalışma saatlerinizi anlatır, ortak yazarlar ekibinizi anlatır, dal adları duyurulmamış ürünleri anlatır ve ilk commit, henüz duyurulmamış bir projenin tarihini verir. Bunu kendi sunucunuza taşımak, platformu bu tablodan tamamen çıkarır. Bunun yapmadığı şey ise makineyi ortadan kaldırmaktır. Hâlâ bir veri merkezinde donanım kiralıyorsunuzdur, disk hâlâ binanın sahibi olan kişiler tarafından fiziksel olarak erişilebilir durumdadır ve seçtiğiniz host adı hâlâ sertifika şeffaflığı günlüklerindedir. Dürüst özet: sözleşmeye dayalı bir gizlilik politikası olan bir şirketin yerine, tek politikası sizin yapılandırmanız olan, bilerek seçtiğiniz bir yargı alanındaki bir sunucu koydunuz — ve bunu ödeyen hesabın sizin adınızı taşıması gerekmiyor.

VPS ne kadar büyük olmalı?

GitLab belgelerinin herkese alıştırdığından daha küçük. Forgejo ve Gitea, boşta birkaç yüz megabayt RAM kullanan tek bir Go ikili dosyasıdır; PostgreSQL ve bir ters proxy ekleyin, tek başına çalışan bir geliştiricinin forge'u bir Sentinel'e — 2 vCPU, 4 GB, 120 GB NVMe, ayda $3.90 — bolca yer kalacak şekilde rahatça sığar. Baskı başka üç yerden gelir ve her biri bilerek boyutlandırılmayı hak eder. En büyüğü CI'dır: konteyner derleyen bir runner, verdiğiniz her çekirdeği kullanır ve diski katmanlarla doldurur. İkincisi depo boyutudur: oyun varlıkları, not defterleri ve pakete gömülü bağımlılıklar kaynak koddan çok daha hızlı büyür. Üçüncüsü ise artifact'ler ve bir konteyner kayıt sistemidir. Pratikte iyi sonuç veren bir kural — forge'u bir Sentinel'e koyun, runner'ı kendi ikinci Sentinel'ine koyun ve yalnızca disk size söylediğinde bir üst katmana geçin, CPU söylediğinde değil.

Forgejo Actions gerçekten GitHub Actions iş akışlarımla uyumlu mu?

Çoğu basit iş akışının değişmeden çalışacağı kadar uyumlu, ama karmaşık bir pipeline'ı okumadan taşıyabileceğiniz kadar uyumlu değil. İş akışı dosya biçimi aynıdır, .forgejo/workflows/ içinde yaşar (.github/workflows/ de okunur) ve ortak yapı taşları — checkout, dil kurulumu, cache, matris build'leri — beklediğiniz gibi davranır, çünkü runner bunları konteynerlerde aynı şekilde çalıştırır. Bozulan şey, Actions biçimi yerine platform olarak GitHub'ı varsayan her şeydir: kurulumunuzun erişmesine izin verilmesi gereken github.com URL'lerine sabitlenmiş marketplace action'ları, sürüm veya PR meta verisi için GitHub REST API'sini çağıran action'lar, çok özel önceden kurulmuş bir araç zincirine sahip GitHub barındırmalı runner imajları ve OIDC tabanlı bulut kimlik doğrulaması. İşe yarayan taşıma deseni: yalnızca derleyen ve test eden bir iş akışıyla başlayın, onu yeşile getirin, ardından dağıtım adımlarını teker teker yeniden ekleyin.

VPS ölürse koduma ne olur?

Kodun kendisi sorunsuz olan tek kısımdır ve bu, Git'in kendi barındırılan hemen hemen her diğer hizmete karşı sessiz avantajıdır: her klon, geçmişin eksiksiz bir kopyasıdır, bu yüzden bir geliştiricinin güncel bir çalışma kopyası olduğu sürece depo kaybolmaz. Sunucuyla birlikte ölen şey, kodun etrafındaki her şeydir — sorunlar, pull request tartışmaları, inceleme yorumları, sürümler, wiki, kullanıcılar, erişim kuralları, CI geçmişi. Bu materyal yalnızca veritabanında yaşar, kimsenin bunun bir klonu yoktur ve genellikle birikmesi yıllar süren kısım budur. Bu yüzden ikisine farklı davranın. Kod için, ikinci bir konuma bir gönderim yansısı yapılandırın; hiç uğraşmadan sürekli, otomatik, harici bir koruma elde edersiniz. Meta veri için gerçek bir yedeğe ihtiyacınız vardır: bir PostgreSQL dökümü artı veri dizini, şifrelenmiş ve bir zamanlayıcıyla başka bir yargı alanındaki bir makineye gönderilmiş. Adım 06 ikisini de kapsar ve sondaki geri yükleme provası, bunları bir niyetten bir garantiye dönüştüren kısımdır.

GitHub'ı tamamen bırakmak yerine bir yansı olarak tutabilir miyim?

Evet, ve birçok proje için bu bir uzlaşma değil, doğru cevaptır. Forgejo gönderim yansılarını destekler, böylece kurulumunuz ekibinizin üzerinde çalıştığı orijin olur ve her gönderim otomatik olarak GitHub, Codeberg veya ikinci bir Forgejo üzerindeki bir depoya çoğaltılır. Herkese açık görünürlük, rastgele katkıda bulunanlar, bir GitHub URL'si bekleyen paket kayıt sistemleri ve eski bir README'deki sorun izleyici bağlantısı çalışmaya devam ederken, gerçeğin kaynağı — ve özel depolar, ve CI günlükleri, ve yayımlamadığınız her şeyin sorun geçmişi — sunucunuzda kalır. Diğer yönde de çalışır: çekme yansıları, bağımlı olduğunuz yukarı akış projelerinin yerel, her zaman güncel bir kopyasını tutar; bu, yarın silinirse mahvolacağınız her şey için yapmaya değer bir şeydir. Dikkat edilmesi gereken tek şey neyi yansıttığınızdır: kaldırmayı amaçladığınız bir sırrı içeren geçmişe sahip bir deponun gönderim yansısı, o sırrı derhal ve otomatik olarak yeniden yayımlar.

Bir yükleniciye diğerlerini vermeden tek bir depoya nasıl erişim veririm?

Erişimin ne kadar süreceğine uyan katmanı kullanın. Okuyacak, commit yapacak ve pull request açacak bir kişi için bir kullanıcı hesabı oluşturun ve onu, sessizce daha fazlasını veren bir organizasyon ekibine koymak yerine, tam olarak ihtiyaç duyduğu depolara açık bir izin seviyesiyle — okuma, yazma veya yönetici — işbirlikçi olarak ekleyin. Yalnızca çekme yapması gereken otomatik bir sistem için — bir dağıtım hedefi, bir derleme sunucusu, bir yansı — kullanıcı hesabı yerine salt okunur bir dağıtım anahtarı kullanın: tek bir depoyla sınırlıdır, başka hiçbir şeye izin vermez ve iptal etmek tek bir satırı silmektir. API ile konuşan betikler için bir parola vermek yerine kapsamı belirlenmiş bir erişim belirteci verin. İki alışkanlık bütün bunu ayakta tutar: var olan tek hesapların sizin oluşturduklarınız olması için kaydı kapalı tutun ve geçici erişim verdiğinizde takviminize bir tarih koyun, çünkü hiçbir forge size bir sözleşmenin sona erdiğini asla hatırlatmaz.

Forge'un bir alan adına ihtiyacı var mı ve bu kimliğimi ifşa eder mi?

Web arayüzü için bir host adına ihtiyacı vardır, çünkü TLS sertifikaları isimler için verilir ve hiçbir tarayıcının burada bir IP adresine güvenmemesi gerekir. Bu ismin size kadar izlenebilir olmasına gerek yoktur. Dikkatli olunması gereken üç şey var. Alan adını, başka yerde özenle sakladığınız kimliği talep etmeyen bir yerden kaydedin ve WHOIS gizliliğini açık tutun — kayıt şirketi, host'tan ayrı bir güven kararıdır ve insanların unuttuğu şey tam olarak budur. Sertifika verilir verilmez host adının herkese açık hale geleceğini bekleyin, çünkü herkesin arayabileceği sertifika şeffaflığı günlüklerinde güvenilir her sertifika yayımlanır; zaten kullandığınız bir alan adı üzerinde bir joker karakter, aranabilir yeni bir isim eklemekten kaçınmanızı sağlar. Ve hiç herkese açık bir isminizin olmasını istemiyorsanız, alternatif gerçektir: forge'u bir Tor onion hizmetine koyun ya da yalnızca WireGuard üzerinden erişilebilir yapın, herkese açık sertifikayı tamamen atlayın ve her yerden bir tarayıcı açma kolaylığından vazgeçmeyi kabul edin.

Bir VPS'te Git forge'u ve CI runner'ları çalıştırmam NordBastion'ın umurunda mı?

Hiç değil — bir forge ve runner'ları sıradan bir iş yüküdür ve müşterilerimizin kurduğu daha yaygın şeylerden biridir. Kabul edilebilir kullanım politikamızın kaynak kodu barındırmak veya derlemek hakkında söyleyecek hiçbir şeyi yok. Politikadan çok operasyonel iki not. Birincisi, yabancılardan gelen iş akışlarını kabul eden bir CI runner'ı, onu bulan herkes için ücretsiz bir hesaplama hizmetidir: standart istismar bir pull request içine gizlenmiş kripto para madenciliğidir ve açık kaldığı günler içinde bulunur. Kaydı kapalı tutun ve henüz işbirlikçi olmayan herkes için iş akışları çalışmadan önce onay şartı koyun. İkincisi, derlemeleriniz her çalıştırmada büyük konteyner imajları çekiyorsa, bu normal bir trafiktir ve pakete dahildir — ama yine de bunları yerel olarak önbelleğe almaya değer, çünkü bu pipeline'ınızı hızlandırır ve bağımlı olduğunuz üst akış kayıt sistemlerine karşı kibarca yapılması gereken şeydir.

Sunucuyu edinin

Adınız olmayan bir hesap üzerinde, kendinize ait bir forge. KYC gerektirmez, kripto ile ödeme.

Sentinel — Helsinki, Stockholm, Oslo veya Reykjavík'te ayda $3.90'a 2 vCPU ve 4 GB. Forgejo, PostgreSQL ve ters proxy için yeterli, taşımayı düşündüğünüz depolar için de yer bırakır. Runner için ikinci bir tane ekleyin. Kayıtta e-posta yok, kimlik belgesi yok ve gönderdiğiniz hiçbir şeyin ürün düzeyinde bir dizini yok.

Son inceleme · 2026-10-12 · Kaynaklar · Forgejo yönetici belgeleri (kurulum, Actions, komut satırı), Forgejo'nun Gitea ile karşılaştırması, Codeberg e.V. yönetişim sayfaları, PostgreSQL ve Caddy belgeleri, git-config(1) · Kadans · yıllık

Özel barındırma, Kuzey'de inşa edildi.