## Ubuntu 20.04 ### Installing gDebi ```sudo apt install gdebi-core``` ## Sharing Drives via Samba - Install the taskel and samba server packages - ```sudo tasksel install samba-server``` - ```sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup``` - ```sudo bash -c 'grep -v -E "^#|^;" /etc/samba/smb.conf_backup | grep . > /etc/samba/smb.conf'``` - ```sudo nano /etc/samba/smb.conf``` - add an entry to the end of the file: - ``` [public] comment = public anonymous access path = /var/samba/ browsable =yes create mask = 0660 directory mask = 0771 writable = yes guest ok = yes ``` - restart the service ```sudo systemctl restart smbd``` ## VS Code Installation - [Visual Studio Code on Linux](https://code.visualstudio.com/docs/setup/linux) - or ```sudo snap install --classic code``` - or if you like living on the edge ```sudo snap install --classic code-insiders``` #### VS Code Post Installation ``` code /etc/sysctl.conf ``` - add the following line to the end of the sysctl.conf file ``` fs.inotify.max_user_watches=524288 ``` - enter the following command in your shell ``` sudo sysctl -p ``` - make sure VS Code isn't listening to unnecessary files ``` "files.watcherExclude": { "**/.git/objects/**": true, "**/.git/subtree-cache/**": true, "**/node_modules/*/**": true } ``` ## Git Installation ``` sudo apt install git -y ``` ## SSH Key Generation Simply follow the prompts. There is no need to enter a password. Continue to hit the enter/return key until you see ASCII art. ``` ssh-keygen ``` ### *Note* If for some reason, when you attempt to clone a repository and you receive a `sign_and_send_pubkey: signing failed: agent refused operation` - this means your key for one reason or another hasn't been added. If this is the case, enter the following commands: ``` chmod 700 ~/.ssh && chmod 600 ~/.ssh/* && ssh-add ``` ## ZSH Installation ``` sudo apt update -y && sudo apt upgrade -y && sudo apt install zsh -y && sudo apt install powerline fonts-powerline -y && git clone https://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh ``` #### Create a new ZSH config file ``` cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc ``` #### Edit ZSH configuration File (up to you what you change) ``` nano .zshrc or code .zshrc ``` ## Make ZSH your default shell ``` chsh -s /bin/zsh ``` ## Reboot Machine ``` sudo reboot ``` ## NVM Installation [Original post...](https://github.com/nvm-sh/nvm) ``` sudo apt install curl -y && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.3/install.sh | bash ``` ``` export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm ``` #### Troubleshooting If you receive an error message regarding manpath i.e.: `manpath: can't set the locale;...`, please run the following command: ```sudo locale-gen "en_US.UTF-8"``` ## Mongo DB Installation ``` sudo apt update && sudo apt upgrade -y && sudo apt install mongodb -y && sudo systemctl status mongodb (to check status) ``` #### Mongo Terminal Commands ``` sudo systemctl status mongodb sudo systemctl stop mongodb sudo systemctl start mongodb sudo systemctl restart mongodb ``` ## NGINX Installation ``` sudo apt update && sudo apt install nginx -y sudo ufw allow 'Nginx HTTP' && sudo ufw status (it's ok if it says inactive) ``` To enable: ```sudo ufw enable``` #### Adding website entries ``` sudo touch /etc/nginx/sites-available/YOUR_DOMAIN_NAME.com ``` #### Example Configuration ``` server { listen 80; root /var/www/html; index index.php index.html index.htm index.nginx-debian.html; server_name example.com; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; } location ~ /\.ht { deny all; } } ``` #### Test NGINX Configuration ``` sudo nginx -t ``` #### Activate Site ``` sudo ln -s /etc/nginx/sites-available/YOUR_DOMAIN_NAME.com /etc/nginx/sites-enabled/ ``` #### Reload NGINX Configuration ``` sudo systemctl reload nginx ``` #### Adding a Reverse Proxy for Node.JS based Applications ``` sudo ln -s /etc/nginx/sites-available/YOUR_SITE_CONFIGURATION_FILE /etc/nginx/sites-enabled/ ```
server {
listen 80 kanebridge.local;
listen [::]:80 kanebridge.local;
server_name _;
location / {
# default port, could be changed if you use next with custom server
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# if you have try_files like this, remove it from our block
# otherwise next app will not work properly
# try_files $uri $uri/ =404;
}
}
#### Activate Site
```
sudo ln -s /etc/nginx/sites-available/YOUR_SITE_CONFIGURATION /etc/nginx/sites-enabled
```
### Restart NGINX:
```
sudo systemctl restart nginx
```
#### Add Custom domains to hosts file
```
code /etc/hosts
```
## MySQL Installation
```
sudo apt install mysql-server mysql-common mysql-client -y &&
sudo systemctl start mysql &&
sudo systemctl enable mysql &&
sudo mysql_secure_installation &&
systemctl start mysql
```
additional reading: [How to install MySQL](https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-18-04)
#### Check MySQL server status
```
service mysql status
```
#### Export MySQL database
Assuming that you're not a crazy person and pass your db password into the command line, you have a file located at your home directory named `.my.cnf` that is populated with the following values:
```
[mysqldump]
user=YOURUSERNAME
password=YOUR_PASSWORD
```
### Checking which Auth method root is using
```SELECT user,authentication_string,plugin,host FROM mysql.user;```
If you notice that it's using the auth_socket plugin, execute the following command to use 'mysql_native_password`:
```
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
```
```
mysqldump YOUR_DB_USER_NAME YOUR_TARGET_DATABASE > YOUR_LOCAL_DIRECTORY/NAME_OF_YOUR_SQL_FILE.sql
```
### Import MySQL database
```
mysqldump YOUR_DB_USER_NAME YOUR_TARGET_DATABASE < YOUR_LOCAL_DIRECTORY/NAME_OF_YOUR_SQL_FILE.sql
```
### Purge MySQL
```sudo apt remove --purge mysql-server mysql-client mysql-common -y```
```sudo apt autoremove -y```
```sudo apt autoclean```
##### Remove the MySQL folder:
```rm -rf /etc/mysql```
##### Delete all MySQL files on your server:
```sudo find / -iname 'mysql*' -exec rm -rf {} \;```
## PHP Installation
```
sudo apt install -y software-properties-common &&
sudo add-apt-repository universe &&
sudo add-apt-repository ppa:ondrej/php &&
sudo apt update &&
sudo apt install php7.4-cli php7.4-fpm php7.4-bcmath php7.4-curl php7.4-gd php7.4-intl php7.4-json php7.4-mbstring php7.4-mysql php7.4-opcache php7.4-sqlite3 php7.4-xml php7.4-zip -y &&
php --version
## take that version and apply it to the next command)
```
### PHP Additional Extensions
```
sudo apt update &&
sudo add-apt-repository ppa:ondrej/php -y &&
sudo apt update &&
sudo apt install php7.4-cli \
php7.4-fpm \
php7.4-bcmath \
php7.4-curl \
php7.4-gd \
php7.4-intl \
php7.4-json \
php7.4-mbstring \
php7.4-odbc \
php7.4-mysql \
php7.4-opcache \
php7.4-sqlite3 \
php7.4-xml \
php7.4-zip -y
```
### Switching PHP Versions
```sudo update-alternatives --config php```
Then select the version you desire.
## Composer - PHP Package Manager
Make sure to get the latest instructions as I maintain this document when I have the time.
https://getcomposer.org/download/
[Composer](https://getcomposer.org/download/)
```
sudo apt update &&
sudo apt install curl php-cli php-mbstring git unzip -y &&
cd ~ &&
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" &&
HASH="$(wget -q -O - https://composer.github.io/installer.sig)"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" &&
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer &&
sudo rm composer-setup.php
```
### Fixing Laravel Permissions issues
You have a few options here, by default the user:group for php is www-data:www-data.
You can simply add the www-data user to your group for example:
```id cesar```
Should list out all of the groups your belong to. In my case, it's cesar:cesar (user:group).
What I did to resolve any permissions issue is add the www-data user to my group (since by default whenever you clone a repo, your user is the owner and group.
TLDR;
```
sudo adduser www-data YOUR_USER_NAME
```
## Android Studio
- [Download here](https://developer.android.com/studio)
- their installation instructions have been solid. I've never had an issue within the Ubuntu distro
- Make sure to note that you will need to install KVM to run Android emulators
## Laravel
+ [Installing Laravel](https://laravel.com/docs/6.x#installing-laravel)
+ ZSH [Laravel Plugins](https://learninglaravel.net/run-artisan-from-anywhere-in-with-laravel-artisan-plugin-for-zsh)
## Memcached
```
sudo apt update -y &&
sudo apt upgrade -y &&
sudo apt install memcached libmemcached-tools -y &&
systemctl start memcached &&
systemctl enable memcached
```
### To check if Memcached is running
```ps aux | grep memcached```
### Edit Memcached settings
```code /etc/memcached.conf```
### Restart Memcached
```systemctl restart memcached```
### Memcached Authentication Layer
[DigitalOcean Instructions](https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-memcached-on-ubuntu-18-04)
### Install PHP Memcached Extension
```sudo apt install php-memcached -y```
## Redis - In-Memory Cache or Persistent Database
```
sudo apt install redis-server -y
```
### Stop/Start/Enabled Redis Server (only type one at a time obviously :-P)
```
sudo systemctl restart redis.service
```
### Check Redis Status
```
sudo systemctl status redis
```
## How to mount a Windows based shared folder
```
sudo apt install nfs-common && sudo apt install cifs-utils -y
```
```
sudo mount -t cifs //WINDOWS-COMPUTER-NAME/SHARED-FOLDER /home/YOUR-LINUX-HOST-USERNAME/DESTINATION-PATH -o username=YOUR-LINUX-HOST-USERNAME,uid=$(id -u),gid=$(id -g),forceuid,forcegid,password=YOUR-PASSWORD
```
## Installing SSL Certificates via [Certbot](https://certbot.eff.org/lets-encrypt/ubuntufocal-nginx)
- Open a terminal shell
- Add the following repository with the following command:
```sudo add-apt-repository ppa:certbot/certbot```
- Run apt updates with the following command:
```sudo apt update```
- Install Certbot's NGINX package with the following command:
```sudo snap install --classic certbot```
- Reload NGINX with the following command:
```sudo systemctl reload nginx```
- Then modify firewall rules:
```
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
```
- Generate a SSL certificate:
```sudo certbot --nginx -d example.com -d www.YOUR-DOMAIN.com```
## NGINX Auto Restart (on cashes)
Sometimes Nginx can crash for various reasons. If you prefer to make Nginx automatically restart after a crash, then we need to edit the Nginx service unit. First, copy the original Nginx service unit to the /etc/systemd/system/ directory.
```sudo cp /lib/systemd/system/nginx.service /etc/systemd/system/nginx.service```
Then edit the service unit.
```sudo nano /etc/systemd/system/nginx.service```
Add the following line in the [service] section.
```
Restart=always
RestartSec=2
```
Like so:
```[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
Restart=always
RestartSec=2
```
This will make Nginx try to restart itself every 2 seconds after a crash. Save and close the file. Then restart Nginx.
```sudo systemctl restart nginx```
### Mounting a Windows NTFS shared network drive/folder
```
sudo apt update
sudo apt install cifs-utils -y
```
### Craft related
### ENSURE YOUR LOCAL USER ACCOUNT BELONGS TO THE SAME GROUP AS WWW-DATA (Nginx User)
```chmod a+x craft```
```
sudo chmod -R 774 .env &&
sudo chmod -R 774 composer.json &&
sudo chmod -R 774 composer.lock &&
sudo chmod -R 774 config/license.key &&
sudo chmod -R 774 storage/* &&
sudo chmod -R 774 vendor/* &&
sudo chmod -R 774 web/cpresources/*
```
```
sudo chown -R www-data:www-data ./storage/*
```
## Jenkins CD/CI Installation
```
sudo apt install openjdk-8-jdk -y &&
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - &&
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' &&
sudo apt update &&
sudo apt install jenkins -y &&
sudo systemctl start jenkins
```
### Check status of Jenkins
```sudo systemctl status jenkins```
### Updating Jenkins
```
sudo service jenkins stop &&
/usr/share/jenkins &&
sudo mv jenkins.war jenkins.war.old &&
sudo wget https://updates.jenkins-ci.org/latest/jenkins.war &&
sudo service jenkins start
```
* If you experience issues with access, run the following command:
```sudo chown root:root jenkins.war```
### NetExtender VPN
**Note:** Make sure to select the correct filter in the dropdown. By default it selects "Global VPJN Client (32-Bit)". Please change that selection to NetExtender
+ Visit the following site and download the appropriate platform installation file for [NetExtender](https://www.mysonicwall.com/muir/freedownloads)
#### NetExtender required PPD
```
sudo apt install pptpd
```
### Python 2
```sudo apt install python2```
### Java
```sudo apt install default-jre```
### Installing OpenSSH
```
sudo apt install openssh-client &&
sudo apt install openssh-server
```
### OpenSSH Commands
```
sudo systemctl stop ssh
sudo systemctl start ssh
sudo systemctl restart ssh
sudo systemctl disable ssh
sudo apt remove opnessh-server
sudo systemctl status httpd
```
### Configure OpenSSH
OpenSSH server config file – sshd_config (located in /etc/ssh/)
OpenSSH client config file – ssh_config (located in /etc/ssh/)
Update the following to secure SSH:
```
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
PermitEmptyPasswords no
UsePAM no
AuthenticationMethods publickey
PubkeyAuthentication yes
Port [YOUR DESIRED PORT]
```
If you REALLY want to be safe:
```
sudo ufw allow from 192.168.171.1/29 to any port 22
```
### Install Fail2Ban
```
sudo apt update &&
sudo apt upgrade &&
sudo apt install -y fail2ban
```
### Fail2Ban Configure a Jail :)
```
sudo nano /etc/fail2ban/jail.local
```
Paste the following:
```
[sshd]
enabled = true
port = YOUR DESIRED PORT
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
```
### Fail2Ban Bailing an IP from Jail
```
sudo fail2ban-client set sshd unbanip IP_ADDRESS
```
### Fail2Ban Commands
```
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
```
### Install Jenkins
```sudo apt update```
```sudo apt install jenkins```
### Upgrade Jenkins
+ Navigate to `/usr/share/jenkins`
+ Stop the jenkins server ```sudo service jenkins stop```
+ Move existing jenkins war file ```sudo mv jenkins.war jenkins.war.old```
+ Download latest jenkins war file ```/usr/share/jenkins && sudo wget https://updates.jenkins-ci.org/latest/jenkins.war```
+ Start the Jenkins server ```sudo service jenkins start```
### Install [Docker](https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04)
- ```sudo apt update```
- ```sudo apt install apt-transport-https ca-certificates curl software-properties-common```
- ```curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -```
- ```sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"```
- ```sudo apt update```
- ```apt-cache policy docker-ce```
- ```sudo apt install docker-ce```
- ```sudo systemctl status docker```
### Running Docker without Sudo
- ```sudo usermod -aG docker ${USER}```
- ```su - ${USER}```
- Confirm that the docker group has been added: ```id -nG```
#### Installing [Docker Compose](https://docs.docker.com/compose/install/)
-```sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose```
- ```sudo chmod +x /usr/local/bin/docker-compose```
- ```sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose```
## Additional Software
#### Skype
```sudo snap install skype --classic```
#### Slack
```sudo snap install slack --classic```
#### Ferdi Messaging Consolidation Platform
[Get Ferdi](https://getferdi.com/download)
### Kazam Screencast
```sudo apt install kazam```
### OBS Studio
```
sudo add-apt-repository ppa:obsproject/obs-studio -y &&
sudo apt update -y &&
sudo apt install obs-studio -y
```
### Upgrading Ubuntu 18.04 LTS to 20.04 LTS
- ```sudo apt update && sudo apt upgrade```
- ```sudo reboot```
- ```sudo apt install update-manager-core```
- ```sudo do-release-upgrade```
- ```sudo reboot```
- ```sudo apt update```
- ```sudo apt list --upgradable```
- ```sudo apt upgrade```
- ```sudo reboot```
- ```sudo apt --purge autoremove```
- ```sudo apt install update-manager-core```
- ```sudo do-release-upgrade```
- *IF YOU RECEIVE THE FOLLOWING OR SIMILAR MESSAGE*:
Checking for a new Ubuntu release
There is no development version of an LTS available.
To upgrade to the latest non-LTS develoment release
set Prompt=normal in /etc/update-manager/release-upgrades
- Run the following command:
```sudo do-release-upgrade -d```
- Check version :)
```lsb_release -a```
### Installing Howdy (Windows like Hello)
``` sudo apt install v4l-utils```
- Visit [Howdy](https://github.com/boltgolt/howdy) and follow their installation steps