網管傳承總論

本筆記由建中電研一三學術長AaW初寫 而後有建北電資學術網管共同編修
若有相關疑慮,可以寄信到 ckefgisc28th@gmail.com 或是透過 Discord 詢問

這一篇筆記,是建北電資為了傳承所有一二、一三、一四曾經管理的網路相關服務所寫的(類)技術文件。

在本書當中,我們主要針對社網、ISCOJ 伺服器、以及其他相關我們所做的事情做傳承。不過,由於也是我們第一次撰寫如此巨大的傳承文件,因此難免有一些缺漏或不清楚之處。學弟妹如有需要可以向我詢問或是協助我們補齊不清楚之處。

本書使用 mdBook 進行部署與開發,所有原始碼和頁面(除了 AaW 留給學弟妹的話)都開放你們在 Github 上進行編輯1,希望此文件可以一路傳承下去。

本書原本發布在 hackmd 平台,若對原始版本有興趣歡迎前往 https://hackmd.io/@AaW/SyULyS7Dn 看看

1

編輯方式請參考修改本書頁面

Github Organization

為了維護社團的所有程式碼,我建立了一個 CKEFGISC 的 Github 組織帳號。

網址:https://github.com/CKEFGISC 管理員:會交給學術長以及網管

這個地方主要提供給學術放置上課內容,以及網管如果開發新的專案可以放在這邊,也可以用來架設社網或相關網站。 目前有的內容:

  • CKEFGISC.github.io :就是社網的專案庫
  • cms : CMS 上機考評測系統的原始碼,是從 https://github.com/erichung09060/cms fork 到吳亞倫的 github 帳號再 fork 過來的。目前為於伺服器上面的 cms 系統是接著這個 repo。詳情請見CMS 比賽平台管理與使用
  • cms-ranking-archiver:用來把 cms 上面的計分板內容抓下來變成靜態網頁。使用方式請見CMS 比賽平台管理與使用
  • CKEFGISC-Linked-List:之前專案小社的內容
  • .github:可以拿來寫組織的介紹之類的
  • translation:從 IOI 抓來的東東,還不知道有什麼用
  • MochaGen(-Assembler):某些一二到一四的YTP專題
  • archives:社內上機比賽的封存檔
  • iscoj-tioj-old:舊oj專案庫
  • Commander:從discord溝通伺服器的酷東西
  • 27, 28th-website:歷屆社網
  • iscoj-tioj:本社oj目前使用的專案庫
  • club-exhibition-website:社網本來要用的網站
  • server-book:本網站

基本上,所有 github 的設定你們都可以亂動,if 你知道自己在做什麼。只要注意不要不小心把東西刪掉就好。

Git

這邊我想要再花一小段篇幅講一下 git 的使用。

首先,如果你還不會用 git,我建議你一定要花時間把他學會,尤其網管對於 git 必須要十分熟悉。如果你覺得你對於指令式介面不熟,可以使用 github desktop 等等圖形化介面沒關係。

而最基本的,你要能夠理解 add、commit、push、fetch、pull 這些操作,並且能夠理解 branch、fork、merge 和 pull request 是什麼。

常用的指令紀錄在2.4. Git 指令

可使用的資源:

另外,在利用 github 進行共用協作時,可以遵守以下的規則:

  1. 盡量保持 main branch 的穩定性:
    • 這代表你應該只有確認沒有問題的程式碼才能 merge 到 main 裡面
  2. 以個人帳號 fork 出來之後,再 merge 回組織帳號
  3. commit message 寫清楚,並且詳細寫下這筆 commit 包含哪一些更新

常用 Linux 指令

本章節列出所有在進行伺服器管理時常用的指令。在程式開發界,會使用以及熟悉各類指令是基本的能力,尤其是 Unix-like 系統(包含 Linux、FreeBSD、MacOS)的 shell 和 Terminal 指令更應該熟悉。

基本指令

  • ls
    • 列出工作路徑下的檔案或是目錄清單
  • cd
    • 切換目錄的路徑
  • pwd
    • 列印工作路徑
  • cp <A> <B>
    • 拷貝檔案 A 到 B
    • -r複製目錄:
      • cp -r path/to/dir/a path/to/dir/b
  • mv <A> <B>
    • 移動
    • 重新命名也是這樣用
    • -r 移動目錄
  • touch <FILENAME>
    • 碰一下
    • 建立一個空的文件檔
  • mkdir <DIR-NAME>
    • 建立新資料夾
  • rm <FILENAME>
    • 刪除檔案
    • -r 刪資料夾
    • -f 強制
  • sudo <指令>
    • 以 root(管理員 aka 超級使用者)權限執行指令
    • 注意!危險!小心使用!
    • 執行後要輸入密碼
  • sudo su
    • 成為 root 使用者
  • ln
    • 建立“連結”
    • https://blog.gtwang.org/linux/linux-ln-command-tutorial-examples/
    • https://ithelp.ithome.com.tw/articles/10222754
    • 常用 ln -s 將執行檔 link 到 bin 目錄當中(linux 中的==安裝==)
  • chmod
    • 變更檔案權限
    • 參考網址:https://weikaiwei.com/linux/chmod-commands/
  • cat
    • 把某個檔案的東西在終端機中印出來
    • https://weikaiwei.com/linux/cat-command/
    • 會和 pipe 結合成怪怪用法
  • echo <A>
    • 終端機就會輸出<A>
    • 會和> >>結合成怪怪用法
  • > < >>
    • <
      • 指令 < 檔案
      • 將檔案的東西導入指令的“輸入流”
    • >
      • 指令 > 檔案
      • 將指令的“輸出流”輸出到檔案(原檔案內容會被洗掉)
    • >>
      • 指令 >> 檔案
      • 將指令的“輸出流”輸出到檔案(添加在原檔案內容後面)
  • neofetch
    • 出現這個酷東東
  • gccg++
    • 就...gcc 和 g++
  • ssh
    • 遠端連線
    • ssh username@ip-address
    • 例如:ssh fgisc@203.64.52.132
  • scp
    • 遠端複製檔案
    • https://blog.gtwang.org/linux/linux-scp-command-tutorial-examples/
  • zipunzip
    • https://www.ltsplus.com/linux/linux-zip-unzip
  • man
    • 教學文件
    • man <指令>
    • 得到 <指令> 的文件內容
    • 例如:man git

參考資料:https://blog.ossii.com.tw/?p=2241#

APT 簡介

APT(Advanced Package Tool)是一種用於在基於 Debian 的 Linux 發行版中管理軟體包的軟體包管理工具。它是一種命令列工具,用於安裝、升級、刪除和管理軟體包,使得軟體包的管理變得簡單和高效。

常用指令

  • apt update: 更新軟體包列表。
  • apt upgrade: 升級所有可用的軟體包到最新版本。
  • apt install <package_name>: 安裝指定軟體包。
  • apt remove <package_name>: 卸載指定軟體包,但保留配置文件。
  • apt purge <package_name>: 卸載指定軟體包,並刪除其所有相關的配置文件。
  • apt autoremove: 自動刪除不再被其他軟體包依賴的無用軟體包。
  • apt clean: 刪除已下載的軟體包文件,以釋放硬碟空間。

vim

vim 是一個很棒的文字編輯器。他可以讓你用思維的速度寫程式

Vim 具有多種模式,包括普通模式(Normal mode)、插入模式(Insert mode)、可視模式(Visual mode)等,每種模式下的鍵盤操作不同,使得編輯更加高效。

不過,其實只要知道基本的存檔、退出、編輯就好了。

常用指令

  • 用 Vim 開啟並編輯檔案:

    在終端機當中:

    vim filename.txt
    

    此時會進入到一般模式,按 h j k l 分別可以將游標往 移動。 按i進入編輯模式(就會跟一般文字編輯器一樣可以打字),按esc退出編輯模式。

  • 保存和退出:

    注意指令當中的:和驚嘆號都是有意義的!

    • 離開 Vim: 無法 :q
    • 保存文件並退出: :wq
    • 不保存文件並退出: :q!
  • 移動光標:

    • 向上移動一行: k
    • 向下移動一行: j
    • 向左移動一個字符: h
    • 向右移動一個字符: l
  • 編輯文本:

    • 進入插入模式: i
    • 刪除一個字符: x
    • 撤銷上一個操作: u
    • 重做上一個撤銷的操作: Ctrl + r
    • 退出插入模式: <ESC>

Git

多多少少學著用吧,可以自己去網路上找相關文章

以下是一個常用指令表,source

  • git init 建立新的本地端 Repository。
  • git clone [Repository URL] 複製遠端的 Repository 檔案到本地端。
  • git status 檢查本地端檔案異動狀態。
  • git add [檔案或資料夾] 將指定的檔案(或資料夾)加入版本控制。用 git add . 可加入全部。
  • git commit 提交(commit)目前的異動。
  • git commit -m "提交說明內容" 提交(commit)目前的異動並透過 -m 參數設定摘要說明文字。
  • git stash 獲取目前工作目錄的 dirty state,並保存到一個未完成變更的 stack,以方便隨時回復至當初的 state。
  • git log 查看先前的 commit 記錄。
  • git push 將本地端 Repository 的 commit 發佈到遠端。
  • git push origin [BRANCH_NAME] 發佈至遠端指定的分支(Branch)
  • git branch 查看分支。
  • git branch [BRANCH_NAME] 建立分支。
  • git checkout [BRANCH_NAME] 取出指定的分支。
  • git checkout -b [BRANCH_NAME] 建立並跳到該分支。
  • git branch -D [BRANCH_NAME] 強制刪除指定分支(須先切換至其他分支再做刪除)。
  • git reset --hard [HASH] 強制恢復到指定的 commit(透過 Hash 值)。
  • git checkout [HASH] 切換到指定的 commit(與 git checkout [BRANCH_NAME] 相同)。
  • git branch -m <OLD_BRANCH_NAME> <NEW_BRANCH_NAME> 修改分支名稱。

Port 相關指令

我本來想寫 但我發現我忘光了 這邊只有一個 sudo lsof -i -P -n | grep LISTEN 可以查看端口佔用情形

伺服器總論

本筆記由建電一三學術長吳亞倫製作
若有相關疑慮,可以寄信到 aaronwu0218@gmail.com 或是 Discord aaw.rail 詢問

本筆記當中所有的指令,皆是 bash 指令,代表其作用範圍為 Linux 或 MacOS 作用系統。
如果你是網管但還用 windows,你很糟糕,請去灌 linux 或是使用 wsl。
另外,所有指令當中,如果使用角括號<>圍起來的片段,例如<USERNAME>,代表這個東西你使用時要視情況自己替換。

伺服器,全稱網路伺服器,是一種在網路上提供服務的電腦。

以往,建電社辦內部有數台伺服器,運行著社網以及其他網路服務。不過由於建中內部現在不得架設任何網路伺服器,因此目前社辦皆已無相關設備。因此,目前我們架設 ISCOJ 的伺服器是向北一女借用的。本書篇章中的伺服器皆是指向北資借的那台伺服器。

北資的伺服器

請看下一節 北資的伺服器

如何取得其他伺服器

如果經費可行,推薦你們可以再去找台 VPS 伺服器,拿來練習各種伺服器技巧。也可以用來提供學弟妹練習架設具有後端的網站。

現在網路上的伺服器供應商主要有提供虛擬主機以及 VPS 伺服器兩種不同的商品。其中虛擬主機一般是給你一個 panel,不會給你 ssh 權限以及 root 權限。而 VPS 則會給你整台虛擬機伺服器的管理權限。

蘇怡恩當初在有學長姐的那個大 FB 群公布社網時,有一些學長姐主動來聯繫我,表示願意提供電腦設備或是讓我們租線上 VPS 來使用。 這邊給大家這位學長的聯絡方式:

建電百四學術長 丁安立 學長 DC: 在在 - 存在先於本質#2035

可以幫你們租 VPS,可以幫你們代付只有信用卡能買的東西,可以買些你們需要用來學習的電腦之類的。
一年五萬以內那種量級我應該都直接付了

建電 19th 詹依寰 學長 EMAIL: yihuan.chan@gmail.com 目前我們 ckefgisc.org 和 ckeisc.org ==網域==的所有人是這一位學長,有事可以聯絡他。

北資的伺服器

注意:
本章節包含過時資訊(ISCOJ 已經由 青島 OJ 轉移到 TIOJ 了)
我們後續將儘速更新,抱歉造成困擾

伺服器的主管人為北一女何雪溱老師,如果針對伺服器有任何疑慮可以向老師詢問。
另外,如果希望針對裡面內容進行大幅度修改,請務必向雪溱老師報備之後才可以進行!
何雪溱老師聯絡方式:
email : sjher@gapps.fg.tp.edu.tw

目前,我們是跟北一女中借用了一台伺服器。該伺服器為一台運行在虛擬機上的 Ubuntu Server 20.04 LTS。

這台伺服器由於是學長們自己維護的,因此,東西的穩定性無法到非常的完整。所以如果要進行任何操作務必要先在別的地方以虛擬機進行確認之後,再著手進行。

現在伺服器有哪些東西

營運中網路服務

以下所有服務皆是使用 docker 架設

  1. ISCOJ(已退役)

  2. CMS 比賽評測系統 (Contest Management System)

    • 分為 前台 (port 8888)、後台 (port 8889)、計分版 (port 8890)三大服務
    • 檔案位置:~/cms//cms_docker_postgresql_data/
  3. TIOJ Infor Online Judge

    • 本社目前使用的oj,檔案位置為~/tioj-new/,由建中學長開發,各式文檔並不齊全(伺服器端的大部分根本不存在),請自行熟悉ruby on rails以及sandbox後再進行修改
  4. Online Code Editor

    • 不知道為什麼架的,但可以在上面共編東西,檔案位置 ~/vscode,網址是 https://iscoj.ckefgisc.org/vscode

其他服務

  1. nginx
    • 處理各式轉址以及效能平衡
  2. certbot
    • 自動更新SSL憑證

基本上,家目錄裡面的東西(除了上述提到的服務),很多都是測試用途,可以嘗試看看 但是,根目錄(/)底下的資料夾,==不懂的人沒事不要上去亂動!==

網域

  • 伺服器 ip 位址:203.64.52.132
  • 網址:iscoj.fg.tp.edu.twfgiscoj.fg.tp.edu.twiscoj.ckefgisc.org
    • 如果需要更多網域登入學長的aws後就可以新增A record 指向ip即可

使用者名稱

使用者名稱為 fgisc,可透過 sudo 具有 root 權限,請小心使用。 密碼將放置在另外一個檔案教給網管。

連線

  • 請使用 ssh 指令進行連線
  • 指令:ssh fgisc@203.64.52.132
  • windows 使用者可以去下載 putty
  • scp指令:將檔案複製上去伺服器/複製回來你的電腦
    • 教學:https://blog.gtwang.org/linux/linux-scp-command-tutorial-examples/

PORT 端口

通訊埠(英語:port),又稱為連接埠、端口、協定埠(protocol port)在電腦網路中是一種經由軟體建立的服務,在一個電腦作業系統中扮演通訊的端點(endpoint)。每個通訊埠都會與主機的 IP 位址及通訊協定關聯。通訊埠以 16 位元數字來表示,這被稱為通訊埠編號(port number)。 --- 維基百科

簡單來說,在電腦當中,所有的服務都會佔用一到多個端口。 例如,網際網路服務(http)預設的端口是80,而https443ssh22,小佛用的 telnet 是23

在我們的伺服器當中,以下 port 是對外開啟的:

  • 22: ssh
  • 80: http
  • 443: https
  • 8888、8889、8890: 測試用

另外可能還有一些別的 port,但我沒用過也不確定。 如果你們希望開啟其他的 port 作為測試用途,例如8000,可以請雪臻老師幫忙。

在所有網際網路服務當中,使用到了以下 port:

  • 平常啟用
    • 80:對外所有 http
    • 443:對外所有 https
    • 8000:青島 oj 的 http
    • 1443:青島 oj 的 https
    • 8890:CMS 使用者比賽頁面
    • 8891:CMS admin
    • 8892:CMS ranking

nginx 與 反向代理 (reverse proxy)

因為伺服器當中對外開放的 port 有點少,原本只有 80 和 443。當初我為了要架設 cms,所以特地去學反向代理。

在我們伺服器當中,我用了 nginx 作為反向代理的 server。那 nginx 這個東西蠻強大的,也很複雜,我這裡無法細講太多,有興趣的可以自己再去搜尋。

nginx 配置文件皆位於/etc/nginx/資料夾底下。

  1. 主配置文件為/etc/nginx/nginx.conf
  2. ISCOJ 與 CMS 配置文件:
    • /etc/nginx/conf.d/iscoj.conf
    • 內容解說位於下一段

我的 nginx 配置文件寫了什麼?

## 上游設定
upstream oj {
	server 0.0.0.0:1443;
	keepalive 16;
}

upstream cms {
	server 0.0.0.0:8888;
	keepalive 16;
    # 以這邊為例
    # 底下配置文件當中寫的 https://cms/ 會代理到 port 8888
}

upstream cms-admin {
	server 0.0.0.0:8889;
	keepalive 8;
}

upstream cms-rank {
	server 0.0.0.0:8890;
	keepalive 8;
}

upstream cmspython {
	server 0.0.0.0:8788;
	keepalive 16;
}

upstream cmspython-admin {
	server 0.0.0.0:8789;
	keepalive 8;
}

upstream cmspython-rank {
	server 0.0.0.0:8790;
	keepalive 8;
}

# Default server configuration
#
server {

	# SSL configuration
	#
	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;

  	# 憑證與金鑰的路徑
    ssl_certificate /etc/letsencrypt/live/iscoj.fg.tp.edu.tw/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/iscoj.fg.tp.edu.tw/privkey.pem; # managed by Certbot

	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html; # 不太重要,因為我們所有東西都是反向代理

	# Add index.php to the list if you are using PHP
	# index index.html index.htm index.nginx-debian.html;

	server_name iscoj.fg.tp.edu.tw fgiscoj.fg.tp.edu.tw;

    ## 反向代理區段
    # iscoj
	location / {
		proxy_pass https://oj/;

		# 把 IP、Protocol 等 header 都一起送給反向代理的 server
		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 $http_x_forwarded_proto;
	}

	# 沒有加斜線的要轉址成有斜線,才能正確的反向代理到subfolder
	location = /cms {
		return 302 /cms/;
	}
    # 反向代理的程式
	location /cms/ {
		proxy_pass http://cms/;
	}

	location = /cms/admin {
		return 302 /cms/admin/;
	}
	location /cms/admin/ {
		proxy_pass http://cms-admin/;
	}

	location = /cms/ranking {
		return 302 /cms/ranking/;
	}
	location /cms/ranking/ {
		proxy_pass http://cms-rank/;
		proxy_buffering off;
	}

	location = /cmspython {
		return 302 /cmspython/;
	}
	location /cmspython/ {
		proxy_pass http://cmspython/;
	}

	location = /cmspython/admin {
		return 302 /cmspython/admin/;
	}
	location /cmspython/admin/ {
		proxy_pass http://cmspython-admin/;
	}
	location = /cmspython/ranking {
		return 302 /cmspython/ranking/;
	}
	location /cmspython/ranking/ {
		proxy_pass http://cmspython-rank/;
		proxy_buffering off;
	}


	#上機考 得題
	location /cms/<ANS> {
		return 302 https://hackmd.io/_uploads/rJMJQzcNn.png;
	}
	location /cms/96 {
		return 302 https://hackmd.io/@QYi6gllvSum0RZrW3jaysg/Sy75nf9Vn;
	}
	location /cms/96/ {
		return 302 https://hackmd.io/@QYi6gllvSum0RZrW3jaysg/Sy75nf9Vn;
	}
	location /cms/<96>/ {
		return 302 https://hackmd.io/@QYi6gllvSum0RZrW3jaysg/Sy75nf9Vn;
	}
}


server {
    if ($host = iscoj.fg.tp.edu.tw) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = fgiscoj.fg.tp.edu.tw) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


	listen 80 default_server;
	listen [::]:80 default_server;

	server_name iscoj.fg.tp.edu.tw fgiscoj.fg.tp.edu.tw;
    return 404; # managed by Certbot

}

如果你們希望更動 nginx 的配置文件,可以,但請記得要小心&先備份原本的設定檔。 注意,最好不要更動或刪除到我已經配置完的文件。 更動完設定之後,可以用以下指令讓 nginx 重新啟動: systemctl restart nginx

systemctl 系統服務

這有點複雜,反正就是如果你寫好一個文件指令交給 systemctl (其實應該說交給 systemd),他會讓你的程式在電腦背景以“服務”形式在運作。 基本上我額外設定的服務有:

  1. nginx
  2. certbot 自動更新
  3. iscoj 的開機自動啟用,在 iscoj 區段會有詳細介紹

systemctl 常用指令:

記得大部分都要 sudo,所以請小心使用

  • systemctl start <SERVICE_NAME>.service
    • 啟動<SERVICE_NAME> 這個服務,例如ststemctl start nginx.service
  • systemctl stop <SERVICE_NAME>.service:停止這個服務
  • systemctl restart <SERVICE_NAME>.service:重啟這個服務
  • 其他的自己 google,但理論上你只會用到這幾個

自行設定服務

一般來說,在 systemctl 裡面的服務都是你安裝某個應用程式之後,系統自動建立的。 不過呢,有些時候我們會希望建立自己的服務,例如 iscoj 那個。 這時候你可以參考這幾篇教學文章來進行。

  • https://blog.gtwang.org/linux/linux-create-systemd-service-unit-for-python-echo-server-tutorial-examples/
  • https://unix.stackexchange.com/questions/236084/how-do-i-create-a-service-for-a-shell-script-so-i-can-start-and-stop-it-like-a-d
  • https://medium.com/@benmorel/creating-a-linux-service-with-systemd-611b5c8b91d6

ISCOJ

CMS

SSL 安全認證

所謂的 SSL 安全認證,代表這個網站可以被 CA 認證,擁有 https 加密連線。原本 SSL 的認證文件都是透過雪臻老師協助申請取得,但後來雪臻老師提供了一個自動申請憑證的方式:certbot 機器人。

certbot

老師當初給我的教學是 apache 版本的,文件連結

我自己目前是看這一篇教學設定的: https://blog.hellojcc.tw/setup-https-with-letsencrypt-on-nginx/

certbot如果要登記新的網域需重新啟動,此時他會覆蓋掉原本的nginx執行緒,並佔用 80 PORT,即使查看執行緒直接kill仍無法重啟nginx,原因未知,如果可以的話希望你們能找出來,惟重開機可解決。

目前檔案路徑

憑證位於/etc/letsencrypt/live/iscoj.fg.tp.edu.tw目錄底下,需有 root 權限才可以瀏覽。 fullchain.pem為公鑰,privkey.pem是私鑰

Docker

Docker 是一個好東西。

他是一個類似於虛擬機的東東,可以十分輕量化的建立一個服務,同時將應用程式安裝在不會影響到原先伺服器的設定。

教學文章:

我在這邊簡單講一下下我對於 Docker 的各種理解

image

基本上,就是一個公開的東西。 可以把它當作是安裝檔之類的,或是類似於一個 github repo。

常見的 image 有純 ubuntu、ubuntu+nginx 之類的。也有一些人會透過 Dockerfile 建立自己應用程式的 image 並且放在網路上,例如青島 OJ。

基本上我們在建立應用程式時,需要先將一個 image pull 下來。再透過他建立 container。

  • docker image list : 檢視電腦裡有哪些 image

container

就是一著正在執行的,一個類似虛擬機的東東。

可以透過 docker ps -a 指令檢視正在執行的 container。

docker-compose

基本上,我們不太需要自己慢慢的用 docker run 之類的指令來執行 docker,由於我們都是使用別人打包好的應用程式,因此我們可以直接以 docker-compose 的相關指令來將一堆 docker 一次設定好。

教學文章:https://ithelp.ithome.com.tw/articles/10194183

所有 docker-compose 的相關指令與配置,都會記載在專案資料夾的 docker-compose.yml 文件當中。以青島 OJ 的文件為例:

version: "3"
services:

  oj-redis:
    image: redis:4.0-alpine
    container_name: oj-redis
    restart: always
    volumes:
      - ./data/redis:/data

  oj-postgres:
    image: postgres:10-alpine
    container_name: oj-postgres
    restart: always
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge

  judge-server:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/judge_server
    container_name: judge-server
    restart: always
    read_only: true
    cap_drop:
      - SETPCAP
      - MKNOD
      - NET_BIND_SERVICE
      - SYS_CHROOT
      - SETFCAP
      - FSETID
    tmpfs:
      - /tmp
    volumes:
      - ./data/backend/test_case:/test_case:ro
      - ./data/judge_server/log:/log
      - ./data/judge_server/run:/judger
    environment:
      - SERVICE_URL=http://judge-server:8080
      - BACKEND_URL=http://oj-backend:8000/api/judge_server_heartbeat/
      - TOKEN=CHANGE_THIS
      # - judger_debug=1

  oj-backend:
    image: registry.cn-hangzhou.aliyuncs.com/onlinejudge/oj_backend
    container_name: oj-backend
    restart: always
    depends_on:
      - oj-redis
      - oj-postgres
      - judge-server
    volumes:
      - ./data/backend:/data
    environment:
      - POSTGRES_DB=onlinejudge
      - POSTGRES_USER=onlinejudge
      - POSTGRES_PASSWORD=onlinejudge
      - JUDGE_SERVER_TOKEN=CHANGE_THIS
      - FORCE_HTTPS=1
      # - STATIC_CDN_HOST=cdn.oj.com
    ports:
      - "0.0.0.0:8000:8000"
      - "0.0.0.0:1443:1443"

文件中大部分的東西都不用懂。首先我們可以看到的是services區段底下的四個大區段:oj-redisjudge-serveroj-backend。這分別代表 docker-compose 會啟動的四個容器。再次注意,一個 docker container 基本上就是一台虛擬機。

一般來說你們有可能需要動到的只有下列兩個地方。

  1. port 區塊
    • 以第 64 行為例,代表的是要將 host 的 8000 阜映射到 oj-backend 這台虛擬機的 8000 阜
  2. volumes
    • 以第 60 行為例,代表的是要將 host 的./data/backend資料夾共用到虛擬機的/data資料夾。

docker-compose 會用到的指令

注意,要先 cd 到有 docker-compose.yml 的那個資料夾

docker-compose up -d

執行應用程式,並且 detach (在背景中執行)

docker-compose up

執行應用程式,並且顯示 log 在 console 當中

docker-compose build

建立但不執行(up 時也會先 build)

docker-compose down

停止應用程式

docker-compose restart

重新啟動運用程式。但注意,此指令並不會更新到你對配置文件做的新跟動。如果有修改 yml 檔案之類的,請用先 down 再 up 的方式重啟。

其他常用指令

docker exec -it <CONTAINER-NAME> /bin/bash

進入虛擬機的 bash 裡面

docker ps -a

檢查所有容器的狀態

TIOJ 使用說明

TIOJ 位在的資料夾:/home/fgisc/tioj-newaka~/tioj-new

由於此 oj 歷經多次嘗試才架設成功

目前 oj 所在的資料夾名稱為tioj-new

此外,本oj的judge已被分離至tioj-judge並加上docker-compose的檔案,必要時可複製該repo並於其他伺服器啟用judge server

文件

  • GitHub: https://github.com/TIOJ-INFOR-Online-Judge/tioj

架設

git clone https://github.com/TIOJ-INFOR-Online-Judge/tioj.git
cd tioj
cp .env.example .env

# setup keys

docker-compose up -d

啟動 OJ

# cd path/to/tioj-new

# 啟動OJ
docker-compose up -d
sudo systemctl restart nginx

啟動完之後可以去 localhost:4000 查看網頁

雜七雜八的設定

UI 修改方式

在~/tioj-new 下修改原始碼

  • 圖像儲存在public/image
  • 一些網頁內容與 css 儲存在app app/assets/stylesheets/custom_styles.css可以修改眾多 css 類別
  • app/views則多為純 html 若副檔名為.html.erb 則為 html 與 ruby 配合的文件寫法 詳細語法請自行搜尋

在此改完所有欲修改、新增的東西後

  • 前往/srv/tioj/public/assets/找到自己新增的東西並刪掉
sudo rm -r /srv/tioj/public/assets/<你要刪的東西>/
  • 上面那個很危 不懂不要亂搞
  • 不會的請到下面的 build --no-cache 只是會慢個億點點而已
  • 之後再回到/home/fgisc/tioj-new/
docker-compose build
sudo systemctl restart nginx
  • 此時連回網站,如果發現東西沒有變 到/home/fgisc/tioj-new/
docker-compose build --no-cache
sudo systemctl restart nginx

可能是因為你在 srv 刪錯東西的原因

External Judge Server

如果之後我創了tioj-judge-docker再放上來

現在先講怎麼手動加上compose並接上oj

git clone https://github.com/TIOJ-INFOR-Online-Judge/tioj-judge.git
cd tioj-judge

用vim開一個 .env 然後把下面的東西放進去,要記得改自己的網址和FETCH_KEY

vim .env

不用加冒號

TIOJ_URL: your_url_here
TIOJ_KEY: your_fetch_key_here

接下來創一個docker-compose.yml

vim docker-compose.yml

把這些放進去

version: "3.7"

x-logging:
  &default-logging
  driver: "json-file"
  options:
    max-size: "100m"
    max-file: "2"

services:
  judge:
    build: https://github.com/TIOJ-INFOR-Online-Judge/tioj-judge.git
    environment:
      TIOJ_URL: $TIOJ_URL
      TIOJ_KEY: $TIOJ_KEY
    volumes:
      - /srv/tioj/judge-td-pool:/var/lib/tioj-judge/td-pool
      - /srv/tioj/judge-testdata:/var/lib/tioj-judge/testdata
      - ./tioj-judge:/judge
    tmpfs:
      - /tmp:exec
    privileged: true
    network_mode: host
    pid: host
    logging: *default-logging

啟動他

docker-compose up -d

最後進到tioj的admin頁面新增一個judge server即可(name隨便打 ip不用打 key要是一樣的)

題目新增方式

新增測資

tioj 不像 iscoj 測資與題序是分開上傳的 在新增題目後點入該題目 若有管理員權限 應會看到一個叫 manage testdata 的地方 按下去就可以上傳測資了 但只能一筆一筆慢慢上傳 至於測資來源一樣從 iscoj 上下載 每一題後面都會有個 download testcase 的按鈕 記得解壓縮

批量上傳測資

使用本文件底端的那份扣 就照著他說的做 問你文件路徑如果此.py 跟那個在同一個資料夾請輸入./ 很方便你只要有給到正確的路徑 他就會讀取所有的.in, .out並上傳 time limit 與 memory limit 請照 iscoj 原本大小

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import requests
import random
import string
from bs4 import BeautifulSoup
from getpass import *
from os import listdir
from os.path import join, isfile

judge_site = 'https://iscoj.fg.tp.edu.tw'

session = requests.Session()
def login():
	TIOJusername = input("username: ")
	TIOJpassword = input("password: ")
	print('logging in...')
	global session
	rel = session.get(judge_site + '/users/sign_in')
	soup = BeautifulSoup(rel.text, "html.parser")
	inputs = soup.find('form').find_all('input')
	rel = session.post(judge_site + '/users/sign_in', data = {
		inputs[0].attrs['name']: inputs[0].attrs['value'],
		#inputs[1].attrs['name']: inputs[1].attrs['value'],
		'user[username]': TIOJusername,
		'user[password]': TIOJpassword,
		'user[remember_me]': '1',
		'commit': 'Sign in'
	})

login()
print('Successful log in')

problem_id = input('Problem ID: ')
tdpath = input('Testdata folder path: ')
files = [join(tdpath, f[:-3]) for f in listdir(tdpath) if isfile(join(tdpath, f)) and f[-3:] == '.in']
files.sort()

time_limit = input('Time limit: ')
memory_limit = input('Memory limit: ')

sign_up_get_url = judge_site + '/problems/%s/testdata/new' % problem_id
sign_up_post_url = judge_site + '/problems/%s/testdata' % problem_id
for f in files:
	print(f'processing {f}...')
	rel = session.get(sign_up_get_url)
	soup = BeautifulSoup(rel.text, "html.parser")
	inputs = soup.find('form').find_all('input')
	rel = session.post(sign_up_post_url, data = {
		inputs[0].attrs['name']: inputs[0].attrs['value'],
		#inputs[1].attrs['name']: inputs[1].attrs['value'],
		'testdatum[limit_attributes][time]': time_limit,
		'testdatum[limit_attributes][memory]': memory_limit,
		'testdatum[limit_attributes][output]': '65536',
		'testdatum[problem_id]': problem_id,
		'commit': 'Create Testdatum'
	}, files = {
		'testdatum[test_input]': open(f'{f}.in', 'rb'),
		'testdatum[test_output]': open(f'{f}.out', 'rb')
	})
	print(f'Create {f}.')

不按照 pid 順序新增題目

連進 db

不要刪東西 不要刪東西

docker exec -it tioj-new_db_1 bash #進入tioj的db所在的docker
mysql -u root -p #進入該docker中的sql
55555333 #這是sql密碼 不要問為甚麼這麼爛 ~~問AaW~~
use tioj_production #進入sql的tioj_production這個表
# 在problems這張表新增題目 schema隨附與文件末
INSERT INTO problems (id, specjudge_type, interlib_type, verdict_ignore_td_list) VALUES(**THE ID TO INSERT**, 0, 0, "A");

sql-tioj_production-problems-schema

# == Schema Information
#
# Table name: problems
#
#  id                     :bigint           not null, primary key
#  name                   :string(255)
#  description            :text(16777215)
#  source                 :text(16777215)
#  created_at             :datetime
#  updated_at             :datetime
#  input                  :text(16777215)
#  output                 :text(16777215)
#  hint                   :text(16777215)
#  visible_state          :integer          default("public")
#  sjcode                 :text(4294967295)
#  interlib               :text(4294967295)
#  specjudge_type         :integer          not null
#  interlib_type          :integer          not null
#  specjudge_compiler_id  :bigint
#  discussion_visibility  :integer          default("enabled")
#  interlib_impl          :text(4294967295)
#  score_precision        :integer          default(2)
#  verdict_ignore_td_list :string(255)      not null
#  num_stages             :integer          default(1)
#  judge_between_stages   :boolean          default(FALSE)
#  default_scoring_args   :string(255)
#  strict_mode            :boolean          default(FALSE)
#  skip_group             :boolean          default(FALSE)
#  ranklist_display_score :boolean          default(FALSE)
#  code_length_limit      :integer          default(5000000)
#  specjudge_compile_args :string(255)
#
# Indexes
#
#  index_problems_on_name                   (name)
#  index_problems_on_specjudge_compiler_id  (specjudge_compiler_id)
#  index_problems_on_visible_state          (visible_state)
#
# Foreign Keys
#
#  fk_rails_...  (specjudge_compiler_id => compilers.id)
#```

(舊) ISCOJ (青島 OJ) 伺服器端使用說明

注意:
本章節包含過時資訊(ISCOJ 已經由 青島 OJ 轉移到 TIOJ 了)
我們後續將儘速更新,抱歉造成困擾

ISCOJ 位在的資料夾:/OnlineJudgeDeploy/

一二學長姐架設時,使用的是青島 OJ。他具有好部署、架設簡單的特性。但是,相對來說,他的功能十分薄弱,很多東西都不好用,因此建議你們可以嘗試換一個 OJ。

文件

  • GitHub: https://github.com/QingdaoU/OnlineJudge
  • 官方說明文件:https://opensource.qduoj.com/

架設

https://github.com/QingdaoU/OnlineJudgeDeploy 非常簡單,只需要在一台裝有 Docker 的 Ubuntu 上輸入以下指令:

環境準備

# 安裝必要的依賴
sudo apt-get update && sudo apt-get install -y vim python3-pip curl git
pip3 install --upgrade pip
pip install docker-compose

## 安裝docker
sudo curl -sSL get.docker.com | sh

安裝青島 OJ

# 複製專案庫
git clone -b 2.0 https://github.com/QingdaoU/OnlineJudgeDeploy.git
cd OnlineJudgeDeploy

# 啟動OJ
docker-compose up -d

啟動

# cd path/to/Onlinejudgedeploy

# 啟動OJ
docker-compose up -d

啟動完之後可以去 localhost:80 查看網頁(如果沒有動設定,在 server 上我改成localhost:8000。)

錯誤訊息

有些時候,你會看到以下此錯誤訊息: 這代表你有其他應用程式佔用了相同的 port。

如果在 server 上面出現此錯誤訊息,請先試著找找看是什麼東西在佔用,並且通知我處理。我再來告訴你們該怎麼解決此錯誤。

安全憑證

位於/OnlineJudgeDeploy/data/backend/ssl資料夾當中,公鑰名稱為server.crt,私鑰名稱為server.key,一定要是檔名相同的實體文件,不能是 symbolic link。請手動將 certbot 產生的安全憑證複製過來。

備份

青島 OJ 有內建的備份可以使用,為於 backup 目錄底下的db_backup.shshell 檔可以直接用來備份。

cd /OnlineJudgeDeploy/backup
./db_backup.sh

以上指令會生成一個黨名包含日期的sql檔案,可以將其下載到別的電腦當中備份。

復原

可參考官網的復原方式,經實測有用。 https://opensource.qduoj.com/#/onlinejudge/guide/backup

其他

有其他問題的話,請找 AaW 學長協助。

CMS 比賽平台管理與使用

文件

官方文件:https://cms.readthedocs.io/en/ 一份寫得不錯的文件(我是根據他裝的):https://hackmd.io/@erichung0906/cms

架設

我是根據這一篇文章,使用 docker 架設的: https://hackmd.io/@erichung0906/cms 安裝完成之後,會預設導入一場比賽以及測試用使用者。

cms 一樣是使用 docker 架設。不過,由於是私人寫的 docker-compose 檔案,所以 docker-compose.yml 不規則很多。

在底下,有兩個 docker-compose 文件。docker-compose.yml會安裝、啟動 cms 系統並且啟動一場比賽以及計分板。而docker-compose.empty.yml則不會啟動比賽,只會啟動後台以及計分板。

其中,最重要的是第 41 行的地方,其中的指令為cmsResourceService -a <CONTEST_ID>。其中,<CONTEST_ID>要置換成 CMS 要啟動的比賽的 ID。例如,在截圖當中,可以看到 <CONTEST_ID>3,而這代表的是 2023 上機考的 ID。<CONTEST_ID> 可以透過 admin 頁面的網址看到。

而如果要用docker-compose.empty.yml啟動的話,則要使用以下指令:

docker-compose -f docker-compose.empty.yml up -d

之後,再使用以下指令啟動指定比賽:

docker exec cms cmsResourceService -a <CONTEST_ID>

比賽控制與管理

終端機操作(CLI)

CMS 有許多東西必須在終端機以指令方式操作。

啟動 / 切換比賽

vim docker-compose.yml

將第 41 行的cmsResourceService -a <CONTEST_ID><CONTEST_ID> 置換成對的 ID。

docker-compose up -d
單純啟動比賽
docker exec cms cmsResourceService -a <CONTEST_ID>

建立使用者

如果要大量建立使用者,可以將CreateByAaW 資料夾當中的 cms_user.csv.example複製一份到cms_user.csv並且修改,然後再用createUserFromCsv.sh建立。

指令:
cd ~/cms/CreateByAaW
./createUserFromCsv.sh

將使用者加到比賽中

以下指令可以將cms_user.csv 中的所有使用者加到特定比賽當中:

1. 修改 addUserToContestCsv.sh
cd ~/cms/CreateByAaW
vim addUserToContestCsv.sh

將第 8 行 -c 後面的數字改成比賽 ID,然後:q退出vim,執行指令:

./addUserToContestCsv.sh

刪除個人計分板

進到 cms 裡面

docker exec -it cms bash

如要刪除使用者名稱為userA的計分板:

cmsRWSHelper delete user userA

其他指令

請閱讀官方文件:https://cms.readthedocs.io/

後台操作(GUI)

problem

按 create new task 下面是題目簡稱、中文全名 statements 放題目敘述的 pdf(正常比賽的樣子,記得要先做好 LaTeX 模板)

聯集給分

group min for 子題

[[第一組分數, 子題測資數量], [第二組分數,  子題測資數量]]

上傳.zip 裡面只有編號規律的檔案(可以透過 input file names template 那邊更改你的檔案名稱格式)

互動題

基本上有多種不同的,可以參考這一篇

基本上互動題要準備兩個檔案:header 和 grader.cpp 並且在這裡上傳:

這邊上傳的 header 使用者都可以 include 的到,另外,grader.cpp 會和使用者上傳的程式一起編譯。

而 checker 則為一個編譯過的執行黨,用來進行連續給分之類的,可以自行設計。

user

cms 的使用者從後台建立出來之後,

修改介面 這邊可以將使用者加入比賽中(participation)

participant

要藏起來讓別人試用:hidden 超級使用者(可以再開賽前測機):unrestricted

contest

anouncement

cms-ranking-archiver

將比賽計分板放到社網的工具。 https://github.com/CKEFGISC/cms-ranking-archiver 指令:

./rws-archiver.py --noflags https://iscoj.fg.tp.edu.tw/cms/ranking/

產生的網址:

https://ckefgisc.org/cms-ranking-archiver/<比賽名稱>

public resources

放在/srv/cms 裡面的

  • add user faces(他真的叫這個)
    • /srv/cms/heads
    • 裡面放 user_id.png/jpg 就會顯示了
  • add team icon
    • /srv/cms/flags
    • 裡面放 team_code.png/jpg
    • 記得要先在 admin 頁面 create team
    • 然後在比賽中為 user 指定 team

External Judge Server(Worker)

這東西相當之弔詭,cms的documentation中提到這個的只有說你可能會想在不同伺服器開不同worker,所以這些是我通靈出來的,可能會遇到一些不可預期的錯誤

Before action

如果CMS是用docker架設的,需先將儲存空間移到靜態位置,不然每次重新啟動docker更改過的文件便會被洗掉,做的方式為在docker-compose.yml指定volume 可先啟動docker一次,並透過

docker exec --it cms bash

進入docker的終端機頁面把放在/usr/local/etc的cms.conf複製出來,因為其涉及加密無法提供範本,如果之後找到在外面生成的方式亦會更新此文,在yaml的volume中加入此行便可將其轉換為靜態

- "./cmsconfig:/usr/local/etc"

可刪減不需要的服務如ranking web server,judge址需要留下worker的部分,基本的也要留

最後將docker-compose.yml最下面的cms開頭指令改為你要開啟的worker即可,如要開啟編號為0的worker便打

cmsWorker 0

也可同時啟動多個

編號為依據cms.conf中worker陣列的index,每個worker其使用的port皆有意義,需記住

在judge server上開啟worker後,需要到主程式端新增worker,新增方式為在cms.conf加上新的項目(這邊也需要將cms.conf)移至靜態儲存空間

[external_judge_server_ip, judge_port]

注意judge server必須為連通外網之伺服器,若需架於內網可透過如反向ssh通道實現 重新啟動後即可在admin看到這台worker正在運轉了

其他東西

你們可以做的事

  • 更新oj前端
  • 幫oj新增更多功能或是自己寫一個
  • 在不影響oj效能前提下部署其他網路服務

關於社網的那檔事

社網,就是放社團介紹的網頁。網址為 https://ckefgisc.org/

原本一三架了一個用手刻 html 和 css 做的網頁,留下不少待改進之處。 後來一四網管重做了一個利用 React 寫出得更好的版本。

社網原始碼都在 Github 上,只是各個 Repository 有點亂,需要整理一下。

關於一三社網那檔事

原始碼:有兩個地方,因為一四重架了之後 AaW 不知道要怎麼管理 Github Repository 比較好

網站:https://27th.ckefgisc.org/

部署

使用 Github Pages 部署。 Branch 那邊可以更改部署的 branch (develop 或 main) 而 custom domain 那邊則是更改網站網域名稱,設定完之後,要將 DNS record 指過去,詳情可以看這篇文章

action 標籤頁可以看到部署現況。

檔案結構

  • styles下面有 header 跟 footer 的 CSS,以及全體共用的global.css
  • common下面有 header、footer 以及共用的 CSS links CSS links 除了有 styles 裡面需要共用的 CSS,還有外部的 CSS,包括字體跟 Font Awesome 等
  • scripts下面的include.js用來把common裡面的 HTML 都加進頁面裡,
  • 因為用了 jQuery,所以要用時請在<head>裡面加上這兩行:
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="/scripts/include.js"></script>

並將<body>如下安排:

<body>
  <header></header>
  <div id="main-container">
    <!--你自己的code-->
  </div>
  <footer></footer>
</body>

公告系統

.txt檔撰寫公告,存放於/news/posts底下

檔案格式

  • 第一行為日期YYYY-MM-DD
  • 第二行為標題
  • 第三行及以下為公告內容
  • 範例如下:
2022-12-25
[測試]公告系統測試
本公告乃為測試公告系統是否正常運作
以及提供做為演示用途的範例

HTML 生成

使用gennews.sh來生成 HTML 網頁:

./gennews.sh test

注意參數僅為其「檔名」,而不包含完整路徑或副檔名

給蔡政廷寫東西的地方

網管跟有參與管理的學術 除了知道怎麼用之外 還要完全搞懂一些 script 的運作原理 然後之後如果我們社團有幸取得自己的伺服器 可以考慮加入後端

給蘇怡恩寫東西的地方

基本上我希望你們重新弄一個你們的社網,把我們的完整保留丟到歷屆區

你們的社網有兩個選項

  1. 直接複製程式碼改 HTML 內容就好
  • 優點:
    • 你們可以懶惰
    • 風格一致
    • 基本上沒有太多 bug
  • 缺點:
    • 比較沒有一屆一屆的感覺
    • 你們可能嫌我寫得太爛
    • 因為我是完全手刻,而且可能有一堆亂嘗試的東西、一堆奇奇怪怪的變數名,如果你們要改可能比較麻煩 ,但我相信你們那麼電一定看的懂
  1. 自己重新搞一個你們喜歡的社網
  • 優點:
    • 每屆都有每屆的特色
    • 可以跟我們的架構完全不一樣
  • 缺點:
    • 會跟我一樣爆肝,不過你們可能不會,因為你們是網管+不會卡的小卡
    • 以後的每屆可能都要做一個新版的社網

if 你們要重弄一個社網,我的微不足道的建議

  • 可以用 bootstrap,但不要用現成的完整程式碼
  • 基本上我個人覺得社史、幹介、課程那些是蠻重要的,但如果你們有甚麼其他想法可以再討論

其他小建議

  • 活動要放的話要逼著執秘趕快生出東西,不然會像我們一樣沒有活動
  • 課程簡報盡量就公布出來
  • 一定要做對手機使用者友善的網頁
  • 內容提前討論好(應該是學術會議),是時候展現你們催東西的藝術了
  • 做任何更改前要先跟其他網管討論過
  • 弄一個社網的群啦,可以加我們
  • 弄好社網可以丟 FB 建北電資社團宣傳

給吳亞倫寫建議的地方

關於歷屆的部分,我這邊有兩種想法,給學弟妹參考:

  1. 跟蘇怡恩講的一樣,把整個網站完整備份到一個類似 27th.ckefgisc.org 的另外一個網站去
  2. 每個分頁都有一個歷屆按鈕

一三未完成的東西 aka 學弟妹你們可以幫我們做的事

  • slides.com 在手機版頁面時嵌入式窗會太小 (絕對不是因為我懶)
  • linktree 還沒有 RWD (絕對不是因為我懶)
  • 演算法頁面沒有放入上機考排行榜
  • 放歷屆 aka 一三資料的地方
  • 一堆活動沒內容(不過就不用理一三的了,你們做好你們的就好)
  • og:image

關於一四社網那檔事

關於網域的那檔事

ckeisc.orgckefgisc.org 這兩個網域是學長給我們的,使用 AWS 的 Route 53 管理。

如何登入控制台

登入網址是 https://yhchan.signin.aws.amazon.com/console 帳號和密碼另外會給你們 然後要輸入 MFA 驗證碼 初次登入可以跟我們要 但是接下來就要設定用自己的手機取得驗證碼

如何將我的手機新增為 MFA 裝置

登入後畫面右上角可以下拉 點「安全憑證」 進去後在 MFA 的地方點「指派 MFA 裝置」 裝置名稱自己取,認得出是誰的手機就好 選「Authenticator 應用程式」 然後你要在手機上裝 Google Authenticator 然後掃它給你的 QR Code 你會看到它給你一個六位數的驗證碼 而且每隔幾秒就會更新 然後就照它要的「填入兩個連續的代碼」就可以了 之後要登入被問驗證碼時 就在手機上打開 Google Authenticator 看數字是多少填進去就好了

如何管理網域

登入後點 Route 53 進去點「託管區域」 然後看你要管理哪個網域 要弄 A 紀錄還是 CNAME 幹嘛的

關於 SEO 的那檔事

等我之後補
by AaW

上面那個都畢業了還沒補
看誰之後有空囉
by cjtsai

給你們的練習

1. 練習安裝 linux 虛擬機

請試著透過 Virturalbox 安裝 Ubuntu 虛擬機。 (注意,不要使用 ARM 架構電腦,例如 M1 的 Mac 或是 Raspberry pi,否則練習 3 和練習 4 無法完成)

2. 練習使用 git 以及 vim 處理專案

這裡有一個專案程式碼,裡面有一個 a+b 程式。 請練習使用 github 並且執行程式,再使用 vim 編輯器修改程式碼,使其恢復正常運作。

https://github.com/CKEFGISC/practice1

3. 練習架設青島 OJ

就,練習安裝青島 OJ

請試著從官方文件去學習 https://opensource.qduoj.com/#/onlinejudge/guide/deploy

4. 練習復原 OJ 資料

這裡有一份 ISCOJ 的備份檔,請試著在你自己的電腦上恢復資料

5. 練習反向代理

等我之後補。

參考資料

erichung0906 的 CMS 架設筆記

CMS 官方文件

https://cms.readthedocs.io/en/v1.4/

polygon 使用指北

https://hackmd.io/@omeletwithoutegg/HJtQcQ0vB?type=view

青島 OJ

https://github.com/QingdaoU/OnlineJudge https://opensource.qduoj.com/#/

TIOJ

https://github.com/TIOJ-INFOR-Online-Judge/tioj

修改本書

本書是使用 mdBook 編輯的,mdBook 是一個用 Rust 所開發,用於創建容易閱讀的電子書的工具。它使用 Markdown 語言來編寫內容,並且能夠將其轉換為 HTML 靜態網頁,以便於在瀏覽器中閱讀。

本書的原始碼皆放在 Github 上,歡迎直接發 Issue 或 Pull Request 進行修改。具有專案庫權限者,也可以直接點選各頁面右上角的 進行編輯。

參考資料

完整文檔

關於 Markdown 和 Mathjex

Contributors

建電一三

  • 吳亞倫(AaW、鹽亞倫)(學術長)

建電一四

  • 蔡嘉晉(cjtsai、世宗)(學術)

AaW 留給學弟妹的話

大家好,我是建電一三的學術長 AaW(或是鹽亞倫吳亞倫火車倫)。

最後,還是決定在傳承裡面加入這個頁面,講講我在這一年以來的心得。

去年,我剛接到學長姐留下的伺服器帳密時,十分興奮。沒想到一到七月底,ISCOJ 的運作就出了問題,我上去試著修理,卻把它弄個更糟,因為我不知道問題在哪,也不知道當初學長姐是怎麼架設的。後來才勉強讓 OJ 處於一個危險平衡態運作下去。

在老師將伺服器關機的這一段時間內,我一直對於此事感到十分的自責,同時,我也花了許多時間去研究伺服器相關的知識以及相同問題的處理方式,希望能為我闖的禍負責。後來,感謝雪溱老師願意再給我一次機會,讓我重新學習。

為了避免重蹈傳承不周覆徹,在我後來花費很多心力,搞懂整台伺服器結構,並且修理完成之後,我決定一定要將這個東西好好的傳給學弟妹,因此才打了這一篇文檔。

伺服器管理,講求的是學習能力以及細心和耐心。對於每一個指令,我常常在送出之前,也不知道它的效用如何,會不會不小心弄壞東西。但是,這時候就需要依靠你的經驗以及查資料能力,學著透過已知的指令原理去設想這個指令的破壞程度,思考可能的副作用,想清楚再去執行。更重要的是,永遠要先查好指令下去之後要用什麼方式材能讓他復原,因為在伺服器當中沒有 ctrl+z 給你按。更重要的是,永遠要記得備份、記得紀錄自己所更改的內容。

那天跟一四傳承完之後,我從你們眼神中,知道你們來不及吸收。這我也了解,畢竟這東西我學了一整年,到現在仍沒有完全搞懂。傳承的那個三小時,絕對不可能讓你們完全學會。因此,我回來之後,補上了給你們的練習頁面,希望可以讓你們慢慢學會這東西。

其實,重要的永遠不是你會什麼,而是你會不會學習,會不會查資料。就算你把我傳承的所有東西搞懂了,這也只是冰山一角,永遠有著未知的東西等著你。在這一年當中,我學到最重要的事情,就是在這領域當中,我永遠學不完。永遠有未知的事物等著學習,永遠有突如其來錯誤等著你修復。

因此,我希望各位學弟妹可以保持一個開放的態度,不斷地試,去勇於嘗試,勇於犯錯,勇於面對錯誤,勇於去學著避免以及修復犯錯。我期待你們可以以摸索為樂,期待你們可以成功在這一片汪洋大海中發現新天地。

伺服器,網站,和建北電資繼續前進的傳承使命,現在就交給你們了。

加油!

建電 42nd 吳亞倫 筆 2023.07.05

p.s.
AaW 的聯絡資訊
Discord: aaw.rail
Email: aaronwu0218@gmail.com