From e0b5cc6e4075c5539164011c68f82611e063777f Mon Sep 17 00:00:00 2001 From: teddit Date: Tue, 24 Aug 2021 17:17:46 +0200 Subject: [PATCH] introduce a cache control: a way of keeping the cache directory under certain size (should fix #229) --- app.js | 3 +++ cacheControl.js | 58 ++++++++++++++++++++++++++++++++++++++++++++++ config.js.template | 3 +++ 3 files changed, 64 insertions(+) create mode 100644 cacheControl.js diff --git a/app.js b/app.js index 404288e..504aacd 100644 --- a/app.js +++ b/app.js @@ -153,6 +153,9 @@ redis.on('error', (error) => { } }) +const cacheControl = require('./cacheControl.js') +cacheControl.removeCacheFiles() + if(config.https_enabled) { https.listen(config.ssl_port, config.listen_address, () => console.log(`Teddit running on https://${config.domain}:${config.ssl_port}`)) } diff --git a/cacheControl.js b/cacheControl.js new file mode 100644 index 0000000..09c928b --- /dev/null +++ b/cacheControl.js @@ -0,0 +1,58 @@ +module.exports.removeCacheFiles = function() { + const fs = require('fs') + const config = require('./config') + const pics = './static/pics' + const flairs = './static/pics/flairs' + const icons = './static/pics/icons' + const thumbs = './static/pics/thumbs' + const vids = './static/vids' + let util = require('util') + let spawn = require('child_process').spawn + + let usage + const limit = config.cache_max_size + + function getUsage() { + return new Promise((resolve, reject) => { + let size = spawn('du', ['-sBM', './static/']) + size.stdout.on('data', function (data) { + usage = parseInt(data) + resolve(usage) + }) + }) + } + + function deleteFiles() { + return new Promise(async (resolve, reject) => { + usage = await getUsage() + if(usage > limit) { + const { exec } = require('child_process') + exec(`cd ${pics} && ls -1btr -Iflairs -Iicons -Ithumbs -I.gitignore | head -50 | xargs rm -f --`) + exec(`cd ${flairs} && ls -1btr -I.gitignore | head -50 | xargs rm -f --`) + exec(`cd ${icons} && ls -1btr -I.gitignore | head -50 | xargs rm -f --`) + exec(`cd ${thumbs} && ls -1btr -I.gitignore | head -50 | xargs rm -f --`) + exec(`cd ${vids} && ls -1btr -I.gitignore | head -30 | xargs rm -f --`) + } + resolve(1) + }) + } + + async function main() { + usage = await getUsage() + if(usage > limit) { + console.log('Started removeCacheFiles()') + while(usage > limit) { + await deleteFiles() + } + } + } + + if(config.cache_control) { + main() + + const interval_ms = config.cache_control_interval + setInterval(() => { + main() + }, interval_ms) + } +} diff --git a/config.js.template b/config.js.template index 2394cc6..2ab1eff 100644 --- a/config.js.template +++ b/config.js.template @@ -32,6 +32,9 @@ const config = { domain_replacements: process.env.DOMAIN_REPLACEMENTS ? (JSON.parse(process.env.DOMAIN_REPLACEMENTS).map(([p, r]) => [new RegExp(p, 'gm'), r])) : [], // Replacements for domains in outgoing links. Tuples with regular expressions to match, and replacement values. This is in addition to user-level configuration of privacyDomains. + cache_control: process.env.CACHE_CONTROL !== 'true' || true, // If true, teddit will automatically try to keep the size of the cache directory (static) under config.cache_max_size. By default this is set to true. + cache_max_size: process.env.CACHE_MAX_SIZE || 3000, // How much can we cache to the disk? Default is 3000 MB (~3 GB). Note: This is not perfectly exact limit. + cache_control_interval: process.env.CACHE_CONTROL_INTERVAL || 1000 * 60 * 30, // How often the size of the cache directory (static/) is checked. Default is every 30 minutes. post_media_max_heights: { /** * Sets the max-height value for images and videos in posts.