mirror of
https://github.com/discourse/discourse.git
synced 2024-11-22 15:06:26 +08:00
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:
parent
169cc56bed
commit
6580025af9
|
@ -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 =
|
||||||
|
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user