2.4-stable release
This commit is contained in:
parent
7c5432fbe7
commit
dccb3e0cd0
@ -513,6 +513,14 @@ func main() {
|
|||||||
if err := os.MkdirAll(conf.Thumbnails.Directory, os.ModePerm); err != nil {
|
if err := os.MkdirAll(conf.Thumbnails.Directory, os.ModePerm); err != nil {
|
||||||
log.Fatalf("Failed to create thumbnail directory: %v", err)
|
log.Fatalf("Failed to create thumbnail directory: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Verify and repair thumbnails
|
||||||
|
thumbnailPaths, err := filepath.Glob(filepath.Join(conf.Thumbnails.Directory, "*"))
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("Error listing thumbnail files: %v", err)
|
||||||
|
} else {
|
||||||
|
go verifyAndRepairThumbnails(thumbnailPaths, redisClient, conf.Server.StoragePath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = checkFreeSpaceWithRetry(storagePath, 3, 5*time.Second)
|
err = checkFreeSpaceWithRetry(storagePath, 3, 5*time.Second)
|
||||||
@ -3079,4 +3087,84 @@ func handleThumbnails(w http.ResponseWriter, r *http.Request) {
|
|||||||
if _, err := io.Copy(w, file); err != nil {
|
if _, err := io.Copy(w, file); err != nil {
|
||||||
log.WithError(err).Errorf("Failed to serve thumbnail for user_id: %s", userID)
|
log.WithError(err).Errorf("Failed to serve thumbnail for user_id: %s", userID)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// verifyAndRepairThumbnails verifies the integrity of thumbnail files and repairs them if necessary
|
||||||
|
func verifyAndRepairThumbnails(thumbnailPaths []string, redisClient *redis.Client, originalDir string) {
|
||||||
|
// Check if redisClient is nil
|
||||||
|
if redisClient == nil {
|
||||||
|
log.Error("Redis client is nil. Cannot verify and repair thumbnails.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if thumbnailPaths is nil or empty
|
||||||
|
if len(thumbnailPaths) == 0 {
|
||||||
|
log.Error("Thumbnail paths are nil or empty. Nothing to verify or repair.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, thumbPath := range thumbnailPaths {
|
||||||
|
// Compute SHA-256 hash of the thumbnail file
|
||||||
|
file, err := os.Open(thumbPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error opening thumbnail %s: %v", thumbPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hasher := sha256.New()
|
||||||
|
if _, err := io.Copy(hasher, file); err != nil {
|
||||||
|
log.Warnf("Error hashing thumbnail %s: %v", thumbPath, err)
|
||||||
|
file.Close()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
file.Close()
|
||||||
|
computedHash := hex.EncodeToString(hasher.Sum(nil))
|
||||||
|
|
||||||
|
// Get stored hash from Redis
|
||||||
|
storedHash, err := redisClient.Get(context.Background(), thumbPath).Result()
|
||||||
|
if err == redis.Nil || storedHash != computedHash {
|
||||||
|
log.Warnf("Thumbnail %s is corrupted or missing. Regenerating...", thumbPath)
|
||||||
|
|
||||||
|
// Assume original image is in originalDir with the same base name
|
||||||
|
originalPath := filepath.Join(originalDir, filepath.Base(thumbPath))
|
||||||
|
origImage, err := imaging.Open(originalPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error opening original image %s: %v", originalPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate thumbnail (e.g., 200x200 pixels)
|
||||||
|
thumbnail := imaging.Thumbnail(origImage, 200, 200, imaging.Lanczos)
|
||||||
|
|
||||||
|
// Save the regenerated thumbnail
|
||||||
|
err = imaging.Save(thumbnail, thumbPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error saving regenerated thumbnail %s: %v", thumbPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compute new hash
|
||||||
|
file, err := os.Open(thumbPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error opening regenerated thumbnail %s: %v", thumbPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
hasher.Reset()
|
||||||
|
if _, err := io.Copy(hasher, file); err != nil {
|
||||||
|
log.Warnf("Error hashing regenerated thumbnail %s: %v", thumbPath, err)
|
||||||
|
file.Close()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
file.Close()
|
||||||
|
newHash := hex.EncodeToString(hasher.Sum(nil))
|
||||||
|
|
||||||
|
// Store new hash in Redis
|
||||||
|
err = redisClient.Set(context.Background(), thumbPath, newHash, 0).Err()
|
||||||
|
if err != nil {
|
||||||
|
log.Warnf("Error storing new hash for thumbnail %s in Redis: %v", thumbPath, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Infof("Successfully regenerated and updated thumbnail %s", thumbPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
0
cmd/server/uploads/test
Normal file
0
cmd/server/uploads/test
Normal file
28
config.toml
28
config.toml
@ -27,17 +27,17 @@ max_age = 30
|
|||||||
compress = true
|
compress = true
|
||||||
|
|
||||||
[deduplication]
|
[deduplication]
|
||||||
enabled = false
|
enabled = true
|
||||||
directory = "./deduplication"
|
directory = "./deduplication"
|
||||||
|
|
||||||
[thumbnails]
|
[thumbnails]
|
||||||
enabled = false
|
enabled = true
|
||||||
directory = "./thumbnails"
|
directory = "./thumbnails"
|
||||||
size = "200x200"
|
size = "200x200"
|
||||||
thumbnailintervalscan = "24h"
|
thumbnailintervalscan = "24h"
|
||||||
|
|
||||||
[iso]
|
[iso]
|
||||||
enabled = false
|
enabled = true
|
||||||
size = "1GB"
|
size = "1GB"
|
||||||
mountpoint = "/mnt/iso"
|
mountpoint = "/mnt/iso"
|
||||||
charset = "utf-8"
|
charset = "utf-8"
|
||||||
@ -52,19 +52,14 @@ idletimeout = "4800s"
|
|||||||
secret = "changeme"
|
secret = "changeme"
|
||||||
|
|
||||||
[versioning]
|
[versioning]
|
||||||
enableversioning = false
|
enableversioning = true
|
||||||
maxversions = 1
|
maxversions = 5
|
||||||
|
|
||||||
[uploads]
|
[uploads]
|
||||||
resumableuploadsenabled = true
|
resumableuploadsenabled = true
|
||||||
chunkeduploadsenabled = true
|
chunkeduploadsenabled = true
|
||||||
chunksize = "8192"
|
chunksize = "8192"
|
||||||
allowedextensions = [
|
allowedextensions = ["*"] # Use ["*"] to allow all or specify extensions
|
||||||
".txt", ".pdf", ".png", ".jpg", ".jpeg", ".gif",
|
|
||||||
".bmp", ".tiff", ".svg", ".webp", ".wav", ".mp4",
|
|
||||||
".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm",
|
|
||||||
".mpeg", ".mpg", ".m4v", ".3gp", ".3g2", ".mp3", ".ogg"
|
|
||||||
]
|
|
||||||
|
|
||||||
[downloads]
|
[downloads]
|
||||||
resumabledownloadsenabled = true
|
resumabledownloadsenabled = true
|
||||||
@ -88,18 +83,9 @@ redishealthcheckinterval = "120s"
|
|||||||
[workers]
|
[workers]
|
||||||
numworkers = 4
|
numworkers = 4
|
||||||
uploadqueuesize = 50
|
uploadqueuesize = 50
|
||||||
max_concurrent_operations = 10
|
|
||||||
network_event_buffer = 100
|
|
||||||
performance_monitor_interval = "5m"
|
|
||||||
metrics_update_interval = "10s"
|
|
||||||
|
|
||||||
[file]
|
[file]
|
||||||
filerevision = 1
|
filerevision = 1
|
||||||
|
|
||||||
[precache]
|
|
||||||
redisEnabled = true
|
|
||||||
redisAddr = "localhost:6379"
|
|
||||||
staticIndexFile = "./static_index.json"
|
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
version = "v1.0.0"
|
version = "v2.3"
|
||||||
|
@ -16,7 +16,7 @@ import (
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
serverURL = "http://[::1]:8080" // Replace with your actual server URL
|
serverURL = "http://[::1]:8080" // Replace with your actual server URL
|
||||||
secret = "changeme" // Replace with your HMAC secret key
|
secret = "a-orc-and-a-humans-is-drinking-ale" // Replace with your HMAC secret key
|
||||||
uploadPath = "hmac_icon.png" // Test file to upload
|
uploadPath = "hmac_icon.png" // Test file to upload
|
||||||
protocolType = "v2" // Use v2, v, or token as needed
|
protocolType = "v2" // Use v2, v, or token as needed
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user