# myblog **Repository Path**: laicj/myblog ## Basic Information - **Project Name**: myblog - **Description**: Apple风格的个人博客 - **Primary Language**: Go - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-10 - **Last Updated**: 2026-05-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Developer Personal Blog Apple 浅色毛玻璃风格的开源技术博客系统,包含 Nuxt 前台、内置管理员后台、Go API、SQLite、Flyway 风格迁移、本地文件上传、账号密码登录、邮箱验证注册和评论系统。 ## 技术栈 - 前端:Nuxt 3、Vue 3、TypeScript、Pinia、VueUse、Lucide - 后台:集成在 Nuxt `/admin` 路由中,不再单独维护后台项目 - 后端:Go、Gin、SQLite、服务端 Session、Markdown 渲染与 HTML 清洗 - 存储:SQLite 数据库 + 本地 `backend/storage` - 部署:Docker Compose + Nginx ## 本地开发 ```bash cp .env.example .env npm install make dev-api make dev-web ``` 默认地址: - 前台:`http://localhost:3000` - 管理后台:`http://localhost:3000/admin` - 后端:`http://localhost:8080` 首次启动后端会自动执行 `backend/migrations/V*.sql`。第一次访问站点时,如果数据库里还没有安装完成标记,会进入初始化向导;在向导里填写网站名称、站点图标、联系方式和管理员账号后,系统会写入安装标记并进入后台。 ## 常用命令 ```bash make test # Go 编译测试 + Nuxt 类型检查 make build # 构建 Go API 和 Nuxt 应用 make docker-up # Docker Compose 启动 ``` ## 功能 - 首页、文章列表、文章详情、项目页、关于页 - `/`、`/blog`、`/blog/:slug`、`/projects`、`/about` - 账号密码登录、邮箱验证注册、忘记密码重置、HttpOnly Cookie Session - 登录用户评论,用户可删除自己的评论,管理员可删除全部评论 - 管理员后台:仪表盘、文章编辑、评论、用户、资源、分类标签 - Markdown 和轻量富文本编辑 - Mac 风格代码块、复制按钮、阅读进度、搜索弹窗 - 本地文件上传,上传路径由后端生成并做类型/大小限制 - RSS:`/rss.xml` - Sitemap:`/sitemap.xml` ## Docker / Docker Compose 部署 ```bash cp .env.example .env docker compose up -d --build ``` 默认只对外暴露 Nginx: - 站点入口:`http://localhost` - 管理后台:`http://localhost/admin` - API 反代:`http://localhost/api/v1` - 上传资源:`http://localhost/uploads/...` 前端生产镜像运行的是 Nuxt SSR 的 Node server,但它只在 Docker 内网被 Nginx 反代访问,不直接暴露给公网。这样可以保留 SSR、SEO、RSS 和 sitemap 能力,同时让公网入口仍然由 Nginx/OpenResty/CDN 统一处理。 Nginx 路由: - `/` -> Nuxt 前台和内置 `/admin` - `/api` -> Go 后端 - `/uploads` -> Go 后端公开上传资源 ### 生产环境配置 部署前至少修改 `.env`: ```env APP_ENV=production PUBLIC_SITE_NAME=你的站点名称 PUBLIC_SITE_URL=https://example.com BACKEND_ALLOWED_ORIGINS=https://example.com BACKEND_SESSION_SECRET=替换为至少32位随机字符串 BACKEND_ADMIN_EMAIL=admin@example.com BACKEND_ADMIN_PASSWORD= BACKEND_COOKIE_DOMAIN=example.com BACKEND_COOKIE_SECURE=true NGINX_HTTP_PORT=80 GOPROXY=https://goproxy.cn,direct NPM_CONFIG_REGISTRY=https://registry.npmmirror.com ``` 如果你的 HTTPS 由外层网关、CDN 或服务器 Nginx 负责,本项目内置 Nginx 可以继续只监听 HTTP;外层反代到本 Compose 的 `NGINX_HTTP_PORT` 即可。首次打开站点会进入初始化向导,请在向导里设置自己的管理员密码。 `GOPROXY` 和 `NPM_CONFIG_REGISTRY` 只影响 Docker 镜像构建阶段。国内服务器建议保留示例值;海外服务器可以改回官方源: ```env GOPROXY=https://proxy.golang.org,direct NPM_CONFIG_REGISTRY=https://registry.npmjs.org/ ``` ### 数据持久化 默认使用 Docker named volumes: - `myblog_data`:SQLite 数据库 - `myblog_storage`:上传文件和附件 查看卷: ```bash docker volume ls | grep myblog ``` 如果你更希望把数据直接放在项目目录,可把 `docker-compose.yml` 中 backend 的 volumes 改为: ```yaml volumes: - ./data:/app/data - ./backend/storage:/app/storage ``` Linux 服务器使用宿主机目录挂载时,需要确保容器有写入权限。 ### 常用运维命令 ```bash docker compose ps docker compose logs -f backend docker compose logs -f frontend-web docker compose pull docker compose up -d --build docker compose down ``` 备份 named volumes: ```bash mkdir -p backups docker run --rm -v myblog_data:/data -v "$PWD/backups:/backup" alpine \ tar czf /backup/myblog-data-$(date +%Y%m%d%H%M%S).tar.gz -C /data . docker run --rm -v myblog_storage:/storage -v "$PWD/backups:/backup" alpine \ tar czf /backup/myblog-storage-$(date +%Y%m%d%H%M%S).tar.gz -C /storage . ``` 恢复前请先停止服务: ```bash docker compose down docker run --rm -v myblog_data:/data -v "$PWD/backups:/backup" alpine \ sh -c 'rm -rf /data/* && tar xzf /backup/你的数据备份.tar.gz -C /data' docker run --rm -v myblog_storage:/storage -v "$PWD/backups:/backup" alpine \ sh -c 'rm -rf /storage/* && tar xzf /backup/你的文件备份.tar.gz -C /storage' docker compose up -d ``` ## 目录 ```text backend/ Go API、SQLite 迁移、本地存储 frontend-web/ Nuxt 前台和内置管理员后台 nginx/ 反向代理配置 data/ 本地 SQLite 数据,默认被 git 忽略 ``` ## 开源说明 项目默认内容是通用演示数据,不绑定任何个人身份。你可以替换站点名称、关于页、文章、项目和管理员账号后作为个人博客或团队技术站点使用。