Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use db-ip lite database for countries #906

Merged
merged 3 commits into from
Apr 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ npm-debug.log
# we ignore priv/static. You may want to comment
# this depending on your deployment strategy.
/priv/static/
/priv/geolix/
/priv/geodb/

# Files matching config/*.secret.exs pattern contain sensitive
# data and you should not commit them into version control.
Expand All @@ -58,4 +58,4 @@ plausible-report.xml

# Dializer
/priv/plts/*.plt
/priv/plts/*.plt.hash
/priv/plts/*.plt.hash
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
- Site switching keybinds (1-9 for respective sites) plausible/analytics#735
- Glob (wildcard) based pageview goals plausible/analytics#750
- Support for embedding shared links in an iframe plausible/analytics#812
- Include a basic IP-To-Country database by default plausible/analytics#906
- Add name/label to shared links plausible/analytics#910

### Fixed
Expand Down
3 changes: 2 additions & 1 deletion assets/js/dashboard/mount.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ if (container) {
hasGoals: container.dataset.hasGoals === 'true',
insertedAt: container.dataset.insertedAt,
embedded: container.dataset.embedded,
background: container.dataset.background
background: container.dataset.background,
selfhosted: container.dataset.selfhosted === 'true'
}

const loggedIn = container.dataset.loggedIn === 'true'
Expand Down
11 changes: 10 additions & 1 deletion assets/js/dashboard/stats/countries.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,22 @@ class Countries extends React.Component {
});
}

geolocationDbNotice() {
if (this.props.site.selfhosted) {
return (
<span className="text-xs text-gray-500 absolute bottom-4 right-3">IP Geolocation by <a target="_blank" href="https://db-ip.com" className="text-indigo-600">DB-IP</a></span>
)
}
}

renderBody() {
if (this.state.countries) {
return (
<React.Fragment>
<h3 className="font-bold dark:text-gray-100">Countries</h3>
<div className="mx-auto mt-6" style={{width: '100%', maxWidth: '475px', height: '320px'}} id="map-container"></div>
<div className="mx-auto mt-6" style={{width: '100%', maxWidth: '475px', height: '335px'}} id="map-container"></div>
<MoreLink site={this.props.site} list={this.state.countries} endpoint="countries" />
{ this.geolocationDbNotice() }
</React.Fragment>
)
}
Expand Down
4 changes: 2 additions & 2 deletions config/runtime.exs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ cron_enabled = String.to_existing_atom(System.get_env("CRON_ENABLED", "false"))
custom_domain_server_ip = System.get_env("CUSTOM_DOMAIN_SERVER_IP")
custom_domain_server_user = System.get_env("CUSTOM_DOMAIN_SERVER_USER")
custom_domain_server_password = System.get_env("CUSTOM_DOMAIN_SERVER_PASSWORD")
geolite2_country_db = System.get_env("GEOLITE2_COUNTRY_DB")
geolite2_country_db = System.get_env("EOLITE2_COUNTRY_DB", "priv/geodb/dbip-country.mmdb")
disable_auth = String.to_existing_atom(System.get_env("DISABLE_AUTH", "false"))
disable_registration = String.to_existing_atom(System.get_env("DISABLE_REGISTRATION", "false"))
hcaptcha_sitekey = System.get_env("HCAPTCHA_SITEKEY")
Expand Down Expand Up @@ -243,7 +243,7 @@ config :kaffy,
]
]

if geolite2_country_db do
if config_env() != :test && geolite2_country_db do
config :geolix,
databases: [
%{
Expand Down
38 changes: 38 additions & 0 deletions lib/mix/tasks/download_country_database.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
defmodule Mix.Tasks.DownloadCountryDatabase do
use Mix.Task
use Plausible.Repo
require Logger

# coveralls-ignore-start

def run(_) do
Application.ensure_all_started(:httpoison)
Application.ensure_all_started(:timex)
this_month = Timex.today()
last_month = Timex.shift(this_month, months: -1)
this_month = this_month |> Date.to_iso8601() |> binary_part(0, 7)
last_month = last_month |> Date.to_iso8601() |> binary_part(0, 7)
this_month_url = "https://download.db-ip.com/free/dbip-country-lite-#{this_month}.mmdb.gz"
last_month_url = "https://download.db-ip.com/free/dbip-country-lite-#{last_month}.mmdb.gz"
Logger.info("Downloading #{this_month_url}")
res = HTTPoison.get!(this_month_url)

res =
case res.status_code do
404 ->
Logger.info("Got 404 for #{this_month_url}, trying #{last_month_url}")
HTTPoison.get!(last_month_url)

_ ->
res
end

if res.status_code == 200 do
File.mkdir("priv/geodb")
File.write!("priv/geodb/dbip-country.mmdb", res.body)
Logger.info("Downloaded and saved the database successfully")
else
Logger.error("Unable to download and save the database. Response: #{inspect(res)}")
end
end
end
2 changes: 1 addition & 1 deletion lib/plausible_web/templates/stats/stats.html.eex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
</div>
<% end %>
<div class="pt-6"></div>
<div id="stats-react-container" data-domain="<%= @site.domain %>" data-offset="<%= Timex.Timezone.total_offset(Timex.Timezone.get(@site.timezone)) %>" data-has-goals="<%= @has_goals %>" data-logged-in="<%= [email protected][:current_user] %>" data-inserted-at="<%= @site.inserted_at %>" data-shared-link-auth="<%= assigns[:shared_link_auth] %>" data-embedded="<%= @conn.assigns[:embedded] %>" data-background="<%= @conn.assigns[:background] %>"></div>
<div id="stats-react-container" data-domain="<%= @site.domain %>" data-offset="<%= Timex.Timezone.total_offset(Timex.Timezone.get(@site.timezone)) %>" data-has-goals="<%= @has_goals %>" data-logged-in="<%= [email protected][:current_user] %>" data-inserted-at="<%= @site.inserted_at %>" data-shared-link-auth="<%= assigns[:shared_link_auth] %>" data-embedded="<%= @conn.assigns[:embedded] %>" data-background="<%= @conn.assigns[:background] %>" data-selfhosted="<%= Application.get_env(:plausible, :is_selfhost) %>"></div>
<div id="modal_root"></div>
<%= if [email protected][:current_user] && @conn.assigns[:demo] do %>
<div class="bg-gray-50 dark:bg-gray-850">
Expand Down