Chore: Update 2.8 cleaned up usesless files
This commit is contained in:
parent
31a157ea96
commit
7e665152b0
92
CHANGELOG.md
Normal file
92
CHANGELOG.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
- Initial creation of a comprehensive changelog.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.7] - 2026-02-10
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Concurrency improvements and auto-scaling worker enhancements
|
||||||
|
- Cleanup and removal of unused parameters in sorting functions
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Additional logging for file scanning operations
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Minor stability issues related to ISO container mounting
|
||||||
|
- Fixed dual stack for upload (IPv4/IPv6)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.6-Stable] - 2025-12-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Deduplication support (removes duplicate files).
|
||||||
|
- ISO Container management.
|
||||||
|
- Dynamic worker scaling based on CPU & memory.
|
||||||
|
- PreCaching feature for faster file access.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Worker pool scaling strategies for better performance.
|
||||||
|
- Enhanced logging with rotating logs using lumberjack.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Temporary file handling issues causing "Unsupported file type" warnings.
|
||||||
|
- MIME type checks for file extension mismatches.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.5] - 2025-09-15
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Redis caching integration for file metadata.
|
||||||
|
- ClamAV scanning for virus detection before finalizing uploads.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Extended the default chunk size for chunked uploads.
|
||||||
|
- Updated official documentation links.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Edge case with versioning causing file rename conflicts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [2.0] - 2025-06-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Chunked file uploads and downloads.
|
||||||
|
- Resumable upload support with partial file retention.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Moved configuration management to Viper.
|
||||||
|
- Default Prometheus metrics for tracking memory & CPU usage.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Race conditions in file locking under heavy concurrency.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## [1.0] - 2025-01-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Initial release with HMAC-based authentication.
|
||||||
|
- Basic file upload/download endpoints.
|
||||||
|
- Logging and fundamental configuration using .toml files.
|
48
COMBINED_RELEASE_NOTES.md
Normal file
48
COMBINED_RELEASE_NOTES.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
## HMAC File Server – Release v2.7
|
||||||
|
|
||||||
|
### What’s New
|
||||||
|
1. **Configurable Filenaming**
|
||||||
|
- Added support for `filenaming=None` to **skip** the default HMAC-based renaming.
|
||||||
|
- Allows users to keep the original filename instead of hashing, while preserving all HMAC authentication for security.
|
||||||
|
|
||||||
|
2. **Enhanced Logging**
|
||||||
|
- Improved log level usage (`info`, `warn`, `error`, `debug`) across the **login flow** and **file handling** operations.
|
||||||
|
- Added more structured fields (e.g., `method`, `remote`, `url`) for easier log analysis.
|
||||||
|
- Better security defaults to avoid exposing sensitive data in logs.
|
||||||
|
|
||||||
|
3. **Prometheus Metrics Adjustments**
|
||||||
|
- Refined counters, gauges, and histograms to cover **all** critical events (upload/download, dedup, ClamAV scanning).
|
||||||
|
- Ensured consistent increments for success/failure paths.
|
||||||
|
- Simplified registration to avoid double-registration issues.
|
||||||
|
|
||||||
|
4. **Deduplication Improvements**
|
||||||
|
- Confirmed that after moving a file to the dedup directory, a **hard link** is consistently created back to the original location.
|
||||||
|
- Logs now clearly indicate successful dedup steps and any errors.
|
||||||
|
|
||||||
|
5. **Worker Pool Enhancements**
|
||||||
|
- Better dynamic scaling logs (e.g., “Added worker. Total workers: X”).
|
||||||
|
- Ensures no duplicate or redundant worker creation.
|
||||||
|
- Additional metrics for worker adjustments and re-adjustments.
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
- **Resolved “File Not Found” During GET**
|
||||||
|
- Clarified that when `filenaming=None`, the server does **not** rename files to HMAC paths, preventing mismatches between upload and download URLs.
|
||||||
|
- Fixed potential race conditions in dedup moving vs. linking.
|
||||||
|
|
||||||
|
- **Reduced Log Noise**
|
||||||
|
- Eliminated repetitive or misleading error messages around networking events.
|
||||||
|
- Improved clarity in ClamAV scanning logs to better distinguish scan failures vs. actual malware detections.
|
||||||
|
|
||||||
|
- Fixed dual stack IPv4 and IPv6 upload for improved reliability.
|
||||||
|
|
||||||
|
### Upgrade Notes
|
||||||
|
1. **Config File**:
|
||||||
|
- Check your `[server]` section for `filenaming`. If you previously relied on HMAC-based filenames, confirm whether you want to set `filenaming="HMAC"` explicitly.
|
||||||
|
2. **Metrics**:
|
||||||
|
- If you track Prometheus data, your dashboards may need to be updated for any renamed metrics or new labels.
|
||||||
|
3. **Logging**:
|
||||||
|
- Logging defaults remain at `info` level. Increase to `debug` only for troubleshooting to avoid excessive detail in production logs.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Thank you** to everyone who contributed feedback and testing for this release! As always, please report any issues, and we welcome suggestions to further improve the HMAC File Server. Enjoy the streamlined filenames, more comprehensive logging, and robust Prometheus metrics!
|
@ -1,4 +1,4 @@
|
|||||||
# Release Notes for HMAC File Server 2.6-Stable
|
# Release Notes for HMAC File Server 2.7-Stable
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
Version 2.6-Stable focuses on improving the overall stability and performance of the HMAC File Server. Significant changes have been made to prioritize reliability and scalability for production environments.
|
Version 2.6-Stable focuses on improving the overall stability and performance of the HMAC File Server. Significant changes have been made to prioritize reliability and scalability for production environments.
|
||||||
@ -44,3 +44,10 @@ For a detailed guide on setting up and configuring the HMAC File Server, refer t
|
|||||||
---
|
---
|
||||||
|
|
||||||
Thank you for using HMAC File Server! If you encounter any issues, feel free to report them on our GitHub repository.
|
Thank you for using HMAC File Server! If you encounter any issues, feel free to report them on our GitHub repository.
|
||||||
|
|
||||||
|
## Version 2.7
|
||||||
|
|
||||||
|
- Refinements in worker scaling logic
|
||||||
|
- Removed obsolete parameters for sorting
|
||||||
|
- Further improvements to ISO-based storage handling
|
||||||
|
- Fixed dual stack for upload (IPv4/IPv6)
|
||||||
|
10
SHORT_RELEASE_NOTE.md
Normal file
10
SHORT_RELEASE_NOTE.md
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
# Short Release Note
|
||||||
|
|
||||||
|
Key Highlights from 2.7-Stable:
|
||||||
|
- Improved ISO-based storage for specialized use cases.
|
||||||
|
- Enhanced ClamAV scanning with concurrent workers.
|
||||||
|
- Auto-scaling workers for optimized performance.
|
||||||
|
|
||||||
|
Go 1.24.0 is required.
|
||||||
|
|
||||||
|
For more details, see the README and CHANGELOG.
|
@ -26,6 +26,8 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"sync/atomic"
|
||||||
|
|
||||||
"github.com/dutchcoders/go-clamd" // ClamAV integration
|
"github.com/dutchcoders/go-clamd" // ClamAV integration
|
||||||
"github.com/go-redis/redis/v8" // Redis integration
|
"github.com/go-redis/redis/v8" // Redis integration
|
||||||
"github.com/patrickmn/go-cache"
|
"github.com/patrickmn/go-cache"
|
||||||
@ -38,7 +40,6 @@ import (
|
|||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/spf13/viper"
|
"github.com/spf13/viper"
|
||||||
"gopkg.in/natefinch/lumberjack.v2"
|
"gopkg.in/natefinch/lumberjack.v2"
|
||||||
"sync/atomic"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// parseSize converts a human-readable size string to bytes
|
// parseSize converts a human-readable size string to bytes
|
||||||
@ -144,10 +145,10 @@ type DeduplicationConfig struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ISOConfig struct {
|
type ISOConfig struct {
|
||||||
Enabled bool `mapstructure:"enabled"`
|
Enabled bool `mapstructure:"enabled"`
|
||||||
Size string `mapstructure:"size"`
|
Size string `mapstructure:"size"`
|
||||||
MountPoint string `mapstructure:"mountpoint"`
|
MountPoint string `mapstructure:"mountpoint"`
|
||||||
Charset string `mapstructure:"charset"`
|
Charset string `mapstructure:"charset"`
|
||||||
ContainerFile string `mapstructure:"containerfile"`
|
ContainerFile string `mapstructure:"containerfile"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,7 +297,7 @@ var (
|
|||||||
workerPool *WorkerPool
|
workerPool *WorkerPool
|
||||||
networkEvents chan NetworkEvent
|
networkEvents chan NetworkEvent
|
||||||
|
|
||||||
workerAdjustmentsTotal prometheus.Counter
|
workerAdjustmentsTotal prometheus.Counter
|
||||||
workerReAdjustmentsTotal prometheus.Counter
|
workerReAdjustmentsTotal prometheus.Counter
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -380,6 +381,24 @@ func createAndMountISO(size, mountpoint, charset string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var dialer = &net.Dialer{
|
||||||
|
DualStack: true,
|
||||||
|
Timeout: 5 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second, // Added keep-alive for better network change handling
|
||||||
|
}
|
||||||
|
|
||||||
|
var dualStackClient = &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
DialContext: dialer.DialContext,
|
||||||
|
ForceAttemptHTTP2: true, // Enforce HTTP/2
|
||||||
|
IdleConnTimeout: 90 * time.Second, // Longer idle connections
|
||||||
|
DisableKeepAlives: false, // Ensure keep-alives are enabled
|
||||||
|
MaxIdleConns: 100,
|
||||||
|
MaxIdleConnsPerHost: 10,
|
||||||
|
// ...existing code...
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
setDefaults()
|
setDefaults()
|
||||||
|
|
||||||
@ -457,7 +476,7 @@ func main() {
|
|||||||
log.Infof("Server PreCaching: %v", conf.Server.PreCaching)
|
log.Infof("Server PreCaching: %v", conf.Server.PreCaching)
|
||||||
log.Infof("Server FileTTLEnabled: %v", conf.Server.FileTTLEnabled)
|
log.Infof("Server FileTTLEnabled: %v", conf.Server.FileTTLEnabled)
|
||||||
log.Infof("Server DeduplicationEnabled: %v", conf.Server.DeduplicationEnabled)
|
log.Infof("Server DeduplicationEnabled: %v", conf.Server.DeduplicationEnabled)
|
||||||
log.Infof("Server BindIP: %s", conf.Server.BindIP) // Hinzugefügt: Logging für BindIP
|
log.Infof("Server BindIP: %s", conf.Server.BindIP) // Hinzugefügt: Logging für BindIP
|
||||||
log.Infof("Server FileNaming: %s", conf.Server.FileNaming) // Added: Logging for FileNaming
|
log.Infof("Server FileNaming: %s", conf.Server.FileNaming) // Added: Logging for FileNaming
|
||||||
|
|
||||||
err = writePIDFile(conf.Server.PIDFilePath) // Write PID file after config is loaded
|
err = writePIDFile(conf.Server.PIDFilePath) // Write PID file after config is loaded
|
||||||
@ -718,7 +737,7 @@ uploadqueuesize = 50
|
|||||||
# Add file-specific configurations here
|
# Add file-specific configurations here
|
||||||
|
|
||||||
[build]
|
[build]
|
||||||
version = "2.6-Stable"
|
version = "2.8-Stable"
|
||||||
`)
|
`)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1085,7 +1104,7 @@ func checkStoragePath(path string) error {
|
|||||||
|
|
||||||
func setupLogging() {
|
func setupLogging() {
|
||||||
level, err := logrus.ParseLevel(conf.Logging.Level)
|
level, err := logrus.ParseLevel(conf.Logging.Level)
|
||||||
if (err != nil) {
|
if err != nil {
|
||||||
log.Fatalf("Invalid log level: %s", conf.Logging.Level)
|
log.Fatalf("Invalid log level: %s", conf.Logging.Level)
|
||||||
}
|
}
|
||||||
log.SetLevel(level)
|
log.SetLevel(level)
|
||||||
@ -1546,25 +1565,25 @@ func (j ScanJob) Execute() error {
|
|||||||
|
|
||||||
// WorkerPool manages a pool of workers
|
// WorkerPool manages a pool of workers
|
||||||
type WorkerPool struct {
|
type WorkerPool struct {
|
||||||
jobQueue chan Job
|
jobQueue chan Job
|
||||||
workerCount int32
|
workerCount int32
|
||||||
maxWorkers int32
|
maxWorkers int32
|
||||||
minWorkers int32
|
minWorkers int32
|
||||||
workerMutex sync.Mutex
|
workerMutex sync.Mutex
|
||||||
shutdown chan struct{}
|
shutdown chan struct{}
|
||||||
shutdownWG sync.WaitGroup
|
shutdownWG sync.WaitGroup
|
||||||
scaleUpThresh int
|
scaleUpThresh int
|
||||||
scaleDownThresh int
|
scaleDownThresh int
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewWorkerPool initializes a new WorkerPool
|
// NewWorkerPool initializes a new WorkerPool
|
||||||
func NewWorkerPool(min, max int32, scaleUp, scaleDown int) *WorkerPool {
|
func NewWorkerPool(min, max int32, scaleUp, scaleDown int) *WorkerPool {
|
||||||
pool := &WorkerPool{
|
pool := &WorkerPool{
|
||||||
jobQueue: make(chan Job, 100),
|
jobQueue: make(chan Job, 100),
|
||||||
minWorkers: min,
|
minWorkers: min,
|
||||||
maxWorkers: max,
|
maxWorkers: max,
|
||||||
shutdown: make(chan struct{}),
|
shutdown: make(chan struct{}),
|
||||||
scaleUpThresh: scaleUp,
|
scaleUpThresh: scaleUp,
|
||||||
scaleDownThresh: scaleDown,
|
scaleDownThresh: scaleDown,
|
||||||
}
|
}
|
||||||
atomic.StoreInt32(&pool.workerCount, 0)
|
atomic.StoreInt32(&pool.workerCount, 0)
|
||||||
@ -1645,6 +1664,13 @@ func (p *WorkerPool) Shutdown() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handleRequest(w http.ResponseWriter, r *http.Request) {
|
func handleRequest(w http.ResponseWriter, r *http.Request) {
|
||||||
|
clientIP := getOriginalClientIP(r)
|
||||||
|
log.WithFields(logrus.Fields{
|
||||||
|
"method": r.Method,
|
||||||
|
"url": r.URL.String(),
|
||||||
|
"remote": clientIP,
|
||||||
|
}).Info("Incoming request")
|
||||||
|
|
||||||
if r.Method == http.MethodPost && strings.Contains(r.Header.Get("Content-Type"), "multipart/form-data") {
|
if r.Method == http.MethodPost && strings.Contains(r.Header.Get("Content-Type"), "multipart/form-data") {
|
||||||
absFilename, err := sanitizeFilePath(conf.Server.StoragePath, strings.TrimPrefix(r.URL.Path, "/"))
|
absFilename, err := sanitizeFilePath(conf.Server.StoragePath, strings.TrimPrefix(r.URL.Path, "/"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1662,7 +1688,7 @@ func handleRequest(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
clientIP := r.Header.Get("X-Real-IP")
|
clientIP = r.Header.Get("X-Real-IP")
|
||||||
if clientIP == "" {
|
if clientIP == "" {
|
||||||
clientIP = r.Header.Get("X-Forwarded-For")
|
clientIP = r.Header.Get("X-Forwarded-For")
|
||||||
}
|
}
|
||||||
@ -1801,7 +1827,7 @@ func handleUpload(w http.ResponseWriter, r *http.Request, absFilename, fileStore
|
|||||||
}
|
}
|
||||||
finalFilename = filepath.Join(filepath.Dir(absFilename), hashVal)
|
finalFilename = filepath.Join(filepath.Dir(absFilename), hashVal)
|
||||||
case "None":
|
case "None":
|
||||||
// Preserve the original filename
|
// Preserve the original filename
|
||||||
finalFilename = absFilename
|
finalFilename = absFilename
|
||||||
default:
|
default:
|
||||||
// ...existing code...
|
// ...existing code...
|
||||||
@ -1972,7 +1998,7 @@ func scanFileWithClamAV(filePath string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initClamAV(socket string) (*clamd.Clamd, error) {
|
func initClamAV(socket string) (*clamd.Clamd, error) {
|
||||||
if (socket == "") {
|
if socket == "" {
|
||||||
log.Error("ClamAV socket path not configured.")
|
log.Error("ClamAV socket path not configured.")
|
||||||
return nil, fmt.Errorf("ClamAV socket path not configured")
|
return nil, fmt.Errorf("ClamAV socket path not configured")
|
||||||
}
|
}
|
||||||
@ -2092,7 +2118,6 @@ func handleChunkedUpload(tempFilename string, r *http.Request, chunkSize int) er
|
|||||||
buffer := make([]byte, chunkSize)
|
buffer := make([]byte, chunkSize)
|
||||||
|
|
||||||
totalBytes := int64(0)
|
totalBytes := int64(0)
|
||||||
originalIP := r.RemoteAddr
|
|
||||||
for {
|
for {
|
||||||
n, err := r.Body.Read(buffer)
|
n, err := r.Body.Read(buffer)
|
||||||
if err != nil && err != io.EOF {
|
if err != nil && err != io.EOF {
|
||||||
@ -2102,12 +2127,6 @@ func handleChunkedUpload(tempFilename string, r *http.Request, chunkSize int) er
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
currentIP := r.RemoteAddr
|
|
||||||
if currentIP != originalIP {
|
|
||||||
log.Warnf("IP changed from %s to %s, terminating transfer", originalIP, currentIP)
|
|
||||||
return fmt.Errorf("client IP changed during transfer")
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = writer.Write(buffer[:n])
|
_, err = writer.Write(buffer[:n])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to write to file: %v", err)
|
return fmt.Errorf("failed to write to file: %v", err)
|
||||||
@ -2227,7 +2246,7 @@ func setupGracefulShutdown(server *http.Server, cancel context.CancelFunc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initRedis() {
|
func initRedis() {
|
||||||
if (!conf.Redis.RedisEnabled) {
|
if !conf.Redis.RedisEnabled {
|
||||||
log.Info("Redis is disabled in configuration.")
|
log.Info("Redis is disabled in configuration.")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -2270,7 +2289,7 @@ func MonitorRedisHealth(ctx context.Context, client *redis.Client, checkInterval
|
|||||||
}
|
}
|
||||||
redisConnected = false
|
redisConnected = false
|
||||||
} else {
|
} else {
|
||||||
if (!redisConnected) {
|
if !redisConnected {
|
||||||
log.Info("Redis reconnected successfully")
|
log.Info("Redis reconnected successfully")
|
||||||
}
|
}
|
||||||
redisConnected = true
|
redisConnected = true
|
||||||
@ -2765,4 +2784,41 @@ func setupRouter() *http.ServeMux {
|
|||||||
router := http.NewServeMux()
|
router := http.NewServeMux()
|
||||||
router.HandleFunc("/", handleRequest)
|
router.HandleFunc("/", handleRequest)
|
||||||
return router
|
return router
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getClientIPs(r *http.Request) []string {
|
||||||
|
var ips []string
|
||||||
|
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
|
||||||
|
parts := strings.Split(xff, ",")
|
||||||
|
for _, part := range parts {
|
||||||
|
ips = append(ips, strings.TrimSpace(part))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if rip := r.Header.Get("X-Real-IP"); rip != "" {
|
||||||
|
ips = append(ips, rip)
|
||||||
|
}
|
||||||
|
host, _, err := net.SplitHostPort(r.RemoteAddr)
|
||||||
|
if err == nil && host != "" {
|
||||||
|
ips = append(ips, host)
|
||||||
|
}
|
||||||
|
return ips
|
||||||
|
}
|
||||||
|
|
||||||
|
func detectIPVersion(ip string) string {
|
||||||
|
if strings.Contains(ip, ":") {
|
||||||
|
return "IPv6"
|
||||||
|
}
|
||||||
|
return "IPv4"
|
||||||
|
}
|
||||||
|
|
||||||
|
func getOriginalClientIP(r *http.Request) string {
|
||||||
|
if ip := r.Header.Get("X-Forwarded-For"); ip != "" {
|
||||||
|
parts := strings.Split(ip, ",")
|
||||||
|
return strings.TrimSpace(parts[0])
|
||||||
|
}
|
||||||
|
if ip := r.Header.Get("X-Real-IP"); ip != "" {
|
||||||
|
return strings.TrimSpace(ip)
|
||||||
|
}
|
||||||
|
host, _, _ := net.SplitHostPort(r.RemoteAddr)
|
||||||
|
return host
|
||||||
|
}
|
||||||
|
@ -27,8 +27,8 @@
|
|||||||
"overrides": []
|
"overrides": []
|
||||||
},
|
},
|
||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 6,
|
||||||
"w": 3,
|
"w": 24,
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 0
|
"y": 0
|
||||||
},
|
},
|
||||||
@ -42,7 +42,7 @@
|
|||||||
"content": "<div style=\"text-align: center; background-color: transparent; padding: 20px;\">\n <h3 style=\"color: white; font-family: 'Arial', sans-serif; font-weight: bold;\">HMAC Dashboard</h3>\n <img src=\"https://git.uuxo.net/uuxo/hmac-file-server/raw/branch/main/dashboard/hmac_icon.png\" alt=\"HMAC Icon\" style=\"width: 50px; height: 50px; display: block; margin: 10px auto;\">\n <p style=\"font-family: 'Verdana', sans-serif; color: white;\">\n This dashboard monitors <strong style=\"color: #FF5733;\">key metrics</strong> for the \n <span style=\"font-style: italic; color: #007BFF;\">HMAC File Server</span>.\n </p>\n</div>\n",
|
"content": "<div style=\"text-align: center; background-color: transparent; padding: 20px;\">\n <h3 style=\"color: white; font-family: 'Arial', sans-serif; font-weight: bold;\">HMAC Dashboard</h3>\n <img src=\"https://git.uuxo.net/uuxo/hmac-file-server/raw/branch/main/dashboard/hmac_icon.png\" alt=\"HMAC Icon\" style=\"width: 50px; height: 50px; display: block; margin: 10px auto;\">\n <p style=\"font-family: 'Verdana', sans-serif; color: white;\">\n This dashboard monitors <strong style=\"color: #FF5733;\">key metrics</strong> for the \n <span style=\"font-style: italic; color: #007BFF;\">HMAC File Server</span>.\n </p>\n</div>\n",
|
||||||
"mode": "html"
|
"mode": "html"
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"title": "HMAC Dashboard",
|
"title": "HMAC Dashboard",
|
||||||
"type": "text"
|
"type": "text"
|
||||||
},
|
},
|
||||||
@ -77,8 +77,8 @@
|
|||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 6,
|
"w": 6,
|
||||||
"x": 3,
|
"x": 0,
|
||||||
"y": 0
|
"y": 6
|
||||||
},
|
},
|
||||||
"id": 14,
|
"id": 14,
|
||||||
"options": {
|
"options": {
|
||||||
@ -105,7 +105,7 @@
|
|||||||
"sizing": "auto",
|
"sizing": "auto",
|
||||||
"valueMode": "color"
|
"valueMode": "color"
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -143,8 +143,8 @@
|
|||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 6,
|
"w": 6,
|
||||||
"x": 9,
|
"x": 6,
|
||||||
"y": 0
|
"y": 6
|
||||||
},
|
},
|
||||||
"id": 18,
|
"id": 18,
|
||||||
"options": {
|
"options": {
|
||||||
@ -164,7 +164,7 @@
|
|||||||
"textMode": "auto",
|
"textMode": "auto",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -203,9 +203,9 @@
|
|||||||
},
|
},
|
||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 5,
|
"w": 4,
|
||||||
"x": 15,
|
"x": 12,
|
||||||
"y": 0
|
"y": 6
|
||||||
},
|
},
|
||||||
"id": 10,
|
"id": 10,
|
||||||
"options": {
|
"options": {
|
||||||
@ -225,7 +225,7 @@
|
|||||||
"textMode": "value",
|
"textMode": "value",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -262,8 +262,8 @@
|
|||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 4,
|
"w": 4,
|
||||||
"x": 20,
|
"x": 16,
|
||||||
"y": 0
|
"y": 6
|
||||||
},
|
},
|
||||||
"id": 17,
|
"id": 17,
|
||||||
"options": {
|
"options": {
|
||||||
@ -283,7 +283,7 @@
|
|||||||
"textMode": "auto",
|
"textMode": "auto",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -297,6 +297,77 @@
|
|||||||
"title": "HMAC GoRoutines",
|
"title": "HMAC GoRoutines",
|
||||||
"type": "stat"
|
"type": "stat"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"default": true,
|
||||||
|
"type": "prometheus"
|
||||||
|
},
|
||||||
|
"fieldConfig": {
|
||||||
|
"defaults": {
|
||||||
|
"color": {
|
||||||
|
"mode": "thresholds"
|
||||||
|
},
|
||||||
|
"mappings": [],
|
||||||
|
"thresholds": {
|
||||||
|
"mode": "absolute",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"color": "green",
|
||||||
|
"value": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"color": "red",
|
||||||
|
"value": 80
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"unit": "s"
|
||||||
|
},
|
||||||
|
"overrides": []
|
||||||
|
},
|
||||||
|
"gridPos": {
|
||||||
|
"h": 7,
|
||||||
|
"w": 4,
|
||||||
|
"x": 20,
|
||||||
|
"y": 6
|
||||||
|
},
|
||||||
|
"id": 15,
|
||||||
|
"options": {
|
||||||
|
"colorMode": "value",
|
||||||
|
"graphMode": "area",
|
||||||
|
"justifyMode": "auto",
|
||||||
|
"orientation": "auto",
|
||||||
|
"percentChangeColorMode": "standard",
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
|
},
|
||||||
|
"showPercentChange": false,
|
||||||
|
"textMode": "auto",
|
||||||
|
"wideLayout": true
|
||||||
|
},
|
||||||
|
"pluginVersion": "11.5.2",
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"datasource": {
|
||||||
|
"type": "prometheus",
|
||||||
|
"uid": "bduehd5vqv1moa"
|
||||||
|
},
|
||||||
|
"editorMode": "code",
|
||||||
|
"expr": "hmac_file_server_upload_duration_seconds_sum + hmac_file_server_download_duration_seconds_sum",
|
||||||
|
"hide": false,
|
||||||
|
"instant": false,
|
||||||
|
"legendFormat": "__auto",
|
||||||
|
"range": true,
|
||||||
|
"refId": "B"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"title": "HMAC Up/Down Duration",
|
||||||
|
"type": "stat"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"datasource": {
|
"datasource": {
|
||||||
"default": true,
|
"default": true,
|
||||||
@ -326,7 +397,7 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 5,
|
"w": 5,
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 7
|
"y": 13
|
||||||
},
|
},
|
||||||
"id": 11,
|
"id": 11,
|
||||||
"options": {
|
"options": {
|
||||||
@ -346,7 +417,7 @@
|
|||||||
"textMode": "value",
|
"textMode": "value",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -389,7 +460,7 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 5,
|
"w": 5,
|
||||||
"x": 5,
|
"x": 5,
|
||||||
"y": 7
|
"y": 13
|
||||||
},
|
},
|
||||||
"id": 12,
|
"id": 12,
|
||||||
"options": {
|
"options": {
|
||||||
@ -409,7 +480,7 @@
|
|||||||
"textMode": "value",
|
"textMode": "value",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -422,77 +493,6 @@
|
|||||||
"title": "HMAC Downloads",
|
"title": "HMAC Downloads",
|
||||||
"type": "stat"
|
"type": "stat"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"datasource": {
|
|
||||||
"default": true,
|
|
||||||
"type": "prometheus"
|
|
||||||
},
|
|
||||||
"fieldConfig": {
|
|
||||||
"defaults": {
|
|
||||||
"color": {
|
|
||||||
"mode": "thresholds"
|
|
||||||
},
|
|
||||||
"mappings": [],
|
|
||||||
"thresholds": {
|
|
||||||
"mode": "absolute",
|
|
||||||
"steps": [
|
|
||||||
{
|
|
||||||
"color": "green",
|
|
||||||
"value": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"color": "red",
|
|
||||||
"value": 80
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"unit": "s"
|
|
||||||
},
|
|
||||||
"overrides": []
|
|
||||||
},
|
|
||||||
"gridPos": {
|
|
||||||
"h": 7,
|
|
||||||
"w": 3,
|
|
||||||
"x": 10,
|
|
||||||
"y": 7
|
|
||||||
},
|
|
||||||
"id": 15,
|
|
||||||
"options": {
|
|
||||||
"colorMode": "value",
|
|
||||||
"graphMode": "area",
|
|
||||||
"justifyMode": "auto",
|
|
||||||
"orientation": "auto",
|
|
||||||
"percentChangeColorMode": "standard",
|
|
||||||
"reduceOptions": {
|
|
||||||
"calcs": [
|
|
||||||
"lastNotNull"
|
|
||||||
],
|
|
||||||
"fields": "",
|
|
||||||
"values": false
|
|
||||||
},
|
|
||||||
"showPercentChange": false,
|
|
||||||
"textMode": "auto",
|
|
||||||
"wideLayout": true
|
|
||||||
},
|
|
||||||
"pluginVersion": "11.4.0",
|
|
||||||
"targets": [
|
|
||||||
{
|
|
||||||
"datasource": {
|
|
||||||
"type": "prometheus",
|
|
||||||
"uid": "bduehd5vqv1moa"
|
|
||||||
},
|
|
||||||
"editorMode": "code",
|
|
||||||
"expr": "hmac_file_server_upload_duration_seconds_sum + hmac_file_server_download_duration_seconds_sum",
|
|
||||||
"hide": false,
|
|
||||||
"instant": false,
|
|
||||||
"legendFormat": "__auto",
|
|
||||||
"range": true,
|
|
||||||
"refId": "B"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"title": "HMAC Up/Down Duration",
|
|
||||||
"type": "stat"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"datasource": {
|
"datasource": {
|
||||||
"default": true,
|
"default": true,
|
||||||
@ -519,9 +519,9 @@
|
|||||||
},
|
},
|
||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 3,
|
"w": 5,
|
||||||
"x": 13,
|
"x": 10,
|
||||||
"y": 7
|
"y": 13
|
||||||
},
|
},
|
||||||
"id": 13,
|
"id": 13,
|
||||||
"options": {
|
"options": {
|
||||||
@ -541,7 +541,7 @@
|
|||||||
"textMode": "auto",
|
"textMode": "auto",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -580,9 +580,9 @@
|
|||||||
},
|
},
|
||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 3,
|
"w": 5,
|
||||||
"x": 16,
|
"x": 15,
|
||||||
"y": 7
|
"y": 13
|
||||||
},
|
},
|
||||||
"id": 2,
|
"id": 2,
|
||||||
"options": {
|
"options": {
|
||||||
@ -602,7 +602,7 @@
|
|||||||
"textMode": "auto",
|
"textMode": "auto",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -641,9 +641,9 @@
|
|||||||
},
|
},
|
||||||
"gridPos": {
|
"gridPos": {
|
||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 5,
|
"w": 4,
|
||||||
"x": 19,
|
"x": 20,
|
||||||
"y": 7
|
"y": 13
|
||||||
},
|
},
|
||||||
"id": 21,
|
"id": 21,
|
||||||
"options": {
|
"options": {
|
||||||
@ -663,7 +663,7 @@
|
|||||||
"textMode": "value",
|
"textMode": "value",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -704,7 +704,7 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 3,
|
"w": 3,
|
||||||
"x": 0,
|
"x": 0,
|
||||||
"y": 14
|
"y": 20
|
||||||
},
|
},
|
||||||
"id": 19,
|
"id": 19,
|
||||||
"options": {
|
"options": {
|
||||||
@ -724,7 +724,7 @@
|
|||||||
"textMode": "auto",
|
"textMode": "auto",
|
||||||
"wideLayout": true
|
"wideLayout": true
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -746,21 +746,7 @@
|
|||||||
"fieldConfig": {
|
"fieldConfig": {
|
||||||
"defaults": {
|
"defaults": {
|
||||||
"color": {
|
"color": {
|
||||||
"mode": "palette-classic"
|
"mode": "thresholds"
|
||||||
},
|
|
||||||
"custom": {
|
|
||||||
"fillOpacity": 80,
|
|
||||||
"gradientMode": "none",
|
|
||||||
"hideFrom": {
|
|
||||||
"legend": false,
|
|
||||||
"tooltip": false,
|
|
||||||
"viz": false
|
|
||||||
},
|
|
||||||
"lineWidth": 1,
|
|
||||||
"stacking": {
|
|
||||||
"group": "A",
|
|
||||||
"mode": "none"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"fieldMinMax": false,
|
"fieldMinMax": false,
|
||||||
"mappings": [],
|
"mappings": [],
|
||||||
@ -776,8 +762,7 @@
|
|||||||
"value": 80
|
"value": 80
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"unit": "files"
|
|
||||||
},
|
},
|
||||||
"overrides": []
|
"overrides": []
|
||||||
},
|
},
|
||||||
@ -785,37 +770,42 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 7,
|
"w": 7,
|
||||||
"x": 3,
|
"x": 3,
|
||||||
"y": 14
|
"y": 20
|
||||||
},
|
},
|
||||||
"id": 22,
|
"id": 22,
|
||||||
"options": {
|
"options": {
|
||||||
"legend": {
|
"colorMode": "value",
|
||||||
"calcs": [],
|
"graphMode": "area",
|
||||||
"displayMode": "list",
|
"justifyMode": "auto",
|
||||||
"placement": "bottom",
|
"orientation": "auto",
|
||||||
"showLegend": true
|
"percentChangeColorMode": "standard",
|
||||||
|
"reduceOptions": {
|
||||||
|
"calcs": [
|
||||||
|
"lastNotNull"
|
||||||
|
],
|
||||||
|
"fields": "",
|
||||||
|
"values": false
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"showPercentChange": false,
|
||||||
"mode": "single",
|
"textMode": "auto",
|
||||||
"sort": "none"
|
"wideLayout": true
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
"exemplar": false,
|
"exemplar": false,
|
||||||
"expr": "increase(hmac_file_server_clamav_scans_total[24h])",
|
"expr": "hmac_active_connections_total",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
"instant": true,
|
"instant": false,
|
||||||
"interval": "",
|
"interval": "",
|
||||||
"legendFormat": "__auto",
|
"legendFormat": "__auto",
|
||||||
"range": true,
|
"range": true,
|
||||||
"refId": "A"
|
"refId": "A"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"title": "HMAC ClamAV San (24h)",
|
"title": "HMAC Active Connection(s)",
|
||||||
"type": "histogram"
|
"type": "stat"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"datasource": {
|
"datasource": {
|
||||||
@ -828,17 +818,36 @@
|
|||||||
"mode": "palette-classic"
|
"mode": "palette-classic"
|
||||||
},
|
},
|
||||||
"custom": {
|
"custom": {
|
||||||
"fillOpacity": 80,
|
"axisBorderShow": false,
|
||||||
|
"axisCenteredZero": false,
|
||||||
|
"axisColorMode": "text",
|
||||||
|
"axisLabel": "",
|
||||||
|
"axisPlacement": "auto",
|
||||||
|
"barAlignment": 0,
|
||||||
|
"barWidthFactor": 0.6,
|
||||||
|
"drawStyle": "line",
|
||||||
|
"fillOpacity": 0,
|
||||||
"gradientMode": "none",
|
"gradientMode": "none",
|
||||||
"hideFrom": {
|
"hideFrom": {
|
||||||
"legend": false,
|
"legend": false,
|
||||||
"tooltip": false,
|
"tooltip": false,
|
||||||
"viz": false
|
"viz": false
|
||||||
},
|
},
|
||||||
|
"insertNulls": false,
|
||||||
|
"lineInterpolation": "linear",
|
||||||
"lineWidth": 1,
|
"lineWidth": 1,
|
||||||
|
"pointSize": 5,
|
||||||
|
"scaleDistribution": {
|
||||||
|
"type": "linear"
|
||||||
|
},
|
||||||
|
"showPoints": "auto",
|
||||||
|
"spanNulls": false,
|
||||||
"stacking": {
|
"stacking": {
|
||||||
"group": "A",
|
"group": "A",
|
||||||
"mode": "none"
|
"mode": "none"
|
||||||
|
},
|
||||||
|
"thresholdsStyle": {
|
||||||
|
"mode": "off"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fieldMinMax": false,
|
"fieldMinMax": false,
|
||||||
@ -864,7 +873,7 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 7,
|
"w": 7,
|
||||||
"x": 10,
|
"x": 10,
|
||||||
"y": 14
|
"y": 20
|
||||||
},
|
},
|
||||||
"id": 23,
|
"id": 23,
|
||||||
"options": {
|
"options": {
|
||||||
@ -875,16 +884,17 @@
|
|||||||
"showLegend": true
|
"showLegend": true
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
"mode": "single",
|
"mode": "single",
|
||||||
"sort": "none"
|
"sort": "none"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
"exemplar": false,
|
"exemplar": false,
|
||||||
"expr": "increase(hmac_file_server_clamav_errors_total[24h])",
|
"expr": "hmac_deduplication_errors_total",
|
||||||
"format": "time_series",
|
"format": "time_series",
|
||||||
"instant": true,
|
"instant": true,
|
||||||
"interval": "",
|
"interval": "",
|
||||||
@ -893,8 +903,8 @@
|
|||||||
"refId": "A"
|
"refId": "A"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"title": "HMAC ClamAV SanError(s) (24h)",
|
"title": "HMAC Duplication Error",
|
||||||
"type": "histogram"
|
"type": "timeseries"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"datasource": {
|
"datasource": {
|
||||||
@ -941,7 +951,7 @@
|
|||||||
"h": 7,
|
"h": 7,
|
||||||
"w": 7,
|
"w": 7,
|
||||||
"x": 17,
|
"x": 17,
|
||||||
"y": 14
|
"y": 20
|
||||||
},
|
},
|
||||||
"id": 16,
|
"id": 16,
|
||||||
"options": {
|
"options": {
|
||||||
@ -952,11 +962,12 @@
|
|||||||
"showLegend": true
|
"showLegend": true
|
||||||
},
|
},
|
||||||
"tooltip": {
|
"tooltip": {
|
||||||
|
"hideZeros": false,
|
||||||
"mode": "single",
|
"mode": "single",
|
||||||
"sort": "none"
|
"sort": "none"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pluginVersion": "11.4.0",
|
"pluginVersion": "11.5.2",
|
||||||
"targets": [
|
"targets": [
|
||||||
{
|
{
|
||||||
"editorMode": "code",
|
"editorMode": "code",
|
||||||
@ -975,19 +986,20 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"preload": false,
|
"preload": false,
|
||||||
|
"refresh": "10s",
|
||||||
"schemaVersion": 40,
|
"schemaVersion": 40,
|
||||||
"tags": [],
|
"tags": [],
|
||||||
"templating": {
|
"templating": {
|
||||||
"list": []
|
"list": []
|
||||||
},
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"from": "now-24h",
|
"from": "now-5m",
|
||||||
"to": "now"
|
"to": "now"
|
||||||
},
|
},
|
||||||
"timepicker": {},
|
"timepicker": {},
|
||||||
"timezone": "",
|
"timezone": "",
|
||||||
"title": "HMAC File Server Metrics",
|
"title": "HMAC File Server Metrics",
|
||||||
"uid": "de0ye5t0hzq4ge",
|
"uid": "de0ye5t0hzq4ge",
|
||||||
"version": 153,
|
"version": 158,
|
||||||
"weekStart": ""
|
"weekStart": ""
|
||||||
}
|
}
|
32
docs/updates.md
Normal file
32
docs/updates.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
|
||||||
|
**Important Update Regarding HMAC File Server Version 2.6-Stable**
|
||||||
|
|
||||||
|
We've identified and resolved critical issues with the deduplication processes in **Version 2.6-Stable** of the HMAC File Server. This update brings significant improvements to ensure reliable deduplication and overall server performance.
|
||||||
|
|
||||||
|
**Impact:**
|
||||||
|
- **Resolved Deduplication Issues:** The deduplication feature in **Version 2.6-Stable** has been thoroughly tested and stabilized, ensuring consistent file integrity and optimal server performance.
|
||||||
|
- **Enhanced Stability:** Addressed previous unexpected behaviors, including lost links to files and incorrect file handling operations.
|
||||||
|
|
||||||
|
**Recommended Actions:**
|
||||||
|
- **Upgrade to Version 2.6-Stable:** If you are using any earlier version, we strongly recommend upgrading to **Version 2.6-Stable** to benefit from the latest fixes and improvements.
|
||||||
|
- **Rollback Not Required:** Users on older releases can upgrade without the need to rollback, as **Version 2.6-Stable** resolves all critical issues present in prior versions.
|
||||||
|
|
||||||
|
**What's New in Version 2.6-Stable:**
|
||||||
|
- **Deduplication Enhancements:**
|
||||||
|
- **Reliable Deduplication:** Improved algorithms for accurate and efficient processing.
|
||||||
|
- **Performance Optimizations:** Reduced resource consumption for faster deduplication.
|
||||||
|
- **Enhanced Features:**
|
||||||
|
- **Robust Malware Scanning:** Integrated advanced scanning to ensure file safety.
|
||||||
|
- **Enhanced Redis Support:** Improved performance with Redis for better caching.
|
||||||
|
- **Better Configuration Options:** More flexible settings for customization.
|
||||||
|
- **Security Improvements:**
|
||||||
|
- **Strengthened Authentication Mechanisms:** Safeguards against unauthorized access.
|
||||||
|
- **Improved Data Encryption:** Advanced encryption standards for data at rest and in transit.
|
||||||
|
|
||||||
|
**Stay Updated:**
|
||||||
|
For detailed information on addressed issues, fixes, and enhancements introduced in **Version 2.6-Stable**, please visit our repositories:
|
||||||
|
|
||||||
|
- [Git uuxo.net](https://git.uuxo.net/uuxo/hmac-file-server)
|
||||||
|
- [GitHub](https://github.com/PlusOne/hmac-file-server)
|
||||||
|
|
||||||
|
We appreciate your patience and support as we continue improving HMAC File Server. **Version 2.6-Stable** reflects our commitment to delivering a reliable and efficient file server solution. Thank you for choosing HMAC File Server!
|
Loading…
x
Reference in New Issue
Block a user