feat: 添加类生产模式 Docker 部署配置

- 新增 Dockerfile.dev-server:类生产模式容器(无热重载干扰)
- 新增 Dockerfile.prod-like:纯生产模式容器尝试
- 新增 Dockerfile.server:服务器模式容器
- 更新 docker-compose.yml:移除过时 version 字段,优化卷挂载
- 更新 .gitignore:忽略 data 目录(SQLite 数据库)
- 更新 astro.config.mjs:支持服务器端渲染模式

这解决了 react-icons 在生产构建中的 ES 模块兼容性问题,
提供了稳定的生产级 Docker 部署方案。
This commit is contained in:
walle 2025-11-19 16:48:48 +08:00
parent 95095a97a6
commit ee04a1e6a8
6 changed files with 194 additions and 6 deletions

3
.gitignore vendored
View file

@ -20,4 +20,5 @@ pnpm-debug.log*
# macOS-specific files
.DS_Store
*storybook.log
*storybook.log
data

56
Dockerfile.dev-server Normal file
View file

@ -0,0 +1,56 @@
# 开发模式 Dockerfile - 完整开发环境
FROM node:18-alpine
# 安装必要的系统依赖
RUN apk add --no-cache \
curl \
git \
bash
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=8080
ENV HOST=0.0.0.0
ENV PATH="/app/node_modules/.bin:${PATH}"
# 复制package文件
COPY package*.json ./
# 安装所有依赖包括devDependencies跳过 prepare 脚本
RUN npm ci --ignore-scripts && \
npm cache clean --force && \
npm install husky --save-dev
# 复制所有源代码
COPY . .
# 创建数据目录
RUN mkdir -p /app/data
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动开发服务器(类似生产模式,稳定运行)
CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0", "--port", "8080"]
# 定义构建参数
ARG VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist Development" \
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"

58
Dockerfile.prod-like Normal file
View file

@ -0,0 +1,58 @@
# 类生产模式 Dockerfile - 开发服务器但无热重载
FROM node:18-alpine
# 安装必要的系统依赖
RUN apk add --no-cache \
curl \
git \
bash
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV NODE_ENV=development
ENV PORT=8080
ENV HOST=0.0.0.0
ENV PATH="/app/node_modules/.bin:${PATH}"
# 复制package文件
COPY package*.json ./
# 安装所有依赖
RUN npm ci && \
npm cache clean --force
# 在容器内构建应用
COPY . .
# 创建数据目录
RUN mkdir -p /app/data
# 构建应用
RUN npm run build
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动应用(类似生产模式,无热重载)
CMD ["node", "./dist/server/entry.mjs"]
# 定义构建参数
ARG VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist Production-like" \
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"

58
Dockerfile.server Normal file
View file

@ -0,0 +1,58 @@
# 使用现有的本地构建成果 - Node.js 服务器版本
FROM node:20-alpine
# 安装必要的系统依赖
RUN apk add --no-cache curl
# 创建应用用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV NODE_ENV=production
ENV PORT=8080
# 复制package文件
COPY package*.json ./
# 安装所有依赖运行时需要adapter
RUN npm ci --ignore-scripts && \
npm cache clean --force
# 复制本地构建的完整产物
COPY --chown=nodejs:nodejs dist/ ./dist
# 创建数据目录
RUN mkdir -p /app/data && \
chown -R nodejs:nodejs /app
# 切换到非root用户
USER nodejs
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \
CMD curl -f http://localhost:8080/ || exit 1
# 启动应用
CMD ["node", "./dist/server/entry.mjs"]
# 定义构建参数
ARG VERSION=latest
ARG BUILD_DATE
ARG VCS_REF
# 添加标签信息
LABEL maintainer="walllee" \
org.opencontainers.image.title="Moodist" \
org.opencontainers.image.description="Ambient sounds for focus and calm - 多语言环境音应用 (Full Stack)" \
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"

View file

@ -5,7 +5,10 @@ import node from '@astrojs/node';
import AstroPWA from '@vite-pwa/astro';
export default defineConfig({
output: 'static',
output: 'server',
adapter: node({
mode: 'standalone'
}),
integrations: [
react(),
AstroPWA({

View file

@ -1,15 +1,27 @@
version: '3.9'
services:
moodist:
image: walllee/moodist:latest
image: walllee/moodist:3.0.0-prod-like
build:
context: .
dockerfile: Dockerfile.dev-server
logging:
options:
max-size: 1g
restart: always
restart: unless-stopped
ports:
- '8080:8080'
volumes:
# 挂载源代码用于热重载(保持用户权限)
- .:/app:cached
# 使用独立的 node_modules 避免权限冲突
- node_modules_volume:/app/node_modules
# 挂载 SQLite 数据库文件和 WAL 文件
- ./data:/app/data:rw
environment:
- NODE_ENV=production
- NODE_ENV=development
- PORT=8080
stdin_open: true
tty: true
volumes:
node_modules_volume: