add imagecleaner, fix #4

This commit is contained in:
jomo 2014-11-30 02:48:54 +01:00
parent 332330f68e
commit 48e1f54336
8 changed files with 58 additions and 26 deletions

View File

@ -1,24 +0,0 @@
#!/bin/bash
# deletes old images on heroku
# heroku provides only 300 MB available disk space
# number of files to delete (2 files ~ 400B)
amount="50000" # about 20MB
# max free MB (on /) to trigger deletion
trigger="50"
available=`df -m / | awk "NR==2 { print $4 }"` # MB available on /
if [ "$available" -le "$trigger" ]; then
echo "Deleting old images"
for file in `ls -1tr "/app/skins/faces" | head -n $amount`; do
rm -rf "/app/skins/faces/$file"
done
for file in `ls -1tr "/app/skins/helms" | head -n $amount`; do
rm -rf "/app/skins/helms/$file"
done
echo "done."
else
echo "More than $trigger MB are available ($available MB), not deleting!"
fi

44
modules/clean_images.js Normal file
View File

@ -0,0 +1,44 @@
var logging = require("./logging");
var config = require("./config");
var df = require("node-df");
var fs = require("fs");
var exp = {};
// uses `df` to get the available fisk space
// callback contains error, true|false
function should_clean(callback) {
df({
file: __dirname + "/../" + config.faces_dir,
prefixMultiplier: 'KiB',
isDisplayPrefixMultiplier: false,
precision: 2
}, function (err, response) {
var available = response[0].available;
console.log("ImageCleaner: " + available + "KB available");
callback(err, available < config.cleaning_limit);
});
}
// check if disk limit reached
// then delete images
exp.run = function() {
should_clean(function(err, clean) {
if (err) {
logging.error(err);
} else if (clean) {
logging.warn("ImageCleaner: Disk limit reached! Cleaning images now");
var skindir = __dirname + "/../" + config.faces_dir;
var helmdir = __dirname + "/../" + config.helms_dir;
var files = fs.readdirSync(skindir);
for (var i = 0; i < Math.min(files.length, config.cleaning_amount); i++) {
fs.unlink(skindir + files[i], function(){});
fs.unlink(helmdir + files[i], function(){});
}
} else {
logging.log("ImageCleaner: Nothing to clean");
}
});
};
module.exports = exp;

View File

@ -4,6 +4,9 @@ var config = {
default_size: 160, // size to be used when no size given
local_cache_time: 3600, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response
browser_cache_time: 3600, // seconds until browser will request image again
cleaning_interval: 1800, // seconds interval: deleting images if disk size at limit
cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning
cleaning_amount: 50000, // amount of avatar (and their helm) files to clean
http_timeout: 1000, // ms until connection to mojang is dropped
faces_dir: "skins/faces/", // directory where faces are kept. should have trailing "/"
helms_dir: "skins/helms/", // directory where helms are kept. should have trailing "/"

View File

@ -5,6 +5,9 @@ var config = {
local_cache_time: 30, // seconds until we will check if the image changed. should be > 60 to prevent mojang 429 response
browser_cache_time: 30, // seconds until browser will request image again
http_timeout: 3000, // ms until connection to mojang is dropped
cleaning_interval: 3000, // ms interval: deleting images if disk size at limit
cleaning_limit: 10240, // minumum required available KB on disk to trigger cleaning
cleaning_amount: 50000, // amount of avatar (and their helm) files to clean
faces_dir: "skins/faces/", // directory where faces are kept. should have trailing "/"
helms_dir: "skins/helms/", // directory where helms are kept. should have trailing "/"
debug_enabled: true // enables logging.debug

View File

@ -37,6 +37,7 @@
"mocha-lcov-reporter": "0.0.1",
"morgan": "~1.3.0",
"redis": "0.12.1",
"request": "2.45.0"
"request": "2.45.0",
"node-df": "0.1.1"
}
}

View File

@ -1,5 +1,7 @@
#!/usr/bin/env node
var config = require("./modules/config");
var debug = require("debug")("crafatar");
var clean = require("./modules/clean_images");
var app = require("./app");
app.set("port", process.env.PORT || 3000);
@ -7,3 +9,6 @@ app.set("port", process.env.PORT || 3000);
var server = app.listen(app.get("port"), function() {
debug("Crafatar server listening on port " + server.address().port);
});
// cleaning worker
setInterval(clean.run, config.cleaning_interval);

View File

View File