add mix task to prune the object database using a configured retention period
authorWilliam Pitcock <nenolod@dereferenced.org>
Tue, 21 May 2019 01:21:28 +0000 (01:21 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Tue, 21 May 2019 21:38:56 +0000 (21:38 +0000)
config/config.exs
docs/config.md
lib/mix/tasks/pleroma/database.ex

index 72908266d635f2267f8a613f103d59fb971510b9..466a6e9b751f624287b58ba064f5863d8998a93f 100644 (file)
@@ -239,7 +239,8 @@ config :pleroma, :instance,
   welcome_message: nil,
   max_report_comment_size: 1000,
   safe_dm_mentions: false,
-  healthcheck: false
+  healthcheck: false,
+  remote_post_retention_days: 90
 
 config :pleroma, :app_account_creation, enabled: true, max_requests: 25, interval: 1800
 
index 197326bbd74d59aef62a810858036142ef1f8f1a..a050068f4d246e65d33db971c537efaf99f9a285 100644 (file)
@@ -104,6 +104,7 @@ config :pleroma, Pleroma.Emails.Mailer,
 * `max_report_comment_size`: The maximum size of the report comment (Default: `1000`)
 * `safe_dm_mentions`: If set to true, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. "@friend hey i really don't like @enemy"). (Default: `false`)
 * `healthcheck`: if set to true, system data will be shown on ``/api/pleroma/healthcheck``.
+* `remote_post_retention_days`: the default amount of days to retain remote posts when pruning the database
 
 ## :app_account_creation
 REST API for creating an account settings
index f650b447dde848fa381729fa6406ccc38e05ecde..fdb216037beb145fdce44b59ef2a9e59bae2505a 100644 (file)
@@ -23,6 +23,10 @@ defmodule Mix.Tasks.Pleroma.Database do
     Options:
     - `--vacuum` - run `VACUUM FULL` after the embedded objects are replaced with their references
 
+  ## Prune old objects from the database
+
+      mix pleroma.database prune_objects
+
   ## Create a conversation for all existing DMs. Can be safely re-run.
 
       mix pleroma.database bump_all_conversations
@@ -72,4 +76,40 @@ defmodule Mix.Tasks.Pleroma.Database do
     Enum.each(users, &User.remove_duplicated_following/1)
     Enum.each(users, &User.update_follower_count/1)
   end
+
+  def run(["prune_objects" | args]) do
+    {options, [], []} =
+      OptionParser.parse(
+        args,
+        strict: [
+          vacuum: :boolean
+        ]
+      )
+
+    Common.start_pleroma()
+
+    deadline = Pleroma.Config.get([:instance, :remote_post_retention_days])
+
+    Logger.info("Pruning objects older than #{deadline} days")
+
+    time_deadline =
+      NaiveDateTime.utc_now()
+      |> NaiveDateTime.add(-(deadline * 86_400))
+
+    Repo.query!(
+      "DELETE FROM objects WHERE inserted_at < $1 AND split_part(data->>'actor', '/', 3) != $2",
+      [time_deadline, Pleroma.Web.Endpoint.host()],
+      timeout: :infinity
+    )
+
+    if Keyword.get(options, :vacuum) do
+      Logger.info("Runnning VACUUM FULL")
+
+      Repo.query!(
+        "vacuum full;",
+        [],
+        timeout: :infinity
+      )
+    end
+  end
 end