Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Random PHP scripts
Random PHP scripts
<?php
// find function declaration
$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();
// find class declaration
$reflClass = new ReflectionClass('class_name');
print $reflClass->getFileName();
{{--
A commented Laravel Envoy (https://laravel.com/docs/master/envoy) script that deploy from private GitLab repo
Tested on Laravel 5.8 and Laravel Envoy 1.5 and Ubuntu 16.04 LTS
Inspired by https://docs.gitlab.com/ee/ci/examples/laravel_with_gitlab_and_envoy/
Running command: envoy run deploy
Prerequisites:
✓ Laravel prerequisites are installed on @servers https://laravel.com/docs/master/installation#server-requirements
✓ $releases_dir, $app_dir, $data_dir are available at @servers
✓ @servers user is a sudoer that requires NO password
✓ @servers runs web server (apache/nginx) using www-data
✓ @servers SSH public key has been registred as Deploy Keys in GitLab https://docs.gitlab.com/ee/api/deploy_keys.html (required unless using public repo)
✓ @servers has registered GitLab as known server (do git clone from there once)
✓ (optional) Supervisord is installed. Needed only queue worker setup is activated
✓ (optional) Laravel Passport is one of dependency https://laravel.com/docs/master/passport
Optional features (activate by uncomment corresponding parts):
✓ Supervisord worker: setup, update, refresh worker cache
✓ Laravel Passport: setup (generate secret keys)
✓ Migrate database: migrate or fresh (drop/create all)
✓ Temporary directory for generated files
Author: yohanes.gultom@gmail.com
--}}
{{-- deployment server user and ip address --}}
@servers(['web' => 'user@ipaddress'])
@setup
$repository = 'git@gitlab.com:username/myapp.git'; {{-- GitLab repo --}}
$releases_dir = '$HOME/myapp'; {{-- stored cloned repositories --}}
$app_dir = '/var/www/myapp'; {{-- web server (apache/nginx) symlink --}}
$data_dir = '$HOME/myapp-data'; {{-- shared directory to store app config (.env) and data (storage/*, tmp/*) --}}
$release = date('YmdHis'); {{-- source code version tag/identifier eg. 20190328235959. WARNING This date format is required by clean_old_releases task --}}
$new_release_dir = $releases_dir .'/'. $release; {{-- current release path eg. $HOME/myapp/20190328235959 --}}
@endsetup
@story('deploy')
clone_repository
{{-- setup_supervisor --}} {{-- Optional. Requires file named like 'myapp-worker.conf' in repo root --}}
run_composer
set_permissions
update_symlinks
{{-- refresh_database --}} {{-- Optional. Requires APP_ENV (in .env) to be other than 'production' --}}
{{-- migrate_database --}} {{-- Optional. Requires APP_ENV (in .env) to be other than 'production' --}}
clear_cache
clean_old_releases {{-- Limit number of releases stored in server --}}
@endstory
@task('clone_repository')
echo 'Cloning repository'
[ -d {{ $releases_dir }} ] || mkdir -p {{ $releases_dir }}
git clone --depth 1 {{ $repository }} {{ $new_release_dir }}
@endtask
{{-- Optional. Copy worker conf file from repo to default Debian/Ubuntu Supervisord directory --}}
@task('setup_supervisor')
echo 'Setup supervisor'
sudo cp {{ $new_release_dir }}/*-worker.conf /etc/supervisor/conf.d/ {{-- You may need to change this if you have different Supervisord installation --}}
sudo supervisorctl update
@endtask
@task('run_composer')
echo "Starting deployment ({{ $release }})"
cd {{ $new_release_dir }}
composer install --prefer-dist --no-scripts -q -o {{-- Include dev dependency in case dev process is required (eg. DB seeding with Faker, phpunit testing) --}}
{{-- composer install --prefer-dist --no-scripts -q -o --no-dev --}} {{-- Use this instead if no dev process is required --}}
@endtask
{{-- Allow web server user (assumed www-data) to modify bootstrap and storage directories (usually for caches and user files) --}}
@task('set_permissions')
echo "Setting permissions"
sudo chown -R www-data:www-data {{ $new_release_dir }}/bootstrap
sudo chown -R www-data:www-data {{ $new_release_dir }}/storage
@endtask
@task('update_symlinks')
{{-- Create symlink for storage --}}
echo "Linking storage directory"
rm -rf {{ $new_release_dir }}/storage
ln -nfs {{ $data_dir }}/storage {{ $new_release_dir }}/storage
{{-- Create symlink for public storage (to store user public/insecure uploaded files such as profile images) https://laravel.com/docs/master/filesystem --}}
echo "Linking public storage directory"
rm -rf {{ $new_release_dir }}/public/storage
ln -nfs {{ $data_dir }}/storage/app/public {{ $new_release_dir }}/public/storage
{{-- Create symlink for .env file so it won't be overwritten --}}
echo 'Linking .env file'
ln -nfs {{ $data_dir }}/.env {{ $new_release_dir }}/.env
{{-- Optional. Uncomment this if you require '/tmp' directory to store temporary files (eg. report, invoice, generated images --}}
{{--
echo 'Linking tmp dir'
rm -Rf {{ $new_release_dir }}/tmp
ln -nfs {{ $data_dir }}/tmp {{ $new_release_dir }}/tmp
--}}
echo 'Linking current release'
sudo ln -nfs {{ $new_release_dir }} {{ $releases_dir }}/current
sudo ln -nfs {{ $new_release_dir }}/public {{ $app_dir }}
@endtask
{{-- Drops dan recreates database. Only for non-production https://laravel.com/docs/5.8/migrations#running-migrations --}}
@task('refresh_database')
echo "Refreshing database"
rm -Rf {{ $data_dir }}/storage/app/public/*
cd {{ $new_release_dir }}
php artisan migrate:fresh --seed {{-- Drop all tables, recreates tables and runs seeder --}}
{{-- php artisan passport:install --}} {{-- Optional. Only if using passport --}}
{{-- php artisan queue:flush --}} {{-- Optional. Only if using queue --}}
@endtask
{{-- Migrates database. Only for non-production https://laravel.com/docs/5.8/migrations#running-migrations --}}
@task('migrate_database')
echo "Migrate database"
cd {{ $new_release_dir }}
php artisan migrate
@endtask
{{-- Clear all caches. Useful for production --}}
@task('clear_cache')
echo "Clearing cache"
cd {{ $new_release_dir }}
sudo -u www-data php artisan route:clear
sudo -u www-data php artisan view:clear
sudo -u www-data php artisan cache:clear
{{-- sudo -u www-data php artisan queue:restart --}} {{-- Optional. If queue is used --}}
sudo -u www-data php artisan config:cache
{{-- echo "Restarting supervisor worker"
sudo supervisorctl restart all --}} {{-- Optional. If Supervisord is used --}}
@endtask
{{-- This will list our releases by modification time and delete all but the 3 most recent (depends on $release date format). --}}
@task('clean_old_releases')
purging=$(ls -dt {{ $releases_dir }}/* | tail -n +3); {{-- +3 means keep 3 releases (including current). If you do not want to keep backup, change the value to +1 --}}
if [ "$purging" != "" ]; then
echo Purging old releases: $purging;
rm -rf $purging;
else
echo "No releases found for purging at this time";
fi
@endtask
<?php
// Get LAN IP address of the hosting server
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
$ipconfig = shell_exec("ipconfig");
} else {
$ip = shell_exec("/sbin/ifconfig | grep 'inet '| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}'");
}
// prepend address to protocol and app name
$appname = "moodle";
$url = "http://$ip/$appname";
echo "Application address: <a href='$url'>$url</a>";
; Example of Laravel Supervisord queue worker https://laravel.com/docs/master/queues#supervisor-configuration
[program:myapp-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/user/myapp/current/artisan queue:work --sleep=3 --tries=3 --timeout=60 ; Modify according to your static artisan path
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/home/user/myapp/current/storage/logs/supervisord.log ; Modify according to your static log path
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.