# 如何在 Windows 安裝 Gitea 源碼版控系統與 PostgreSQL 14 資料庫

[Gitea](https://about.gitea.com/) 是一套功能相當完整卻又非常輕量的 Git 源碼版控與議題追蹤系統，我在這幾年也幫好幾家公司安裝過，基本上在 Windows 上面安裝 Gitea 的過程十分容易，只要幾個命令就可以安裝到好，但是若真的要一次安裝到好，其實還是有一些門檻，畢竟網路上的資料太多太亂，這篇文章我將分享我的安裝過程，基本上照著做應該都可以順利的安裝到好。

![Gitea](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/02dcee722f5ca8a246ed-212111074-ddd61457-371e-4b36-b35d-c1b770133f56.png)

> 以下命令皆**以系統管理員身份**執行 **Windows PowerShell** 命令視窗。

1.  安裝 [Chocolatey](https://chocolatey.org/install) 套件管理器
    
    ```powershell
    Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
    ```
    
2.  安裝 Git for Windows 命令列工具
    
    安裝 Gitea 之前，請務必事先安裝 Git 命令列工具！
    
    ```powershell
    choco install git -y
    ```
    
3.  安裝 [PostgreSQL](https://community.chocolatey.org/packages/postgresql) 資料庫
    
    以下命令會自動安裝好 PostgreSQL 14 資料庫，並自動註冊名為 **postgresql-x64-14 - PostgreSQL Server 14** (`postgresql-x64-14`) 的 Windows 服務。除此之外，這個版本也會連帶安裝 [pgAdmin](https://community.chocolatey.org/packages/pgadmin4) 資料庫管理工具！
    
    ```powershell
    choco install postgresql --version=14.1.1 --params '/Password:8ws9NVXS7s69' --params-global -y
    ```
    
    > 以上命令的 `8ws9NVXS7s69` 是 PostgreSQL 資料庫的預設管理者密碼，預設使用者名稱為 `postgres`！
    
    > 安裝完畢請關閉 PowerShell 視窗之後重新開啟！
    
    如果無法透過 Chocolatey 進行安裝，請到 [PostgreSQL: Windows installers](https://www.postgresql.org/download/windows/) 下載 [postgresql-14.1-1-windows-x64.exe](https://get.enterprisedb.com/postgresql/postgresql-14.1-1-windows-x64.exe) 安裝檔，並執行以下命令進行 Silent 安裝：
    
    ```powershell
    postgresql-14.1-1-windows-x64.exe `
        --mode "unattended" `
        --unattendedmodeui "none" `
        --superaccount "postgres" `
        --superpassword "8ws9NVXS7s69" `
        --enable_acledit 1 `
        --install_runtimes 0 `
        --serverport  5432 `
        --debugtrace postgresql-install.log
    ```
    
4.  測試連接 PostgreSQL 資料庫，確認帳號密碼都可以正確連線
    
    ```powershell
    $env:PGPASSWORD='8ws9NVXS7s69'; '\conninfo' | psql -Upostgres
    ```
    
    請確認看到以下訊息才算安裝成功！
    
    ```
    You are connected to database "postgres" as user "postgres" on host "localhost" (address "::1") at port "5432".
    ```
    
5.  建立 Gitea 專用的資料庫
    
    ```powershell
    # 這是為了讓 psql 可以在執行時免輸入密碼
    $env:PGPASSWORD='8ws9NVXS7s69'
    
    # 這個是專門給 Gitea 使用的資料庫使用者帳號密碼
    $GiteaDbPassword = 'FfW75FW3raWg'
    "CREATE ROLE gitea WITH LOGIN PASSWORD '${GiteaDbPassword}';" | psql -Upostgres
    
    # 建立名為 gitea 的資料庫
    "CREATE DATABASE gitea WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';" | psql -Upostgres
    ```
    
6.  下載 Gitea 主程式
    
    [Gitea](https://dl.gitea.io/gitea) 整套系統只有一個約 140 MiB 的**單一執行檔**而已，完全免安裝，直接下載執行檔就可以執行！
    
    請下載 Current Release 版本，假設我們選擇安裝 Gitea 1.16.0 版本，你可以使用以下命令下載 Gitea 主程式：
    
    ```powershell
    mkdir C:\Gitea
    Invoke-WebRequest -Uri https://dl.gitea.io/gitea/1.16.0/gitea-1.16.0-windows-4.0-amd64.exe -OutFile C:\Gitea\gitea.exe
    ```
    
    > 下載路徑: https://dl.gitea.io/gitea
    
7.  啟動 Gitea 伺服器
    
    ```powershell
    C:\Gitea\gitea.exe
    ```
    
    第一次啟動會喚醒 Windows Security Alert 視窗，請務必按下 **Allow access** 按鈕，否則服務會連不上！
    
    ![Windows Security Alert](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/96a0b7f24cebc51d40e4-151992790-982fb083-e586-4135-9186-05495790524e.png)
    
    開啟瀏覽器並連到 [http://localhost:3000/](http://localhost:3000/) 網址，並開啟 **Initial Configuration** 初始化設定頁面！
    
8.  初始化 Gitea 設定 (Initial Configuration)
    
    -   Database Type: `PostgreSQL`
    -   Host: `127.0.0.1:5432`
    -   Username: `gitea`
    -   Password: `FfW75FW3raWg`
    -   Database Name: `gitea`
    -   Gitea HTTP Listen Port: `80`
    -   Gitea Base URL: `http://gitea.localhost/`
    -   Server and Third-Party Service Settings
        -   建議勾選 Enable Local Mode
        -   取消勾選 Enable OpenID Sign-in
        -   建議勾選 Disable Self-Registration
        -   取消勾選 Allow Creation of Organizations by Default
        -   設定欄位 Hidden Email Domain 為你公司的 E-mail 域名
    -   Administrator Account Settings
        -   請設定**預設 Gitea 管理者名稱與密碼**
    
    > 所有 Chromium-based 瀏覽器預設會將所有 `*.localhost` 域名自動導向 `127.0.0.1` 本機 IP 位址，所以你在本機可以不用特別調整 DNS 或 `hosts` 設定！
    
    按下 **Install Gitea** 按鈕之後，完整的 Gitea 設定檔會儲存在 `C:/Gitea/custom/conf/app.ini` 檔案中，瀏覽器會自動開啟 http://gitea.localhost 網站，你只要使用上述設定的**預設 Gitea 管理者名稱與密碼**登入即可！
    
    接著請回到 Windows PowerShell 視窗按下 `Ctrl+C` 停止 `Gitea.exe` 執行。
    
9.  設定 Gitea 支援 HTTPS 與 SSH 安全加密連線
    
    假設你的對外域名是 `gitea.localhost` 的話，可以使用 `Gitea.exe` 快速幫我們建立 TLS/SSL 自簽憑證。
    
    以下命令會在 `C:\Gitea\custom` 目錄下自動產生 `cert.pem` (憑證) 與 `key.pem` (金鑰)：
    
    ```powershell
    cd C:\Gitea\custom; C:\Gitea\gitea.exe cert --host gitea.localhost --ca
    ```
    
    以下命令會將 `cert.pem` 註冊到「受信任的根憑證授權單位」的憑證儲存區，讓你的本機電腦(包含瀏覽器)可以信任這張憑證：
    
    ```powershell
    certutil -addstore -enterprise Root cert.pem
    ```
    
    編輯 `C:/Gitea/custom/conf/app.ini` 設定檔，並調整 `[server]` 區段，合併以下設定：
    
    ```ini
    [server]
    ROOT_URL  = https://gitea.localhost/
    HTTP_PORT = 443
    
    PROTOCOL  = https
    CERT_FILE = cert.pem
    KEY_FILE  = key.pem
    
    REDIRECT_OTHER_PORT = true
    PORT_TO_REDIRECT = 80
    
    START_SSH_SERVER = true
    BUILTIN_SSH_SERVER_USER = git
    ```
    
    > 相關設定請參見 [Gitea Config Cheat Sheet](https://docs.gitea.com/administration/config-cheat-sheet) 文件。
    
10.  修復 Gitea 內建的 OpenSSH Server 無法支援 RSA 演算法的問題
     
     目前 Gitea 1.16 版還有個 [RSA public keys cannot authenticate against internal SSH if the client has a recent ssh version (which disables ssh-rsa algorithm) #17798](https://github.com/go-gitea/gitea/issues/17798) 問題尚待解決，所以如果你的 SSH 用戶端使用了太新的 SSH 版本，可能會有無法透過 SSH 連上 Gitea 的問題。
     
     目前暫時的解決方案是在**用戶端**建立一個 `~/.ssh/config` 檔案，並放置以下內容：
     
     ```
     Host localhost
       HostkeyAlgorithms +ssh-rsa
       PubkeyAcceptedKeyTypes +ssh-rsa
     ```
     
11.  將 Gitea 註冊為 Windows 服務
     
     首先你必須先查出目前的電腦名稱：
     
     ```powershell
     $env:COMPUTERNAME
     ```
     
     然後再修改 `C:/Gitea/custom/conf/app.ini` 設定檔，務必將 `RUN_USER` 修改為 `電腦名稱` + `$` 這樣的格式（這是電腦帳戶的格式）：
     
     ```ini
     RUN_USER = COMPUTERNAME$
     ```
     
     預設 `C:/Gitea/custom/conf/app.ini` 設定檔將所有 Log 輸出到 Console，如果我們要跑在 Windows 服務下，你必須修改 `[log]` 區段的設定，將所有 Log 改儲存到 `C:/Gitea/log/gitea.log` 檔案中。完整設定請參見 [Advanced: Logging Configuration](https://docs.gitea.com/administration/logging-configuration) 說明。
     
     ```ini
     [log]
     MODE      = file
     LEVEL     = info
     ROOT_PATH = C:/Gitea/log
     FILE_NAME = %(ROOT_PATH)/gitea.log
     ROUTER    = console
     ```
     
     最後直接利用 `sc.exe` 自動註冊並啟動 `Gitea` 的 Windows 服務
     
     ```powershell
     sc.exe create gitea start= auto binPath= '"C:\gitea\gitea.exe" web --config "C:\gitea\custom\conf\app.ini"'
     sc.exe start gitea
     ```
     

### 設定 Git 用戶端工具信任 Gitea 的自簽憑證

由於 Git for Windows 自己有一份 CA 清單，跟 Windows 憑證儲存區的 CA 憑證是分開的，因此使用自簽憑證架設 Gitea 的話，預設所有使用者都將無法成功利用 `git clone` 複製專案回去，你必須請每個人都使用以下步驟進行設定，就可以順利透過 Git 連上 Gitea 下載原始碼。

1.  先將 Git 預設安裝的 CA 清單加入到個人的**家目錄**中，並修改 Git 設定使用自訂的路徑
    
    ```powershell
    $CABundlePath=$(git config --system http.sslCAInfo)
    Copy-Item -Path $CABundlePath -Destination "$env:USERPROFILE\ca-bundle.crt"
    
    git config --global http.sslCAInfo "$env:USERPROFILE\ca-bundle.crt"
    ```
    
    > 注意：**千萬不要**關閉 `http.sslVerify` 設定，這會大幅降低 Git 連線的安全性！
    
2.  將 Gitea 安裝的伺服器**自簽憑證**加入到 `ca-bundle.crt` 檔案中
    
    ```powershell
    Get-Content C:/Gitea/custom/cert.pem | Out-File -Append -FilePath "$env:USERPROFILE\ca-bundle.crt" -Encoding ascii
    ```
    

### 解除安裝 Gitea 與 PostgreSQL

1.  停止並刪除 Windows 服務
    
    ```powershell
    sc.exe stop gitea
    sc.exe delete gitea
    ```
    
2.  解除安裝 PostgreSQL 資料庫
    
    ```powershell
    cuninst postgresql --force-dependencies -y
    ```
    
3.  移除 Gitea 安裝目錄
    
    ```powershell
    CD C:\; Remove-Item C:\Gitea\ -Recurse -Force
    ```
    

### 相關連結

-   Gitea
    -   https://dl.gitea.io/gitea/1.16.0
    -   [gitea-1.16.0-windows-4.0-amd64.exe](https://dl.gitea.io/gitea/1.16.0/gitea-1.16.0-windows-4.0-amd64.exe)
    -   [gitea-1.16.0-gogit-windows-4.0-amd64.exe](https://dl.gitea.io/gitea/1.16.0/gitea-1.16.0-gogit-windows-4.0-amd64.exe)
    -   [Register as a Windows Service - Docs](https://docs.gitea.com/installation/windows-service)
    -   [Database Preparation - Docs](https://docs.gitea.com/installation/database-prep)
    -   [HTTPS setup to encrypt connections to Gitea](https://docs.gitea.com/administration/https-setup)
-   Git
    -   [Adding a corporate (or self-signed) certificate authority to git.exe's store – phkelley's blog](https://blogs.msdn.microsoft.com/phkelley/2014/01/20/adding-a-corporate-or-self-signed-certificate-authority-to-git-exes-store/)
    -   [configure Git to accept a particular self-signed server certificate for a particular https remote - Stack Overflow](https://stackoverflow.com/questions/9072376/configure-git-to-accept-a-particular-self-signed-server-certificate-for-a-partic)
-   PostgreSQL
    -   [Chocolatey Software | PostgreSQL](https://community.chocolatey.org/packages/postgresql)
    -   [Windows installers](https://www.postgresql.org/download/windows/)
