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

場(chǎng)景:因?yàn)閷W(xué)校有流量限制施禾,晚上還斷網(wǎng),同學(xué)間代碼協(xié)作也很麻煩宣蠕,文件老是上傳Github不方便例隆,所以在內(nèi)網(wǎng)部署Gogs解決這個(gè)問題。


零抢蚀、安裝 Docker 和 Compsoe

  1. 首先安裝 Docker:
$ curl -sSL https://get.docker.com/ | sh
$ sudo usermod -aG docker YOURUSERNAME

YOURUSERNAME 為你的用戶名镀层。

  1. 然后安裝 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 運(yùn)行 Gogs

使用 HTTPS 直接看第二部分皿曲。

準(zhǔn)備唱逢、Nginx 配置

雖然每個(gè)人的配置不一樣,但是還是貼一個(gè)簡(jiǎn)單的模板:

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;
    }
}
# 上面是默認(rèn)的不用管也可以屋休。
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; # 這里填容器地址坞古,如果不知道填寫公網(wǎng)IP也是可以的。
    }
}

保存這個(gè)文件為 Nginx 配置文件劫樟,目錄你自己喜歡痪枫,哪都可以。


版本一叠艳、Gogs + Sqlite + Nginx

Gogs 支持 Sqlite奶陈,對(duì)于個(gè)人用戶,Sqlite 足以應(yīng)付附较,所以硬件資源有限的情況下不妨選擇 Sqlite吃粒。
Gogs 默認(rèn)端口是 3000,打算把 git.example.com 解析到 3000 端口翅睛。

新建一個(gè)文件命名為 docker-compose.yml 声搁,然后復(fù)制粘貼下面的代碼并保存黑竞。

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

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

$ docker-compose up -d

即可運(yùn)行。
默認(rèn)容器叫做 gogs 檐涝,數(shù)據(jù)保存在 ~/gogs遏匆,端口是 30003022

  • - 3022:22 會(huì)將 3022 暴露給外網(wǎng)谁榜,用于 Git 的 SSH 協(xié)議, 不用 SSH 可以去掉幅聘。
  • - [~/gogs]:/data 將映射本地的 ~/gogs 目錄作為 volume 給容器使用, 根據(jù)自己創(chuàng)建的目錄修改此項(xiàng)。

然后檢查一下容器有沒有正常在運(yùn)行:

$ docker ps

訪問網(wǎng)站進(jìn)行初次的配置, 配置中需要注意的是這兩項(xiàng)不用修改:

  • Repository Root Path(倉庫根目錄)
  • Run User(運(yùn)行用戶)

  • HTTP Port(HTTP端口)設(shè)置為3000

  • SSH Port(SSH端口)設(shè)置為你-p參數(shù)設(shè)定的值(比如3002)

  • Application URL(應(yīng)用網(wǎng)址)設(shè)置為你的http://你的域名

nginx 已經(jīng)幫我們把容器內(nèi)的3000端口在服務(wù)器上代理給80端口了窃植。

選擇 sqlite3 作為數(shù)據(jù)庫帝蒿,那么一切都搞定了(Linux 大部分都裝了 sqlite3),不需要去考慮更多的事情巷怜,剩下的便是登錄你的管理員賬號(hào)然后在后臺(tái)設(shè)置好你 SSH 登錄用的公鑰(如果用 SSH 的話)葛超。

哦,對(duì)了延塑,域名要設(shè)置好解析到你的 IP~~(這個(gè)提醒會(huì)不會(huì)有點(diǎn)多余绣张,笑)


版本二、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

[]”里面的內(nèi)容你自己決定,可以自由修改好芭,(不改請(qǐng)去掉[]符號(hào)燃箭,保持括號(hào)內(nèi)的默認(rèn)值)。保存上面代碼為 docker-compose.yml 舍败,使用 docker-compose up -d 即可運(yùn)行招狸。

安裝時(shí)注意,數(shù)據(jù)庫地址不是 localhost 而是 db 邻薯,其他按提示操作即可裙戏。


二、使用 HTTPS 運(yùn)行 Gogs

版本一厕诡、Caddy + Gogs + Sqlite

新建文件 Caddyfile 累榜,注意大小寫,然后修改 tls i@example.com 的郵箱為你自己的常用郵箱,IP 改成你的服務(wù)器 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 ,基本不用修改參數(shù)猖凛,直接使用 docker-compose up -d 即可運(yùn)行赂蠢。

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

選擇第二個(gè)辨泳,自動(dòng)生成證書:

自動(dòng)生成證書

生成下面文字即為成功:

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;
    }
}

然后新建一個(gè)文件 docker-compose.yml虱岂,使用 docker-compose up -d 運(yùn)行即可。

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

以上一共四個(gè)版本菠红,根據(jù)需要選擇一種即可第岖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市试溯,隨后出現(xiàn)的幾起案子蔑滓,更是在濱河造成了極大的恐慌,老刑警劉巖耍共,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烫饼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡试读,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門荠耽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钩骇,“玉大人,你說我怎么就攤上這事铝量√纫伲” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵慢叨,是天一觀的道長纽匙。 經(jīng)常有香客問我,道長拍谐,這世上最難降的妖魔是什么烛缔? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮轩拨,結(jié)果婚禮上践瓷,老公的妹妹穿的比我還像新娘。我一直安慰自己亡蓉,他們只是感情好晕翠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砍濒,像睡著了一般淋肾。 火紅的嫁衣襯著肌膚如雪硫麻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天樊卓,我揣著相機(jī)與錄音拿愧,去河邊找鬼。 笑死简识,一個(gè)胖子當(dāng)著我的面吹牛赶掖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播七扰,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼奢赂,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了颈走?” 一聲冷哼從身側(cè)響起膳灶,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎立由,沒想到半個(gè)月后轧钓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锐膜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年毕箍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片道盏。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡而柑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荷逞,到底是詐尸還是另有隱情媒咳,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布种远,位于F島的核電站涩澡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坠敷。R本人自食惡果不足惜妙同,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望常拓。 院中可真熱鬧渐溶,春花似錦、人聲如沸弄抬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拖陆,卻和暖如春弛槐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背依啰。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工乎串, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人速警。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓叹誉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闷旧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子长豁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容