appserver 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,85 +0,0 @@
1
- # This is an appserver directory configuration of the "appserver" gem. Use the
2
- # "appserver" command or visit http://github.com/zargony/appserver for details
3
-
4
- #
5
- # SERVER SETTINGS
6
- # Non application specific. Paths are relative to the appserver directory. The
7
- # appserver directory is the directory, that contains this configuration file.
8
- #
9
-
10
- # Path to the default directory of git repositories that contain the
11
- # applications to deploy. Defaults to the home directory of the user 'git'
12
- #repo_dir: /var/git
13
-
14
- # Path/name of the Monit configuration snippet that should be written
15
- #monit_conf: monitrc
16
-
17
- # Command to execute to tell Monit to reload the configuration. Used within
18
- # the Monit snippet, so this command will be called as root
19
- #monit_reload: /usr/sbin/monit reload
20
-
21
- # Path/name of the Nginx configuration snippet that should be written
22
- #nginx_conf: nginx.conf
23
-
24
- # Command to execute to tell Nginx to reload the configuration. Used within
25
- # the Monit snippet, so this command will be called as root
26
- #nginx_reload: /usr/sbin/nginx -s reload
27
-
28
-
29
- #
30
- # APPLICATION SETTINGS
31
- # Can be either specified globally for all applications or application-
32
- # specific under the "apps" subtree (see examples at the bottom of this file).
33
- # Paths are relative to the respective application directory. Every deployed
34
- # application has it's own directory under the appserver directory.
35
- #
36
-
37
- # Name/path of unicorn
38
- #unicorn: /usr/local/bin/unicorn
39
-
40
- # Environment to run the application in. Defaults to 'production'
41
- #environment: production
42
-
43
- # Default number of application instances (unicorn workers)
44
- #instances: 3
45
-
46
- # Let Monit watch the CPU usage of instances and restart them if their
47
- # CPU usage exceeds this value
48
- #max_cpu_usage:
49
-
50
- # Let Monit watch the memory usage of instances and restart them if their
51
- # memory usage exceeds this value
52
- #max_memory_usage:
53
-
54
- # When doing CPU/memory usage checks, only restart an instance if it exceeds
55
- # a resource for at least this number of Monit cycles
56
- #usage_check_cycles: 5
57
-
58
- # Let Monit check periodically, if instances provide an answer to HTTP
59
- # requests within the given timeout, or restart them if they don't. Set
60
- # to 0 to disable
61
- #http_check_timeout: 30
62
-
63
- # The hostname, Nginx should accept requests for. You most porbably want to
64
- # specify the hostname for every application below. If an application has no
65
- # hostname set, a subdomain of this default hostname will be used. Defaults
66
- # to the system's domainname.
67
- #hostname: example.com
68
-
69
- # Path where public static files should be served from. Defaults to the public
70
- # directory in the application
71
- #public_dir: public
72
-
73
-
74
- #
75
- # APPLICATIONS
76
- # All application default settings from above can be overridden for every
77
- # application. You most probably want to set "hostname" to your liking here.
78
- # Most other settings should do well with their defaults in most cases.
79
- #
80
-
81
- #apps:
82
- # # A simple blog application named "myblog"
83
- # myblog:
84
- # hostname: blog.example.com
85
- # instances: 1
@@ -1,136 +0,0 @@
1
- require 'etc'
2
- require 'yaml'
3
-
4
- module Appserver
5
- class Server < Struct.new(:dir, :repo_dir, :monit_conf, :monit_reload, :nginx_conf, :nginx_reload)
6
- class AlreadyInitializedError < RuntimeError; end
7
- class DirectoryNotEmptyError < RuntimeError; end
8
- class NotInitializedError < RuntimeError; end
9
-
10
- include Utils
11
-
12
- DEFAULTS = {
13
- :repo_dir => (Etc.getpwnam('git') rescue {})[:dir],
14
- :monit_conf => 'monitrc',
15
- :monit_reload => '/usr/sbin/monit reload',
16
- :nginx_conf => 'nginx.conf',
17
- :nginx_reload => '/usr/sbin/nginx -s reload',
18
- }
19
-
20
- def self.config_file_template
21
- File.expand_path('../appserver.yml', __FILE__)
22
- end
23
-
24
- def self.search_dir (path = Dir.pwd)
25
- if File.exist?(File.join(path, 'appserver.yml'))
26
- path
27
- elsif path =~ %r(/)
28
- search_dir(path.sub(%r(/[^/]*$), ''))
29
- else
30
- nil
31
- end
32
- end
33
-
34
- def self.initialize_dir (options = {})
35
- raise AlreadyInitializedError if search_dir && !options[:force]
36
- raise DirectoryNotEmptyError if Dir.glob('*') != [] && !options[:force]
37
- safe_replace_file('appserver.yml') do |f|
38
- f.puts File.read(config_file_template)
39
- end
40
- ['tmp', 'log'].each do |dir|
41
- Dir.mkdir(dir) if !File.directory?(dir)
42
- end
43
- end
44
-
45
- def initialize (options = {})
46
- super()
47
- # Search upwards for the appserver dir
48
- self.dir = self.class.search_dir
49
- raise NotInitializedError unless dir
50
- # Load configuration settings
51
- @config = load_config(config_file)
52
- DEFAULTS.each do |key, default_value|
53
- self[key] = @config[key] || default_value
54
- end
55
- end
56
-
57
- def config_file
58
- File.join(dir, 'appserver.yml')
59
- end
60
-
61
- def tmp_dir
62
- File.join(dir, 'tmp')
63
- end
64
-
65
- def log_dir
66
- File.join(dir, 'log')
67
- end
68
-
69
- def app (name)
70
- @apps ||= {}
71
- @apps[name] ||= App.new(self, name, @config)
72
- end
73
-
74
- def apps
75
- Dir.glob(File.join(dir, '*')).select { |f| File.directory?(f) }.map { |f| File.basename(f) }.map { |name| app(name) }
76
- end
77
-
78
- def repository (name_or_path)
79
- path = name_or_path =~ %r(/) ? expand_path(name_or_path) : File.expand_path("#{name_or_path}.git", repo_dir)
80
- @repositories ||= {}
81
- @repositories[path] ||= Repository.new(self, path, @config)
82
- end
83
-
84
- def repositories
85
- Dir.glob(File.join(repo_dir, '*.git')).select { |f| File.directory?(f) }.map { |path| repository(path) }
86
- end
87
-
88
- def write_configs
89
- # Write Monit configuration file
90
- safe_replace_file(monit_conf) do |f|
91
- f.puts %Q(# Monit configuration automagically generated by the "appserver" gem using)
92
- f.puts %Q(# the appserver directory config #{expand_path(config_file)})
93
- f.puts %Q(# Include this file into your system's monitrc (using an include statement))
94
- f.puts %Q(# to use it. See http://github.com/zargony/appserver for details.)
95
- # Let Monit reload itself if this configuration changes
96
- f.puts %Q(check file monit_conf with path #{expand_path(monit_conf)})
97
- f.puts %Q( if changed checksum then exec "#{monit_reload}")
98
- # Reload Nginx if its configuration changes
99
- f.puts %Q(check file nginx_conf with path #{expand_path(nginx_conf)})
100
- f.puts %Q( if changed checksum then exec "#{nginx_reload}")
101
- # Add application-specific Monit configuration
102
- apps.each do |app|
103
- app.write_monit_config(f)
104
- end
105
- end
106
- # Write Nginx configuration file
107
- safe_replace_file(nginx_conf) do |f|
108
- f.puts %Q(# Nginx configuration automagically generated by the "appserver" gem using)
109
- f.puts %Q(# the appserver directory config #{expand_path(config_file)})
110
- f.puts %Q(# Include this file into your system's nginx.conf \(using an include statement)
111
- f.puts %Q(# inside a http statement\) to use it. See http://github.com/zargony/appserver)
112
- f.puts %Q(# for details.)
113
- # The default server always responds with 403 Forbidden
114
- f.puts %Q(server {)
115
- f.puts %Q( listen 80 default;)
116
- f.puts %Q( server_name _;)
117
- f.puts %Q( deny all;)
118
- f.puts %Q(})
119
- # Add application-specific Nginx configuration
120
- apps.each do |app|
121
- app.write_nginx_config(f)
122
- end
123
- end
124
- end
125
-
126
- protected
127
-
128
- def expand_path (path)
129
- File.expand_path(path, dir)
130
- end
131
-
132
- def load_config (filename)
133
- symbolize_keys(YAML.load_file(filename) || {})
134
- end
135
- end
136
- end