02-初始化服務器

在購買服務器後,進行的一些必要初始化操作

在創建服務器時本喵推薦創建最精簡的系統,這樣服務器上不會存在任何不想要的東西,東西越少 bug 也越少你服務器自然也越安全。並且少了這些不必要的累贅,硬件可以更多的服務你真實的需求,最重要的是 linux 上安裝套件就和喝水一樣簡單,下面我們就從0開始以 ubuntu 爲例安裝必備的套件。

對於 ubuntu 只需要知道套件名稱,之後執 apt install 即可安裝,不知道的自己 google apt 命令教學

bash-completion

首先建議你安裝 bash-completion 套件,它會爲 linux 指令提供自動補全,沒有 bash-completion 本喵基本上無法有效的輸入指令。安裝 bash-completion 後大部分指令根本不需要記住名字,只需要輸入前綴之後 tab 即可自動補全,路徑也可以被補全。

所以建議先安裝這個套件,畢竟後續所有操作都需要輸入命令,提升輸入命令的效率和舒適度理應作爲首要任務

創建一個用戶

通常創建服務器後,供應商會提供一個 root 用戶和隨機的密碼,你不應該使用 root 來操作,因爲 root 權限太大它可以做任何事(包括刪掉整個系統,或者運行非法的惡意指令去嘗試燒壞硬件)。

所以通常會創建一個普通用戶,對於 ubuntu 用戶通常還會把這個用戶添加到 sudoers 中,以便可以方便的使用 sudo 指令

其它必要套件

下面列出其它一些很有用的套件和簡介:

  • curl 這是一個 http 客戶端工具,用於測試 http 或者在 bash 腳本中執行 http 請求很有幫助
  • net-tools 包含了很多網路測試工具,例如 netstat,要調查服務器網路出現的問題,這可能是必不可少的工具
  • dnsutils 包含了 dns 相關的工具,如果不需要調試 dns,你就不需要它
  • vim ubuntu 默認帶的 vim 是精簡版,建議重新安裝完整版,並且將她設置爲默認文本編輯工具
  • docker.io 安裝好 docker,使用 docker 來部署服務,不但簡單並且比直接部署服務在服務器上存在顯著的優勢
  • rsync 一個高效的同步工具,可以方便的將服務器上的檔案同步到本地,或由本地推送到服務器,這對於備份很有幫助。(雖然 vps 供應商提供了快照,但快照數量有限,且跨供應商的快照並不通用。所以自己使用 rsync 來同步備份數據是給不錯的選擇)

docker compose 不在 ubuntu 套件中,需要從 url 下載安裝。它可以幫你把 docker 按項目部署。基本上是必不可少的。這裏有一些簡單的使用說明,詳細功能建議參考官網

一些設置

  • 使用 timedatectl 指令設置好服務器時區
  • 開啓 bbr 以提升服務器的 tcp 性能
  • 設置好固定的 定時任務(安需設置)

自動化完成上述步驟

不要傻傻的去完成上述操作,你應該寫個 bash 腳本來自動完成這些,因爲每次創建服務器你都需要重複這些步驟,寫個腳本則可以自動去完成這一切。相信我,只要你玩服務器,你就絕對不會只做一次上述步驟。下面是一些你需要重複創建服務器的原因:

  1. 你可能更換了供應商,需要遷移系統到一個新的服務器
  2. 你需要再創建一個服務器,來做其它某些事情
  3. 你把服務器系統損毀且無法修復,只能重新開始
  4. 此外你也可能因爲工作,需要幫公司會其它人創建服務器

所以寫個腳本來自動化是相當有必要的,下面是一個本喵使用的腳本,你可以參考,但需要自己修改下來滿足自己的需求

#!/bin/bash
set -e
cd "$(dirname $BASH_SOURCE)"
VAR_APT_UPDATE=0
function apt_update
{
    if [[ $VAR_APT_UPDATE == 0 ]];then
        VAR_APT_UPDATE=1
        apt-get update 
    fi
}
function install_user
{
    local user=$(cat /etc/passwd | egrep '^king')
     if [[ "$user" == "" ]];then
        useradd -m -U -s /bin/bash king;
    fi

    local visudo=$(cat /etc/sudoers | egrep '^king')
    if [[ "$visudo" == "" ]];then
        echo 'king	ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers
    fi

    local docker=$(cat /home/king/.bashrc | egrep '^alias docker=')
    if [[ "$docker" == "" ]];then
        echo 'alias docker="sudo docker"' >> /home/king/.bashrc
    fi
    local compose=$(cat /home/king/.bashrc | egrep '^alias docker-compose=')
    if [[ "$compose" == "" ]];then
        echo 'alias docker-compose="sudo docker-compose"' >> /home/king/.bashrc
    fi

    local path=$(cat /home/king/.bashrc | egrep '^export PATH=')
    if [[ "$path" == "" ]];then
        echo 'export PATH=$PATH:~/Sync/server/ubuntu:~/Sync/bin' >> /home/king/.bashrc
    fi
}
# curl
function install_curl
{
    echo "check curl"
    set +e
    curl -V &> /dev/null
    local check=$?
    set -e

    if [[ $check == 0 ]];then
        echo "curl ready"
    else
        echo "install curl"
        apt_update
        apt-get install curl -y --no-install-recommends
    fi
}
# net-tools
function install_net_tools
{
    echo "check net-tools"
    set +e
    netstat -h &> /dev/null
    local check=$?
    set -e

    if [[ $check == 0 ]];then
        echo "net-tools ready"
    else
        echo "install net-tools"
        apt_update
        apt-get install net-tools -y --no-install-recommends
    fi
}
# dnsutils
function install_dnsutils
{
    echo "check dnsutils"
    set +e
    dig -v &> /dev/null
    local check=$?
    set -e

    if [[ $check == 0 ]];then
        echo "dnsutils ready"
    else
        echo "install dnsutils"
        apt_update
        apt-get install dnsutils -y --no-install-recommends
    fi
}
# vim
function install_vim
{
    echo "check vim.basic"
    set +e
    vim.basic --version &> /dev/null
    local check=$?
    set -e

    if [[ $check == 0 ]];then
        echo "vim.basic  ready"
    else
        echo "install vim.basic"
        apt_update
        apt-get install vim  -y --no-install-recommends
    fi
}


function install_docker_compose
{
    echo "check docker compose"
    set +e
    docker-compose version &> /dev/null
    local check=$?
    set -e

    # check=0
    if [[ $check == 0 ]];then
        echo "docker compose ready"
    else
        echo "install docker compose"
        if [[ ! -d /etc/bash_completion.d ]];then
            mkdir /etc/bash_completion.d
        fi

        if [[ ! -f /etc/bash_completion.d/docker-compose ]];then
            curl -#Lko tmp https://raw.githubusercontent.com/docker/compose/master/contrib/completion/bash/docker-compose
            mv tmp /etc/bash_completion.d/docker-compose
        fi

        curl -#Lko tmp https://github.com/docker/compose/releases/download/v2.23.2/docker-compose-linux-x86_64
        chmod a+x tmp
        mv tmp /usr/local/bin/docker-compose
    fi
}
function install_ejt
{
    echo "check ejt"
    set +e
    ejt -v &> /dev/null
    local check=$?
    set -e

    # check=0
    if [[ $check == 0 ]];then
        echo "ejt ready"
    else
        echo "install ejt"
        curl -#Lko ejt_linux_amd64.tar.gz https://github.com/powerpuffpenguin/ejt/releases/download/v0.0.5/ejt_linux_amd64.tar.gz
        tar -zxvf ejt_linux_amd64.tar.gz -C /usr/local/bin
        rm ejt_linux_amd64.tar.gz
    fi
    local ejt=$(cat /home/king/.bashrc | egrep 'ejt completion bash')
    if [[ "$ejt" == "" ]];then
        echo 'source <(ejt completion bash)' >> /home/king/.bashrc
    fi
}

function install_bbr
{
    local bbr=$(cat /etc/modules-load.d/modules.conf | egrep '^tcp_bbr$')
    if [[ "$bbr" == "" ]];then
        echo "tcp_bbr" >> /etc/modules-load.d/modules.conf
    fi
    local fq=$(cat /etc/sysctl.conf | egrep '^net.core.default_qdisc=fq$')
    if [[ "$fq" == "" ]];then
        echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
    fi
    local sys=$(cat /etc/sysctl.conf | egrep 'net.ipv4.tcp_congestion_control=bbr')
    if [[ "$sys" == "" ]];then
        echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
    fi

    local started=$(sysctl net.ipv4.tcp_available_congestion_control | egrep bbr)
    if [[ "$started" == "" ]];then
        echo "enable bbr"
        modprobe tcp_bbr && sysctl net.ipv4.tcp_available_congestion_control
    fi
}
# bash-completion
function install_bash_completion
{
    local com=$(dpkg-query -l |egrep bash-completion)
    if [[ "$com" == "" ]];then
        apt_update
        apt-get install bash-completion -y --no-install-recommends
    fi
}
# set timezone
function install_timezone
{
    local timezone=$(cat /etc/timezone | egrep '^Asia/Shanghai$')
    if [[ "$timezone" == "" ]];then
        timedatectl set-timezone Asia/Shanghai
    fi
}
function install_rsync
{
    echo "check rsync"
    set +e
    rsync --version &> /dev/null
    local check=$?
    set -e

    # check=0
    if [[ $check == 0 ]];then
        echo "rsync ready"
    else
        echo "install rsync"
        apt_update
        apt-get install rsync -y --no-install-recommends
    fi
}
# docker.io
function install_docker
{
    echo "check docker"
    set +e
    docker version --help &> /dev/null
    local check=$?
    set -e

    # check=0
    if [[ $check == 0 ]];then
        echo "docker ready"
    else
        echo "install docker"
        apt_update
        apt-get install docker.io -y --no-install-recommends
    fi

    local dst="/etc/docker/daemon.json"
    if [[ ! -f "$dst" ]];then
        local src="tmp.json"
        echo '{' > "$src"
        echo '  "log-driver":"json-file",' >> "$src"
        echo '  "log-opts": {' >> "$src"
        echo '      "max-size" :"10m",' >> "$src"
        echo '      "max-file":"3"' >> "$src"
        echo '  }' >> "$src"
        echo '}' >> "$src"
        mv "$src" "$dst"
    fi
}
function install_cron
{
    local certbot=$(cat /etc/crontab | egrep 'apt-get upgrade')
    if [[ "$certbot" == "" ]];then
        echo '# 每晚 02:00 更新系統' >> /etc/crontab
        echo '0 2	* * *	root	apt-get update && apt-get upgrade -y' >> /etc/crontab
    fi
    local certbot=$(cat /etc/crontab | egrep 'certbot_renew.sh$')
    if [[ "$certbot" == "" ]];then
        echo '# 每月 1 號 01:00 更新證書' >> /etc/crontab
        echo '0 1	1 * *	root	/home/king/Sync/server/ubuntu/project/ingress/certbot_renew.sh' >> /etc/crontab
    fi
    local xray=$(cat /etc/crontab | egrep 'geo.sh$')
    if [[ "$xray" == "" ]];then
        echo '# 每天 07:00 更新 xray ip site' >> /etc/crontab
        echo '0 7	* * *	root	/home/king/Sync/server/ubuntu/project/xray/geo.sh' >> /etc/crontab
    fi
}
install_bash_completion
install_user
install_curl
install_net_tools
install_dnsutils
install_vim
install_docker
install_docker_compose
install_ejt
install_bbr
install_timezone
install_rsync
install_cron

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *