perf: 添加gzip压缩提升前端资源加载速度

- 对JS/CSS/HTML/JSON/SVG等文本资源启用gzip压缩
- 传输体积可减少70-80%,大幅提升页面加载速度
- 图片和字体等已压缩格式不重复压缩
This commit is contained in:
2026-05-05 12:15:46 +08:00
parent bb802e765c
commit bc30afe106
2 changed files with 113 additions and 86 deletions
+23 -2
View File
@@ -1,6 +1,7 @@
package main package main
import ( import (
"compress/gzip"
"embed" "embed"
"fmt" "fmt"
"io/fs" "io/fs"
@@ -273,9 +274,19 @@ func setupEmbeddedFrontend(r *gin.Engine) {
} }
contentType := getContentType(decodedPath) contentType := getContentType(decodedPath)
c.Header("Cache-Control", "public, max-age=31536000, immutable") c.Header("Cache-Control", "public, max-age=31536000, immutable")
c.Data(200, contentType, data)
if strings.Contains(c.GetHeader("Accept-Encoding"), "gzip") && isCompressible(decodedPath) {
c.Header("Content-Encoding", "gzip")
c.Header("Vary", "Accept-Encoding")
c.Writer.WriteHeader(200)
c.Writer.Header().Set("Content-Type", contentType)
gw := gzip.NewWriter(c.Writer)
gw.Write(data)
gw.Close()
} else {
c.Data(200, contentType, data)
}
}) })
r.NoRoute(func(c *gin.Context) { r.NoRoute(func(c *gin.Context) {
@@ -334,6 +345,16 @@ func getSettingString(settings map[string]interface{}, key, defaultValue string)
return defaultValue return defaultValue
} }
func isCompressible(filename string) bool {
ext := strings.ToLower(filename[strings.LastIndex(filename, "."):])
switch ext {
case ".js", ".mjs", ".css", ".html", ".json", ".svg", ".xml", ".txt":
return true
default:
return false
}
}
func getContentType(filename string) string { func getContentType(filename string) string {
ext := strings.ToLower(filename[strings.LastIndex(filename, "."):]) ext := strings.ToLower(filename[strings.LastIndex(filename, "."):])
switch ext { switch ext {
+90 -84
View File
@@ -1,89 +1,95 @@
root@super:/opt/ace/compose/verify# docker compose logs root@super:/opt/ace/compose/verify# docker compose logs
verify-app | 2026/05/04 20:09:27 database.go:69: Using SQLite database: /app/data/verification_platform.db verify-app | 2026/05/05 03:40:45 database.go:69: Using SQLite database: /app/data/verification_platform.db
verify-app | verify-app |
verify-app | 2026/05/04 20:09:27 /app/internal/database/database.go:163 verify-app | 2026/05/05 03:40:45 /app/internal/database/database.go:163
verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc000035ff0 verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc0002c8140
verify-app | 2026/05/04 20:09:27 database.go:164: Applications table columns: verify-app | 2026/05/05 03:40:45 database.go:164: Applications table columns:
verify-app | 2026/05/04 20:09:27 database.go:166: - id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - user_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - user_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - name (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - name (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - description (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - description (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - icon_url (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - icon_url (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - app_key (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - app_key (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - billing_type (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - billing_type (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - login_policy (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - login_policy (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - encrypt_type (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - encrypt_type (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - encrypt_key (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - encrypt_key (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - bind_type (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - bind_type (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - max_devices (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - max_devices (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - change_limit (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - change_limit (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - change_interval (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - change_interval (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - change_exceed_action (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - change_exceed_action (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - change_deduct_amount (REAL) verify-app | 2026/05/05 03:40:45 database.go:166: - change_deduct_amount (REAL)
verify-app | 2026/05/04 20:09:27 database.go:166: - multi_open_mode (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - multi_open_mode (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - max_instances (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - max_instances (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - enable_trial (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - enable_trial (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - trial_balance (REAL) verify-app | 2026/05/05 03:40:45 database.go:166: - trial_balance (REAL)
verify-app | 2026/05/04 20:09:27 database.go:166: - trial_days (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - trial_days (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - enable_free_period (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - enable_free_period (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_type (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_type (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_start (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_start (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_end (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_end (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_weekdays (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_weekdays (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_start_time (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_start_time (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - free_period_end_time (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - free_period_end_time (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - heartbeat_interval (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - heartbeat_interval (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - heartbeat_timeout (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - heartbeat_timeout (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - max_attempts (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - max_attempts (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - lock_duration (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - lock_duration (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - status (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - status (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - deduction_mode (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - deduction_mode (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - deduction_type (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - deduction_type (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - deduction_interval (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - deduction_interval (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - deduction_unit (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - deduction_unit (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - deduction_amount (REAL) verify-app | 2026/05/05 03:40:45 database.go:166: - deduction_amount (REAL)
verify-app | 2026/05/04 20:09:27 database.go:166: - allow_register (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - allow_register (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - enable_login_verify (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - enable_login_verify (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - enable_register_verify (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - enable_register_verify (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - verify_method (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - verify_method (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - email_config_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - email_config_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - sms_config_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - sms_config_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - enable_password_reset (numeric) verify-app | 2026/05/05 03:40:45 database.go:166: - enable_password_reset (numeric)
verify-app | 2026/05/04 20:09:27 database.go:166: - password_reset_method (TEXT) verify-app | 2026/05/05 03:40:45 database.go:166: - password_reset_method (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:166: - password_reset_email_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - password_reset_email_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - password_reset_sms_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:166: - password_reset_sms_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:166: - created_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:166: - created_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:166: - updated_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:166: - updated_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:166: - deleted_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:166: - deleted_at (datetime)
verify-app | verify-app |
verify-app | 2026/05/04 20:09:27 /app/internal/database/database.go:178 verify-app | 2026/05/05 03:40:45 /app/internal/database/database.go:178
verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc000235970 verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc0002c9cc0
verify-app | 2026/05/04 20:09:27 database.go:179: AppUsers table columns: verify-app | 2026/05/05 03:40:45 database.go:179: AppUsers table columns:
verify-app | 2026/05/04 20:09:27 database.go:181: - id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:181: - id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:181: - username (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - username (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - email (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - email (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - password (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - password (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - device_id (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - device_id (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - avatar (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - avatar (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - status (TEXT) verify-app | 2026/05/05 03:40:45 database.go:181: - status (TEXT)
verify-app | 2026/05/04 20:09:27 database.go:181: - application_id (INTEGER) verify-app | 2026/05/05 03:40:45 database.go:181: - application_id (INTEGER)
verify-app | 2026/05/04 20:09:27 database.go:181: - balance (REAL) verify-app | 2026/05/05 03:40:45 database.go:181: - balance (REAL)
verify-app | 2026/05/04 20:09:27 database.go:181: - expiry_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - expiry_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - last_login_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - last_login_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - last_heartbeat_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - last_heartbeat_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - is_trial_user (numeric) verify-app | 2026/05/05 03:40:45 database.go:181: - is_trial_user (numeric)
verify-app | 2026/05/04 20:09:27 database.go:181: - trial_start_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - trial_start_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - trial_end_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - trial_end_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - created_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - created_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - updated_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - updated_at (datetime)
verify-app | 2026/05/04 20:09:27 database.go:181: - deleted_at (datetime) verify-app | 2026/05/05 03:40:45 database.go:181: - deleted_at (datetime)
verify-app | verify-app |
verify-app | 2026/05/04 20:09:27 /app/internal/database/database.go:273 verify-app | 2026/05/05 03:40:45 /app/internal/database/database.go:273
verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc0006aa820 verify-app | [error] failed to parse field: DefaultVal, error: unsupported data type: 0xc000235f40
verify-app | 2026/05/04 20:09:27 database.go:418: Document data already exists, skipping initialization verify-app | 2026/05/05 03:40:45 database.go:418: Document data already exists, skipping initialization
verify-app | 2026/05/04 20:09:27 database.go:730: Initializing ticket data... verify-app | 2026/05/05 03:40:45 database.go:730: Initializing ticket data...
verify-app | 2026/05/04 20:09:27 database.go:734: No dev user found, skipping ticket initialization verify-app | 2026/05/05 03:40:45 database.go:734: No dev user found, skipping ticket initialization
verify-app | 2026/05/04 20:09:27 database.go:418: Document data already exists, skipping initialization verify-app | 2026/05/05 03:40:45 database.go:418: Document data already exists, skipping initialization
verify-app | 2026/05/04 20:09:27 database.go:718: Failed to connect to Redis: dial tcp [::1]:6379: connect: connection refused verify-app | 2026/05/05 03:40:45 database.go:718: Failed to connect to Redis: dial tcp [::1]:6379: connect: connection refused
verify-app | 2026/05/04 20:09:27 main.go:250: Server starting on port 8080 verify-app | 2026/05/05 03:40:45 main.go:240: Server starting on port 8080
verify-app | 103.244.89.77 - [Tue, 05 May 2026 03:41:04 UTC] "GET / HTTP/1.1 200 848.29µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0" "
verify-app | 103.244.89.77 - [Tue, 05 May 2026 03:41:04 UTC] "GET / HTTP/1.1 200 907.021µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0" "
verify-app | [GIN] 2026/05/05 - 03:41:04 | 200 | 922.691µs | 103.244.89.77 | GET "/"
verify-app | 103.244.89.77 - [Tue, 05 May 2026 03:41:05 UTC] "GET /logo-black.svg HTTP/1.1 200 34.14µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0" "
verify-app | 103.244.89.77 - [Tue, 05 May 2026 03:41:05 UTC] "GET /logo-black.svg HTTP/1.1 200 308.597µs "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36 Edg/147.0.0.0" "
verify-app | [GIN] 2026/05/05 - 03:41:05 | 200 | 764.498µs | 103.244.89.77 | GET "/logo-black.svg"
root@super:/opt/ace/compose/verify# root@super:/opt/ace/compose/verify#