Merge pull request #7146 from opf/merge/table-refresh
Merging 8.3.1 into dev [ci skip]pull/7151/head
commit
31b32d25b5
@ -1,39 +0,0 @@ |
||||
FROM openproject/community:8-base |
||||
MAINTAINER operations@openproject.com |
||||
|
||||
ENV DATABASE_URL=postgres://openproject:openproject@127.0.0.1/openproject |
||||
ENV RAILS_ENV=production |
||||
ENV HEROKU=true |
||||
ENV ATTACHMENTS_STORAGE_PATH=/var/db/openproject/files |
||||
ENV RAILS_CACHE_STORE=memcache |
||||
ENV SECRET_KEY_BASE=OVERWRITE_ME |
||||
ENV OPENPROJECT_INSTALLATION__TYPE=docker |
||||
|
||||
USER root |
||||
RUN apt-get update -qq && \ |
||||
DEBIAN_FRONTEND=noninteractive apt-get install -y \ |
||||
memcached \ |
||||
postfix \ |
||||
postgresql \ |
||||
apache2 \ |
||||
supervisor \ |
||||
pandoc && \ |
||||
apt-get clean && rm -rf /var/lib/apt/lists/* |
||||
|
||||
RUN a2enmod proxy proxy_http && rm -f /etc/apache2/sites-enabled/000-default.conf |
||||
|
||||
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.6/main/pg_hba.conf |
||||
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.6/main/postgresql.conf |
||||
RUN rm -rf /var/lib/postgresql/9.6/main && mkdir -p /var/lib/postgresql/9.6/main && chown -R postgres:postgres /var/lib/postgresql/9.6 |
||||
RUN mkdir -p /var/db/openproject/{files,git,svn} && chown -R app:app /var/db/openproject |
||||
|
||||
COPY docker /usr/src/app/docker |
||||
COPY docker/supervisord.conf /etc/supervisor/conf.d/supervisord.conf |
||||
|
||||
# ports |
||||
EXPOSE 80 5432 |
||||
|
||||
# volumes to export |
||||
VOLUME ["/var/lib/postgresql/9.6/main", "/var/db/openproject"] |
||||
|
||||
ENTRYPOINT ["/usr/src/app/docker/entrypoint-all-in-one.sh"] |
@ -1,3 +0,0 @@ |
||||
web: ./docker/web |
||||
worker: ./docker/worker |
||||
cron: ./docker/cron |
@ -0,0 +1,3 @@ |
||||
#!/bin/bash |
||||
set -e |
||||
exec bundle exec rails c |
@ -1,12 +1,52 @@ |
||||
#!/bin/bash |
||||
|
||||
set -e |
||||
set -o pipefail |
||||
|
||||
# handle legacy configs |
||||
if [ -d "$PGDATA_LEGACY" ]; then |
||||
echo "WARN: You are using a legacy volume path for your postgres data. You should mount your postgres volumes at $PGDATA instead of $PGDATA_LEGACY." |
||||
if [ "$(find "$PGDATA" -type f | wc -l)" = "0" ]; then |
||||
echo "INFO: $PGDATA is empty, so $PGDATA will be symlinked to $PGDATA_LEGACY as a temporary measure." |
||||
sed -i "s|$PGDATA|$PGDATA_LEGACY|" /etc/postgresql/9.6/main/postgresql.conf |
||||
export PGDATA="$PGDATA_LEGACY" |
||||
else |
||||
echo "ERROR: $PGDATA contains files, so we will not attempt to symlink $PGDATA to $PGDATA_LEGACY. Please fix your docker configuration." |
||||
exit 2 |
||||
fi |
||||
fi |
||||
|
||||
if [ -d "$APP_DATA_PATH_LEGACY" ]; then |
||||
echo "WARN: You are using a legacy volume path for your openproject data. You should mount your openproject volume at $APP_DATA_PATH instead of $APP_DATA_PATH_LEGACY." |
||||
if [ "$(find "$APP_DATA_PATH" -type f | wc -l)" = "0" ]; then |
||||
echo "INFO: $APP_DATA_PATH is empty, so $APP_DATA_PATH will be symlinked to $APP_DATA_PATH_LEGACY as a temporary measure." |
||||
# also set ATTACHMENTS_STORAGE_PATH back to its legacy value in case it hasn't been changed |
||||
if [ "$ATTACHMENTS_STORAGE_PATH" = "$APP_DATA_PATH/files" ]; then |
||||
export ATTACHMENTS_STORAGE_PATH="$APP_DATA_PATH_LEGACY/files" |
||||
fi |
||||
export APP_DATA_PATH="$APP_DATA_PATH_LEGACY" |
||||
else |
||||
echo "ERROR: $APP_DATA_PATH contains files, so we will not attempt to symlink $APP_DATA_PATH to $APP_DATA_PATH_LEGACY. Please fix your docker configuration." |
||||
exit 2 |
||||
fi |
||||
fi |
||||
|
||||
if [ "$(id -u)" = '0' ]; then |
||||
chown -R $APP_USER:$APP_USER $APP_PATH $APP_DATA /usr/local |
||||
sync |
||||
exec $APP_PATH/docker/gosu $APP_USER "$BASH_SOURCE" "$@" |
||||
mkdir -p $APP_DATA_PATH/{files,git,svn} |
||||
chown -R $APP_USER:$APP_USER $APP_DATA_PATH |
||||
|
||||
if [ ! -z "$ATTACHMENTS_STORAGE_PATH" ]; then |
||||
mkdir -p "$ATTACHMENTS_STORAGE_PATH" |
||||
chown -R "$APP_USER:$APP_USER" "$ATTACHMENTS_STORAGE_PATH" |
||||
fi |
||||
mkdir -p "$APP_PATH/log" "$APP_PATH/tmp/pids" "$APP_PATH/files" |
||||
chown "$APP_USER:$APP_USER" "$APP_PATH" |
||||
chown -R "$APP_USER:$APP_USER" "$APP_PATH/log" "$APP_PATH/tmp" "$APP_PATH/files" "$APP_PATH/public" |
||||
if [ "$1" = "./docker/supervisord" ]; then |
||||
exec "$@" |
||||
else |
||||
exec $APP_PATH/docker/gosu $APP_USER "$BASH_SOURCE" "$@" |
||||
fi |
||||
fi |
||||
|
||||
mkdir -p "$ATTACHMENTS_STORAGE_PATH" |
||||
chown -R "$(id -u)" "$ATTACHMENTS_STORAGE_PATH" 2>/dev/null || : |
||||
exec "$@" |
||||
|
@ -1,212 +0,0 @@ |
||||
############################################################## |
||||
# Phusion Passenger Standalone uses a template file to |
||||
# generate an Nginx configuration file. The original template |
||||
# file can be found by running the following command: |
||||
# |
||||
# ls $(passenger-config about resourcesdir)/templates/standalone/config.erb |
||||
# |
||||
# You can create a copy of this template file and customize it |
||||
# to your liking. Just make sure you tell Phusion Passenger Standalone |
||||
# to use your template file by passing the --nginx-config-template |
||||
# parameter. |
||||
# |
||||
# *** NOTE *** |
||||
# If you customize the template file, make sure you keep an eye |
||||
# on the original template file and merge any changes. |
||||
# New Phusion Passenger features may require changes to the template |
||||
# file. |
||||
############################################################## |
||||
|
||||
|
||||
master_process on; |
||||
worker_processes 1; |
||||
daemon on; |
||||
error_log '<%= @options[:log_file] %>' <% if @options[:log_level] >= LVL_DEBUG %>info<% end %>; |
||||
pid '<%= @options[:pid_file] %>'; |
||||
|
||||
<% if Process.euid == 0 %> |
||||
<% if @options[:user] %> |
||||
<%# Run workers as the given user. The master process will always run as root and will be able to bind to any port. %> |
||||
user <%= @options[:user] %> <%= default_group_for(@options[:user]) %>; |
||||
<% else %> |
||||
<%# Prevent running Nginx workers as nobody. %> |
||||
user <%= current_user %> <%= default_group_for(current_user) %>; |
||||
<% end %> |
||||
<% end %> |
||||
|
||||
events { |
||||
worker_connections 1024; |
||||
} |
||||
|
||||
http { |
||||
log_format debug '[$time_local] $msec "$request" $status conn=$connection sent=$bytes_sent body_sent=$body_bytes_sent'; |
||||
include '<%= PhusionPassenger.resources_dir %>/mime.types'; |
||||
|
||||
<% if @options[:ruby] %> |
||||
passenger_ruby <%= @options[:ruby] %>; |
||||
<% else %> |
||||
passenger_ruby <%= PlatformInfo.ruby_command %>; |
||||
<% end %> |
||||
<% if @options[:nodejs] %> |
||||
passenger_nodejs <%= @options[:nodejs] %>; |
||||
<% end %> |
||||
<% if @options[:python] %> |
||||
passenger_python <%= @options[:python] %>; |
||||
<% end %> |
||||
|
||||
passenger_root '<%= PhusionPassenger.install_spec %>'; |
||||
passenger_abort_on_startup_error on; |
||||
passenger_ctl cleanup_pidfiles <%= serialize_strset("#{@working_dir}/temp_dir_toucher.pid") %>; |
||||
passenger_ctl integration_mode standalone; |
||||
passenger_ctl standalone_engine nginx; |
||||
passenger_user_switching off; |
||||
<%= nginx_option :passenger_log_level, :log_level %> |
||||
<%= nginx_option :passenger_max_pool_size, :max_pool_size %> |
||||
<%= nginx_option :passenger_min_instances, :min_instances %> |
||||
<%= nginx_option :passenger_pool_idle_time, :pool_idle_time %> |
||||
<%= nginx_option :passenger_max_preloader_idle_time, :max_preloader_idle_time %> |
||||
<%= nginx_option :passenger_turbocaching, :turbocaching %> |
||||
<% if @options[:user] %> |
||||
passenger_user <%= @options[:user] %>; |
||||
passenger_default_user <%= @options[:user] %>; |
||||
passenger_analytics_log_user <%= @options[:user] %>; |
||||
<% else %> |
||||
passenger_user <%= current_user %>; |
||||
passenger_default_user <%= current_user %>; |
||||
passenger_analytics_log_user <%= current_user %>; |
||||
<% end %> |
||||
<% if @options[:instance_registry_dir] %>passenger_instance_registry_dir '<%= @options[:instance_registry_dir] %>';<% end %> |
||||
<% if @options[:data_buffer_dir] %>passenger_data_buffer_dir '<%= @options[:data_buffer_dir] %>';<% end %> |
||||
<% if @options[:rolling_restarts] %>passenger_rolling_restarts on;<% end %> |
||||
<% if @options[:resist_deployment_errors] %>passenger_resist_deployment_errors on;<% end %> |
||||
<% if !@options[:load_shell_envvars] %>passenger_load_shell_envvars off;<% end %> |
||||
|
||||
<% if !@options[:friendly_error_pages].nil? -%> |
||||
passenger_friendly_error_pages <%= boolean_config_value(@options[:friendly_error_pages]) %>; |
||||
<% end %> |
||||
|
||||
<% if @options[:union_station_gateway_address] %> |
||||
union_station_gateway_address <%= @options[:union_station_gateway_address] %>; |
||||
<% end %> |
||||
<% if @options[:union_station_gateway_port] %> |
||||
union_station_gateway_port <%= @options[:union_station_gateway_port] %>; |
||||
<% end %> |
||||
<% if @options[:union_station_gateway_cert] %> |
||||
union_station_gateway_cert -; |
||||
<% end %> |
||||
|
||||
<% @options[:ctls].each do |ctl| %> |
||||
passenger_ctl '<%= ctl.split("=", 2)[0] %>' '<%= ctl.split("=", 2)[1] %>'; |
||||
<% end %> |
||||
|
||||
default_type application/octet-stream; |
||||
types_hash_max_size 2048; |
||||
server_names_hash_bucket_size 64; |
||||
client_max_body_size 20m; |
||||
access_log off; |
||||
keepalive_timeout 60; |
||||
underscores_in_headers on; |
||||
gzip on; |
||||
gzip_comp_level 3; |
||||
gzip_min_length 150; |
||||
gzip_proxied any; |
||||
gzip_types text/plain text/css text/json text/javascript |
||||
application/javascript application/x-javascript application/json |
||||
application/rss+xml application/vnd.ms-fontobject application/x-font-ttf |
||||
application/xml font/opentype image/svg+xml text/xml; |
||||
|
||||
<% if @app_finder.multi_mode? %> |
||||
# Default server entry for mass deployment mode. |
||||
server { |
||||
<% if @options[:ssl] %> |
||||
<% if @options[:ssl_port] %> |
||||
listen <%= nginx_listen_address %>; |
||||
listen <%= nginx_listen_address_with_ssl_port %> ssl; |
||||
<% else %> |
||||
listen <%= nginx_listen_address %> ssl; |
||||
<% end %> |
||||
<% else %> |
||||
listen <%= nginx_listen_address %>; |
||||
<% end %> |
||||
root '<%= PhusionPassenger.resources_dir %>/standalone_default_root'; |
||||
} |
||||
<% end %> |
||||
|
||||
<% for app in @apps %> |
||||
server { |
||||
<% if app[:ssl] %> |
||||
<% if app[:ssl_port] %> |
||||
listen <%= nginx_listen_address(app) %>; |
||||
listen <%= nginx_listen_address_with_ssl_port(app) %> ssl; |
||||
<% else %> |
||||
listen <%= nginx_listen_address(app) %> ssl; |
||||
<% end %> |
||||
<% else %> |
||||
listen <%= nginx_listen_address(app) %>; |
||||
<% end %> |
||||
server_name <%= app[:server_names].join(' ') %>; |
||||
<% if app[:static_files_dir] %> |
||||
root '<%= app[:static_files_dir] %>'; |
||||
<% else %> |
||||
root '<%= app[:root] %>/public'; |
||||
<% end %> |
||||
passenger_app_root '<%= app[:root] %>'; |
||||
passenger_enabled on; |
||||
passenger_app_env <%= app[:environment] %>; |
||||
passenger_spawn_method <%= app[:spawn_method] %>; |
||||
<% if app[:app_type] %>passenger_app_type <%= app[:app_type] %>;<% end %> |
||||
<% if app[:startup_file] %>passenger_startup_file <%= app[:startup_file] %>;<% end %> |
||||
<% if app[:concurrency_model] && app[:concurrency_model] != DEFAULT_CONCURRENCY_MODEL %>passenger_concurrency_model <%= app[:concurrency_model] %>;<% end %> |
||||
<% if app[:thread_count] && app[:thread_count] != DEFAULT_APP_THREAD_COUNT %>passenger_thread_count <%= app[:thread_count] %>;<% end %> |
||||
<% if app[:min_instances] %>passenger_min_instances <%= app[:min_instances] %>;<% end %> |
||||
<% if app[:restart_dir] %>passenger_restart_dir '<%= app[:restart_dir] %>';<% end %> |
||||
<% if app[:sticky_sessions] %>passenger_sticky_sessions on;<% end %> |
||||
<% if app[:sticky_sessions_cookie_name] %>passenger_sticky_sessions_cookie_name '<%= app[:sticky_sessions_cookie_name] %>';<% end %> |
||||
<% if app[:vary_turbocache_by_cookie] %>passenger_vary_turbocache_by_cookie '<%= app[:vary_turbocache_by_cookie] %>';<% end %> |
||||
<% if app[:union_station_key] %> |
||||
union_station_support on; |
||||
union_station_key <%= app[:union_station_key] %>; |
||||
<% end %> |
||||
<% if app[:ssl] %> |
||||
ssl_certificate <%= app[:ssl_certificate] %>; |
||||
ssl_certificate_key <%= app[:ssl_certificate_key] %>; |
||||
<% end %> |
||||
<% if @options[:meteor_app_settings] %> |
||||
passenger_meteor_app_settings <%= @options[:meteor_app_settings] %>; |
||||
<% end %> |
||||
|
||||
<% app[:envvars].each_pair do |name, value| %> |
||||
passenger_env_var '<%= name %>' '<%= value %>'; |
||||
<% end %> |
||||
|
||||
# Rails asset pipeline support. |
||||
location ~ "^/assets/.+-([0-9a-f]{32}|[0-9a-f]{64})\..+" { |
||||
error_page 490 = @static_asset; |
||||
error_page 491 = @dynamic_request; |
||||
recursive_error_pages on; |
||||
|
||||
if (-f $request_filename) { |
||||
return 490; |
||||
} |
||||
if (!-f $request_filename) { |
||||
return 491; |
||||
} |
||||
} |
||||
location @static_asset { |
||||
gzip_static on; |
||||
expires max; |
||||
add_header Cache-Control public; |
||||
add_header Access-Control-Allow-Origin "*"; |
||||
add_header ETag ""; |
||||
} |
||||
location @dynamic_request { |
||||
passenger_enabled on; |
||||
} |
||||
|
||||
<% (ENV['NGINX_ADDITIONAL_SERVER_RULES'] || "").split(";").each do |rule| %> |
||||
<%= rule.chomp(";") %>; |
||||
<% end %> |
||||
} |
||||
passenger_pre_start <%= listen_url(app) %>; |
||||
<% end %> |
||||
} |
@ -0,0 +1,18 @@ |
||||
#!/bin/bash |
||||
set -e |
||||
|
||||
pushd "${APP_PATH}/frontend" |
||||
|
||||
# Installing frontend dependencies |
||||
RAILS_ENV=production npm install |
||||
|
||||
popd |
||||
|
||||
# Bundle assets |
||||
DATABASE_URL='nulldb://nohost' RAILS_ENV=production bundle exec rake assets:precompile |
||||
|
||||
# Remove node_modules and entire frontend |
||||
rm -rf "$APP_PATH/node_modules/" "$APP_PATH/frontend/node_modules/" |
||||
|
||||
# Clean cache in root |
||||
rm -rf /root/.npm |
@ -1,5 +1,5 @@ |
||||
#!/bin/bash |
||||
set -e |
||||
|
||||
[ -f /etc/apache2/sites-enabled/openproject.conf ] || erb -r time /usr/src/app/docker/proxy.conf.erb > /etc/apache2/sites-enabled/openproject.conf |
||||
[ -f /etc/apache2/sites-enabled/openproject.conf ] || erb -r time $APP_PATH/docker/proxy.conf.erb > /etc/apache2/sites-enabled/openproject.conf |
||||
exec /usr/sbin/apache2ctl -DFOREGROUND |
||||
|
@ -1,161 +0,0 @@ |
||||
#!/usr/bin/env bash |
||||
# Use this script to test if a given TCP host/port are available |
||||
|
||||
cmdname=$(basename $0) |
||||
|
||||
echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } |
||||
|
||||
usage() |
||||
{ |
||||
cat << USAGE >&2 |
||||
Usage: |
||||
$cmdname host:port [-s] [-t timeout] [-- command args] |
||||
-h HOST | --host=HOST Host or IP under test |
||||
-p PORT | --port=PORT TCP port under test |
||||
Alternatively, you specify the host and port as host:port |
||||
-s | --strict Only execute subcommand if the test succeeds |
||||
-q | --quiet Don't output any status messages |
||||
-t TIMEOUT | --timeout=TIMEOUT |
||||
Timeout in seconds, zero for no timeout |
||||
-- COMMAND ARGS Execute command with args after the test finishes |
||||
USAGE |
||||
exit 1 |
||||
} |
||||
|
||||
wait_for() |
||||
{ |
||||
if [[ $TIMEOUT -gt 0 ]]; then |
||||
echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" |
||||
else |
||||
echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" |
||||
fi |
||||
start_ts=$(date +%s) |
||||
while : |
||||
do |
||||
(echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 |
||||
result=$? |
||||
if [[ $result -eq 0 ]]; then |
||||
end_ts=$(date +%s) |
||||
echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" |
||||
break |
||||
fi |
||||
sleep 1 |
||||
done |
||||
return $result |
||||
} |
||||
|
||||
wait_for_wrapper() |
||||
{ |
||||
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 |
||||
if [[ $QUIET -eq 1 ]]; then |
||||
timeout $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & |
||||
else |
||||
timeout $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & |
||||
fi |
||||
PID=$! |
||||
trap "kill -INT -$PID" INT |
||||
wait $PID |
||||
RESULT=$? |
||||
if [[ $RESULT -ne 0 ]]; then |
||||
echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" |
||||
fi |
||||
return $RESULT |
||||
} |
||||
|
||||
# process arguments |
||||
while [[ $# -gt 0 ]] |
||||
do |
||||
case "$1" in |
||||
*:* ) |
||||
hostport=(${1//:/ }) |
||||
HOST=${hostport[0]} |
||||
PORT=${hostport[1]} |
||||
shift 1 |
||||
;; |
||||
--child) |
||||
CHILD=1 |
||||
shift 1 |
||||
;; |
||||
-q | --quiet) |
||||
QUIET=1 |
||||
shift 1 |
||||
;; |
||||
-s | --strict) |
||||
STRICT=1 |
||||
shift 1 |
||||
;; |
||||
-h) |
||||
HOST="$2" |
||||
if [[ $HOST == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--host=*) |
||||
HOST="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
-p) |
||||
PORT="$2" |
||||
if [[ $PORT == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--port=*) |
||||
PORT="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
-t) |
||||
TIMEOUT="$2" |
||||
if [[ $TIMEOUT == "" ]]; then break; fi |
||||
shift 2 |
||||
;; |
||||
--timeout=*) |
||||
TIMEOUT="${1#*=}" |
||||
shift 1 |
||||
;; |
||||
--) |
||||
shift |
||||
CLI="$@" |
||||
break |
||||
;; |
||||
--help) |
||||
usage |
||||
;; |
||||
*) |
||||
echoerr "Unknown argument: $1" |
||||
usage |
||||
;; |
||||
esac |
||||
done |
||||
|
||||
if [[ "$HOST" == "" || "$PORT" == "" ]]; then |
||||
echoerr "Error: you need to provide a host and port to test." |
||||
usage |
||||
fi |
||||
|
||||
TIMEOUT=${TIMEOUT:-15} |
||||
STRICT=${STRICT:-0} |
||||
CHILD=${CHILD:-0} |
||||
QUIET=${QUIET:-0} |
||||
|
||||
if [[ $CHILD -gt 0 ]]; then |
||||
wait_for |
||||
RESULT=$? |
||||
exit $RESULT |
||||
else |
||||
if [[ $TIMEOUT -gt 0 ]]; then |
||||
wait_for_wrapper |
||||
RESULT=$? |
||||
else |
||||
wait_for |
||||
RESULT=$? |
||||
fi |
||||
fi |
||||
|
||||
if [[ $CLI != "" ]]; then |
||||
if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then |
||||
echoerr "$cmdname: strict mode, refusing to execute subprocess" |
||||
exit $RESULT |
||||
fi |
||||
exec $CLI |
||||
else |
||||
exit $RESULT |
||||
fi |
Loading…
Reference in new issue