一步搞定私有Git服務器部署(Gogs)


http://www.jianshu.com/p/424627516ef6

 

零、安裝 Docker 和 Compsoe

  1. 首先安裝 Docker:
    $ curl -sSL https://get.docker.com/ | sh
    $ sudo usermod -aG docker YOURUSERNAME
    YOURUSERNAME 為你的用戶名。
  2. 然后安裝 Compsoe:
    $ sudo curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
    $ sudo chmod +x /usr/local/bin/docker-compose

一、HTTP 運行 Gogs

使用 HTTPS 直接看第二部分。

准備、Nginx 配置

雖然每個人的配置不一樣,但是還是貼一個簡單的模板:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }
}
# 上面是默認的不用管也可以。
server
{
    listen 80;
    server_name git.example.com; # 這里填自定義域名
    location / {
        proxy_redirect off;
        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_pass http://172.17.0.3:8181; # 這里填容器地址,如果不知道填寫公網IP也是可以的。
    }
}

保存這個文件為 Nginx 配置文件,目錄你自己喜歡,哪都可以。


版本一、Gogs + Sqlite + Nginx

Gogs 支持 Sqlite,對於個人用戶,Sqlite 足以應付,所以硬件資源有限的情況下不妨選擇 Sqlite。
Gogs 默認端口是 3000,打算把 git.example.com 解析到 3000 端口。

新建一個文件命名為 docker-compose.yml ,然后復制粘貼下面的代碼並保存。

version: '2'
services:
  nginx:
    container_name: [nginx]
    image: nginx:alpine
    volumes:
      - "[~/nginx/]:/etc/nginx/conf.d/"
    ports:
      - "80:80"
    restart: always
  gogs:
    container_name: [gogs]
    image: gogs/gogs
    volumes:
      - [~/gogs]:/data
    ports:
      - "[3000]:3000"
      - "[3022]:22"
    restart: always

如你所見 “[]” 里面的內容你自己決定,可以自由修改。保存上面代碼為 docker-compose.yml 文件之后,使用命令:

$ docker-compose up -d

即可運行。
默認容器叫做 gogs ,數據保存在 ~/gogs,端口是 30003022

  • - 3022:22 會將 3022 暴露給外網,用於 Git 的 SSH 協議, 不用 SSH 可以去掉。
  • - [~/gogs]:/data 將映射本地的 ~/gogs 目錄作為 volume 給容器使用, 根據自己創建的目錄修改此項。

然后檢查一下容器有沒有正常在運行:

$ docker ps

訪問網站進行初次的配置, 配置中需要注意的是這兩項不用修改:

  • Repository Root Path(倉庫根目錄)
  • Run User(運行用戶)
  • HTTP Port(HTTP端口)設置為3000
  • SSH Port(SSH端口)設置為你-p參數設定的值(比如3002)
  • Application URL(應用網址)設置為你的http://你的域名

nginx 已經幫我們把容器內的3000端口在服務器上代理給80端口了。

選擇 sqlite3 作為數據庫,那么一切都搞定了(Linux 大部分都裝了 sqlite3),不需要去考慮更多的事情,剩下的便是登錄你的管理員賬號然后在后台設置好你 SSH 登錄用的公鑰(如果用 SSH 的話)。

哦,對了,域名要設置好解析到你的 IP~~(這個提醒會不會有點多余,笑)


版本二、Gogs + Mysql + Nginx

如果你不希望使用 Sqlite,而是使用 Mysql,可以使用下面這份 docker-compose.yml

你不需要在本地安裝 Nginx 和 Mysql,全文都通過 Docker 來完成。

version: '2'
services:
  nginx:
    container_name: [nginx]
    image: nginx:alpine
    volumes:
      - "[~/nginx/]:/etc/nginx/conf.d/"
    ports:
      - "80:80"
    restart: always
  db:
    container_name: [db]
    image: mysql:5.7
    volumes:
      - "[~/mysql]:/var/lib/mysql"
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: [PASSWORD]
      MYSQL_DATABASE: [GOGS]
      MYSQL_USER: [USER]
      MYSQL_PASSWORD: [PASSWORD]
  gogs:
    container_name: [gogs]
    depends_on:
      - db
    image: gogs/gogs
    volumes:
      - [~/gogs]:/data
    links:
      - db
    ports:
      - "[3000]:3000"
      - "[3022]:3022"
    restart: always

[]”里面的內容你自己決定,可以自由修改,(不改請去掉[]符號,保持括號內的默認值)。保存上面代碼為 docker-compose.yml ,使用 docker-compose up -d 即可運行。

安裝時注意,數據庫地址不是 localhost 而是 db ,其他按提示操作即可。


二、使用 HTTPS 運行 Gogs

版本一、Caddy + Gogs + Sqlite

新建文件 Caddyfile ,注意大小寫,然后修改 tls i@example.com 的郵箱為你自己的常用郵箱,IP 改成你的服務器 IP ,然后保存。

git.example.com {
    proxy / 123.456.789.0:3000 { # 改成你 IP:port
        proxy_header Host {host}
        proxy_header X-Real-IP {remote}
        proxy_header X-Forwarded-Proto {scheme}
    }
    log /var/log/caddy.log
    gzip
    tls i@example.com # 你的郵箱
}

新建文件 docker-compose.yml ,基本不用修改參數,直接使用 docker-compose up -d 即可運行。

version: '2'
services:
  caddy:
    container_name: caddy
    image: abiosoft/caddy
    volumes:
      - "~/caddy/Caddyfile:/etc/Caddyfile"
    restart: always
  gogs:
    container_name: gogs
    image: gogs/gogs
    volumes:
      - ~/gogs:/data
    ports:
      - "3000:3000"
      - "3022:22"
    restart: always

版本二、Nginx + Letsencrypt + Gogs + Sqlite

克隆 Letsencrypt 倉庫:

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto certonly -d git.example.com

選擇第二個,自動生成證書:


自動生成證書

生成下面文字即為成功:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
.........
.........
 - If you like Let's Encrypt, please consider supporting our work by:
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Nginx 配置:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name git.example.com; # 修改域名
    server_tokens off;
    location /generate_204 { return 204; }
    # Discourage deep links by using a permanent redirect to home page of HTTPS site
    return 301 https://$host;
    # Alternatively, redirect all HTTP links to the matching HTTPS page
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2 default_server;
    listen [::]:443 ssl http2 default_server;
    server_name git.example.com; # 修改域名
    server_tokens off;
    location /generate_204 { return 204; }

    # ssl on;
    ################
    # SSL 配置
    ################
    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;
    ################
    # from https://cipherli.st/
    # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ################
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    # ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5:!MEDIUM:!LOW";
    ssl_ecdh_curve secp384r1;
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;
    # Disable preloading HSTS for now.  You can use the commented out header line that includes
    # the "preload" directive if you understand the implications.
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    # add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

    # ssl_dhparam /etc/nginx/certs/dhparam.pem;
    ################
    # SSL END
    ################
    add_header 'Access-Control-Allow-Origin' *;
    add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS';
    location / {
        proxy_pass http://123.456.789.0:3000; # 修改為你的 IP:port
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

然后新建一個文件 docker-compose.yml,使用 docker-compose up -d 運行即可。

version: '2'
services:
  nginx:
    container_name: [nginx]
    image: nginx:alpine
    volumes:
      - "~/nginx/:/etc/nginx/conf.d/"
      - "~/nginx/certs/dhparam.pem:/etc/nginx/certs/dhparam.pem:ro"
      - "/etc/letsencrypt/live/zuolan.me/cert.pem:/etc/nginx/certs/cert.pem:ro"
      - "/etc/letsencrypt/live/zuolan.me/chain.pem:/etc/nginx/certs/chain.pem:ro"
      - "/etc/letsencrypt/live/zuolan.me/fullchain.pem:/etc/nginx/certs/fullchain.pem:ro"
      - "/etc/letsencrypt/live/zuolan.me/privkey.pem:/etc/nginx/certs/privkey.pem:ro"
    ports:
      - "80:80"
      - "443:443"
    restart: always
  gogs:
    container_name: [gogs]
    image: gogs/gogs
    volumes:
      - [~/gogs]:/data
    ports:
      - "[3000]:3000"
      - "[3022]:22"
    restart: always

以上一共四個版本,根據需要選擇一種即可。



作者:左藍
鏈接:http://www.jianshu.com/p/424627516ef6
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM