Linux

Command

Add new user

useradd <username>

passwd <username>

Enter password

check memory and restart service when less than X gb.

bash
#!/bin/bash

# Get the available memory in KB
free_mem_kb=$(free -k | grep Mem | awk '{print $4}')

# Convert to GB (divide by 1024^2)
# without bc
free_mem_gb=$((free_mem_kb / 1024 / 1024))
# with bc
# free_mem_gb=$(echo "scale=2; $free_mem_kb / (1024 * 1024)" | bc)

# Threshold for memory in GB
threshold=2

# Check if free memory is less than the threshold
# without bc
if [ "$free_mem_gb" -lt "$threshold" ]; then
# with bc
# if (( $(echo "$free_mem_gb < $threshold" | bc -l) )); then
    echo "Free memory is less than 2GB ($free_mem_gb GB). Restarting Apache..."
#    restart some service here
#    sudo systemctl restart apache2
else
    echo "Free memory is sufficient: $free_mem_gb GB."
fi

change ownership

basic


chown <user>:<group> <option> <path>

chown www-data:wheel -R /var/www/html/project_name

 

-R = recursive

change own from one of the user or group only

chown -R --from=root nginx /var/www/html/cms

chown -R --from=:root :nginx /var/www/html/cms

Curl

simple curl GET

``sh
curl "https://api.onesignal.com"
``

simple curl POST

``sh
curl -X "POST" "https://api.onesignal.com"
``

curl with json request and header

``sh
curl -X "POST" "https://iems.kpdn.gov.my/oauth/token" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -d $'{
  "client_id": "3",
  "scope": "ecoss",
  "client_secret": "v3v0kqaUPYkxO7tl3FprWcbD3pzyk7EgvnEBzLmk",
  "grant_type": "client_credentials"
}'``

curl with full url

``sh
curl "https://familyhub.lppkn.gov.my/index.php/epms_api/LPPKNReportGateway?token=HEgAtuOHunGqmiMEVDUMjhTAYJRxyM&laporan=1004&tahun=2023&sukuan=1"
``
curl with hidden method (laravel)
``sh
curl -X "POST" "http://10.29.59.97/gps/gpss/50/budgets"
     -d $'{
     "_method": "PATCH",
  "test": "somthing"
}'
``

curl with auth token in header

``sh
curl -X "POST" "http://10.29.59.97/gps/gpss/50/budgets" -H "Content-Type: application/x-www-form-urlencoded" -d "_method=PATCH&token=bgl2TOaY5IdSQRHQDEPKvZd1Y79N66fFNOaV4E9P"
``

nginx basic ssl config

```
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate /path/to/signed_cert_plus_intermediates;
    ssl_certificate_key /path/to/private_key;
    ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    # OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;

    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # intermediate configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
    ssl_prefer_server_ciphers off;

    # HSTS (ngx_http_headers_module is required) (63072000 seconds)
    add_header Strict-Transport-Security "max-age=63072000" always;
}
```

NPT

# Centos 7

```install: yum install ntp -y```

``vi /etc/ntp.conf``

``server 192.168.1.100 iburst``

``systemctl restart ntp``

``check ntp: ntpq -p``


# Centos 8

``install: dnf install chrony``

``vi /etc/chrony.conf``

``server 192.168.1.100 iburst``

``systemctl enable chronyd``

``systemctl restart chronyd``

``check ntp: chronyc sources``

linux permission

# chown

``chown user directory``

> chown ali /var/www/html/project/index.php
> chown ali /var/www/html/project

- this will assign user of the target directory or file to ali.

``chown -R user directory``

- this will assign user of target directory and all its child to ali. 

``chown :group directory``

> chown :wheel /var/www/html/project

- this will assign group of target directory to wheel
- difference between user and group is :

``chown user:group directory``

> chown ali:wheel /var/www/html/project

- this will assign user of target directory to ali and group of target directory to wheel

``chown -R --from=root nginx /var/www/html/project``

- change target directory and its child that have current user as root to nginx


``chown -R --from=:root :wheel /var/www/html/project``

- change target directory and its child that have current group as root to wheel

basic config php system

## ssh

ssh -l root 159.223.43.172

sudo dnf update -y

## php

dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
rpm -qa | grep epel
dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
rpm -qa | grep remi
dnf module list php
dnf module enable php:remi-7.4


dnf install php php-fpm php-opcache php-gd php-curl php-mysqlnd php-mbstring php-dom zip unzip php-zip php-json php-pdo php-pdo_mysql

## mysql

dnf install mysql-server
systemctl start mysqld | mysqld.service
systemctl status mysqld
systemctl enable mysqld
mysql -u root -p
mysql_secure_installation // jika mahu ke live, maka run ini untuk pastikan setting mysql adalah betul
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; // jika php adalah php >7.3 + mysql 8

QvsfjYR@9pJs@T8oMCy23fwYyQ-.snmviq_!*24p.JC7YERFUsfx_.mQaN.tJGnM

## nginx

dnf install nginx
mv /etc/nginx/default.d/php.conf /etc/nginx/default.d/php.conf.disabled
vi /etc/nginx/conf.d/ekjp.conf

~~~
server {
    listen      80;
       server_name 10.21.1.86;
       root        /var/www/html/hlp/public;
       index       index.php;

       charset utf-8;
       gzip on;
    gzip_types text/css application/javascript text/javascript application/x-javascript  image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php {
                # include fastcgi.conf;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/run/php-fpm/www.sock;
                
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                fastcgi_buffer_size 128k;
                fastcgi_buffers 256 16k;
                fastcgi_busy_buffers_size 256k;
                fastcgi_temp_file_write_size 256k;
                include        fastcgi_params;
        }
        location ~ /\.ht {
                deny all;
        }
}

~~~

nginx -t
systemctl start nginx
systemctl status nginx
systemctl enable nginx

## git

dnf install git

## composer

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

## firewall

dnf install firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --zone=public --permanent --add-service=http
firewall-cmd --zone=public --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --permanent --list-all

## setting

cd /var/www/html
git clone https://gitlab.com/tmukmkd/jtm-ekjp-laravel-training.git ekjp
cd ekjp
composer update

vi /etc/php-fpm.d/www.conf
tukar apache kepada nginx
-- tukar nobody kepada nginx

update .env

chown -R nginx:nginx /var/www/html/sago-beta/storage/
chown -R nginx:nginx /var/www/html/sago-beta/bootstrap/cache/
chmod -R 0777 /var/www/html/sago-beta/storage/
chmod -R 0775 /var/www/html/sago-beta/bootstrap/cache/

semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/sago-beta/storage(/.*)?'
semanage fcontext -a -t httpd_sys_rw_content_t '/var/www/html/sago-beta/bootstrap/cache(/.*)?'
restorecon -Rv '/var/www/html/sago-beta'

mv /etc/nginx/default.d/php.conf /etc/nginx/default.d/php.conf.disabled

systemctl restart php-fpm
systemctl restart nginx

## selinux
sudo setsebool -P httpd_can_network_connect_db=1
setenforce 0

## letsencrypt

dnf install epel-release
dnf install certbot python3-certbot-nginx
certbot --nginx -d some.domain.name

## add user to group
usermod -a -G group_name user_name

supervisord

yum install supervisor

-- ubuntu

apt-get update -y
apt-get install supervisor -y
vi /etc/supervisor/supervisord.conf

```
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

systemctl start supervisord

sudo supervisorctl reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*
```

===

ps -ef | grep supervisord

kill -s SIGTERM 2503

=== ekbaru setting

vi /etc/supervisord.d/supervisor.ini

```
[program:laravel-worker]
command=php /var/www/html/ekgbaru/artisan queue:work --tries=3 --sleep=3
process_name=%(program_name)s_%(process_num)02d
numprocs=8
; priority=99
autostart=true
stopasgroup=true
killasgroup=true
autorestart=true
; startsecs=1
; startretries=3
user=root
redirect_stderr=true
stdout_logfile=/var/www/html/supervisor.log
;stdout_logfile=/var/logs/supervisor.log
```

systemctl start supervisord

systemctl enable supervisord

systemctl status supervisord

traceroute mtr mytraceroute

## tracert

``tracert <url>``

``tracert pcdev.kpdn.gov.my``

## traceroute

// install

``apt instal traceroute``

// usage

``traceroute <url>``

``traceroute pcdev.kpdn.gov.my``

## mtr (mytraceroute)

``sudo mtr <url> -c <request count>``

``sudo mtr pcdev.kpdn.gov.my -c 1000``
``sudo mtr pricecatcher.kpdn.gov.my -c 100``
``sudo mtr myworkforce.perkeso.gov.my -c 10``

 

wkhtmltopdf

# Centos 8

```sh
wget https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos8.x86_64.rpm

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos8.x86_64.rpm

rpm -i wkhtmltox-0.12.6-1.centos8.x86_64.rpm
```

# Centos 7

## install

```
https://downloads.wkhtmltopdf.org/0.12/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm

https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm

yum install -y libpng libjpeg openssl icu libX11 libXext libXrender xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi
```

## spacedeal

``yum -y install wget``
`yum localinstall wkhtmltox-0.12.6-1.centos7.x86_64.rpm`
`wkhtmltopdf --version`

# rhel 9

```

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-2/wkhtmltox-0.12.6.1-2.almalinux9.x86_64.rpm

rpm -i wkhtmltox-0.12.6.1-2.almalinux9.x86_64.rpm
```

# Ubuntu

`sudo apt-get install wkhtmltopdf`

`sudo ln -s /usr/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf`

If prompt reboot service just click OK. Use TAB or arrow to navigate.

known issues in Ubuntu

`https://packagist.org/packages/h4cc/wkhtmltopdf-amd64`

`php composer.phar require h4cc/wkhtmltopdf-amd64 "0.12.4"`

`$path = \h4cc\WKHTMLToPDF\WKHTMLToPDF::PATH;` in .env

Ubuntu Setup

install mysql-server
create user 'hub'@'localhost' IDENTIFIED BY 'The-Best-WAY-2024';
create user 'hub'@'localhost' IDENTIFIED BY 'The-Best-PROD-2024';
grant all privileges on *.* to 'hub'@'localhost';
FLUSH PRIVILEGES;

apt install ca-certificates apt-transport-https software-properties-common
add-apt-repository ppa:ondrej/php
apt update
apt install php8.3 php8.3-common php8.3-xml php8.3-intl php8.3-mysql php8.3-zip php8.3-curl 

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
mv composer.phar /usr/bin/composer <-- 2204 guna usr bin. 2004 guna usr local bin
composer install

php8.3-common 
php8.3-mysql 
php8.3-xml 
php8.3-xmlrpc 
php8.3-curl 
php8.3-gd 
php8.3-imagick 
php8.3-cli 
php8.3-mbstring 
php8.3-opcache 
php8.3-zip 
php8.3-redis 
php8.3-intl
php8.3-fpm
 -y
 
 -- nginx
 
 server {
    listen 80;
    server_name server_domain_or_IP;
    root /var/www/travellist/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;
    }
}

-- local git
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = git@gitlab.com:myopensoft/sprm-pesalah-rasuah.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
".git/config" 13L, 315B
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[remote "origin"]
        url = git@gitlab.com:myopensoft/sprm-pesalah-rasuah.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
        remote = origin
        merge = refs/heads/main
~