capistrano-laravel-lazy 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +2 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +107 -0
- data/Rakefile +1 -0
- data/bin/cap_laravel +64 -0
- data/capistrano-laravel.gemspec +26 -0
- data/lib/capistrano/laravel/helpers.rb +6 -0
- data/lib/capistrano/laravel/version.rb +5 -0
- data/lib/capistrano/laravel.rb +6 -0
- data/lib/capistrano/tasks/laravel.rake +185 -0
- data/lib/capistrano/tasks/php_fpm.rake +15 -0
- data/lib/capistrano/tasks/setup_config.rake +83 -0
- data/lib/capistrano/templates/Capfile +16 -0
- data/lib/capistrano/templates/deploy.rb.erb +61 -0
- data/lib/capistrano/templates/fpm.conf.erb +65 -0
- data/lib/capistrano/templates/nginx.conf.erb +51 -0
- data/lib/capistrano/templates/stage.rb.erb +38 -0
- data/lib/capistrano-laravel.rb +0 -0
- metadata +138 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7b441d61f122b8718af54a5e3add2b942dc73c2b
|
4
|
+
data.tar.gz: 1ba75866b5bf3280972f03df3b4f9af0574c1fd0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 477c2a3fb627e4682492e5a9dcb7fe6c9794fb62bf68b78fc0b3ead7b5ee0f25477224e1564a7a9a0a98c52e0eb088bb568bd747934806e923ab551e12335b6c
|
7
|
+
data.tar.gz: f691ac7154afa74909803784ba8270ff8ffc43e93b523fc0e3176abcf66e7dff823b2498007613c3d8b2779d030eb19c0bb44f420563b7a18ed0cf38c68e774d
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2013 Peter Mitchell (peterjmit@gmail.com)
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
7
|
+
the Software without restriction, including without limitation the rights to
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
10
|
+
subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
# Capistrano::laravel
|
2
|
+
|
3
|
+
Deploy Laravel applications with Capistrano v3.*
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
gem 'capistrano', '~> 3.0.0'
|
11
|
+
gem 'capistrano-laravel'
|
12
|
+
```
|
13
|
+
|
14
|
+
And then execute:
|
15
|
+
|
16
|
+
$ bundle
|
17
|
+
|
18
|
+
Or install it yourself as:
|
19
|
+
|
20
|
+
$ gem install capistrano-laravel
|
21
|
+
|
22
|
+
## Usage
|
23
|
+
|
24
|
+
Require the module in your `Capfile`:
|
25
|
+
|
26
|
+
```ruby
|
27
|
+
require 'capistrano/laravel'
|
28
|
+
```
|
29
|
+
|
30
|
+
### Configuration
|
31
|
+
|
32
|
+
The gem makes the following configuration variables available (shown with defaults).
|
33
|
+
|
34
|
+
```ruby
|
35
|
+
# Which roles to execute commands on.
|
36
|
+
set :laravel_roles, :all
|
37
|
+
|
38
|
+
# Determines which operations to perform based on which version
|
39
|
+
# of the Laravel framework your project is using.
|
40
|
+
set :laravel_version, 5.1
|
41
|
+
|
42
|
+
# If using Laravel 5+, a dotenv file is used for environment configuration.
|
43
|
+
# This variable uploads the given file from the the host to the guest.
|
44
|
+
set :laravel_dotenv_file, './.env'
|
45
|
+
|
46
|
+
# Flags to add to artisan calls.
|
47
|
+
set :laravel_artisan_flags, "--env=production"
|
48
|
+
|
49
|
+
# Will set linked folders based on your Laravel version
|
50
|
+
set :laravel_set_linked_dirs, false
|
51
|
+
|
52
|
+
# Will set ACL paths based on your Laravel version
|
53
|
+
set :laravel_set_acl_paths, true
|
54
|
+
|
55
|
+
# Which user to set ACL permissions for.
|
56
|
+
set :laravel_server_user, "www-data"
|
57
|
+
```
|
58
|
+
|
59
|
+
### Tasks
|
60
|
+
|
61
|
+
The tasks are more or less automatic and are executed as follows:
|
62
|
+
|
63
|
+
```ruby
|
64
|
+
before "deploy:starting", :prepare_laravel do
|
65
|
+
invoke "laravel:configure_folders"
|
66
|
+
end
|
67
|
+
|
68
|
+
before "deploy:updated", :laravel_tasks do
|
69
|
+
invoke "laravel:upload_dotenv_file"
|
70
|
+
invoke "laravel:optimize_release"
|
71
|
+
invoke "laravel:create_acl_paths"
|
72
|
+
invoke "deploy:set_permissions:acl"
|
73
|
+
end
|
74
|
+
```
|
75
|
+
|
76
|
+
#### Task Descriptions
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
# Execute an artisan command
|
80
|
+
invoke "laravel:artisan", "command"
|
81
|
+
|
82
|
+
# Run any optimization commands
|
83
|
+
invoke "laravel:optimize_release"
|
84
|
+
|
85
|
+
# Configure linked dirs/acl dirs
|
86
|
+
invoke "laravel:configure_folders"
|
87
|
+
|
88
|
+
# Upload the dotenv file from local to remote
|
89
|
+
invoke "laravel:upload_dotenv_file"
|
90
|
+
|
91
|
+
# Seed the database
|
92
|
+
invoke "laravel:seed_db"
|
93
|
+
|
94
|
+
# Create any missing folders for ACL
|
95
|
+
invoke "laravel:create_acl_paths"
|
96
|
+
|
97
|
+
# Run migrations for the database
|
98
|
+
invoke "laravel:migrate_db"
|
99
|
+
```
|
100
|
+
|
101
|
+
## Contributing
|
102
|
+
|
103
|
+
1. Fork it
|
104
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
105
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
106
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
107
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'bundler/gem_tasks'
|
data/bin/cap_laravel
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'erb'
|
4
|
+
require 'pathname'
|
5
|
+
require 'capistrano/all'
|
6
|
+
|
7
|
+
# desc 'Install Capistrano Laravel, cap_laravel install STAGES=staging,production'
|
8
|
+
def laravel_install(stages = 'staging,production')
|
9
|
+
config_dir = Pathname.new('config')
|
10
|
+
deploy_dir = config_dir.join('deploy')
|
11
|
+
|
12
|
+
deploy_rb = File.expand_path('../../lib/capistrano/templates/deploy.rb.erb', __FILE__)
|
13
|
+
stage_rb = File.expand_path('../../lib/capistrano/templates/stage.rb.erb', __FILE__)
|
14
|
+
capfile = File.expand_path('../../lib/capistrano/templates/Capfile', __FILE__)
|
15
|
+
|
16
|
+
mkdir_p deploy_dir
|
17
|
+
|
18
|
+
entries = [{template: deploy_rb, file: config_dir.join('deploy.rb')}]
|
19
|
+
entries += stages.split(',').map { |stage| {template: stage_rb, file: deploy_dir.join("#{stage}.rb"), stage: stage} }
|
20
|
+
|
21
|
+
entries.each do |entry|
|
22
|
+
if File.exists?(entry[:file])
|
23
|
+
warn "[skip] #{entry[:file]} already exists"
|
24
|
+
else
|
25
|
+
File.open(entry[:file], 'w+') do |f|
|
26
|
+
f.write(ERB.new(File.read(entry[:template])).result(binding))
|
27
|
+
puts I18n.t(:written_file, scope: :capistrano, file: entry[:file])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
if File.exists?('Capfile')
|
33
|
+
warn '[skip] Capfile already exists'
|
34
|
+
else
|
35
|
+
FileUtils.cp(capfile, 'Capfile')
|
36
|
+
puts I18n.t(:written_file, scope: :capistrano, file: 'Capfile')
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
puts I18n.t :capified, scope: :capistrano
|
41
|
+
end
|
42
|
+
|
43
|
+
case ARGV[0]
|
44
|
+
when 'install'
|
45
|
+
if /^STAGES=/ === ARGV[1]
|
46
|
+
laravel_install ARGV[1][7,140]
|
47
|
+
else
|
48
|
+
laravel_install
|
49
|
+
end
|
50
|
+
else
|
51
|
+
puts <<-HERE
|
52
|
+
|
53
|
+
Install capistrano laravel in a project:
|
54
|
+
bundle exec cap_laravel install [STAGES=qa,staging,production,...]
|
55
|
+
|
56
|
+
Command `cap_laravel` must be used to install capistrano/laravel only!
|
57
|
+
|
58
|
+
Install capistrano in a project:
|
59
|
+
bundle exec cap install [STAGES=qa,staging,production,...]
|
60
|
+
|
61
|
+
See full capistrano documentation at http://capistranorb.com/.
|
62
|
+
|
63
|
+
HERE
|
64
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'capistrano-laravel-lazy'
|
7
|
+
spec.version = '0.0.3'
|
8
|
+
spec.authors = ['Ivan Chou', 'Peter Mitchell', 'Andrew Miller']
|
9
|
+
spec.email = ['yiichou@gmail.com', 'peterjmit@gmail.com', 'ikari7789@yahoo.com']
|
10
|
+
spec.description = %q{Laravel specific deployment options for Capistrano 3.x}
|
11
|
+
spec.summary = %q{Laravel deployment for Capistrano 3.x}
|
12
|
+
spec.homepage = 'https://github.com/IvanChou/laravel/tree/lazy'
|
13
|
+
spec.license = 'MIT'
|
14
|
+
|
15
|
+
spec.files = `git ls-files`.split($/)
|
16
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
17
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
|
+
spec.require_paths = ['lib']
|
19
|
+
|
20
|
+
spec.add_dependency 'capistrano', '~> 3.0'
|
21
|
+
spec.add_dependency 'capistrano-composer', '~> 0.0.6'
|
22
|
+
spec.add_dependency 'capistrano-file-permissions', '~> 1.0'
|
23
|
+
|
24
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
|
+
spec.add_development_dependency 'rake', '~> 10.4'
|
26
|
+
end
|
@@ -0,0 +1,185 @@
|
|
1
|
+
require 'capistrano/laravel/helpers'
|
2
|
+
|
3
|
+
include Comparable
|
4
|
+
include Capistrano::Laravel::Helpers
|
5
|
+
|
6
|
+
namespace :load do
|
7
|
+
task :defaults do
|
8
|
+
set :laravel_roles, :all
|
9
|
+
set :laravel_migrate_roles, :all
|
10
|
+
set :laravel_version, 5.1
|
11
|
+
set :laravel_dotenv_file, './.env.example'
|
12
|
+
set :laravel_artisan_flags, '--env=production'
|
13
|
+
set :laravel_artisan_migrate_flags, '--env=production --force'
|
14
|
+
set :laravel_set_linked_dirs, true
|
15
|
+
set :laravel_set_acl_paths, true
|
16
|
+
set :laravel_create_linked_acl_paths, true
|
17
|
+
set :laravel_server_user, 'www-data'
|
18
|
+
set :laravel_phplint, false
|
19
|
+
|
20
|
+
# Folders to link between releases
|
21
|
+
set :laravel_4_linked_dirs, [
|
22
|
+
'app/storage'
|
23
|
+
]
|
24
|
+
set :laravel_5_linked_dirs, [
|
25
|
+
'storage'
|
26
|
+
]
|
27
|
+
set :laravel_5_1_linked_dirs, [
|
28
|
+
'storage'
|
29
|
+
]
|
30
|
+
|
31
|
+
# Folders to set permissions on based on laravel version
|
32
|
+
set :laravel_4_acl_paths, [
|
33
|
+
'app/storage',
|
34
|
+
'app/storage/cache',
|
35
|
+
'app/storage/logs',
|
36
|
+
'app/storage/meta',
|
37
|
+
'app/storage/sessions',
|
38
|
+
'app/storage/views'
|
39
|
+
]
|
40
|
+
set :laravel_5_acl_paths, [
|
41
|
+
'storage',
|
42
|
+
'storage/app',
|
43
|
+
'storage/framework',
|
44
|
+
'storage/framework/cache',
|
45
|
+
'storage/framework/sessions',
|
46
|
+
'storage/framework/views',
|
47
|
+
'storage/logs'
|
48
|
+
]
|
49
|
+
set :laravel_5_1_acl_paths, [
|
50
|
+
'bootstrap/cache',
|
51
|
+
'storage',
|
52
|
+
'storage/app',
|
53
|
+
'storage/framework',
|
54
|
+
'storage/framework/cache',
|
55
|
+
'storage/framework/sessions',
|
56
|
+
'storage/framework/views',
|
57
|
+
'storage/logs'
|
58
|
+
]
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
namespace :laravel do
|
63
|
+
desc 'Set the ACL for the web user based on Laravel version.'
|
64
|
+
task :configure_folders do
|
65
|
+
laravel_version = fetch(:laravel_version)
|
66
|
+
laravel_linked_dirs = []
|
67
|
+
laravel_acl_paths = []
|
68
|
+
if laravel_version < 5 # Laravel 4
|
69
|
+
laravel_linked_dirs = fetch(:laravel_4_linked_dirs)
|
70
|
+
laravel_acl_paths = fetch(:laravel_4_acl_paths)
|
71
|
+
elsif laravel_version < 5.1 # Laravel 5
|
72
|
+
laravel_linked_dirs = fetch(:laravel_5_linked_dirs)
|
73
|
+
laravel_acl_paths = fetch(:laravel_5_acl_paths)
|
74
|
+
else # Laravel 5.1 or greater
|
75
|
+
laravel_linked_dirs = fetch(:laravel_5_1_linked_dirs)
|
76
|
+
laravel_acl_paths = fetch(:laravel_5_1_acl_paths)
|
77
|
+
end
|
78
|
+
|
79
|
+
if fetch(:laravel_set_linked_dirs)
|
80
|
+
set :linked_dirs, fetch(:linked_dirs, []).push(*laravel_linked_dirs)
|
81
|
+
end
|
82
|
+
|
83
|
+
if fetch(:laravel_set_acl_paths)
|
84
|
+
set :file_permissions_paths, fetch(:file_permissions_paths, []).push(*laravel_acl_paths)
|
85
|
+
set :file_permissions_users, [fetch(:laravel_server_user)]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
desc 'Create missing directories.'
|
90
|
+
task :create_linked_acl_paths do
|
91
|
+
if fetch(:laravel_create_linked_acl_paths)
|
92
|
+
if fetch(:laravel_version) < 5
|
93
|
+
laravel_acl_paths = fetch(:laravel_4_acl_paths)
|
94
|
+
elsif fetch(:laravel_version) < 5.1
|
95
|
+
laravel_acl_paths = fetch(:laravel_5_acl_paths)
|
96
|
+
else
|
97
|
+
laravel_acl_paths = fetch(:laravel_5_1_acl_paths)
|
98
|
+
end
|
99
|
+
|
100
|
+
on roles fetch(:laravel_roles) do
|
101
|
+
laravel_acl_paths.each do |path|
|
102
|
+
acl_path = release_path.join(path)
|
103
|
+
if test("[ ! -e '#{acl_path}' ]")
|
104
|
+
execute :mkdir, '-vp', acl_path
|
105
|
+
else
|
106
|
+
info "#{acl_path} already exists."
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
desc 'Upload dotenv file for release.'
|
114
|
+
task :upload_dotenv_file do
|
115
|
+
if fetch(:laravel_version) >= 5
|
116
|
+
on roles fetch(:laravel_roles) do
|
117
|
+
unless fetch(:laravel_dotenv_file).empty?
|
118
|
+
upload! fetch(:laravel_dotenv_file), "#{release_path}/.env"
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
desc 'Execute a provided artisan command'
|
125
|
+
task :artisan, :command_name do |_t, args|
|
126
|
+
# ask only runs if argument is not provided
|
127
|
+
ask(:cmd, 'list')
|
128
|
+
command = args[:command_name] || fetch(:cmd)
|
129
|
+
|
130
|
+
on roles fetch(:laravel_roles) do
|
131
|
+
within release_path do
|
132
|
+
execute :php, :artisan, command, *args.extras, fetch(:laravel_artisan_flags)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# enable task artisan to be ran twice
|
137
|
+
Rake::Task['laravel:artisan'].reenable
|
138
|
+
end
|
139
|
+
|
140
|
+
desc 'Optimize the configuration'
|
141
|
+
task :optimize_config do
|
142
|
+
invoke 'laravel:artisan', 'config:cache' if fetch(:laravel_version) >= 5
|
143
|
+
end
|
144
|
+
|
145
|
+
desc 'Optimize the routing file'
|
146
|
+
task :optimize_route do
|
147
|
+
invoke 'laravel:artisan', 'route:cache' if fetch(:laravel_version) >= 5
|
148
|
+
end
|
149
|
+
|
150
|
+
desc 'Optimize a Laravel installation for optimimum performance in production.'
|
151
|
+
task :optimize_release do
|
152
|
+
invoke 'laravel:artisan', :optimize, :'--force'
|
153
|
+
end
|
154
|
+
|
155
|
+
desc 'Run migrations against the database using Artisan.'
|
156
|
+
task :migrate_db do |_t, args|
|
157
|
+
on roles fetch(:laravel_migrate_roles) do
|
158
|
+
within release_path do
|
159
|
+
execute :php, :artisan, :migrate, *args.extras, fetch(:laravel_artisan_migrate_flags)
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
desc 'Rollback migrations against the database using Artisan.'
|
165
|
+
task :rollback_db do
|
166
|
+
on roles fetch(:laravel_migrate_roles) do
|
167
|
+
within release_path do
|
168
|
+
execute :php, :artisan, 'migrate:rollback', *args.extras, fetch(:laravel_artisan_migrate_flags)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
desc 'Check syntax error with PHPLint.'
|
174
|
+
task :phplint do
|
175
|
+
invoke 'laravel:artisan', :phplint if fetch(:laravel_phplint)
|
176
|
+
end
|
177
|
+
|
178
|
+
before 'deploy:starting', 'laravel:configure_folders'
|
179
|
+
after 'deploy:symlink:shared', 'laravel:create_linked_acl_paths'
|
180
|
+
after 'deploy:symlink:shared', 'deploy:set_permissions:acl'
|
181
|
+
# after 'deploy:symlink:shared', 'laravel:upload_dotenv_file'
|
182
|
+
before 'deploy:updated', 'laravel:phplint'
|
183
|
+
after 'deploy:updated', 'laravel:optimize_release'
|
184
|
+
|
185
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
namespace :php_fpm do
|
2
|
+
%w(start stop status restart reload force-reload).each do |command|
|
3
|
+
desc "Commands for #{command} php_fpm"
|
4
|
+
task command.to_sym do
|
5
|
+
if (fpm = fetch(:php_fpm, 'php5-fpm')).empty?
|
6
|
+
warn 'miss setting :php_fpm.'
|
7
|
+
else
|
8
|
+
on roles(:app), in: :sequence, wait: 1 do
|
9
|
+
execute :sudo, "service #{fpm} #{command}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
namespace :load do
|
2
|
+
task :defaults do
|
3
|
+
set :server_name, 'localhost'
|
4
|
+
set :nginx_user, 'nginx'
|
5
|
+
set :bind, "unix:/run/php/#{fetch(:php_fpm, 'php5-fpm')}.sock"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
namespace :deploy do
|
10
|
+
|
11
|
+
def render_template(file)
|
12
|
+
StringIO.new(ERB.new(File.read(file)).result(binding))
|
13
|
+
end
|
14
|
+
|
15
|
+
def upload_shared
|
16
|
+
local_shared_path = 'config/deploy/shared'
|
17
|
+
|
18
|
+
files = Dir.entries local_shared_path
|
19
|
+
files.shift(2)
|
20
|
+
|
21
|
+
files.each do |name|
|
22
|
+
local = File.join(local_shared_path, name)
|
23
|
+
target = File.join(shared_path, name)
|
24
|
+
|
25
|
+
if File.file? local
|
26
|
+
if local[-4,4] == '.erb'
|
27
|
+
local = render_template local
|
28
|
+
target = target.gsub('.erb', '')
|
29
|
+
end
|
30
|
+
upload! local, target
|
31
|
+
info "copying: #{name} to: #{target}"
|
32
|
+
|
33
|
+
elsif File.directory? local
|
34
|
+
target = shared_path
|
35
|
+
upload! local, target, recursive: true
|
36
|
+
info "copying: #{name} to: #{target}"
|
37
|
+
|
38
|
+
else
|
39
|
+
error "error #{local} not found"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def upload_config(conf, path)
|
45
|
+
if File.exist? "config/templates/#{conf}.erb"
|
46
|
+
conf_file = render_template "config/templates/#{conf}.erb"
|
47
|
+
elsif File.exist? "config/templates/#{conf}"
|
48
|
+
conf_file = "config/templates/#{conf}"
|
49
|
+
else
|
50
|
+
conf_file = render_template File.expand_path("../../templates/#{conf}.erb", __FILE__)
|
51
|
+
end
|
52
|
+
|
53
|
+
tmp_target = "/tmp/#{fetch(:application)}/#{fetch(:full_app_name)}.#{conf}"
|
54
|
+
target = File.join(path, "#{fetch(:full_app_name)}.conf")
|
55
|
+
upload! conf_file, tmp_target
|
56
|
+
execute :sudo, :mv, "-n #{tmp_target} #{target}"
|
57
|
+
info "Compile & upload #{conf} to: #{target}"
|
58
|
+
end
|
59
|
+
|
60
|
+
desc 'setup config to prepare deploying project.'
|
61
|
+
task :setup_config do
|
62
|
+
on release_roles :all do
|
63
|
+
execute :mkdir, "-p #{shared_path}"
|
64
|
+
|
65
|
+
# compile & upload all the config files
|
66
|
+
upload_shared if File.exist? 'config/deploy/shared'
|
67
|
+
|
68
|
+
# Compile & upload nginx config
|
69
|
+
upload_config 'nginx.conf', fetch(:nginx_server_path) unless fetch(:nginx_server_path).to_s.empty?
|
70
|
+
|
71
|
+
# Compile & upload php-fpm config
|
72
|
+
upload_config 'fpm.conf', fetch(:fpm_pool_path) unless fetch(:fpm_pool_path).to_s.empty?
|
73
|
+
|
74
|
+
# Upload dotenv file to shared path
|
75
|
+
if fetch(:laravel_version) >= 5
|
76
|
+
unless fetch(:laravel_dotenv_file).empty?
|
77
|
+
upload! fetch(:laravel_dotenv_file), "#{shared_path}/.env"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# Load DSL and set up stages
|
2
|
+
require 'capistrano/setup'
|
3
|
+
|
4
|
+
# Include default deployment tasks
|
5
|
+
require 'capistrano/deploy'
|
6
|
+
|
7
|
+
# Include tasks from other gems included in your Gemfile
|
8
|
+
#
|
9
|
+
# For documentation on these, see for example:
|
10
|
+
#
|
11
|
+
# https://github.com/capistrano/laravel
|
12
|
+
#
|
13
|
+
require 'capistrano/laravel'
|
14
|
+
|
15
|
+
# Load custom tasks from `lib/capistrano/tasks` if you have any defined
|
16
|
+
Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# config valid only for current version of Capistrano
|
2
|
+
lock '<%= Capistrano::VERSION %>'
|
3
|
+
|
4
|
+
set :application, 'my_app_name'
|
5
|
+
set :repo_url, 'git@example.com:me/my_repo.git'
|
6
|
+
|
7
|
+
# Default branch is :master
|
8
|
+
# ask :branch, `git rev-parse --abbrev-ref HEAD`.chomp
|
9
|
+
|
10
|
+
# Default deploy_to directory is /var/www/my_app_name
|
11
|
+
# set :deploy_to, '/var/www/my_app_name'
|
12
|
+
|
13
|
+
# Default value for :scm is :git
|
14
|
+
# set :scm, :git
|
15
|
+
|
16
|
+
# Default value for :format is :pretty
|
17
|
+
# set :format, :pretty
|
18
|
+
|
19
|
+
# Default value for :log_level is :debug
|
20
|
+
# set :log_level, :debug
|
21
|
+
|
22
|
+
# Default value for :pty is false
|
23
|
+
set :pty, true
|
24
|
+
|
25
|
+
# Default value for :linked_files is []
|
26
|
+
set :linked_files, ['.env']
|
27
|
+
|
28
|
+
# Default value for linked_dirs is []
|
29
|
+
# set :linked_dirs, []
|
30
|
+
|
31
|
+
# Default value for keep_releases is 5
|
32
|
+
set :keep_releases, 10
|
33
|
+
|
34
|
+
# Default value for php_fpm is php5-fpm
|
35
|
+
set :php_fpm, 'php7.0-fpm'
|
36
|
+
|
37
|
+
# Which roles to execute commands on.
|
38
|
+
set :laravel_roles, :app
|
39
|
+
set :laravel_migrate_roles, :db
|
40
|
+
|
41
|
+
# Default value for :laravel_version is 5.1
|
42
|
+
set :laravel_version, 5.2
|
43
|
+
|
44
|
+
# If using Laravel 5+, a dotenv file is used for environment configuration.
|
45
|
+
# This variable uploads the given file from local to servers, default: './.env.example'
|
46
|
+
# set :laravel_dotenv_file, './.env.example'
|
47
|
+
|
48
|
+
# Default value for :laravel_server_user is true
|
49
|
+
# set :laravel_server_user, 'www-data'
|
50
|
+
|
51
|
+
# Default value for :laravel_phplint is false
|
52
|
+
# set :laravel_phplint, false
|
53
|
+
|
54
|
+
# See more configuration at https://github.com/capistrano/laravel.
|
55
|
+
|
56
|
+
namespace :deploy do
|
57
|
+
after 'deploy:updated', 'laravel:migrate_db'
|
58
|
+
after 'deploy:updated', 'laravel:optimize_config'
|
59
|
+
after 'deploy:updated', 'laravel:optimize_route'
|
60
|
+
after :finishing, 'php_fpm:reload'
|
61
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
[<%= fetch(:full_app_name) %>]
|
2
|
+
|
3
|
+
;prefix = /path/to/pools/$pool
|
4
|
+
|
5
|
+
user = <%= fetch(:laravel_server_user) %>
|
6
|
+
group = <%= fetch(:laravel_server_user) %>
|
7
|
+
|
8
|
+
listen = <%= fetch(:bind).gsub('unix:', '') %>
|
9
|
+
|
10
|
+
;listen.backlog = 511
|
11
|
+
|
12
|
+
listen.owner = <%= fetch(:nginx_user) %>
|
13
|
+
listen.group = <%= fetch(:nginx_user) %>
|
14
|
+
;listen.mode = 0660
|
15
|
+
|
16
|
+
;listen.acl_users =
|
17
|
+
;listen.acl_groups =
|
18
|
+
|
19
|
+
;listen.allowed_clients = 127.0.0.1
|
20
|
+
|
21
|
+
;process.priority = -19
|
22
|
+
|
23
|
+
pm = dynamic
|
24
|
+
pm.max_children = 5
|
25
|
+
pm.start_servers = 2
|
26
|
+
pm.min_spare_servers = 1
|
27
|
+
pm.max_spare_servers = 3
|
28
|
+
;pm.process_idle_timeout = 10s;
|
29
|
+
pm.max_requests = 7200
|
30
|
+
|
31
|
+
;pm.status_path = /status
|
32
|
+
;ping.path = /ping
|
33
|
+
;ping.response = pong
|
34
|
+
|
35
|
+
|
36
|
+
access.log = /data/logs/fpm/$pool.log.access;
|
37
|
+
access.format = "%R - %u %t \"%m %r%Q%q\" %s %f %{mili}d %{kilo}M %C%%"
|
38
|
+
;access.format = "[%{mili}dms] [%{%Y/%m/%d %H:%M:%S}t] %R - %m %s \"%r%Q%q\""
|
39
|
+
|
40
|
+
;slowlog = /data/logs/fpm/$pool.log.slow
|
41
|
+
;request_slowlog_timeout = 0
|
42
|
+
;request_terminate_timeout = 0
|
43
|
+
|
44
|
+
;rlimit_files = 1024
|
45
|
+
;rlimit_core = 0
|
46
|
+
|
47
|
+
;chroot =
|
48
|
+
;chdir = /var/www
|
49
|
+
|
50
|
+
;catch_workers_output = yes
|
51
|
+
;clear_env = no
|
52
|
+
security.limit_extensions = .php .php3 .php4 .php5 .php7
|
53
|
+
|
54
|
+
;env[HOSTNAME] = $HOSTNAME
|
55
|
+
;env[PATH] = /usr/local/bin:/usr/bin:/bin
|
56
|
+
;env[TMP] = /tmp
|
57
|
+
;env[TMPDIR] = /tmp
|
58
|
+
;env[TEMP] = /tmp
|
59
|
+
|
60
|
+
;php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
|
61
|
+
php_admin_flag[display_errors] = off
|
62
|
+
php_admin_value[error_reporting] = E_ERROR | E_PARSE | E_CORE_ERROR
|
63
|
+
php_admin_value[error_log] = /data/logs/fpm/$pool.log.error
|
64
|
+
php_admin_flag[log_errors] = on
|
65
|
+
;php_admin_value[memory_limit] = 32M
|
@@ -0,0 +1,51 @@
|
|
1
|
+
log_format customized_<%= fetch(:application) %>
|
2
|
+
'$remote_addr:$remote_port '
|
3
|
+
'$tcpinfo_rtt(±$tcpinfo_rttvar)μs '
|
4
|
+
'[$time_iso8601] $request_time "$request" '
|
5
|
+
'$status $body_bytes_sent "$http_referer" '
|
6
|
+
'"$http_user_agent" "$http_x_forwarded_for" '
|
7
|
+
'UPSTREAM $upstream_addr $upstream_response_time $upstream_status';
|
8
|
+
|
9
|
+
server {
|
10
|
+
listen 80;
|
11
|
+
server_name <%= fetch(:server_name) %>;
|
12
|
+
root <%= fetch(:deploy_to) %>/current/public;
|
13
|
+
|
14
|
+
index index.php index.html index.htm;
|
15
|
+
|
16
|
+
access_log /data/logs/nginx/<%= fetch(:application) %>.log customized_<%= fetch(:application) %>;
|
17
|
+
error_log /data/logs/nginx/<%= fetch(:application) %>.error.log warn;
|
18
|
+
|
19
|
+
# 修改为 Laravel 转发规则
|
20
|
+
location / {
|
21
|
+
try_files $uri $uri/ /index.php?$query_string;
|
22
|
+
}
|
23
|
+
|
24
|
+
# PHP 支持
|
25
|
+
location ~ \.php$ {
|
26
|
+
try_files $uri /index.php =404;
|
27
|
+
fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
28
|
+
fastcgi_pass <%= fetch(:bind) %>;
|
29
|
+
fastcgi_index index.php;
|
30
|
+
include fastcgi.conf;
|
31
|
+
|
32
|
+
#fastcgi_intercept_errors on;
|
33
|
+
}
|
34
|
+
|
35
|
+
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
|
36
|
+
expires 30d;
|
37
|
+
access_log off;
|
38
|
+
log_not_found off;
|
39
|
+
}
|
40
|
+
|
41
|
+
location ~ .*\.(js|css)?$ {
|
42
|
+
expires 7d;
|
43
|
+
access_log off;
|
44
|
+
}
|
45
|
+
|
46
|
+
location = /favicon.ico { access_log off; log_not_found off; }
|
47
|
+
location = /robots.txt { access_log off; log_not_found off; }
|
48
|
+
location = /download.html { access_log off; log_not_found off; }
|
49
|
+
|
50
|
+
# error_page 500 502 503 504 /50x.html;
|
51
|
+
}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
set :stage, :<%= entry[:stage] %>
|
2
|
+
set :branch, ENV['BRANCH'] || 'master'
|
3
|
+
|
4
|
+
# used in case we're deploying multiple versions of the same
|
5
|
+
# app side by side. Also provides quick sanity checks when looking
|
6
|
+
# at filepaths
|
7
|
+
set :full_app_name, "#{fetch(:application)}_#{fetch(:stage)}"
|
8
|
+
|
9
|
+
set :deploy_to, "/data/projects/#{fetch(:application)}"
|
10
|
+
set :enable_ssl, false
|
11
|
+
|
12
|
+
# server-based syntax
|
13
|
+
# ======================
|
14
|
+
# Defines a single server with a list of roles and multiple properties.
|
15
|
+
# You can define all roles on a single server, or split them:
|
16
|
+
|
17
|
+
# server 'example.com', user: 'deploy', roles: %w{app db web}, my_property: :my_value
|
18
|
+
# server 'example.com', user: 'deploy', roles: %w{app web}, other_property: :other_value
|
19
|
+
# server 'db.example.com', user: 'deploy', roles: %w{db}
|
20
|
+
|
21
|
+
# setup_config options
|
22
|
+
# ======================
|
23
|
+
# Server name use for nginx, default: localhost
|
24
|
+
# set :server_name, 'localhost'
|
25
|
+
|
26
|
+
# Which user to run nginx, default: nginx
|
27
|
+
# set :nginx_user, 'nginx'
|
28
|
+
|
29
|
+
# Bind for php-fpm, default: unix:/run/php/#{fetch(:php_fpm)}.sock
|
30
|
+
# set :bind, '127.0.0.1:8080'
|
31
|
+
|
32
|
+
# Where to set fpm pool config, default: nil
|
33
|
+
# if nil or empty, fpm_pool config will not be set up automatically
|
34
|
+
# set :fpm_pool_path, ''
|
35
|
+
|
36
|
+
# Where to set nginx server config, default: nil
|
37
|
+
# if nil or empty, nginx_server config will not be set up automatically
|
38
|
+
# set :nginx_server_path, ''
|
File without changes
|
metadata
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-laravel-lazy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ivan Chou
|
8
|
+
- Peter Mitchell
|
9
|
+
- Andrew Miller
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2016-08-18 00:00:00.000000000 Z
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: capistrano
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- - "~>"
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
requirements:
|
26
|
+
- - "~>"
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
version: '3.0'
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: capistrano-composer
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - "~>"
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.0.6
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - "~>"
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.0.6
|
43
|
+
- !ruby/object:Gem::Dependency
|
44
|
+
name: capistrano-file-permissions
|
45
|
+
requirement: !ruby/object:Gem::Requirement
|
46
|
+
requirements:
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '1.0'
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - "~>"
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: '1.0'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: bundler
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '1.3'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '1.3'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: rake
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - "~>"
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '10.4'
|
78
|
+
type: :development
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - "~>"
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '10.4'
|
85
|
+
description: Laravel specific deployment options for Capistrano 3.x
|
86
|
+
email:
|
87
|
+
- yiichou@gmail.com
|
88
|
+
- peterjmit@gmail.com
|
89
|
+
- ikari7789@yahoo.com
|
90
|
+
executables:
|
91
|
+
- cap_laravel
|
92
|
+
extensions: []
|
93
|
+
extra_rdoc_files: []
|
94
|
+
files:
|
95
|
+
- ".gitignore"
|
96
|
+
- Gemfile
|
97
|
+
- LICENSE
|
98
|
+
- README.md
|
99
|
+
- Rakefile
|
100
|
+
- bin/cap_laravel
|
101
|
+
- capistrano-laravel.gemspec
|
102
|
+
- lib/capistrano-laravel.rb
|
103
|
+
- lib/capistrano/laravel.rb
|
104
|
+
- lib/capistrano/laravel/helpers.rb
|
105
|
+
- lib/capistrano/laravel/version.rb
|
106
|
+
- lib/capistrano/tasks/laravel.rake
|
107
|
+
- lib/capistrano/tasks/php_fpm.rake
|
108
|
+
- lib/capistrano/tasks/setup_config.rake
|
109
|
+
- lib/capistrano/templates/Capfile
|
110
|
+
- lib/capistrano/templates/deploy.rb.erb
|
111
|
+
- lib/capistrano/templates/fpm.conf.erb
|
112
|
+
- lib/capistrano/templates/nginx.conf.erb
|
113
|
+
- lib/capistrano/templates/stage.rb.erb
|
114
|
+
homepage: https://github.com/IvanChou/laravel/tree/lazy
|
115
|
+
licenses:
|
116
|
+
- MIT
|
117
|
+
metadata: {}
|
118
|
+
post_install_message:
|
119
|
+
rdoc_options: []
|
120
|
+
require_paths:
|
121
|
+
- lib
|
122
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
127
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
requirements: []
|
133
|
+
rubyforge_project:
|
134
|
+
rubygems_version: 2.5.1
|
135
|
+
signing_key:
|
136
|
+
specification_version: 4
|
137
|
+
summary: Laravel deployment for Capistrano 3.x
|
138
|
+
test_files: []
|