From d09a0487ae6058938860f4b36cc916e4bfad9157 Mon Sep 17 00:00:00 2001 From: lzw-723 Date: Sat, 21 Mar 2026 22:13:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=95=B0=E6=8D=AE=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 8 +++++--- bin/config/app_config.dart | 37 +++++++++++++++++++++++++++++++++++++ bin/router.dart | 8 +++++--- bin/server.dart | 6 ++++++ bin/util/vips.dart | 5 +++-- docker-compose.yml | 2 ++ 6 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 bin/config/app_config.dart diff --git a/Dockerfile b/Dockerfile index 6faceb3..ad6a673 100644 --- a/Dockerfile +++ b/Dockerfile @@ -53,11 +53,13 @@ COPY --from=backend-build /app/web/build /app/web/build # Create data and cache directories RUN mkdir -p /app/data /app/cache +# Set environment variables (can be overridden at runtime) +ENV PORT=8080 \ + DATA_DIR=/app/data \ + CACHE_DIR=/app/cache + # Expose port EXPOSE 8080 -# Set environment variables -ENV PORT=8080 - # Start server CMD ["/app/bin/server"] \ No newline at end of file diff --git a/bin/config/app_config.dart b/bin/config/app_config.dart new file mode 100644 index 0000000..30ec5db --- /dev/null +++ b/bin/config/app_config.dart @@ -0,0 +1,37 @@ +import 'dart:io'; + +/// 应用配置管理 +/// +/// 支持通过环境变量配置数据目录和缓存目录: +/// - `DATA_DIR`: 数据目录路径,默认为 `data` +/// - `CACHE_DIR`: 缓存目录路径,默认为 `cache` +class AppConfig { + /// 数据目录路径 + final String dataDir; + + /// 缓存目录路径 + final String cacheDir; + + /// 单例实例 + static final AppConfig _instance = AppConfig._fromEnvironment(); + + /// 获取配置实例 + factory AppConfig() => _instance; + + /// 从环境变量创建配置 + AppConfig._fromEnvironment() + : dataDir = Platform.environment['DATA_DIR'] ?? 'data', + cacheDir = Platform.environment['CACHE_DIR'] ?? 'cache'; + + /// 获取相册预览缓存目录 + String get previewCacheDir => '$cacheDir/preview'; + + /// 确保所有必需的目录都存在 + Future ensureDirectoriesExist() async { + await Directory(dataDir).create(recursive: true); + await Directory(previewCacheDir).create(recursive: true); + } + + @override + String toString() => 'AppConfig(dataDir: $dataDir, cacheDir: $cacheDir)'; +} \ No newline at end of file diff --git a/bin/router.dart b/bin/router.dart index 9f07fa6..9b441fa 100644 --- a/bin/router.dart +++ b/bin/router.dart @@ -5,13 +5,15 @@ import 'dart:async'; import 'package:shelf/shelf.dart'; import 'package:shelf_router/shelf_router.dart'; +import 'config/app_config.dart'; import 'util/vips.dart'; import 'domain/repositories/photo_repository.dart'; import 'domain/repositories/album_repository.dart'; -final vips = Vips(); -final albumRepository = AlbumRepository(basePath: 'data'); -final photoRepository = PhotoRepository('data'); +final _config = AppConfig(); +final vips = Vips(cacheDir: _config.cacheDir); +final albumRepository = AlbumRepository(basePath: _config.dataDir); +final photoRepository = PhotoRepository(_config.dataDir); Response jsonResponse(dynamic data) { return Response.ok( diff --git a/bin/server.dart b/bin/server.dart index 8560a7a..d71faf4 100644 --- a/bin/server.dart +++ b/bin/server.dart @@ -3,10 +3,16 @@ import 'dart:io'; import 'package:shelf/shelf.dart'; import 'package:shelf/shelf_io.dart'; +import 'config/app_config.dart'; import 'router.dart'; import 'middleware/exception_handler.dart'; void main(List args) async { + // Initialize configuration and ensure directories exist + final config = AppConfig(); + print('Configuration: $config'); + await config.ensureDirectoriesExist(); + // Use any available host or container IP (usually `0.0.0.0`). final ip = InternetAddress.anyIPv4; diff --git a/bin/util/vips.dart b/bin/util/vips.dart index 60fc300..43aa8f9 100644 --- a/bin/util/vips.dart +++ b/bin/util/vips.dart @@ -4,8 +4,9 @@ import 'package:path/path.dart'; class Vips { String? vipsExecuteFile; + final String cacheDir; - Vips({this.vipsExecuteFile}); + Vips({this.vipsExecuteFile, required this.cacheDir}); /// 生成图片预览(WebP 格式) /// @@ -22,7 +23,7 @@ class Vips { // 生成缓存文件名:包含原图 hash 和尺寸信息 final baseName = basename(imgPath).hashCode.toString(); final sizeSuffix = _buildSizeSuffix(w, h); - final imgOut = "cache/preview/${baseName}${sizeSuffix}.webp"; + final imgOut = "$cacheDir/preview/$baseName$sizeSuffix.webp"; final outFile = File(imgOut); // 缓存命中:直接返回已存在的预览图 diff --git a/docker-compose.yml b/docker-compose.yml index 942c932..10af477 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,8 @@ services: - ./cache:/app/cache environment: - PORT=8080 + - DATA_DIR=/app/data + - CACHE_DIR=/app/cache restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/api/v1/"]