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

No comments:

Post a Comment

Golang Advanced Interview Q&A