orchestration 0.3.17 → 0.4.0
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 +4 -4
- data/.gitignore +4 -0
- data/LICENSE +7 -0
- data/MANIFEST +76 -0
- data/Makefile +3 -3
- data/README.md +162 -137
- data/Rakefile +2 -2
- data/config/locales/en.yml +3 -1
- data/lib/orchestration/docker_compose/app_service.rb +84 -13
- data/lib/orchestration/docker_compose/compose_configuration.rb +69 -0
- data/lib/orchestration/docker_compose/database_service.rb +15 -13
- data/lib/orchestration/docker_compose/install_generator.rb +3 -2
- data/lib/orchestration/docker_compose/mongo_service.rb +5 -5
- data/lib/orchestration/docker_compose/rabbitmq_service.rb +2 -3
- data/lib/orchestration/docker_compose.rb +1 -0
- data/lib/orchestration/environment.rb +19 -6
- data/lib/orchestration/errors.rb +1 -1
- data/lib/orchestration/file_helpers.rb +27 -4
- data/lib/orchestration/install_generator.rb +85 -20
- data/lib/orchestration/services/app/configuration.rb +9 -5
- data/lib/orchestration/services/app/healthcheck.rb +1 -22
- data/lib/orchestration/services/database/adapters/mysql2.rb +13 -2
- data/lib/orchestration/services/database/adapters/postgresql.rb +0 -1
- data/lib/orchestration/services/database/configuration.rb +68 -75
- data/lib/orchestration/services/database/healthcheck.rb +10 -1
- data/lib/orchestration/services/listener/configuration.rb +1 -1
- data/lib/orchestration/services/listener/healthcheck.rb +2 -2
- data/lib/orchestration/services/{configuration_base.rb → mixins/configuration_base.rb} +15 -13
- data/lib/orchestration/services/{healthcheck_base.rb → mixins/healthcheck_base.rb} +3 -2
- data/lib/orchestration/services/mixins/http_healthcheck.rb +38 -0
- data/lib/orchestration/services/mongo/configuration.rb +37 -63
- data/lib/orchestration/services/mongo/healthcheck.rb +3 -32
- data/lib/orchestration/services/rabbitmq/configuration.rb +11 -22
- data/lib/orchestration/services/rabbitmq/healthcheck.rb +2 -2
- data/lib/orchestration/services.rb +3 -2
- data/lib/orchestration/templates/Dockerfile.erb +8 -4
- data/lib/orchestration/templates/database.yml.erb +32 -0
- data/lib/orchestration/templates/deploy.mk.erb +2 -2
- data/lib/orchestration/templates/entrypoint.sh.erb +13 -4
- data/lib/orchestration/templates/env.erb +10 -2
- data/lib/orchestration/templates/healthcheck.rb.erb +56 -0
- data/lib/orchestration/templates/makefile_macros.mk.erb +108 -0
- data/lib/orchestration/templates/mongoid.yml.erb +18 -0
- data/lib/orchestration/templates/orchestration.mk.erb +242 -120
- data/lib/orchestration/templates/puma.rb.erb +19 -0
- data/lib/orchestration/templates/rabbitmq.yml.erb +12 -0
- data/lib/orchestration/templates/unicorn.rb.erb +5 -5
- data/lib/orchestration/terminal.rb +13 -15
- data/lib/orchestration/version.rb +1 -1
- data/lib/orchestration.rb +20 -2
- data/lib/tasks/orchestration.rake +3 -1
- data/orchestration.gemspec +3 -5
- metadata +23 -13
@@ -0,0 +1,32 @@
|
|
1
|
+
default: &default
|
2
|
+
adapter: <%= compose.call(nil).database_adapter_name %>
|
3
|
+
|
4
|
+
<% if compose.call(nil).services.key?('database') %>
|
5
|
+
development:
|
6
|
+
<<: *default
|
7
|
+
host: 127.0.0.1
|
8
|
+
port: <%= compose.call('development').local_port('database') %>
|
9
|
+
username: <%= compose.call(nil).database_adapter.credentials['username'] %>
|
10
|
+
password: <%= compose.call(nil).database_adapter.credentials['password'] %>
|
11
|
+
database: <%= compose.call(nil).database_adapter.credentials['database'] %>
|
12
|
+
<% end %>
|
13
|
+
|
14
|
+
<% if compose.call('test').services.key?('database') %>
|
15
|
+
test:
|
16
|
+
<<: *default
|
17
|
+
host: 127.0.0.1
|
18
|
+
port: <%= compose.call('test').local_port('database') %>
|
19
|
+
username: <%= compose.call(nil).database_adapter.credentials['username'] %>
|
20
|
+
password: <%= compose.call(nil).database_adapter.credentials['password'] %>
|
21
|
+
database: <%= compose.call(nil).database_adapter.credentials['database'] %>
|
22
|
+
# Useful for certain continuous integration environments (e.g. Jenkins in
|
23
|
+
# Docker) where the DB hostname may be a service name rather than `127.0.0.1`:
|
24
|
+
<%% if ENV.key?('DATABASE_URL') %>
|
25
|
+
url: <%%= ENV['DATABASE_URL'] %>
|
26
|
+
<%% end %>
|
27
|
+
<% end %>
|
28
|
+
|
29
|
+
|
30
|
+
production:
|
31
|
+
<<: *default
|
32
|
+
url: <%%= ENV['DATABASE_URL'] %>
|
@@ -1,9 +1,18 @@
|
|
1
1
|
#!/bin/sh
|
2
|
-
set -
|
2
|
+
set -ue
|
3
|
+
echo "Host user ID: ${HOST_UID}"
|
4
|
+
set +u
|
3
5
|
id owner >/dev/null 2>&1 || useradd -u ${HOST_UID} -m -o owner
|
4
6
|
mkdir -p /app/tmp/pids
|
5
7
|
chown -Rf owner:owner /app/tmp /app/log /app/db
|
6
|
-
rm -f /app/tmp/pids/
|
7
|
-
|
8
|
-
|
8
|
+
rm -f /app/tmp/pids/server.pid
|
9
|
+
|
10
|
+
DOCKER_HOST_IP="$(ip route | awk '/default/ { print $3 }' 2>/dev/null)"
|
11
|
+
if printf "${DOCKER_HOST_IP}" | egrep -q '([0-9]{1,3}[\.]){3}[0-9]{1,3}' \
|
12
|
+
&& [ ! $(grep -q "${DOCKER_HOST_IP} host.docker.internal" '/etc/hosts') ]
|
13
|
+
then
|
14
|
+
echo "Host IP: ${DOCKER_HOST_IP}"
|
15
|
+
echo "${DOCKER_HOST_IP} host.docker.internal" >> '/etc/hosts'
|
16
|
+
fi
|
17
|
+
|
9
18
|
exec gosu owner "$@"
|
@@ -1,2 +1,10 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# Configure which port your `app` service will listen on:
|
2
|
+
CONTAINER_PORT=3000
|
3
|
+
|
4
|
+
# Use `make deploy` to deploy your application stack to a Docker Swarm.
|
5
|
+
# Use this setting to control the number of replicas to create for your
|
6
|
+
# application service:
|
7
|
+
REPLICAS=1
|
8
|
+
|
9
|
+
# Development database:
|
10
|
+
DATABASE_URL=<%= env.database_url %>
|
@@ -0,0 +1,56 @@
|
|
1
|
+
#
|
2
|
+
# Orchestration Healthcheck Utility
|
3
|
+
#
|
4
|
+
#
|
5
|
+
# https://github.com/bobf/orchestration
|
6
|
+
#
|
7
|
+
|
8
|
+
require 'net/http'
|
9
|
+
|
10
|
+
def run
|
11
|
+
client = Net::HTTP.new(
|
12
|
+
ENV.fetch('WEB_HOST', 'localhost'),
|
13
|
+
ENV.fetch('WEB_PORT', '8080').to_i
|
14
|
+
)
|
15
|
+
|
16
|
+
client.read_timeout = ENV.fetch('WEB_HEALTHCHECK_READ_TIMEOUT', '10').to_i
|
17
|
+
client.open_timeout = ENV.fetch('WEB_HEALTHCHECK_OPEN_TIMEOUT', '10').to_i
|
18
|
+
|
19
|
+
client.start do |request|
|
20
|
+
request.get(ENV.fetch('WEB_HEALTHCHECK_PATH') { '/' })
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def success_codes
|
25
|
+
ENV.fetch('WEB_HEALTHCHECK_SUCCESS_CODES', '200,202,204').split(',')
|
26
|
+
end
|
27
|
+
|
28
|
+
def success?(code)
|
29
|
+
success_codes.include?(code.to_s)
|
30
|
+
end
|
31
|
+
|
32
|
+
def message(code)
|
33
|
+
if success?(code)
|
34
|
+
outcome = 'SUCCESS ✓ '
|
35
|
+
in_or_not = 'IN'
|
36
|
+
else
|
37
|
+
outcome = 'FAILURE ✘ '
|
38
|
+
in_or_not = 'NOT IN'
|
39
|
+
end
|
40
|
+
|
41
|
+
accepted = success_codes.join(', ')
|
42
|
+
|
43
|
+
"# HTTP_STATUS(#{code}) #{in_or_not} [#{accepted}] : #{outcome} [#{__FILE__}]"
|
44
|
+
end
|
45
|
+
|
46
|
+
return_code = 1
|
47
|
+
|
48
|
+
begin
|
49
|
+
response = run
|
50
|
+
return_code = 0 if success?(response.code)
|
51
|
+
puts message(response.code)
|
52
|
+
rescue Exception => e
|
53
|
+
puts "[#{__FILE__}] ERROR: #{e.inspect}"
|
54
|
+
ensure
|
55
|
+
exit return_code
|
56
|
+
end
|
@@ -0,0 +1,108 @@
|
|
1
|
+
is_container:=$(shell [ -f './.orchestration_container_flag' ] && echo -n '1' || echo -n '0')
|
2
|
+
TERM ?= 'dumb'
|
3
|
+
pwd:=$(shell pwd)
|
4
|
+
ifdef mounted_orchestration
|
5
|
+
orchestration_dir=$(mounted_orchestration)
|
6
|
+
else
|
7
|
+
orchestration_dir=${pwd}/<%= env.orchestration_dir_name %>
|
8
|
+
endif
|
9
|
+
|
10
|
+
ifdef env_file
|
11
|
+
custom_env_file ?= 1
|
12
|
+
else
|
13
|
+
custom_env_file ?= 0
|
14
|
+
endif
|
15
|
+
|
16
|
+
ifneq (,$(wildcard ${pwd}/config/database.yml))
|
17
|
+
database_enabled = 1
|
18
|
+
else
|
19
|
+
database_enabled = 0
|
20
|
+
endif
|
21
|
+
|
22
|
+
make=$(MAKE) $1
|
23
|
+
orchestration_config_filename:=.orchestration.yml
|
24
|
+
orchestration_config:=${pwd}/${orchestration_config_filename}
|
25
|
+
print_error=printf '${red}\#${reset} '$1 | tee '${stderr}'
|
26
|
+
println_error=$(call print_error,$1'\n')
|
27
|
+
print=printf '${blue}\#${reset} '$1
|
28
|
+
println=$(call print,$1'\n')
|
29
|
+
printraw=printf $1
|
30
|
+
printrawln=$(call printraw,$1'\n')
|
31
|
+
stdout=${pwd}/log/orchestration.stdout.log
|
32
|
+
stderr=${pwd}/log/orchestration.stderr.log
|
33
|
+
log_path_length=$(shell echo "${stdout}" | wc -c)
|
34
|
+
log:= >>${stdout} 2>>${stderr}
|
35
|
+
progress_point:=perl -e 'while( my $$line = <STDIN> ) { printf("."); select()->flush(); }'
|
36
|
+
log_progress:= > >(tee -ai ${stdout} >&1 | ${progress_point}) 2> >(tee -ai ${stderr} 2>&1 | ${progress_point})
|
37
|
+
red:=$(shell tput setaf 1)
|
38
|
+
green:=$(shell tput setaf 2)
|
39
|
+
yellow:=$(shell tput setaf 3)
|
40
|
+
blue:=$(shell tput setaf 4)
|
41
|
+
magenta:=$(shell tput setaf 5)
|
42
|
+
cyan:=$(shell tput setaf 6)
|
43
|
+
gray:=$(shell tput setaf 7)
|
44
|
+
reset:=$(shell tput sgr0)
|
45
|
+
tick=[${green}✓${reset}]
|
46
|
+
cross=[${red}✘${reset}]
|
47
|
+
warn=[${yellow}!${reset}]
|
48
|
+
hr=$(call println,"$1$(shell head -c ${log_path_length} < /dev/zero | tr '\0' '=')${reset}")
|
49
|
+
managed_env_tag:=\# -|- ORCHESTRATION
|
50
|
+
standard_env_path:=${pwd}/.env
|
51
|
+
backup_env_path:=${pwd}/.env.orchestration.backup
|
52
|
+
is_managed_env:=$$(test -f '${standard_env_path}' && tail -n 1 '${standard_env_path}') == "${managed_env_tag}"*
|
53
|
+
|
54
|
+
back_up_env:=( \
|
55
|
+
[ ! -f '${standard_env_path}' ] \
|
56
|
+
|| \
|
57
|
+
( \
|
58
|
+
[ -f '${standard_env_path}' ] \
|
59
|
+
&& cp '${standard_env_path}' '${backup_env_path}' \
|
60
|
+
) \
|
61
|
+
)
|
62
|
+
|
63
|
+
replace_env:=( \
|
64
|
+
( [ "${custom_env_file}" == "0" ] ) \
|
65
|
+
|| \
|
66
|
+
( \
|
67
|
+
[ "${custom_env_file}" == "1" ] \
|
68
|
+
&& ${back_up_env} \
|
69
|
+
&& cp ${env_file} '${standard_env_path}' \
|
70
|
+
&& $(call printraw,'\n${managed_env_tag}') >> '${standard_env_path}' \
|
71
|
+
) \
|
72
|
+
)
|
73
|
+
|
74
|
+
restore_env:=( \
|
75
|
+
( \
|
76
|
+
[[ ! ${is_managed_env} ]] \
|
77
|
+
|| [ ! -f '${backup_env_path}' ] \
|
78
|
+
) \
|
79
|
+
|| \
|
80
|
+
( \
|
81
|
+
[ -f '${backup_env_path}' ] \
|
82
|
+
&& [[ ${is_managed_env} ]] \
|
83
|
+
&& mv '${backup_env_path}' '${standard_env_path}' \
|
84
|
+
) \
|
85
|
+
)
|
86
|
+
|
87
|
+
key_chars:=[a-zA-Z0-9_]
|
88
|
+
censored:=**********
|
89
|
+
censor=sed 's/\(^${key_chars}*$(1)${key_chars}*\)=\(.*\)$$/\1=${censored}/'
|
90
|
+
censor_urls:=sed 's|\([a-zA-Z0-9_+]\+://.*:\).*\(@.*\)$$|\1${censored}\2|'
|
91
|
+
format_env:=$(call censor,SECRET) | \
|
92
|
+
$(call censor,PASSWORD) | \
|
93
|
+
$(call censor,TOKEN) | \
|
94
|
+
$(call censor,PRIVATE) | \
|
95
|
+
$(call censor,KEY) | \
|
96
|
+
${censor_urls} | \
|
97
|
+
sed 's/\(^[a-zA-Z0-9_]\+\)=/${blue}\1${reset}=/' | \
|
98
|
+
sed 's/^/ /' | \
|
99
|
+
sed 's/=\(.*\)$$/=${yellow}\1${reset}/'
|
100
|
+
|
101
|
+
fail=( \
|
102
|
+
$(call printraw,' ${cross}') ; \
|
103
|
+
${restore_env} ; \
|
104
|
+
$(call make,dump) ; \
|
105
|
+
echo ; \
|
106
|
+
$(call println,'Failed. ${cross}') ; \
|
107
|
+
exit 1 \
|
108
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
development:
|
2
|
+
clients:
|
3
|
+
default:
|
4
|
+
hosts:
|
5
|
+
- 127.0.0.1:<%= compose.call('development').local_port('mongo') %>
|
6
|
+
database: development_db
|
7
|
+
|
8
|
+
test:
|
9
|
+
clients:
|
10
|
+
default:
|
11
|
+
hosts:
|
12
|
+
- 127.0.0.1:<%= compose.call('test').local_port('mongo') %>
|
13
|
+
database: test_db
|
14
|
+
|
15
|
+
production:
|
16
|
+
clients:
|
17
|
+
default:
|
18
|
+
uri: <%%= ENV['MONGO_URL'] %>
|