mirror of
https://github.com/ENSL/ensl.org.git
synced 2025-02-10 10:10:57 +00:00
Merge branch 'docker_version3'
This commit is contained in:
commit
a6944cb23c
15 changed files with 229 additions and 22 deletions
2
.dockerignore
Normal file
2
.dockerignore
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
Dockerfile
|
||||||
|
db_data
|
30
.env.example
30
.env.example
|
@ -1,19 +1,33 @@
|
||||||
RACK_ENV=
|
RACK_ENV=production
|
||||||
RAILS_ENV=
|
RAILS_ENV=production
|
||||||
APP_SECRET=
|
APP_SECRET=randomstringhere
|
||||||
|
|
||||||
DEPLOY_PATH=
|
DEPLOY_PATH=/var/www
|
||||||
|
|
||||||
PUMA_WORKERS=1
|
PUMA_WORKERS=5
|
||||||
PUMA_MIN_THREADS=1
|
PUMA_MIN_THREADS=1
|
||||||
PUMA_MAX_THREADS=16
|
PUMA_MAX_THREADS=16
|
||||||
PUMA_PORT=4000
|
PUMA_PORT=4000
|
||||||
PUMA_TIMEOUT=30
|
PUMA_TIMEOUT=30
|
||||||
|
|
||||||
|
# Docker adds mysql to hosts
|
||||||
|
MYSQL_HOST=mysql
|
||||||
|
|
||||||
|
# This is used by both rails + mysql
|
||||||
MYSQL_DATABASE=ensl
|
MYSQL_DATABASE=ensl
|
||||||
MYSQL_USERNAME=
|
|
||||||
MYSQL_PASSWORD=
|
# Add to allow docker image to connect
|
||||||
MYSQL_CONNECTION_POOL=8
|
MYSQL_ROOT_HOST=%
|
||||||
|
|
||||||
|
# FIXME: Use root since normal user does not work. atm.
|
||||||
|
MYSQL_ROOT_PASSWORD=randomstringhere
|
||||||
|
|
||||||
|
# These variables are for ensl
|
||||||
|
MYSQL_USERNAME=root
|
||||||
|
MYSQL_PASSWORD=randomstringhere
|
||||||
|
|
||||||
|
# More MySQL vars
|
||||||
|
MYSQL_CONNECTION_POOL=32
|
||||||
|
|
||||||
NEW_RELIC_APP_NAME=ENSL
|
NEW_RELIC_APP_NAME=ENSL
|
||||||
NEW_RELIC_LICENSE_KEY=
|
NEW_RELIC_LICENSE_KEY=
|
||||||
|
|
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -2,6 +2,8 @@
|
||||||
/log/*
|
/log/*
|
||||||
/tmp/*
|
/tmp/*
|
||||||
/spec/tmp/*
|
/spec/tmp/*
|
||||||
|
/env/production.sh
|
||||||
|
/env/development.sh
|
||||||
.ruby-version
|
.ruby-version
|
||||||
.ruby-gemset
|
.ruby-gemset
|
||||||
.env
|
.env
|
||||||
|
@ -12,6 +14,10 @@
|
||||||
*.rbc
|
*.rbc
|
||||||
*.sassc
|
*.sassc
|
||||||
|
|
||||||
|
# Database and files
|
||||||
|
db_data/*
|
||||||
|
!db_data/.placeholder
|
||||||
|
|
||||||
# OS X
|
# OS X
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
@ -20,6 +26,7 @@
|
||||||
/public/files/*
|
/public/files/*
|
||||||
/public/local
|
/public/local
|
||||||
/public/uploads
|
/public/uploads
|
||||||
|
/public/assets
|
||||||
|
|
||||||
# RubyMine
|
# RubyMine
|
||||||
/.idea
|
/.idea
|
||||||
|
|
36
Dockerfile
Normal file
36
Dockerfile
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
FROM ruby:2.2
|
||||||
|
|
||||||
|
ENV RAILS_ENV production
|
||||||
|
|
||||||
|
# Add 'web' user which will run the application
|
||||||
|
RUN adduser web --home /home/web --shell /bin/bash --disabled-password --gecos ""
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get -y upgrade
|
||||||
|
RUN apt-get -y install mysql-client libmysqlclient-dev memcached nodejs
|
||||||
|
RUN service memcached start
|
||||||
|
|
||||||
|
# Separate Gemfile ADD so that `bundle install` can be cached more effectively
|
||||||
|
|
||||||
|
ADD Gemfile /var/www/
|
||||||
|
ADD Gemfile.lock /var/www/
|
||||||
|
RUN chown -R web:web /var/www &&\
|
||||||
|
mkdir -p /var/bundle &&\
|
||||||
|
chown -R web:web /var/bundle
|
||||||
|
|
||||||
|
RUN su -c "bundle config github.https true; cd /var/www && bundle install --path /var/bundle --jobs 4" -s /bin/bash -l web
|
||||||
|
|
||||||
|
# Add application source
|
||||||
|
ADD . /var/www
|
||||||
|
RUN chown -R web:web /var/www
|
||||||
|
|
||||||
|
WORKDIR /var/www
|
||||||
|
USER web
|
||||||
|
|
||||||
|
RUN bundle config github.https true; cd /var/www && bundle install --path /var/bundle --jobs 4
|
||||||
|
RUN bundle exec rake assets:precompile
|
||||||
|
|
||||||
|
# This is a temporary solution to fix assets issue
|
||||||
|
RUN mv /var/www/public/assets /home/web/assets
|
||||||
|
|
||||||
|
USER root
|
||||||
|
CMD ["/var/www/script/entry.sh"]
|
6
Gemfile
6
Gemfile
|
@ -1,6 +1,7 @@
|
||||||
source 'http://rubygems.org'
|
source 'http://rubygems.org'
|
||||||
|
|
||||||
ruby '2.2.2'
|
ruby '2.2.10'
|
||||||
|
#ruby '2.2.2'
|
||||||
|
|
||||||
gem 'dotenv-rails', '~> 0.10.0'
|
gem 'dotenv-rails', '~> 0.10.0'
|
||||||
gem 'rails', '~> 3.2.22'
|
gem 'rails', '~> 3.2.22'
|
||||||
|
@ -8,6 +9,7 @@ gem 'mysql2', '~> 0.3.17'
|
||||||
gem 'dalli', '~> 2.7.0'
|
gem 'dalli', '~> 2.7.0'
|
||||||
gem 'puma', '~> 2.11.1'
|
gem 'puma', '~> 2.11.1'
|
||||||
|
|
||||||
|
gem 'i18n-js'
|
||||||
gem 'exceptional', '~> 2.0.33'
|
gem 'exceptional', '~> 2.0.33'
|
||||||
gem 'oj', '~> 2.5.5'
|
gem 'oj', '~> 2.5.5'
|
||||||
gem 'faraday', '~> 0.9.0'
|
gem 'faraday', '~> 0.9.0'
|
||||||
|
@ -27,7 +29,7 @@ gem 'test-unit', '~> 3.1.3'
|
||||||
gem 'google-api-client', '~> 0.10.3'
|
gem 'google-api-client', '~> 0.10.3'
|
||||||
|
|
||||||
# Please install nodejs locally.
|
# Please install nodejs locally.
|
||||||
gem 'therubyracer', '~> 0.12.1' if RUBY_PLATFORM == 'x86_64-linux'
|
#gem 'therubyracer', '~> 0.12.1' if RUBY_PLATFORM == 'x86_64-linux'
|
||||||
|
|
||||||
gem 'sprockets', '~> 2.2.1'
|
gem 'sprockets', '~> 2.2.1'
|
||||||
gem 'coffee-rails', '~> 3.2.2'
|
gem 'coffee-rails', '~> 3.2.2'
|
||||||
|
|
29
Makefile
Normal file
29
Makefile
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
REGISTRY ?= ensl
|
||||||
|
PROJECT ?= ensl.org
|
||||||
|
TAG ?= latest
|
||||||
|
|
||||||
|
ifdef REGISTRY
|
||||||
|
IMAGE=$(REGISTRY)/$(PROJECT):$(TAG)
|
||||||
|
else
|
||||||
|
IMAGE=$(PROJECT):$(TAG)
|
||||||
|
endif
|
||||||
|
|
||||||
|
all:
|
||||||
|
@echo "Available targets:"
|
||||||
|
@echo " * build - build a Docker image for $(IMAGE)"
|
||||||
|
@echo " * pull - pull $(IMAGE)"
|
||||||
|
@echo " * push - push $(IMAGE)"
|
||||||
|
@echo " * test - build and test $(IMAGE)"
|
||||||
|
|
||||||
|
build: Dockerfile
|
||||||
|
docker build -t $(IMAGE) .
|
||||||
|
|
||||||
|
pull:
|
||||||
|
docker pull $(IMAGE) || true
|
||||||
|
|
||||||
|
push:
|
||||||
|
docker push $(IMAGE)
|
||||||
|
|
||||||
|
test: build
|
||||||
|
fig run web ./env/test.sh ./test.sh
|
||||||
|
|
|
@ -10,6 +10,7 @@ module Ensl
|
||||||
|
|
||||||
# Additional assets
|
# Additional assets
|
||||||
config.assets.precompile += ["themes/*/theme.css", "themes/*/errors.css"]
|
config.assets.precompile += ["themes/*/theme.css", "themes/*/errors.css"]
|
||||||
|
config.assets.initialize_on_precompile = false
|
||||||
|
|
||||||
# Custom directories with classes and modules you want to be autoloadable.
|
# Custom directories with classes and modules you want to be autoloadable.
|
||||||
config.autoload_paths += Dir["#{config.root}/app/services/**/", "#{config.root}/app/models/concerns/"]
|
config.autoload_paths += Dir["#{config.root}/app/services/**/", "#{config.root}/app/models/concerns/"]
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
base: &db
|
base: &db
|
||||||
adapter: mysql2
|
adapter: mysql2
|
||||||
encoding: utf8
|
encoding: utf8
|
||||||
host: localhost
|
host: <%= ENV['MYSQL_HOST'] %>
|
||||||
database: <%= ENV['MYSQL_DATABASE'] %>
|
database: <%= ENV['MYSQL_DATABASE'] %>
|
||||||
username: <%= ENV['MYSQL_USERNAME'] %>
|
username: <%= ENV['MYSQL_USERNAME'] %>
|
||||||
password: <%= ENV['MYSQL_PASSWORD'] %>
|
password: <%= ENV['MYSQL_PASSWORD'] %>
|
||||||
|
|
|
@ -37,7 +37,7 @@ Ensl::Application.configure do
|
||||||
# config.logger = SyslogLogger.new
|
# config.logger = SyslogLogger.new
|
||||||
|
|
||||||
# Use a different cache store in production
|
# Use a different cache store in production
|
||||||
config.cache_store = :dalli_store
|
config.cache_store = :dalli_store, 'memcached:11211', 'localhost'
|
||||||
|
|
||||||
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
# Enable serving of images, stylesheets, and JavaScripts from an asset server
|
||||||
# config.action_controller.asset_host = "http://assets.example.com"
|
# config.action_controller.asset_host = "http://assets.example.com"
|
||||||
|
@ -64,4 +64,7 @@ Ensl::Application.configure do
|
||||||
|
|
||||||
# Custom Session Store config to allow gathers.staging.ensl.org
|
# Custom Session Store config to allow gathers.staging.ensl.org
|
||||||
config.session_store :cookie_store, key: "_ENSL_session_key", expire_after: 30.days.to_i, domain: ".ensl.org"
|
config.session_store :cookie_store, key: "_ENSL_session_key", expire_after: 30.days.to_i, domain: ".ensl.org"
|
||||||
|
|
||||||
|
# config.cache_store = :dalli_store, 'cache', 'cache-2.example.com:11211:2',
|
||||||
|
# { :namespace => NAME_OF_RAILS_APP, :expires_in => 1.day, :compress => true }
|
||||||
end
|
end
|
|
@ -2,24 +2,24 @@ require "dotenv"
|
||||||
Dotenv.load
|
Dotenv.load
|
||||||
|
|
||||||
base_path = (ENV['DEPLOY_PATH'] || Dir.pwd)
|
base_path = (ENV['DEPLOY_PATH'] || Dir.pwd)
|
||||||
current_path = "#{base_path}/current"
|
#current_path = "#{base_path}/current"
|
||||||
shared_path = "#{base_path}/shared"
|
#shared_path = "#{base_path}/shared"
|
||||||
stderr_path = "#{shared_path}/log/puma.stderr.log"
|
stderr_path = "#{base_path}/lpuma.stderr.log"
|
||||||
stdout_path = "#{shared_path}/log/puma.stdout.log"
|
stdout_path = "#{base_path}/lpuma.stdout.log"
|
||||||
|
|
||||||
tag 'ENSL'
|
tag 'ENSL'
|
||||||
|
|
||||||
preload_app!
|
preload_app!
|
||||||
daemonize true
|
daemonize false
|
||||||
directory current_path
|
directory base_path
|
||||||
pidfile "#{shared_path}/tmp/pids/puma.pid"
|
pidfile "#{base_path}/tmp/puma.pid"
|
||||||
state_path "#{shared_path}/tmp/pids/puma.state"
|
state_path "#{base_path}/tmp/puma.state"
|
||||||
stdout_redirect stdout_path, stderr_path
|
stdout_redirect stdout_path, stderr_path
|
||||||
|
|
||||||
environment ENV['RACK_ENV'] || 'production'
|
environment ENV['RACK_ENV'] || 'production'
|
||||||
rackup DefaultRackup
|
rackup DefaultRackup
|
||||||
|
|
||||||
bind "unix://#{shared_path}/tmp/sockets/puma.sock"
|
bind "unix://#{base_path}/tmp/puma.sock"
|
||||||
port Integer(ENV['PUMA_PORT'] || 4000)
|
port Integer(ENV['PUMA_PORT'] || 4000)
|
||||||
|
|
||||||
worker_timeout Integer(ENV['PUMA_TIMEOUT'] || 30)
|
worker_timeout Integer(ENV['PUMA_TIMEOUT'] || 30)
|
||||||
|
|
29
docker-compose.yml
Normal file
29
docker-compose.yml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
|
services:
|
||||||
|
web:
|
||||||
|
image: ensl/ensl.org:latest
|
||||||
|
volumes:
|
||||||
|
- "./public:/var/www/public"
|
||||||
|
ports:
|
||||||
|
- "4000:4000"
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- memcached
|
||||||
|
# - redis
|
||||||
|
db:
|
||||||
|
image: mariadb:latest
|
||||||
|
volumes:
|
||||||
|
- "./db_data:/var/lib/mysql"
|
||||||
|
- "./ext/mysql.conf.d:/etc/mysql/conf.d"
|
||||||
|
environment:
|
||||||
|
- MYSQL_DATABASE
|
||||||
|
- MYSQL_USER
|
||||||
|
- MYSQL_USERNAME
|
||||||
|
- MYSQL_PASSWORD
|
||||||
|
- MYSQL_ROOT_PASSWORD
|
||||||
|
# - MYSQL_ROOT_HOST
|
||||||
|
memcached:
|
||||||
|
image: memcached:latest
|
||||||
|
#redis:
|
||||||
|
# image: redis
|
25
env/test.sh
vendored
Executable file
25
env/test.sh
vendored
Executable file
|
@ -0,0 +1,25 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
export RACK_ENV=test
|
||||||
|
export RAILS_ENV=test
|
||||||
|
export APP_SECRET=e0cdcb729c4b21d5259e957a2ffc13a3
|
||||||
|
|
||||||
|
export DEPLOY_PATH=/var/www
|
||||||
|
|
||||||
|
export PUMA_WORKERS=1
|
||||||
|
export PUMA_MIN_THREADS=1
|
||||||
|
export PUMA_MAX_THREADS=16
|
||||||
|
export PUMA_PORT=3000
|
||||||
|
export PUMA_TIMEOUT=30
|
||||||
|
|
||||||
|
#export MYSQL_HOST="${MYSQL_PORT_3306_TCP_ADDR:-localhost}"
|
||||||
|
export MYSQL_DATABASE=ensl
|
||||||
|
export MYSQL_USER=root
|
||||||
|
export MYSQL_HOST="mysql"
|
||||||
|
export MYSQL_USERNAME=root
|
||||||
|
export MYSQL_ROOT_PASSWORD=test
|
||||||
|
export MYSQL_PASSWORD=test
|
||||||
|
export MYSQL_ROOT_HOST=172.%
|
||||||
|
export MYSQL_CONNECTION_POOL=32
|
||||||
|
|
||||||
|
exec "$@"
|
31
ext/mysql.conf.d/opt.cnf
Normal file
31
ext/mysql.conf.d/opt.cnf
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
[mysqld]
|
||||||
|
|
||||||
|
skip-host-cache
|
||||||
|
skip-name-resolve
|
||||||
|
|
||||||
|
key_buffer = 150M
|
||||||
|
max_allowed_packet = 20M
|
||||||
|
thread_stack = 196K
|
||||||
|
thread_cache_size = 16
|
||||||
|
|
||||||
|
max_connections = 96
|
||||||
|
table_cache = 2000
|
||||||
|
table_definition_cache = 800
|
||||||
|
thread_concurrency = 128
|
||||||
|
|
||||||
|
query_cache_limit = 30M
|
||||||
|
query_cache_size = 150M
|
||||||
|
open_files_limit = 1800
|
||||||
|
join_buffer_size = 1M
|
||||||
|
sort_buffer_size = 1M
|
||||||
|
read_buffer_size = 128K
|
||||||
|
tmp_table_size = 500M
|
||||||
|
max_heap_table_size = 500M
|
||||||
|
|
||||||
|
innodb_buffer_pool_size = 1280M
|
||||||
|
innodb_flush_log_at_trx_commit = 1
|
||||||
|
innodb_thread_concurrency = 16
|
||||||
|
innodb_flush_method = O_DIRECT
|
||||||
|
#innodb_additional_mem_pool_size = 20M
|
||||||
|
innodb_file_per_table = 1
|
||||||
|
transaction-isolation = READ-COMMITTED
|
11
script/entry.sh
Executable file
11
script/entry.sh
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
env
|
||||||
|
cd /var/www
|
||||||
|
source /var/www/.env
|
||||||
|
rm -rf /var/www/public/assets
|
||||||
|
mv /home/web/assets /var/www/public/
|
||||||
|
chown -R web:web /var/www/public
|
||||||
|
|
||||||
|
#bundle exec rake assets:precompile
|
||||||
|
su -c "cd /var/www && bundle exec puma -C config/puma.rb" -s /bin/bash -l web
|
17
script/test.sh
Executable file
17
script/test.sh
Executable file
|
@ -0,0 +1,17 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Undo the `bundle --deployment --without development test`
|
||||||
|
# settings baked into the prod-ready Docker image's .bundle/config
|
||||||
|
bundle config --delete without
|
||||||
|
bundle config --delete frozen
|
||||||
|
|
||||||
|
# Install gems in development and test groups
|
||||||
|
bundle
|
||||||
|
|
||||||
|
# Ensure database exists and has latest migrations
|
||||||
|
bundle exec rake db:create
|
||||||
|
bundle exec rake db:migrate
|
||||||
|
|
||||||
|
# Run tests
|
||||||
|
bundle exec rake
|
Loading…
Reference in a new issue