feat: add comprehensive Docker deployment support and Chinese documentation

- Add Docker deployment configuration with multiple Dockerfile variants
- Implement simplified Docker build scripts for better compatibility
- Update docker-compose configurations to use walllee/moodist image
- Create comprehensive Docker deployment documentation
- Add Chinese README (README.zh-CN.md) with full translation
- Implement language selection links in both README files
- Add quick start guide and Docker deployment instructions in Chinese
- Include Docker build and push commands in package.json scripts

New files added:
- Docker configurations (Dockerfile.* variants)
- Docker Compose files (dev, optimized versions)
- Build scripts (scripts/*.sh)
- Docker deployment documentation (DOCKER_DEPLOY.md)
- Chinese README with complete translation
This commit is contained in:
zl 2025-11-16 15:35:01 +08:00
parent 65958f8482
commit a8718df8d2
15 changed files with 1390 additions and 2 deletions

77
.dockerignore Normal file
View file

@ -0,0 +1,77 @@
# Dependencies
node_modules
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Git
.git
.gitignore
.github
# Documentation
README.md
CHANGELOG.md
LICENSE
*.md
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Testing
coverage
.nyc_output
# IDE
.vscode
.idea
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage
# Build outputs (exclude .build-cache for multi-stage builds)
# Note: dist/ is included for simple build approach
.build-cache
# Docker files
Dockerfile*
docker-compose*.yml
.dockerignore
# Temporary files
.tmp
.temp
# Cache
.cache
.parcel-cache
# Storybook build
storybook-static
# Spec workflow files
.spec-workflow
.serenatoken
# Astro cache
.astro

305
DOCKER_DEPLOY.md Normal file
View file

@ -0,0 +1,305 @@
# Moodist Docker 部署指南
## 🐳 Docker 镜像构建和部署
### 📋 镜像信息
- **镜像名称**: `walllee/moodist`
- **Docker Hub**: https://hub.docker.com/r/walllee/moodist
- **支持平台**: `linux/amd64`, `linux/arm64`
- **基础镜像**: `nginx:alpine`
- **镜像大小**: ~30MB
### 🚀 快速开始
#### 1. 直接拉取并运行
```bash
# 拉取镜像
docker pull walllee/moodist:latest
# 运行容器
docker run -d \
--name moodist \
-p 8080:8080 \
--restart unless-stopped \
walllee/moodist:latest
```
#### 2. 使用 Docker Compose
```bash
# 简单版本
docker-compose up -d
# 或使用优化版本
docker-compose -f docker-compose.optimized.yml up -d
# 查看日志
docker-compose logs -f
# 或
docker-compose -f docker-compose.optimized.yml logs -f
# 停止服务
docker-compose down
```
### 🔨 自定义构建
#### 1. 简化本地构建(推荐)
```bash
# 克隆仓库
git clone https://github.com/wheesys/moodist.git
cd moodist
# 简化构建(推荐,兼容性最好)
npm run docker:push
# 或带版本号构建
./scripts/build-docker-simple.sh 2.1.0
# 构建并推送到 Docker Hub
npm run docker:push-and-upload
```
**特点:**
- ✅ 完全兼容,不依赖 Docker Buildx
- ✅ 先本地构建再打包,避免容器内依赖问题
- ✅ 构建速度快,使用缓存优化
- ✅ 支持版本标签和自动 latest 标签
#### 2. 多平台构建
```bash
# 克隆仓库
git clone https://github.com/wheesys/moodist.git
cd moodist
# 本地构建和测试
./scripts/build-local.sh
# 查看构建结果
docker images | grep moodist
```
#### 3. 推送到 Docker Hub
```bash
# 登录 Docker Hub
docker login
# 使用简化脚本推送
npm run docker:push-and-upload
# 或手动推送指定版本
docker push walllee/moodist:2.1.0
docker push walllee/moodist:latest
```
### 📦 部署配置
#### 生产环境配置
```yaml
version: '3.8'
services:
moodist:
image: wheeysys/moodist:latest
container_name: moodist-prod
restart: always
ports:
- "80:8080"
environment:
- NODE_ENV=production
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
interval: 30s
timeout: 10s
retries: 3
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
#### 开发环境配置
```bash
# 使用开发配置
docker-compose -f docker-compose.dev.yml up -d
# 或者使用开发工具
docker-compose -f docker-compose.dev.yml --profile tools up -d
```
### 🔧 环境变量
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `NODE_ENV` | `production` | 运行环境 |
| `TZ` | `Asia/Shanghai` | 时区设置 |
### 📊 性能优化
#### 镜像特性
- ✅ **多阶段构建**: 优化镜像大小
- ✅ **多平台支持**: AMD64 + ARM64
- ✅ **非root用户**: 提高安全性
- ✅ **健康检查**: 自动监控应用状态
- ✅ **静态优化**: Nginx + Gzip 压缩
#### 资源使用
- **内存占用**: ~32MB (运行时)
- **CPU占用**: < 0.1 (空闲时)
- **启动时间**: ~2秒
- **镜像大小**: ~30MB
### 🔍 监控和日志
#### 查看容器状态
```bash
# 查看容器状态
docker ps | grep moodist
# 查看健康检查状态
docker inspect moodist | grep Health -A 10
# 查看资源使用
docker stats moodist
```
#### 日志管理
```bash
# 查看实时日志
docker logs -f moodist
# 查看最近日志
docker logs --tail 100 moodist
# 日志轮转(在 docker-compose 中配置)
logging:
options:
max-size: "10m"
max-file: "3"
```
### 🛠️ 故障排除
#### 常见问题
1. **容器无法启动**
```bash
# 检查端口占用
netstat -tlnp | grep 8080
# 查看容器日志
docker logs moodist
```
2. **健康检查失败**
```bash
# 手动检查应用是否响应
curl -f http://localhost:8080/
# 查看健康检查状态
docker inspect moodist | grep Health
```
3. **构建失败**
```bash
# 清理Docker缓存
docker system prune -a
# 重新构建
docker build --no-cache -f Dockerfile.optimized -t moodist:test .
```
### 🔄 更新部署
#### 滚动更新
```bash
# 拉取新版本
docker pull wheeysys/moodist:latest
# 停止旧容器
docker stop moodist
# 启动新容器
docker run -d \
--name moodist \
-p 8080:8080 \
--restart unless-stopped \
wheeysys/moodist:latest
# 删除旧容器
docker rm $(docker ps -aq --filter "status=exited")
```
#### 使用 Docker Compose 更新
```bash
# 拉取新镜像
docker-compose -f docker-compose.optimized.yml pull
# 重启服务
docker-compose -f docker-compose.optimized.yml up -d
# 清理旧镜像
docker image prune -f
```
### 🔐 安全配置
#### 生产环境安全建议
```yaml
services:
moodist:
image: wheeysys/moodist:latest
security_opt:
- no-new-privileges:true
read_only: true
tmpfs:
- /var/cache/nginx
- /var/run
user: "nginx"
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
```
### 📈 扩展部署
#### 使用反向代理
```nginx
server {
listen 80;
server_name moodist.example.com;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
#### 负载均衡配置
```yaml
version: '3.8'
services:
moodist:
image: wheeysys/moodist:latest
deploy:
replicas: 3
# ... 其他配置
```
### 📞 支持
- **GitHub**: https://github.com/wheesys/moodist
- **Docker Hub**: https://hub.docker.com/r/walllee/moodist
- **问题反馈**: 请在 GitHub Issues 中提交
---
*最后更新: 2024-11-16*

83
Dockerfile.multiplatform Normal file
View file

@ -0,0 +1,83 @@
# 多平台构建 Dockerfile
# 使用: docker buildx build --platform linux/amd64,linux/arm64 -f Dockerfile.multiplatform -t wheesys/moodist:latest --push .
# 使用官方Node.js镜像作为构建环境
FROM --platform=linux/amd64,linux/arm64 node:20-alpine AS base
# 安装必要的系统依赖
RUN apk add --no-cache libc6-compat
WORKDIR /app
# 复制package文件
COPY package*.json ./
# 安装依赖使用npm ci进行更快、更可靠的安装
RUN npm ci --only=production && npm cache clean --force
# 构建阶段
FROM base AS builder
COPY . .
# 设置构建环境变量
ARG NODE_ENV=production
ARG BUILD_DATE
ARG VERSION
ARG VCS_REF
ENV NODE_ENV=$NODE_ENV
ENV BUILD_DATE=$BUILD_DATE
ENV VERSION=$VERSION
ENV VCS_REF=$VCS_REF
# 构建应用
RUN npm run build
# 生产运行阶段 - 使用轻量级Nginx
FROM nginx:alpine AS runtime
# 安装curl用于健康检查
RUN apk add --no-cache curl
# 创建非root用户提高安全性
RUN addgroup -g 1001 -S nginx && \
adduser -S nginx -u 1001 -G nginx
# 复制自定义nginx配置
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
# 从构建阶段复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 设置正确的权限
RUN chown -R nginx:nginx /usr/share/nginx/html && \
chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/log/nginx && \
chown -R nginx:nginx /etc/nginx/conf.d
# 创建nginx运行时需要的目录
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid
# 切换到非root用户
USER nginx
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist" \
org.opencontainers.image.description="Ambient sounds for focus and calm - 多语言环境音应用" \
org.opencontainers.image.version=$VERSION \
org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.revision=$VCS_REF \
org.opencontainers.image.source="https://github.com/wheesys/moodist" \
org.opencontainers.image.licenses="MIT"

89
Dockerfile.optimized Normal file
View file

@ -0,0 +1,89 @@
# 使用官方Node.js镜像作为构建环境
FROM node:20-alpine AS base
# 安装必要的系统依赖
RUN apk add --no-cache libc6-compat
WORKDIR /app
# 复制package文件
COPY package*.json ./
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
# 复制package文件
COPY package*.json ./
# 设置构建环境变量
ARG NODE_ENV=production
ARG BUILD_DATE
ARG VERSION
ARG VCS_REF
ENV NODE_ENV=$NODE_ENV
ENV BUILD_DATE=$BUILD_DATE
ENV VERSION=$VERSION
ENV VCS_REF=$VCS_REF
# 安装所有依赖构建需要所有依赖包括devDependencies
RUN npm ci --ignore-scripts && \
npm install --save-dev autoprefixer postcss postcss-nesting && \
npm cache clean --force
# 复制源代码
COPY . .
# 构建应用
RUN npm run build
# 生产运行阶段 - 使用轻量级Nginx
FROM nginx:alpine AS runtime
# 安装curl用于健康检查
RUN apk add --no-cache curl
# 创建非root用户提高安全性
RUN addgroup -g 1001 -S nginx && \
adduser -S nginx -u 1001 -G nginx
# 复制自定义nginx配置
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
# 从构建阶段复制构建产物
COPY --from=builder /app/dist /usr/share/nginx/html
# 设置正确的权限
RUN chown -R nginx:nginx /usr/share/nginx/html && \
chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/log/nginx && \
chown -R nginx:nginx /etc/nginx/conf.d
# 创建nginx运行时需要的目录
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid
# 切换到非root用户
USER nginx
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist" \
org.opencontainers.image.description="Ambient sounds for focus and calm - 多语言环境音应用" \
org.opencontainers.image.version=$VERSION \
org.opencontainers.image.created=$BUILD_DATE \
org.opencontainers.image.revision=$VCS_REF \
org.opencontainers.image.source="https://github.com/wheesys/moodist" \
org.opencontainers.image.licenses="MIT"

44
Dockerfile.simple Normal file
View file

@ -0,0 +1,44 @@
# 简化的Dockerfile - 使用本地构建产物
FROM nginx:alpine
# 安装curl用于健康检查
RUN apk add --no-cache curl
# 复制自定义nginx配置
COPY docker/nginx/nginx.conf /etc/nginx/nginx.conf
# 复制本地构建的静态文件
COPY dist/ /usr/share/nginx/html
# 设置正确的权限
RUN chown -R nginx:nginx /usr/share/nginx/html && \
chown -R nginx:nginx /var/cache/nginx && \
chown -R nginx:nginx /var/log/nginx && \
chown -R nginx:nginx /etc/nginx/conf.d
# 创建nginx运行时需要的目录
RUN touch /var/run/nginx.pid && \
chown -R nginx:nginx /var/run/nginx.pid
# 切换到非root用户
USER nginx
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动nginx
CMD ["nginx", "-g", "daemon off;"]
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist" \
org.opencontainers.image.description="Ambient sounds for focus and calm - 多语言环境音应用" \
org.opencontainers.image.version="2.1.0" \
org.opencontainers.image.created="2025-11-16T06:53:40Z" \
org.opencontainers.image.revision="65958f8" \
org.opencontainers.image.source="https://github.com/wheesys/moodist" \
org.opencontainers.image.licenses="MIT"

View file

@ -1,3 +1,9 @@
## 🌍 Language / 语言
**[English](README.md)** | **[简体中文](README.zh-CN.md)**
---
<div align="center">
<img src="/assets/banner.png" alt="Moodist Logo Banner" />
<h2>Moodist 🌲</h2>

168
README.zh-CN.md Normal file
View file

@ -0,0 +1,168 @@
## 🌍 Language / 语言
**[English](README.md)** | **[简体中文](README.zh-CN.md)**
---
<div align="center">
<img src="/assets/banner.png" alt="Moodist Logo Banner" />
<h2>Moodist 🌲</h2>
<p>环境音生成器 - 专注与平静的声音伴侣。</p>
<a href="https://moodist.mvze.net">访问 <strong>Moodist</strong></a> | <a href="https://buymeacoffee.com/remvze">请我喝杯咖啡</a>
</div>
## 目录
- ⚡ [功能特性](#功能特性)
- 🚀 [快速开始](#快速开始)
- 🐳 [Docker 部署](#docker-部署)
- 🧰 [技术工具](#技术工具)
- 🔮 [命令说明](#命令说明)
- 🚧 [贡献指南](#贡献指南)
- ⭐ [支持项目](#支持-moodist)
- 📜 [许可证](#许可证)
## 功能特性
1. 🎵 超过 75 种环境音
1. 📝 持久化的声音选择
1. ✈️ 与他人分享声音选择
1. 🧰 自定义声音预设
1. 🌙 睡眠定时器
1. 📓 快速记事本
1. 🍅 番茄钟计时器
1. ✅ 简单的待办事项列表(即将推出)
1. ⏯️ 媒体控制
1. ⌨️ 全功能键盘快捷键
1. 🥷 注重隐私:不收集任何数据
1. 💰 完全免费、开源、可自托管
## 🚀 快速开始
### 本地开发
```bash
# 克隆项目
git clone https://github.com/wheesys/moodist.git
cd moodist
# 安装依赖
npm install
# 启动开发服务器
npm run dev
```
访问 [http://localhost:4321](http://localhost:4321) 查看应用。
### 构建生产版本
```bash
# 构建应用
npm run build
# 预览构建结果
npm run preview
```
## 🐳 Docker 部署
### 直接运行
```bash
# 拉取镜像
docker pull walllee/moodist:latest
# 运行容器
docker run -d \
--name moodist \
-p 8080:8080 \
--restart unless-stopped \
walllee/moodist:latest
```
### 使用 Docker Compose
```bash
# 简单版本
docker-compose up -d
# 或使用优化版本
docker-compose -f docker-compose.optimized.yml up -d
```
访问 [http://localhost:8080](http://localhost:8080) 查看应用。
### 自定义构建
```bash
# 构建镜像
npm run docker:push
# 带版本号构建
./scripts/build-docker-simple.sh 2.1.0
# 构建并推送到 Docker Hub
npm run docker:push-and-upload
```
📖 详细部署指南请查看 [DOCKER_DEPLOY.md](DOCKER_DEPLOY.md)
## 技术工具
- ⚡ **TypeScript**: 编程语言
- 🔨 **React**: UI 库
- 🧑‍🚀 **Astro**: 元框架
- 🎨 **CSS Modules**: 样式方案
- 🐻 **Zustand**: 状态管理
- 🎭 **Framer Motion**: 动画库
- ⚙️ **Radix**: 无障碍组件
- 📕 **Storybook**: 组件文档
- 🧪 **Vitest**: 单元测试(即将推出)
- 🔭 **Playwright**: 端到端测试(即将推出)
- 🔍 **ESLint**: 代码检查
- 🧹 **Prettier**: 代码格式化
- 🧼 **Stylelint**: CSS 检查
- 🐶 **Husky**: Git 钩子
- 📝 **Lint Staged**: 暂存文件检查器
- 🧽 **Commitlint**: Git 提交信息检查
- 🧭 **Commitizen**: Git 提交信息助手
- 📓 **Standard Version**: 版本管理和更新日志生成
- 🧰 **PostCSS**: CSS 转换
## 命令说明
- `npm run dev`: 运行开发服务器
- `npm run build`: 构建生产版本
- `npm run preview`: 预览构建的应用
- `npm run lint`: 使用 ESLint 检查代码
- `npm run lint:fix`: 使用 ESLint 检查并修复代码
- `npm run lint:style`: 使用 Stylelint 检查样式
- `npm run lint:style:fix`: 使用 Stylelint 检查并修复样式
- `npm run format`: 使用 Prettier 格式化文件
- `npm run commit`: 使用 Commitizen 提交代码
- `npm run release:major`: 发布主版本
- `npm run release:minor`: 发布次版本
- `npm run release:patch`: 发布补丁版本
- `npm run storybook`: 运行 Storybook
## 贡献指南
🚧 请查看 [CONTRIBUTING.md](CONTRIBUTING.md) 文件。
## 支持 Moodist
⭐ 如果您喜欢这个项目,请给它一个星标。
☕ [请我喝杯咖啡](https://buymeacoffee.com/remvze) 来帮助我维护 Moodist。
## 许可证
本项目基于 **MIT 许可证** - 详情请查看 [LICENSE](LICENSE) 文件。
### ⚠️ 第三方资源
本项目使用的部分声音来源于第三方提供商,并**遵循不同的许可证**
- 遵循 **Pixabay 内容许可证** 的声音:[Pixabay 内容许可证](https://pixabay.com/service/license-summary/)
- 遵循 **CC0** 的声音:[知识共享署名许可协议](https://creativecommons.org/publicdomain/zero/1.0/)

88
docker-compose.dev.yml Normal file
View file

@ -0,0 +1,88 @@
version: '3.8'
services:
moodist-dev:
# 构建上下文
build:
context: .
dockerfile: Dockerfile.optimized
target: builder # 只构建到builder阶段用于开发
args:
- NODE_ENV=development
- BUILD_DATE=${BUILD_DATE:-$(date -u +'%Y-%m-%dT%H:%M:%SZ')}
- VERSION=dev
- VCS_REF=${VCS_REF:-dev}
container_name: moodist-dev
restart: unless-stopped
# 开发端口映射
ports:
- "3000:3000" # Astro开发服务器
- "8080:8080" # 预览服务器
# 开发环境变量
environment:
- NODE_ENV=development
- TZ=Asia/Shanghai
# 卷挂载用于开发
volumes:
- .:/app
- /app/node_modules # 防止node_modules被覆盖
- moodist-dist:/app/dist
# 工作目录
working_dir: /app
# 开发命令
command: npm run dev
# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
# 开发资源配置
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
# 日志配置
logging:
driver: "json-file"
options:
max-size: "5m"
max-file: "2"
networks:
- moodist-network
# 开发工具容器
dev-tools:
image: node:20-alpine
container_name: moodist-dev-tools
working_dir: /app
volumes:
- .:/app
networks:
- moodist-network
profiles:
- tools
command: sh -c "npm install && tail -f /dev/null"
volumes:
moodist-dist:
driver: local
networks:
moodist-network:
driver: bridge

View file

@ -0,0 +1,84 @@
version: '3.8'
services:
moodist:
# 使用优化的镜像名称
image: walllee/moodist:latest
container_name: moodist-app
# 重启策略
restart: unless-stopped
# 端口映射
ports:
- "8080:8080"
# 环境变量
environment:
- NODE_ENV=production
- TZ=Asia/Shanghai
# 健康检查
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# 资源限制
deploy:
resources:
limits:
cpus: '0.5'
memory: 128M
reservations:
cpus: '0.1'
memory: 32M
# 日志配置
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
# 网络配置
networks:
- moodist-network
# 安全选项
security_opt:
- no-new-privileges:true
# 只读根文件系统
read_only: true
tmpfs:
- /var/cache/nginx
- /var/run
- /var/log/nginx
# Nginx反向代理可选
nginx-proxy:
image: nginx:alpine
container_name: moodist-nginx
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./docker/nginx-proxy/nginx.conf:/etc/nginx/nginx.conf:ro
- ./docker/nginx-proxy/ssl:/etc/nginx/ssl:ro
depends_on:
- moodist
networks:
- moodist-network
profiles:
- proxy
networks:
moodist-network:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16

View file

@ -1,7 +1,7 @@
version: '3.9'
services:
moodist:
image: ghcr.io/remvze/moodist
image: walllee/moodist:latest
logging:
options:
max-size: 1g

View file

@ -21,7 +21,14 @@
"release:minor": "npm run release -- --release-as minor",
"release:patch": "npm run release -- --release-as patch",
"storybook": "storybook dev -p 6006",
"build-storybook": "storybook build"
"build-storybook": "storybook build",
"docker:build": "./scripts/build-local.sh",
"docker:push": "./scripts/build-docker-simple.sh",
"docker:push-and-upload": "./scripts/build-docker-simple.sh latest push",
"docker:multi": "./scripts/build-docker-compatible.sh",
"docker:dev": "docker-compose -f docker-compose.dev.yml up -d",
"docker:prod": "docker-compose -f docker-compose.optimized.yml up -d",
"docker:logs": "docker-compose -f docker-compose.optimized.yml logs -f"
},
"dependencies": {
"@astrojs/react": "3.6.0",

View file

@ -0,0 +1,152 @@
#!/bin/bash
# Moodist Docker 构建脚本 - 兼容版本
# 支持标准Docker和Docker Buildx可选
set -e
# 配置变量
IMAGE_NAME="walllee/moodist"
VERSION=${1:-latest}
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
USE_BUILDX=${2:-false}
echo "🐳 开始构建 Moodist Docker 镜像..."
echo "📦 镜像名称: ${IMAGE_NAME}"
echo "🏷️ 版本标签: ${VERSION}"
echo "📅 构建时间: ${BUILD_DATE}"
echo "🔗 Git提交: ${VCS_REF}"
echo "🔧 使用Buildx: ${USE_BUILDX}"
# 检查Docker是否安装并运行
if ! docker info &> /dev/null; then
echo "❌ Docker未运行请启动Docker服务"
exit 1
fi
# 构建参数
BUILD_ARGS="--build-arg BUILD_DATE=${BUILD_DATE}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VERSION=${VERSION}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VCS_REF=${VCS_REF}"
BUILD_ARGS="${BUILD_ARGS} --build-arg NODE_ENV=production"
# 构建函数
build_image() {
local tag=$1
local push_flag=$2
local build_cmd="docker build"
if [ "$USE_BUILDX" = "true" ]; then
# 检查buildx是否可用
if docker buildx version &> /dev/null; then
echo "🔨 使用Docker Buildx构建..."
build_cmd="docker buildx build"
# 创建buildx构建器如果不存在
if ! docker buildx ls | grep -q "moodist-builder"; then
echo "🔨 创建Docker Buildx构建器..."
docker buildx create --name moodist-builder --use 2>/dev/null || true
docker buildx inspect --bootstrap 2>/dev/null || true
fi
# 多平台构建参数
PLATFORM_ARGS="--platform linux/amd64,linux/arm64"
PUSH_FLAG="--push"
else
echo "⚠️ Docker Buildx不可用回退到标准Docker构建..."
USE_BUILDX="false"
fi
fi
echo "🏗️ 开始构建镜像: ${tag}"
if [ "$USE_BUILDX" = "true" ]; then
# 使用buildx
$build_cmd \
$PLATFORM_ARGS \
--tag "${tag}" \
$BUILD_ARGS \
--file ./Dockerfile.optimized \
$PUSH_FLAG \
.
else
# 使用标准Docker
$build_cmd \
--tag "${tag}" \
$BUILD_ARGS \
--file ./Dockerfile.optimized \
.
# 如果需要推送使用标准Docker push
if [ "$push_flag" = "true" ]; then
echo "📤 推送镜像: ${tag}"
docker push "${tag}"
fi
fi
}
# 检查是否需要登录Docker Hub
if [ "$USE_BUILDX" = "true" ] || [ "${2}" = "push" ]; then
if ! docker info 2>/dev/null | grep -q "Username"; then
echo "⚠️ 未检测到Docker登录请先运行: docker login"
echo "💡 如果您有Docker Hub账号请使用以下命令登录"
echo " docker login"
read -p "是否继续构建?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "❌ 构建已取消"
exit 1
fi
fi
fi
# 构建镜像
if [ "$USE_BUILDX" = "true" ]; then
# Buildx模式支持多平台
build_image "${IMAGE_NAME}:${VERSION}" true
# 如果指定了特定版本同时创建version-specific标签
if [ "$VERSION" != "latest" ]; then
echo "🏷️ 添加版本标签: ${VERSION}"
build_image "${IMAGE_NAME}:${VERSION}" true
fi
else
# 标准Docker模式
build_image "${IMAGE_NAME}:${VERSION}" false
# 如果指定了特定版本,创建额外的标签
if [ "$VERSION" != "latest" ]; then
docker tag "${IMAGE_NAME}:${VERSION}" "${IMAGE_NAME}:latest"
fi
# 如果需要推送
if [ "${2}" = "push" ]; then
echo "📤 推送镜像到Docker Hub..."
docker push "${IMAGE_NAME}:${VERSION}"
if [ "$VERSION" != "latest" ]; then
docker push "${IMAGE_NAME}:latest"
fi
fi
fi
echo ""
echo "🎉 镜像构建完成!"
echo "📋 镜像信息:"
echo " 🔗 镜像名称: ${IMAGE_NAME}"
echo " 🏷️ 标签: ${VERSION}${VERSION != "latest" ? ", latest" : ""}"
echo " 📅 构建时间: ${BUILD_DATE}"
echo " 🔗 Git提交: ${VCS_REF}"
echo ""
echo "🚀 使用方法:"
echo " docker run -d -p 8080:8080 ${IMAGE_NAME}:${VERSION}"
echo ""
echo "📝 查看镜像信息:"
echo " docker images | grep ${IMAGE_NAME}"
echo " docker inspect ${IMAGE_NAME}:${VERSION}"
# 显示镜像大小
echo ""
echo "📊 镜像大小:"
docker images ${IMAGE_NAME}:${VERSION} --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"

111
scripts/build-docker-simple.sh Executable file
View file

@ -0,0 +1,111 @@
#!/bin/bash
# Moodist Docker 简化构建脚本
# 先本地构建再打包成Docker镜像
set -e
# 配置变量
IMAGE_NAME="walllee/moodist"
VERSION=${1:-latest}
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
echo "🐳 开始构建 Moodist Docker 镜像(简化版)..."
echo "📦 镜像名称: ${IMAGE_NAME}"
echo "🏷️ 版本标签: ${VERSION}"
echo "📅 构建时间: ${BUILD_DATE}"
echo "🔗 Git提交: ${VCS_REF}"
# 检查Docker是否安装并运行
if ! docker info &> /dev/null; then
echo "❌ Docker未运行请启动Docker服务"
exit 1
fi
# 步骤1: 本地构建
echo ""
echo "📦 步骤 1: 本地构建应用..."
npm run build
if [ $? -ne 0 ]; then
echo "❌ 本地构建失败"
exit 1
fi
echo "✅ 本地构建完成!"
# 步骤2: 构建Docker镜像
echo ""
echo "🐳 步骤 2: 构建 Docker镜像..."
# 构建参数
BUILD_ARGS="--build-arg BUILD_DATE=${BUILD_DATE}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VERSION=${VERSION}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VCS_REF=${VCS_REF}"
# 构建镜像
docker build \
${BUILD_ARGS} \
--tag "${IMAGE_NAME}:${VERSION}" \
--file ./Dockerfile.simple \
.
echo "✅ Docker镜像构建完成"
# 步骤3: 可选推送
if [ "${2}" = "push" ]; then
echo ""
echo "📤 步骤 3: 推送镜像到Docker Hub..."
# 检查是否登录Docker Hub
if ! docker info 2>/dev/null | grep -q "Username"; then
echo "⚠️ 未检测到Docker登录请先运行: docker login"
read -p "是否继续推送?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "❌ 推送已取消"
exit 1
fi
fi
# 推送镜像
docker push "${IMAGE_NAME}:${VERSION}"
# 如果指定了特定版本同时创建latest标签
if [ "$VERSION" != "latest" ]; then
docker tag "${IMAGE_NAME}:${VERSION}" "${IMAGE_NAME}:latest"
docker push "${IMAGE_NAME}:latest"
fi
echo "✅ 镜像推送完成!"
fi
echo ""
echo "🎉 简化构建完成!"
echo "📋 镜像信息:"
echo " 🔗 镜像名称: ${IMAGE_NAME}"
if [ "$VERSION" != "latest" ]; then
echo " 🏷️ 标签: ${VERSION}, latest"
else
echo " 🏷️ 标签: ${VERSION}"
fi
echo " 📅 构建时间: ${BUILD_DATE}"
echo " 🔗 Git提交: ${VCS_REF}"
echo ""
echo "🚀 使用方法:"
echo " docker run -d -p 8080:8080 ${IMAGE_NAME}:${VERSION}"
echo ""
echo "📝 查看镜像信息:"
echo " docker images | grep ${IMAGE_NAME}"
echo " docker inspect ${IMAGE_NAME}:${VERSION}"
# 显示镜像大小
echo ""
echo "📊 镜像大小:"
docker images ${IMAGE_NAME}:${VERSION} --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 显示构建产物大小
echo ""
echo "📦 构建产物大小:"
du -sh dist/ | tail -1

91
scripts/build-docker.sh Executable file
View file

@ -0,0 +1,91 @@
#!/bin/bash
# Moodist Docker 构建和推送脚本
# 支持多平台构建并推送到 Docker Hub
set -e
# 配置变量
IMAGE_NAME="walllee/moodist"
VERSION=${1:-latest}
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VCS_REF=$(git rev-parse --short HEAD)
echo "🐳 开始构建 Moodist Docker 镜像..."
echo "📦 镜像名称: ${IMAGE_NAME}"
echo "🏷️ 版本标签: ${VERSION}"
echo "📅 构建时间: ${BUILD_DATE}"
echo "🔗 Git提交: ${VCS_REF}"
# 检查Docker是否安装并运行
if ! docker info &> /dev/null; then
echo "❌ Docker未运行请启动Docker服务"
exit 1
fi
# 检查是否登录Docker Hub
if ! docker info | grep -q "Username"; then
echo "⚠️ 未检测到Docker登录请先运行: docker login"
echo "💡 如果您有Docker Hub账号请使用以下命令登录"
echo " docker login"
echo " # 输入您的用户名和密码或访问令牌"
read -p "是否继续构建?(y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo "❌ 构建已取消"
exit 1
fi
fi
# 创建buildx构建器如果不存在
if ! docker buildx ls | grep -q "moodist-builder"; then
echo "🔨 创建Docker Buildx构建器..."
docker buildx create --name moodist-builder --use
docker buildx inspect --bootstrap
fi
# 构建参数
BUILD_ARGS="--build-arg BUILD_DATE=${BUILD_DATE}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VERSION=${VERSION}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VCS_REF=${VCS_REF}"
BUILD_ARGS="${BUILD_ARGS} --build-arg NODE_ENV=production"
echo "🏗️ 开始构建多平台镜像..."
# 构建并推送多平台镜像
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag "${IMAGE_NAME}:${VERSION}" \
--tag "${IMAGE_NAME}:latest" \
${BUILD_ARGS} \
--file ./Dockerfile.optimized \
--push \
.
echo "✅ 构建完成!"
# 如果指定了特定版本同时创建version-specific标签
if [ "$VERSION" != "latest" ]; then
echo "🏷️ 添加版本标签: ${VERSION}"
docker buildx build \
--platform linux/amd64,linux/arm64 \
--tag "${IMAGE_NAME}:${VERSION}" \
${BUILD_ARGS} \
--file ./Dockerfile.optimized \
--push \
.
fi
echo ""
echo "🎉 镜像构建和推送完成!"
echo "📋 镜像信息:"
echo " 🔗 Docker Hub: https://hub.docker.com/r/${IMAGE_NAME}"
echo " 🏷️ 标签: ${VERSION}, latest"
echo " 🏗️ 平台: linux/amd64, linux/arm64"
echo ""
echo "🚀 使用方法:"
echo " docker run -d -p 8080:8080 ${IMAGE_NAME}:${VERSION}"
echo ""
echo "📝 查看镜像信息:"
echo " docker pull ${IMAGE_NAME}:${VERSION}"
echo " docker inspect ${IMAGE_NAME}:${VERSION}"

83
scripts/build-local.sh Executable file
View file

@ -0,0 +1,83 @@
#!/bin/bash
# Moodist Docker 本地构建脚本
# 用于本地测试和开发
set -e
# 配置变量
IMAGE_NAME="moodist-local"
VERSION=${1:-dev}
BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VCS_REF=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
echo "🐳 开始本地构建 Moodist Docker 镜像..."
echo "📦 镜像名称: ${IMAGE_NAME}"
echo "🏷️ 版本标签: ${VERSION}"
echo "📅 构建时间: ${BUILD_DATE}"
echo "🔗 Git提交: ${VCS_REF}"
# 检查Docker是否安装并运行
if ! docker info &> /dev/null; then
echo "❌ Docker未运行请启动Docker服务"
exit 1
fi
# 构建参数
BUILD_ARGS="--build-arg BUILD_DATE=${BUILD_DATE}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VERSION=${VERSION}"
BUILD_ARGS="${BUILD_ARGS} --build-arg VCS_REF=${VCS_REF}"
BUILD_ARGS="${BUILD_ARGS} --build-arg NODE_ENV=production"
echo "🏗️ 开始本地构建..."
# 构建本地镜像
docker build \
${BUILD_ARGS} \
--tag "${IMAGE_NAME}:${VERSION}" \
--file ./Dockerfile.optimized \
.
echo "✅ 本地构建完成!"
# 运行容器进行测试
echo "🧪 启动测试容器..."
# 停止并删除现有容器(如果存在)
docker stop moodist-test 2>/dev/null || true
docker rm moodist-test 2>/dev/null || true
# 启动新容器
docker run -d \
--name moodist-test \
-p 8081:8080 \
--restart unless-stopped \
"${IMAGE_NAME}:${VERSION}"
echo "🚀 测试容器已启动!"
echo ""
echo "📋 访问信息:"
echo " 🌐 本地访问: http://localhost:8081"
echo " 🐳 容器名称: moodist-test"
echo " 🏷️ 镜像标签: ${IMAGE_NAME}:${VERSION}"
echo ""
echo "🔧 常用命令:"
echo " 查看日志: docker logs moodist-test"
echo " 停止容器: docker stop moodist-test"
echo " 删除容器: docker rm moodist-test"
echo " 进入容器: docker exec -it moodist-test /bin/sh"
echo ""
echo "⏳ 等待容器启动..."
sleep 5
# 健康检查
echo "🔍 执行健康检查..."
if curl -f http://localhost:8081/ &> /dev/null; then
echo "✅ 健康检查通过!应用正常运行"
else
echo "⚠️ 健康检查失败,请查看容器日志"
echo " docker logs moodist-test"
fi
echo ""
echo "🎉 本地构建和测试完成!"