{"id":15954298,"url":"https://github.com/nekoimi/webapp","last_synced_at":"2026-03-17T04:45:19.110Z","repository":{"id":120621714,"uuid":"578229889","full_name":"nekoimi/webapp","owner":"nekoimi","description":"一个简化前端 Web 项目部署的 Docker 运行环境，通过环境变量动态替换配置，实现一次构建，处处部署。","archived":false,"fork":false,"pushed_at":"2026-03-05T07:19:39.000Z","size":54,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-05T12:29:12.498Z","etag":null,"topics":["docker","docker-compose","golang","react","vue"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nekoimi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-12-14T15:04:10.000Z","updated_at":"2026-03-05T07:21:13.000Z","dependencies_parsed_at":"2025-06-29T13:02:13.921Z","dependency_job_id":"f00700a9-f148-4831-800c-545817b4b4f4","html_url":"https://github.com/nekoimi/webapp","commit_stats":null,"previous_names":["nekoimi/docker-webapp-go"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/nekoimi/webapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nekoimi%2Fwebapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nekoimi%2Fwebapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nekoimi%2Fwebapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nekoimi%2Fwebapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nekoimi","download_url":"https://codeload.github.com/nekoimi/webapp/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nekoimi%2Fwebapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30231468,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T19:01:10.287Z","status":"ssl_error","status_checked_at":"2026-03-07T18:59:58.103Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","golang","react","vue"],"created_at":"2024-10-07T13:16:58.502Z","updated_at":"2026-03-07T21:01:02.185Z","avatar_url":"https://github.com/nekoimi.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📦 Docker Webapp\n\n一个简化前端 Web 项目部署的 Docker 运行环境，通过环境变量动态替换配置，实现**一次构建，处处部署**。\n\n[![Docker Image Size](https://img.shields.io/docker/image-size/nekoimi/webapp/latest)](https://hub.docker.com/r/nekoimi/webapp)\n[![Docker Pulls](https://img.shields.io/docker/pulls/nekoimi/webapp)](https://hub.docker.com/r/nekoimi/webapp)\n[![GitHub](https://img.shields.io/github/stars/nekoimi/webapp)](https://github.com/nekoimi/webapp)\n\n## ✨ 功能特性\n\n- 🚀 **环境变量注入** - 启动时自动替换前端代码中的环境变量占位符\n- 🔧 **零配置部署** - 无需重新构建即可适配不同环境\n- 🐳 **Docker 原生支持** - 基于 Nginx Alpine 镜像，轻量高效\n- 📁 **多格式支持** - 自动处理 `.html` `.js` `.css` `.json` 文件\n- 🛡️ **智能路径处理** - 自动处理斜杠，避免路径拼接问题\n- ⚡ **高性能** - 内置 Gzip 压缩和静态资源缓存策略\n\n## 🎯 解决什么问题\n\n前端项目打包后，后端 API 地址、环境变量等配置已硬编码到构建产物中。当需要在不同环境（开发、测试、生产）部署时，通常需要重新构建项目。\n\n**本项目通过环境变量动态替换机制，实现：**\n\n1. 构建时将配置项以变量名形式打包（如 `API_SERVER_URL`）\n2. 部署时通过环境变量传入实际值\n3. 容器启动时自动替换，无需重新构建\n\n## 📥 快速开始\n\n### 拉取镜像\n\n```bash\ndocker pull ghcr.io/nekoimi/webapp:latest\n```\n\n### 运行示例\n\n```bash\ngit clone https://github.com/nekoimi/webapp.git\ncd webapp\ndocker-compose up -d\n```\n\n访问 http://localhost 查看效果\n\n## 🛠️ 使用方法\n\n### 1. 准备前端项目\n\n在前端代码中使用环境变量名称作为占位符：\n\n```html\n\u003c!-- index.html --\u003e\n\u003cscript\u003e\n  const apiUrl = 'API_SERVER_URL';  // 将被替换为实际值\n  const appName = 'APP_NAME';       // 将被替换为实际值\n\u003c/script\u003e\n```\n\n### 2. 使用 Docker Compose\n\n```yaml\nversion: \"3.6\"\nservices:\n  webapp:\n    image: ghcr.io/nekoimi/webapp:latest\n    ports:\n      - \"80:80\"\n    environment:\n      # 以 WEBAPP_ENV. 为前缀设置环境变量\n      WEBAPP_ENV.API_SERVER_URL: https://api.example.com\n      WEBAPP_ENV.APP_NAME: 我的应用\n      WEBAPP_ENV.BASE_URL: /app/\n      WEBAPP_ENV.USERNAME: admin\n      WEBAPP_ENV.PASSWORD: secret123\n    volumes:\n      - ./dist:/workspace  # 挂载前端构建产物\n```\n\n### 3. 构建自定义镜像\n\n```dockerfile\nFROM ghcr.io/nekoimi/webapp:latest\n\nCOPY ./dist /workspace\n```\n\n```bash\ndocker build -t my-webapp .\ndocker run -p 80:80 -e WEBAPP_ENV.API_URL=https://api.example.com my-webapp\n```\n\n## ⚙️ 配置说明\n\n### 环境变量\n\n| 变量名 | 说明 | 示例 |\n|--------|------|------|\n| `WEBAPP_ENV.\u003cKEY\u003e` | 自定义配置项，将被替换到前端代码中 | `WEBAPP_ENV.API_URL=https://api.com` |\n| `PORT` | HTTP 服务端口（默认 80） | `PORT=8080` |\n| `TZ` | 时区设置（默认 Asia/Shanghai） | `TZ=Asia/Shanghai` |\n\n### 支持的文件类型\n\n以下文件类型会自动进行环境变量替换：\n\n- `.html` - HTML 文件\n- `.js` - JavaScript 文件\n- `.css` - 样式文件\n- `.json` - JSON 配置文件\n\n### 路径处理规则\n\n工具会自动处理斜杠，避免以下问题：\n\n- `//api` → `/api`（自动去重）\n- `api/` + `/endpoint` → `api/endpoint`（智能拼接）\n\n## 📁 项目结构\n\n```\n.\n├── main.go              # Go 部署工具源码\n├── Dockerfile           # 镜像构建配置\n├── docker-compose.yaml  # 示例编排文件\n├── conf/                # Nginx 配置\n│   ├── nginx.conf       # Nginx 主配置\n│   └── default.conf.tpl # 站点配置模板\n├── example/             # 示例前端项目\n│   ├── index.html\n│   ├── css/\n│   └── js/\n└── 99-run-webapp.sh     # 容器启动脚本\n```\n\n## 🔧 工作原理\n\n1. **启动阶段**：容器执行 `99-run-webapp.sh` 脚本\n2. **环境加载**：`webapp` 程序读取 `WEBAPP_ENV.*` 前缀的环境变量\n3. **文件复制**：将 `/workspace` 目录内容复制到 Nginx 根目录\n4. **变量替换**：扫描 `.html` `.js` `.css` `.json` 文件，替换占位符\n5. **权限设置**：设置文件权限，启动 Nginx 服务\n\n## 🌟 最佳实践\n\n### 前端项目配置\n\n建议使用统一的环境变量命名规范：\n\n```javascript\n// config.js\nconst config = {\n  apiUrl: 'API_SERVER_URL',\n  appName: 'APP_NAME',\n  baseUrl: 'BASE_URL',\n  version: 'APP_VERSION'\n};\n```\n\n### CI/CD 集成\n\n```yaml\n# .github/workflows/deploy.yml\n- name: Deploy to Production\n  run: |\n    docker run -d \\\n      -p 80:80 \\\n      -e WEBAPP_ENV.API_SERVER_URL=${{ secrets.PROD_API_URL }} \\\n      -e WEBAPP_ENV.APP_NAME=生产环境 \\\n      -v $(pwd)/dist:/workspace \\\n      ghcr.io/nekoimi/webapp:latest\n```\n\n## 🐛 故障排查\n\n### 环境变量未生效\n\n1. 检查变量名是否以 `WEBAPP_ENV.` 开头\n2. 查看容器日志：`docker logs \u003ccontainer_id\u003e`\n3. 确认挂载目录正确：`/workspace` 应包含前端文件\n\n### 权限问题\n\n```bash\n# 检查文件权限\ndocker exec \u003ccontainer_id\u003e ls -la /usr/share/nginx/html\n\n# 修复权限\nchmod -R 755 ./dist\n```\n\n## 🤝 贡献\n\n欢迎提交 Issue 和 Pull Request！\n\n## 📄 许可证\n\n[MIT License](LICENSE)\n\n---\n\n**Made with ❤️ by [nekoimi](https://github.com/nekoimi)**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnekoimi%2Fwebapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnekoimi%2Fwebapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnekoimi%2Fwebapp/lists"}