diff options
| -rw-r--r-- | Dockerfile | 30 | ||||
| -rw-r--r-- | Gemfile | 4 | ||||
| -rw-r--r-- | Gemfile.lock | 4 | ||||
| -rw-r--r-- | app/models/referential.rb | 10 | ||||
| -rw-r--r-- | config/database.yml | 1 | ||||
| -rw-r--r-- | config/database.yml.docker | 11 | ||||
| -rw-r--r-- | config/environments/production.rb | 70 | ||||
| -rw-r--r-- | config/initializers/sidekiq.rb | 5 | ||||
| -rw-r--r-- | config/schedule.rb | 4 | ||||
| -rw-r--r-- | config/secrets.yml.docker | 16 | ||||
| -rw-r--r-- | docker-compose.yml | 73 | ||||
| -rw-r--r-- | lib/tasks/install.rake | 24 | ||||
| -rw-r--r-- | script/launch-cron | 20 | ||||
| -rw-r--r-- | tmp/pids/.gitkeep | 0 | 
14 files changed, 228 insertions, 44 deletions
| diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 000000000..8259981f8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM debian:stable-slim + +ENV RAILS_ENV=production RAILS_SERVE_STATIC_FILES=true RAILS_LOG_TO_STDOUT=true + +RUN apt-get update && \ +    apt-get install -y --no-install-recommends ruby2.3 && \ +    apt-get install -y --no-install-recommends libpq5 libxml2 zlib1g imagemagick libproj12 && \ +    apt-get install -y --no-install-recommends cron && \ +    apt-get clean && rm -rf /var/lib/apt/lists/* && \ +    gem2.3 install bundler + + +COPY stif-boiv-release.tar.gz / +RUN mkdir /app && apt-get update &&\ +    apt-get -y install --no-install-recommends build-essential ruby2.3-dev libpq-dev libxml2-dev zlib1g-dev libproj-dev&& \ +    tar -C /app -zxf stif-boiv-release.tar.gz && \ +    cd /app && bundle install --local && \ +    apt-get -y remove build-essential ruby2.3-dev libpq-dev libxml2-dev zlib1g-dev && \ +    apt-get clean && apt-get -y autoremove && rm -rf /var/lib/apt/lists/* && \ +    cd /app && rm config/database.yml && mv config/database.yml.docker config/database.yml && \ +    cd /app && rm config/secrets.yml && mv config/secrets.yml.docker config/secrets.yml && \ +    mv script/launch-cron /app && \ +    bundle exec whenever --output '/proc/1/fd/1' --update-crontab stif-boiv --set 'environment=production&bundle_command=bundle exec' --roles=app,db,web + +WORKDIR /app +VOLUME /app/public/uploads + +EXPOSE 3000 + +CMD ["sh", "-c", "bundle exec rake db:migrate && bundle exec rails server -b 0.0.0.0"] @@ -60,7 +60,7 @@ gem 'faraday', '~> 0.9.1'  platforms :ruby do    gem 'therubyracer', '~> 0.12'    gem 'pg' -  gem 'sqlite3' +  #gem 'sqlite3'  end  gem 'activerecord-postgis-adapter', "~> 3.0.0" @@ -139,6 +139,8 @@ gem 'rake'  gem 'devise-async'  gem 'apartment', '~> 1.0.0'  gem 'aasm' +gem 'activerecord-nulldb-adapter' +gem 'puma', '~> 3.10.0'  gem 'newrelic_rpm'  gem 'letter_opener' diff --git a/Gemfile.lock b/Gemfile.lock index e673b7e31..ba1a90a5a 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -356,6 +356,7 @@ GEM        pry (~> 0.10)      pry-rails (0.3.6)        pry (>= 0.10.4) +    puma (3.10.0)      pundit (1.1.0)        activesupport (>= 3.0.0)      quiet_assets (1.1.0) @@ -524,7 +525,6 @@ GEM        actionpack (>= 3.0)        activesupport (>= 3.0)        sprockets (>= 2.8, < 4.0) -    sqlite3 (1.3.13)      teaspoon (1.1.5)        railties (>= 3.2.5, < 6)      teaspoon-jasmine (2.3.4) @@ -650,6 +650,7 @@ DEPENDENCIES    polylines    pry-byebug    pry-rails +  puma (~> 3.10.0)    pundit    quiet_assets    rabl @@ -689,7 +690,6 @@ DEPENDENCIES    slim-rails (~> 3.1)    spring    spring-commands-rspec -  sqlite3    teaspoon-jasmine    therubyracer (~> 0.12)    timecop diff --git a/app/models/referential.rb b/app/models/referential.rb index a5d5acbf9..4cddd502e 100644 --- a/app/models/referential.rb +++ b/app/models/referential.rb @@ -156,7 +156,7 @@ class Referential < ActiveRecord::Base    def stop_points      Chouette::StopPoint.all    end -   +    def compliance_check_sets      ComplianceCheckSet.all    end @@ -356,7 +356,13 @@ class Referential < ActiveRecord::Base        end        Rails.logger.info("Schema create benchmark: '#{slug}'\t#{report}") -      Rails.logger.error( "Schema migrations count for Referential #{slug} " + Referential.connection.select_value("select count(*) from #{slug}.schema_migrations;").to_s ) +      Rails.logger.info("Schema migrations count for Referential #{slug}: #{migration_count || '-'}") +    end +  end + +  def migration_count +    if self.class.connection.table_exists?("#{slug}.schema_migrations") +      self.class.connection.select_value("select count(*) from #{slug}.schema_migrations;")      end    end diff --git a/config/database.yml b/config/database.yml index 2a3ddf5d0..60f1d032f 100644 --- a/config/database.yml +++ b/config/database.yml @@ -21,6 +21,7 @@ test: &test  production:    <<: *default +  adapter: <%= ENV.fetch 'RAILS_DB_ADAPTER', 'postgis' %>    database: chouette2  cucumber: diff --git a/config/database.yml.docker b/config/database.yml.docker new file mode 100644 index 000000000..f49b22b87 --- /dev/null +++ b/config/database.yml.docker @@ -0,0 +1,11 @@ +<%= ENV.fetch 'RAILS_ENV', 'production' %>: +  adapter: <%= ENV.fetch 'RAILS_DB_ADAPTER', 'postgis' %> +  encoding: unicode +  pool: <%= ENV.fetch 'RAILS_DB_POOLSIZE', '5' %> +  host: <%= ENV.fetch 'RAILS_DB_HOST', 'db' %> +  port: <%= ENV.fetch 'RAILS_DB_PORT', '5432' %> +  schema_search_path: 'public,shared_extensions' +  postgis_schema: 'shared_extensions' +  database: <%= ENV.fetch 'RAILS_DB_NAME', 'chouette' %> +  username: <%= ENV.fetch 'RAILS_DB_USER', 'chouette' %> +  password: <%= ENV.fetch 'RAILS_DB_PASSWORD' %> diff --git a/config/environments/production.rb b/config/environments/production.rb index 8e21f0919..cb50cd145 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -19,7 +19,9 @@ Rails.application.configure do    # config.action_dispatch.rack_cache = true    # Disable Rails's static asset server (Apache or nginx will already do this). -  config.serve_static_files = false +  # config.serve_static_files = false +  config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? +  # config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?    # Compress JavaScripts and CSS.    config.assets.js_compressor = :uglifier @@ -53,9 +55,10 @@ Rails.application.configure do    #if ENV['OS'] == 'Windows_NT'    #  # args = log_path,number of files,file sizes    #  config.logger = Logger.new("C:/chouette/logs/chouette2.log", 5, 10.megabytes) -  config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new("rails/chouette2").tap do |syslog| -                                                     syslog.level = Logger::INFO -                                                   end) +  config.logger = Logger.new(STDOUT) +  #config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new("rails/chouette2").tap do |syslog| +  #                                                   syslog.level = Logger::INFO +  #                                                 end)    # Use a different cache store in production.    # config.cache_store = :mem_cache_store @@ -84,42 +87,31 @@ Rails.application.configure do    config.active_record.dump_schema_after_migration = false -  config.action_mailer.default_url_options = { :host => 'my-domain-name.com' } +  config.action_mailer.default_url_options = { :host => ENV.fetch('MAIL_HOST','iboo.stif.info') }    # Configure the e-mail address which will be shown in Devise::Maile -  config.mailer_sender = "chouette-production@my-domain-name.com" - -  ActionMailer::Base.smtp_settings = { -    :address        => "smtp.sample.com", -    :port           => 25, -    :domain         => "sample.com", -    :user_name      => "smtp_user", -    :password       => "smtp_password", -    :authentication => :login -  } +  config.mailer_sender = ENV.fetch('MAIL_FROM', 'STIF Iboo <noreply@stif.info>') +  config.action_mailer.default_options = { from: ENV.fetch('MAIL_FROM', 'STIF Iboo <noreply@stif.info>') } +  config.action_mailer.smtp_settings = { address: ENV.fetch('SMTP_HOST', 'mail.stif.info') } +  config.action_mailer.asset_host          = ENV.fetch('MAIL_ASSETS_URL_BASE','http://iboo.stif.info')    # Specific theme for each company    # AFIMB -  config.company_name = "afimb" -  config.company_theme = "#61970b" # AFIMB color -  config.company_contact = "http://www.chouette.mobi/club-utilisateurs/contact-support/" -  config.accept_user_creation = true - -  # CITYWAY -  # config.company_name = "cityway" -  # config.company_theme = "#32adb0" -  # config.company_contact = "http://www.cityway.fr/contact/?rub_code=14" -  # config.accept_user_creation = false - -  config.chouette_authentication_settings = { -    type: "cas", -    cas_server: "https://portail-server/sessions", -    cas_validate_url: "http://portail-server/sessions/proxyValidate" -  } -  config.stif_portail_api = { -    key: "api_token_for_portail_goes_here", -    url: "http://portail-server" -  } +  config.company_name = ENV.fetch('COMPANY_NAME',"STIF") +  config.company_theme = ENV.fetch('COMPANY_THEME',"#61970b") # AFIMB color +  config.company_contact = ENV.fetch('COMPANY_CONTACT',"http://www.chouette.mobi/club-utilisateurs/contact-support/") +  config.accept_user_creation = ENV.fetch('ACCEPT_USER_CREATION','0')=='1'?true:false + +  config.chouette_authentication_settings = JSON.parse(ENV.fetch('AUTH_SETTINGS','{ +    "type": "cas", +    "cas_server": "https://portail.stif.info/sessions", +    "cas_validate_url": "http://portail.stif.info/sessions/proxyValidate" +  }'),{symbolize_names: true}) + +  config.stif_portail_api = JSON.parse(ENV.fetch('SESAME_API_SETTINGS','{ +    "key": "xxxxxxxxxxx", +    "url": "http://portail.stif.info" +  }'),{symbolize_names: true})    # file to data for demo    # config.demo_data = "/path/to/demo.zip" @@ -135,13 +127,13 @@ Rails.application.configure do    config.i18n.available_locales = [:fr, :en]    # REFLEX api url -  config.reflex_api_url = "https://pprod.reflex.stif.info/ws/reflex/V1/service=getData" +  config.reflex_api_url = ENV.fetch('REFLEX_API_URL',"https://pprod.reflex.stif.info/ws/reflex/V1/service=getData")    # CODIFLIGNE api url -  config.codifligne_api_url = "https://pprod.codifligne.stif.info/rest/v1/lc/getlist" +  config.codifligne_api_url = ENV.fetch('CODIFLIGNE_API_URL',"https://pprod.codifligne.stif.info/rest/v1/lc/getlist")    # IEV -  config.iev_url = "http://worker-server:8080" -  config.rails_host = ENV.fetch('RAILS_HOST') +  config.iev_url = ENV.fetch('IEV_URL',"http://iev:8080") +  config.rails_host = ENV.fetch('RAILS_HOST','http://front')    # Set node env for browserify-rails    # config.browserify_rails.node_env = "production" diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index e44d8df52..bc60dbe20 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -7,4 +7,9 @@ Sidekiq.configure_server do |config|        pendings.map { |sync| sync.failed({error: 'Failed by Sidekiq reboot', processing_time: 0}) }      end    end +  config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://redis:6379/12') } +end + +Sidekiq.configure_client do |config| +  config.redis = { url: ENV.fetch('SIDEKIQ_REDIS_URL', 'redis://redis:6379/12') }  end diff --git a/config/schedule.rb b/config/schedule.rb index 8aa21076f..08488c255 100644 --- a/config/schedule.rb +++ b/config/schedule.rb @@ -42,3 +42,7 @@ end  every 5.minutes do    rake "import:notify_parent"  end + +every 1.minute do +  command "/bin/echo HeartBeat" +end diff --git a/config/secrets.yml.docker b/config/secrets.yml.docker new file mode 100644 index 000000000..1bef794a8 --- /dev/null +++ b/config/secrets.yml.docker @@ -0,0 +1,16 @@ +# Be sure to restart your server when you modify this file. + +# Your secret key is used for verifying the integrity of signed cookies. +# If you change this key, all old signed cookies will become invalid! + +# Make sure the secret is at least 30 characters and all random, +# no regular words or you'll be exposed to dictionary attacks. +# You can use `rake secret` to generate a secure secret key. + +# Make sure the secrets in this file are kept private +# if you're sharing your code publicly. + +<%= ENV.fetch 'RAILS_ENV', 'production' %>: +  secret_key_base: <%= ENV.fetch 'SECRET_KEY_BASE', 'change_this_string_for_something_more_secure' %> +  api_endpoint: <%= ENV.fetch 'IEV_API_ENDPOINT', 'http://iev:8080/chouette_iev/' %> +  api_token: <%= ENV.fetch 'IEV_API_TOKEN', 'change this according to IEV configuration' %> diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 000000000..3c3367a01 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,73 @@ +version: "3.0" +services: +  front: +    image: registry.af83.io/stif-iboo:latest +    environment: +      RAILS_DB_HOST: "192.168.15.98" +      RAILS_DB_USER: "chouette" +      RAILS_DB_NAME: "chouette2" +      RAILS_DB_PASSWORD: "chouette" +      SECRET_KEY_BASE: "KSKSJDHF0QDKJDSfkSJDFKSJDfh98SDF" +      SIDEKIQ_REDIS_URL: "redis://redis:6379/12" +      MAIL_HOST: "iboo-rec.af83.priv" +      MAIL_ASSETS_URL_BASE: "http://iboo-rec.af83.priv" +      MAIL_FROM: "docker <infra+docker@af83.com>" +      SMTP_HOST: "mail.af83.priv" +      REDIS_CACHE_STORE: "redis://redis:6379/0/cache" +      SESAME_API_URL: '{"key":"1234567890azertyuiop","url":"http://172.28.100.18:3001/"}' +      AUTH_SETTINGS: '{"type":"cas","cas_server":"http://172.28.100.18:3001/sessions","cas_validate_url":"http://172.28.100.18:3001/sessions/proxyValidate"}' +    volumes: +      - /data/iboo/uploads:/app/public/uploads +    ports: +      - "3004:3000" +    restart: always +    depends_on: +      - redis +  async: +    image: registry.af83.io/stif-iboo:latest +    environment: +      RAILS_DB_HOST: "192.168.15.98" +      RAILS_DB_USER: "chouette" +      RAILS_DB_NAME: "chouette2" +      RAILS_DB_PASSWORD: "chouette" +      SECRET_KEY_BASE: "KSKSJDHF0QDKJDSfkSJDFKSJDfh98SDF" +      SIDEKIQ_REDIS_URL: "redis://redis:6379/12" +      MAIL_HOST: "iboo-rec.af83.priv" +      MAIL_ASSETS_URL_BASE: "http://iboo-rec.af83.priv" +      MAIL_FROM: "docker <infra+docker@af83.com>" +      SMTP_HOST: "mail.af83.priv" +      SESAME_API_URL: '{"key":"1234567890azertyuiop","url":"http://172.28.100.18:3001/"}' +      AUTH_SETTINGS: '{"type":"cas","cas_server":"http://172.28.100.18:3001/sessions","cas_validate_url":"http://172.28.100.18:3001/sessions/proxyValidate"}' +    command: bundle exec sidekiq -e production +    restart: always +    depends_on: +      - redis +  sync: +    image: registry.af83.io/stif-iboo:latest +    environment: +      RAILS_DB_HOST: "192.168.15.98" +      RAILS_DB_USER: "chouette" +      RAILS_DB_NAME: "chouette2" +      RAILS_DB_PASSWORD: "chouette" +      SECRET_KEY_BASE: "KSKSJDHF0QDKJDSfkSJDFKSJDfh98SDF" +      SIDEKIQ_REDIS_URL: "redis://redis:6379/12" +      MAIL_HOST: "iboo-rec.af83.priv" +      MAIL_ASSETS_URL_BASE: "http://iboo-rec.af83.priv" +      MAIL_FROM: "docker <infra+docker@af83.com>" +      SMTP_HOST: "mail.af83.priv" +      SESAME_API_URL: '{"key":"1234567890azertyuiop","url":"http://172.28.100.18:3001/"}' +      AUTH_SETTINGS: '{"type":"cas","cas_server":"http://172.28.100.18:3001/sessions","cas_validate_url":"http://172.28.100.18:3001/sessions/proxyValidate"}' +    command: bash launch-cron +    restart: always +    depends_on: +      - redis +  redis: +    image: redis:latest +#  db: +#    image: mdillon/postgis +#    environment: +#      POSTGRES_USER: iboo +#      POSTGRES_PASSWORD: stif_iboo_db +#    volumes: +#     - /data/iboo/postgresql:/var/lib/postgresql/data +#    restart: always diff --git a/lib/tasks/install.rake b/lib/tasks/install.rake index ccc6f2450..1150825b2 100644 --- a/lib/tasks/install.rake +++ b/lib/tasks/install.rake @@ -11,6 +11,7 @@ task :package do    sh "bundle exec rake assets:precompile RAILS_ENV=production"    sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar vendor/cache"    sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar public/assets" +  sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar public/packs"    %w{deploy-helper.sh README sidekiq-stif-boiv.service stif-boiv.conf stif-boiv-setup.sh template-stif-boiv.sql}.each do |f|      cp "install/#{f}", "tmp/package/#{f}" @@ -21,3 +22,26 @@ task :package do    sh "tar -czf stif-boiv-#{release_name}.tar.gz -C tmp/package ."    sh "rm -rf tmp/package vendor/cache"  end + +desc "generate all-in-1 tar.gz package for docker" +task :pkg4docker do +  release_name = Time.now.strftime('%Y%m%d%H%M%S') + +  rm_rf "tmp/package" +  mkdir_p "tmp/package" + +  sh "git archive --format=tar --output=tmp/package/stif-boiv-release-#{release_name}.tar HEAD" + +  sh "bundle package --all" +#  sh "RAILS_DB_ADAPTER=nulldb bundle exec rake assets:clobber RAILS_ENV=production" +#  sh "RAILS_DB_ADAPTER=nulldb bundle exec rake assets:precompile RAILS_ENV=production" +  sh "bundle exec rake assets:clobber RAILS_ENV=production" +  sh "bundle exec rake assets:precompile RAILS_ENV=production" +  sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar vendor/cache" +  sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar public/assets" +  sh "tar -rf tmp/package/stif-boiv-release-#{release_name}.tar public/packs" + +  sh "gzip -c tmp/package/stif-boiv-release-#{release_name}.tar > tmp/stif-boiv-release.tar.gz" + +  sh "rm -rf tmp/package vendor/cache" +end diff --git a/script/launch-cron b/script/launch-cron new file mode 100644 index 000000000..183e5a331 --- /dev/null +++ b/script/launch-cron @@ -0,0 +1,20 @@ +#!/bin/bash + +function append_var_if_defined +{ +    VAR_NAME=$1 +    OUTPUT=$2 +    grep -qE "^${VAR_NAME}=" ${OUTPUT}||env|grep -E "^${VAR_NAME}=">>${OUTPUT} +} +VAR_LIST="RAILS_DB_HOST RAILS_DB_PORT RAILS_DB_USER RAILS_DB_PASSWORD RAILS_DB_NAME MAIL_HOST MAIL_ASSETS_URL_BASE MAIL_FROM SMTP_HOST SECRET_BASE SIDEKIQ_REDIS_URL CODIFLIGNE_API_URL REDIS_CACHE_STORE_URL RAILS_LOG_TO_STDOUT PATH" + +TMPF=$(tempfile) +for v in $VAR_LIST; do +    append_var_if_defined $v $TMPF    +done + +crontab -l >> $TMPF +cat $TMPF |crontab - +rm $TMPF + +exec cron -f diff --git a/tmp/pids/.gitkeep b/tmp/pids/.gitkeep new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tmp/pids/.gitkeep | 
