Ubuntu 16 server note
Prelude
This article is mainly to help experienced user install and setup Ubuntu 16 LTS Server. If you are looking for the information for Ubuntu 14, please go to the page Ubuntu 14 server setup
Prerequisites
- You are familiar with Ubuntu, at least you have some experience working on Linux system.
 - You are familiar with basic bash/shell command
 
Wireless Setup
If you install ubuntu server on a laptop, you might end up to setup the wifi first. Usually you won’t bring the cable with your laptop wherever you go, also you might just have no cable or run out all cables. Now let’s dive into how to setup the wifi on sever.
- Find out network control installed on your laptop. The column link lists the name of interfaces. The interface name on your laptop will be possible slightly a bit different. It depends on laptop maker. Basically the interface with the type wlan is your wifi interface.
 
networkctl 
You will see network interfaces on your laptop. enp1s0 is the ethernet interface., and
wlp3s0is your wifi interfaceIDX LINK TYPE OPERATIONAL SETUP 1 lo loopback n/a unmanaged 2 enp1s0 ether n/a unmanaged 3 wlp3s0 wlan n/a unmanagedDisable IP V6 if you don’t use it. (Highly recommanded for personal laptop user)
- Add  following setting to file  
/etc/sysctl.conf 
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv6 = 1- Reconfigure by running the following command
 
sudo sysctl -p ## Check the ipv6 status. If you see 1 after running command below, it means ipv6 ## has been disabled cat /proc/sys/net/ipv6/conf/all/disable_ipv6- Add  following setting to file  
 Find out the status
wpa_supplicantsudo systemctl status wpa_supplicant ## If you find "disabled" in the output, you can simply enable it as below sudo systemctl enable wpa_supplicantFind out your wifi ESSID
sudo iwlist wlp3s0 scan | grep ESSID ## If you get error message like "network is down", use ifconfig to bring it up and ## re-run previous commmand sudo ifconfig wlp3s0 upSetup the wpa passphrase for your wifi
   ## Use following command to add pass phrase to your wpa_supplicant
   ## 
   ## wpa_passphrase <your-ESSID> <your-passphrase> | sudo tee /etc/wpa_supplicant.conf
   ## If your ESSID is mywifi and password of wifi is mypasswork, then you will end up the 
   ## command below
   wpa_passphrase mywifi mypasswork | sudo tee /etc/wpa_supplicant.conf
- Config your wpa supplicant for your wifi interface and run the comand as background process
 
   sudo wpa_supplicant -c /etc/wpa_supplicant.conf -i wlp3s0 > /dev/null 2>1& &
Add SSID scan into config
/etc/wpa_supplicant.confnetwork={ ssid="mywifi" #psk="mypassword" psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx scan_ssid=1 }Get IP address from external DHCP
  sudo dhclient wlp3s0
  ## Check the ip address
  ifconfig wlp3s0
Wifi Trouble Shooting
There is no ip address assigned to your wifi interface
Check out the wpa_supplicant status
sudo systemctl status wpa_supplicantIf you find some error like ‘Failed to construct signal’, it means some network service has been disabled
sudo systemctl list-unit-files --state disabled | grep network- Enable 
systemd-networkd.service,networking.serviceif they are disabled 
The error message comes after the
dhclient- Enable the 
squid.service 
- Enable the 
 Auto connect to wifi on Starup
sudo cp /lib/systemd/system/wpa_supplicant.service /etc/systemd/system/wpa_supplicant.service
sudo vi /etc/systemd/system/wpa_supplicant.service
Replace the following line
ExecStart=/sbin/wpa_supplicant -u -s -O /run/wpa_supplicantwithExecStart=/sbin/wpa_supplicant -u -s -c /etc/wpa_supplicant.conf -i wlp3s0Add wifi interface into auto startup file
/etc/network/interfaces
auto lo
iface lo net loopback
auto wlp3s0
iface wlp3s0 net dchp
UFW setup
sudo ufw enable
sudo ufw allow 80/tcp
sudo ufw allow ssh
sudo ufw allow 443/tcp
sudo ufw allow 8000/tcp
SSH server setup
!!! For production environment, SSH should be secured by the CA
sudo apt-get install openssh-server 
## backup default config 
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.factory-defaults
sudo chmod a-w /etc/ssh/sshd_config.factory-defaults
## use any editor to update sshd_config 
sudo nano /etc/ssh/sshd_config 
## uncomment  PasswordAuthentication yes to allow remote password login
## Password authentication is only for test environment
## setup ssh auto-start onboot
sudo update-rc.d ssh defaults
!!! Install the software-properties-common Package
sudo apt-get install software-properties-common python-software-properties
Time Zone setup
sudo dpkg-reconfigure tzdata
Install tmux
sudo apt-get install tmux
- Most useful tmux commands
 
Ctrl+b “ — split pane horizontally.
Ctrl+b % — split pane vertically.
Ctrl+b arrow key — switch pane.
Hold Ctrl+b, don’t release it and hold one of the arrow keys — resize pane.
Ctrl+b c — ©reate a new window.
Ctrl+b , — rename reate a new window.
Ctrl+b n — move to the (n)ext window.
Ctrl+b p — move to the (p)revious window.
Install git
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
install docker CE (Ubuntu 16 LTS)
## Update the apt package index
sudo apt-get update
## Install packages to allow apt to use a repository over HTTPS
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
## Add Docker’s official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
## Verify the last 8 characters of the fingerprint.
sudo apt-key fingerprint xxxxxxxx
##   set up the stable repository
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
## apt update 
sudo apt-get update
## install docker CE
sudo apt-get install docker-ce
Install JDK 8
- Downlaod the JDK from Oracle website.
 
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get install oracle-java8-installer
java -version
- Setup environment
 
sudo apt-get install oracle-java8-set-default
sudo su
cat >> /etc/environment <<EOL
JAVA_HOME=/usr/lib/jvm/java-8-oracle
JRE_HOME=/usr/lib/jvm/java-8-oracle/jre
EOL
Test JDK with a simple HelloWorld program
import java.util.Calendar; class HelloWorld { public static void main(String[] args) { Calendar cal = Calendar.getInstance(); int year = cal.get(Calendar.YEAR); int month = cal.get(Calendar.MONTH) + 1; int day = cal.get(Calendar.DATE); int hour = cal.get(Calendar.HOUR_OF_DAY); int minute = cal.get(Calendar.MINUTE); String username = System.getProperty("user.name"); System.out.println(username+ ": Hello World! "); System.out.println(year + "/" + month + "/" + day + " " + hour + ":" + minute); } }Compile and run the program
javac HelloWorld.java java HelloWorld.java
Install nodejs
- Install Nodejs 8.x
 
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install -y nodejs
- Install latest npm, yarn and ts
 
sudo npm install -g npm
sudo npm install -g typescript
sudo mpm install -g yarn
Install PHP
- Add new repo
 
sudo apt-get install -y python-software-properties
sudo add-apt-repository -y ppa:ondrej/php
sudo apt-get update -y
apt-cache pkgnames | grep php7.2
- Option 1: Install LAMP stack
 
sudo apt-get install -y apache2
sudo apt-get install -y php7.2 libapache2-mod-php7.2 php7.2-cli php7.2-common \
    php7.2-mbstring php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.1-mcrypt php7.2-zip
- Option 2: Install LEMP stack
 
sudo apt-get install -y nginx
sudo apt-get install -y php7.2 php7.2-fpm php7.2-cli php7.2-common php7.2-mbstring \
    php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.1-mcrypt php7.2-zip
- Disable Apache and Nginx if you install both
 
sudo systemctl disable apache2.service
sudo systemctl disable nginx.service 
Install Python2, Python3
- Ubuntu has python2 installed by default
 
sudo apt-get python-pip 
sudo apt-get install python3-pip
sudo apt-get install python3-dev python-dev
## Install virtualenv 
sudo pip install virtualenv
sudo pip3 install virtualenv
Install Go
- Install Go
 
wget https://storage.googleapis.com/golang/go1.4.linux-amd64.tar.gz
## check hash
shasum -a 256 go*linux-amd64.tar.gz
## install tar ball
sudo tar -C /usr/local -xvzf go1.9.2.linux-amd64.tar.gz
- Setup GOROOT by overwriting the file 
/etc/environmentwith following content 
PATH="/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
JAVA_HOME="/usr/lib/jvm/java-8-oracle"
JRE_HOME="/usr/lib/jvm/java-8-oracle/jre"
GOROOT="/usr/local/go"
- Setup GOPATH by adding following lines to the end of 
.profile 
export GOPATH="$HOME/ws/go"
export GOBIN="$GOPATH/bin"
export PATH="$GOPATH/bin:$PATH"
Create a simple
hello.gofile to testpackage main import ( "fmt" "log" "os/user" ) func main(){ user, err := user.Current() if err != nil { log.Fatal(err) } fmt.Printf(user.Name + " said : Hello World! \n" ) }Run the program
go run $GOPATH/src/hello.go
go install $GOPATH/src/hello.go
$GOBIN/hello
Install clang & cmake
sudo apt-get install clang
sudo apt-get install cmake
Install Rust
$ curl -f -L https://static.rust-lang.org/rustup.sh -O
$ sh rustup.sh