FEATURE: add backup directory for mmdb files

This new `DISCOURSE_MAXMIND_BACKUP_PATH` can be used a secondary location
for maxmind db. That way a build machine, for example can cache it on the
host and reuse between builds.

Also per 5bfeef77 added proper error raising for download fails from
dedicated rake task

This also moves "refresh_maxmind_db_during_precompile_days" to a global
setting, it did not make sense in a site setting
This commit is contained in:
Sam Saffron 2019-05-27 16:51:24 +10:00
parent 169cc56bed
commit 6580025af9
4 changed files with 80 additions and 23 deletions

View File

@ -208,3 +208,10 @@ max_old_rebakes_per_15_minutes = 300
# maximum number of log messages in /logs # maximum number of log messages in /logs
max_logster_logs = 1000 max_logster_logs = 1000
# during precompile update maxmind database if older than N days
# set to 0 to disable
refresh_maxmind_db_during_precompile_days = 2
# backup path containing maxmind db files
maxmind_backup_path =

View File

@ -1534,12 +1534,6 @@ developer:
enable_safe_mode: enable_safe_mode:
default: true default: true
client: true client: true
refresh_maxmind_db_during_precompile_days:
min: 0
max: 120
default: 2
hidden: true
shadowed_by_global: true
embedding: embedding:
feed_polling_enabled: feed_polling_enabled:

View File

@ -27,20 +27,16 @@ class DiscourseIpInfo
def self.mmdb_download(name) def self.mmdb_download(name)
FileUtils.mkdir_p(path) FileUtils.mkdir_p(path)
begin gz_file = FileHelper.download(
gz_file = FileHelper.download( "https://geolite.maxmind.com/geoip/databases/#{name}/update",
"https://geolite.maxmind.com/geoip/databases/#{name}/update", max_file_size: 100.megabytes,
max_file_size: 100.megabytes, tmp_file_name: "#{name}.gz"
tmp_file_name: "#{name}.gz" )
)
Discourse::Utils.execute_command("gunzip", gz_file.path) Discourse::Utils.execute_command("gunzip", gz_file.path)
path = gz_file.path.sub(/\.gz\z/, "") path = gz_file.path.sub(/\.gz\z/, "")
FileUtils.mv(path, mmdb_path(name)) FileUtils.mv(path, mmdb_path(name))
rescue OpenURI::HTTPError => e
Rails.logger.warn("MaxMindDB (#{name}) could not be downloaded: #{e}")
end
ensure ensure
gz_file&.close! gz_file&.close!
end end

View File

@ -158,15 +158,75 @@ def concurrent?
end end
end end
def get_mmdb_time(root_path)
mmdb_time = nil
%w{
GeoLite2-City
GeoLite2-ASN
}.map do |name|
path = File.join(root_path, "#{name}.mmdb")
if File.exist?(path)
mmdb_time = File.mtime(path)
else
mmdb_time = nil
break
end
end
mmdb_time
end
def copy_maxmind(from_path, to_path)
puts "Copying MaxMindDB from #{from_path} to #{to_path}"
%w{
GeoLite2-City
GeoLite2-ASN
}.each do |name|
from = File.join(from_path, "#{name}.mmdb")
to = File.join(to_path, "#{name}.mmdb")
FileUtils.cp(from, to, preserve: true)
end
end
task 'assets:precompile' => 'assets:precompile:before' do task 'assets:precompile' => 'assets:precompile:before' do
if refresh_days = SiteSetting.refresh_maxmind_db_during_precompile_days
mmdb_path = DiscourseIpInfo.mmdb_path('GeoLite2-City') refresh_days = GlobalSetting.refresh_maxmind_db_during_precompile_days
mmdb_time = File.exist?(mmdb_path) && File.mtime(mmdb_path)
if refresh_days.to_i > 0
mmdb_time = get_mmdb_time(DiscourseIpInfo.path)
backup_mmdb_time =
if GlobalSetting.maxmind_backup_path.present?
get_mmdb_time(GlobalSetting.maxmind_backup_path)
end
mmdb_time ||= backup_mmdb_time
if backup_mmdb_time && backup_mmdb_time >= mmdb_time
copy_maxmind(GlobalSetting.maxmind_backup_path, DiscourseIpInfo.path)
end
if !mmdb_time || mmdb_time < refresh_days.days.ago if !mmdb_time || mmdb_time < refresh_days.days.ago
puts "Downloading MaxMindDB..." puts "Downloading MaxMindDB..."
mmdb_thread = Thread.new do mmdb_thread = Thread.new do
DiscourseIpInfo.mmdb_download('GeoLite2-City') begin
DiscourseIpInfo.mmdb_download('GeoLite2-ASN') DiscourseIpInfo.mmdb_download('GeoLite2-City')
DiscourseIpInfo.mmdb_download('GeoLite2-ASN')
if GlobalSetting.maxmind_backup_path.present?
copy_maxmind(DiscourseIpInfo.path, GlobalSetting.maxmind_backup_path)
end
rescue OpenURI::HTTPError => e
STDERR.puts("*" * 100)
STDERR.puts("MaxMindDB (#{name}) could not be downloaded: #{e}")
STDERR.puts("*" * 100)
Rails.logger.warn("MaxMindDB (#{name}) could not be downloaded: #{e}")
end
end end
end end
end end