Monday, 20 May 2024

Run script backup data in Mysql

DB_NAME="eccubedev"
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="$HOME/backupDB/BackupFiles"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_backup_$DATE.sql"
TOTAL_BACKUP_FILES=100

# Create backup directory if it doesn't exist
mkdir -p $BACKUP_DIR

# Dump the database
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE

# Delete oldest backups, keeping only the most recent $TOTAL_BACKUP_FILES
cd $BACKUP_DIR
NUM_FILES=$(ls -1 | wc -l)
if [ $NUM_FILES -gt $TOTAL_BACKUP_FILES ]; then
    DELETE_FILES=$(expr $NUM_FILES - $TOTAL_BACKUP_FILES)
    ls -t | tail -n $DELETE_FILES | xargs rm -f
fi

Thank you

Cron Job on Linux

sudo crontab -u {username} -e

crontab -e

* * * * * /bin/bash /home/phong/backupDB/backup_mysql.sh

crontab -l

- List crontab

Run Cron JobCommand
Every Minute* * * * * /path/to/script
Every 15 Minutes*/15 * * * * /path/to/script
On the 30th Minute of Every Hour30 * * * * /path/to/script
At the Beginning of Every Hour0 * * * * /path/to/script
Every Day at Midnight0 0 * * * /path/to/script
At 2 AM Every Day0 2 * * * /path/to/script
Every 1st of the Month0 0 1 * * /path/to/script
Every 15th of the Month0 0 15 * * /path/to/script
On December 1st - Midnight0 0 1 12 * /path/to/script
Saturdays at Midnight0 0 * * 6 /path/to/script
Every Weekday at 4 AM0 4 * * 1-5 /path/to/script
At 4 AM on Tuesdays and Thursdays0 4 * * 2,4 /path/to/script
Every Other Day at 37 Minutes Past the Hour37 1-23/2 * * * /path/to/script
Every 20 Minutes - Multiple Scripts*/20 * * * * /path/to/script1; /path/to/script2
On Saturdays and Sundays at 12 PM0 12 * * 6,0 /path/to/script
Monday to Friday - Every Hour 9 AM to 5 PM0 9-17 * * 1-5 /path/to/script
Every Hour from 5 PM on Wednesday to 5 AM on Thursday (Job Spans Two Days)0 17-23 * * 3 /path/to/script
0 0-5 * * 4 /path/to/script
Midnight Every Day - Send Output to a Different File0 0 * * * /path/to/script > /path/to/output.log 2>&1

Sunday, 19 May 2024

Deployer for deploy PHP project

1. File deploy.php

<?php
namespace Deployer;
require 'recipe/symfony.php';

// Config #############################################
$projects = [
    'projectA' => [
        'deploy_path' => '/var/www/projectA.com',
        'deploy_branch' => 'develop',
        'env_file' => 'config/projectA.com/.env'
    ],
    'projectB' => [
        'deploy_path' => '/var/www/projectB.com',
        'deploy_branch' => 'staging',
        'env_file' => 'config/projectB.com/.env'
    ]
];
// set repository
set('repository', 'git@github.com:<your_git_repository>.git');
// Number of releases to keep
set('keep_releases', 3);

// Hosts
foreach ($projects as $project => $config) {
    localhost($project)
        ->set('deploy_path', $config['deploy_path'])
        ->set('branch', $config['deploy_branch'])
        ->set('env_file', $config['env_file']);;
}

// Tasks
set('git_tty', true);
set('composer_action', 'update');
add('shared_files', ['.env']);
add('shared_dirs', ['vendor', 'node_modules']);
add('writable_dirs', ['var', 'html']);
set('allow_anonymous_stats', false);

// Tasks
desc('Deploy project');
task('deploy', [
    'deploy:prepare',
    'deploy:copy_env',
    'deploy:vendors',
    'deploy:node_modules',
    'deploy:eccube',
    'deploy:set_permissions',
    'deploy:publish',
]);

// Custom task to copy environment-specific files
task('deploy:copy_env', function () {
    $envFile = get('env_file');
    run("cp $envFile {{release_path}}/.env");
});

// Task to install composer dependencies
task('deploy:vendors', function () {
    run('cd {{release_path}} && composer install');
});

// Task to install composer dependencies
task('deploy:node_modules', function () {
    run('cd {{release_path}} && npm install');
    run('cd {{release_path}} && npm run build');
});

// Custom task to run additional commands
task('deploy:eccube', function () {
    run('cd {{release_path}} && bin/console eccube:generate:proxies');
    run('cd {{release_path}} && bin/console eccube:schema:update --force --dump-sql');
    run('cd {{release_path}} && bin/console cache:clear');
});

// Custom task to set permissions
task('deploy:set_permissions', function () {
    run('chmod -R 777 {{release_path}}/html');
    run('chmod -R 777 {{release_path}}/var');
});

// If deploy fails automatically unlock.
- after('deploy:failed', 'deploy:unlock');

2.  /etc/apache2/sites-available/projectA.com

<VirtualHost *:80>
ServerAdmin admin@projectA.com

ServerName projectA.com

ServerAlias www.projectA.com

DocumentRoot /var/www/projectA.com/current

<Directory /var/www/projectA.com/current>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log

CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

3. Run deploy

$ vendor/bin/dep deploy projectA

* Solve problem permission 

(i) sudo chown folder release for www-data:www-data

- you need remove enter password when call sudo 

/ sudo visudo => edit:
{username } ALL=(ALL:ALL) NOPASSWD: ALL
/ note: need connect server again to use sudo 

(ii) Change user run apache 2

run: sudo nano /etc/apache2/envvars

# export APACHE_RUN_USER=www-data
# export APACHE_RUN_GROUP=www-data

export APACHE_RUN_USER=phong
export APACHE_RUN_GROUP=phong

- phong is user you ssh remote to your server 

(iii) Change user run Nginx

- add group for user: $ sudo usermod -aG www-data phong

- run: sudo nano /etc/nginx/nginx.conf

user phong phong;

* Change user run PHP-fpm
sudo nano /etc/php/8.1/fpm/pool.d/www.conf 
user = phong 
group = phong
...
listen.owner = phong
listen.group = phong


 - phong is user you ssh remote to your server

 

Thank you

Golang Advanced Interview Q&A