Skip to content

Instantly share code, notes, and snippets.

@patrickmaciel
Last active February 26, 2024 15:11
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save patrickmaciel/f9530cc9271c80b4609d03b5e4d716d9 to your computer and use it in GitHub Desktop.
Save patrickmaciel/f9530cc9271c80b4609d03b5e4d716d9 to your computer and use it in GitHub Desktop.
Instructions to fully configure your Ubuntu/Linux machine with all needed tools to code (mainly in PHP/Laravel)

Instructions

Linux essentials

sudo apt update && sudo apt-upgrade -y
sudo apt install wget curl vim -y

PHP

sudo env LC_ALL=C.UTF-8 add-apt-repository --yes ppa:ondrej/php

PHP 7.4 and most extensions

sudo apt-get install php7.4-fpm php7.4-common php7.4-dev php7.4-curl php7.4-gd php7.4-json php7.4-mysql php7.4-odbc php7.4-pgsql php7.4-pspell php7.4-readline php7.4-sqlite3 php7.4-tidy php7.4-xml php7.4-xmlrpc php7.4-bcmath php7.4-bz2 php7.4-intl php7.4-mbstring php7.4-phpdbg php7.4-soap php7.4-zip php-imagick php-redis php-memcached

PHP 8.1 and most extensions

sudo apt-get install php8.1-fpm php8.1-common php8.1-dev php8.1-curl php8.1-gd php8.1-mysql php8.1-odbc php8.1-pgsql php8.1-pspell php8.1-readline php8.1-sqlite3 php8.1-tidy php8.1-xml php8.1-xmlrpc php8.1-bcmath php8.1-bz2 php8.1-intl php8.1-mbstring php8.1-phpdbg php8.1-soap php8.1-zip php-imagick php-redis php-memcached

PHP 8.2 and most extensions

sudo apt-get install php8.2-fpm php8.2-common php8.2-dev php8.2-curl php8.2-gd php8.2-mysql php8.2-odbc php8.2-pgsql php8.2-pspell php8.2-readline php8.2-sqlite3 php8.2-tidy php8.2-xml php8.2-xmlrpc php8.2-bcmath php8.2-bz2 php8.2-intl php8.2-mbstring php8.2-phpdbg php8.2-soap php8.2-zip php-imagick php-redis php-memcached

Option 2 - Beer and Code

sudo apt install php8.2 php8.2-fpm openssl php8.2-bcmath php8.2-curl php8.2-mbstring php8.2-pgsql php8.2-tokenizer php8.2-xml php8.2-zip

To swap PHP extensions, just execute that command and choose the right php for your need (select the number 1, 2, 3, etc):

sudo update-alternatives --config php

Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

sudo mv composer.phar /usr/local/bin/composer

Add on .bashrc/zshrc

export PATH=$PATH:~/.config/composer/vendor/bin

After, reload the terminal: exec $SHELL

Now its time to install so global dependencies to help PHP development:

composer global require phpunit/phpunit
composer global require phpunit/dbunit
composer global require phing/phing
composer global require phpdocumentor/phpdocumentor
composer global require sebastian/phpcpd
composer global require phploc/phploc
composer global require phpmd/phpmd
composer global require squizlabs/php_codesniffer

Maria DB or MySQL

sudo apt install mariadb-client mariadb-server

sudo apt install mysql-server mysql-client
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
default-authentication-plugin=mysql_native_password

USE mysql;
SELECT User, Host, plugin FROM mysql.user;
UPDATE user SET plugin='mysql_native_password' WHERE User='root';
FLUSH PRIVILEGES;  
exit;


After that you need to change the root password:

sudo mysql
use mysql;
alter user 'root'@'localhost' identified by 'root';
flush privileges;
exit

Redis

sudo apt install redis-server

sudo vim /etc/redis/redis.conf
requirepass yourpassword

redis-cli
CONFIG SET requirepass "yourpassword"
AUTH yourpassword

Git

sudo apt install git git-core


NVM / Node

curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 
exec $SHELL

After, reload the terminal: exec $SHELL

nvm install node
nvm install 14
nvm install 16
nvm install 18
nvm alias default 18

If you want to install a specific version, first execute nvm list-remote to get the number of the specific Version, than execute nvm install 16.15.1 and change the 16.17.0 for your version.

On the currently day I write that document, the LTS version is 16.17.0 and the latest version is 18.4.0.

--

Nginx + Laravel

sudo apt install nginx

nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
        client_max_body_size 50M;
        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;


        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}

Server Block

server {
    server_name www.seudominio.com seudominio.com;
    root /var/www/html/seudominio.com/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.html index.htm index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/seudominio.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/seudominio.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = www.seudominio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = seudominio.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name www.seudominio.com seudominio.com;
    return 404; # managed by Certbot
}

Certbot SSL lets encrypt

sudo apt install certbot python3-certbot-nginx
sudo nano /etc/nginx/sites-available/example.com
sudo nginx -t
sudo systemctl reload nginx
sudo ufw status
sudo certbot --nginx -d example.com -d www.example.com
sudo systemctl status certbot.timer

Pyenv Python

	
sudo apt-get install -y software-properties-common make build-essential git libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev

curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash

Than put that 3 lines on your .bashrc

export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"

# Old configuration on .bashrc
# export PYTHON_BUILD_ARIA2_OPTS="-x 10 -k 1M"
# export PATH="~/.pyenv/bin:$PATH"
# eval "$(pyenv init --path)"
# eval "$(pyenv init -)"
# eval "$(pyenv virtualenv-init -)"

After, reload the terminal: exec $SHELL

Than execute exec $SHELL and follow the instructions bellow to install the 3.1 version globally

pyenv install –list
pyenv versions
pyenv install 3.11
pyenv global 3.11

Visual Studio Code

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo install -o root -g root -m 644 microsoft.gpg /etc/apt/trusted.gpg.d/

sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main" > /etc/apt/sources.list.d/vscode.list'

sudo apt install apt-transport-https
sudo apt update
sudo apt install code

Docker

sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
sudo docker run hello-world

sudo apt-get install docker-compose

Yarn

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt-get update
sudo apt install --no-install-recommends yarn

Rust/Cargo

curl https://sh.rustup.rs -sSf | sh

# final path need to be
export PATH="$HOME/.local/bin:$HOME/.cargo/bin:$HOME/.pyenv/bin:$PATH"

cargo install bat exa fd-find procs sd du-dust ripgrep tokei hyperfine ytop tealdeer bandwhich grex rmesg zoxide git-delta 

Others

sudo apt install copyq

https://www.omgubuntu.co.uk/2021/07/gnome-shell-quarter-tiling-extension-wintile


Lunarvim

bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh)


ZSH

sudo apt-get install zsh zsh-common


Powerlevel10k

https://github.com/romkatv/powerlevel10k

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k echo 'source /powerlevel10k/powerlevel10k.zsh-theme' >>/.zshrc

.

Download the fonts and install on your OS:

Change the default shell:

  • chsh -s /usr/bin/zsh

ZSH Autosuggestions

https://github.com/zsh-users/zsh-autosuggestions

git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions

source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment