@fecommunity/reactpress 2.0.0-beta.0 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +6 -6
- package/README.md +28 -176
- package/bin/reactpress-cli-shim.js +28 -0
- package/bin/reactpress.js +244 -61
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +102 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config.d.ts +8 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +54 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +33 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/restart.d.ts +2 -0
- package/dist/commands/restart.d.ts.map +1 -0
- package/dist/commands/restart.js +29 -0
- package/dist/commands/restart.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +31 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +20 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +5 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +29 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/i18n.js +8 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +3 -0
- package/dist/services/config.d.ts +11 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +102 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/database.d.ts +43 -0
- package/dist/services/database.d.ts.map +1 -0
- package/dist/services/database.js +252 -0
- package/dist/services/database.js.map +1 -0
- package/dist/services/exec.d.ts +22 -0
- package/dist/services/exec.d.ts.map +1 -0
- package/dist/services/exec.js +46 -0
- package/dist/services/exec.js.map +1 -0
- package/dist/services/init.d.ts +10 -0
- package/dist/services/init.d.ts.map +1 -0
- package/dist/services/init.js +50 -0
- package/dist/services/init.js.map +1 -0
- package/dist/services/process.d.ts +9 -0
- package/dist/services/process.d.ts.map +1 -0
- package/dist/services/process.js +98 -0
- package/dist/services/process.js.map +1 -0
- package/dist/services/server-health.d.ts +4 -0
- package/dist/services/server-health.d.ts.map +1 -0
- package/dist/services/server-health.js +27 -0
- package/dist/services/server-health.js.map +1 -0
- package/dist/services/server.d.ts +19 -0
- package/dist/services/server.d.ts.map +1 -0
- package/dist/services/server.js +133 -0
- package/dist/services/server.js.map +1 -0
- package/dist/templates/config.default.json +12 -0
- package/dist/templates/docker-compose.yml +27 -0
- package/dist/templates/env.default +11 -0
- package/dist/templates/package.json +10 -0
- package/dist/types/config.d.ts +30 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/utils/cli-context.d.ts +4 -0
- package/dist/utils/cli-context.d.ts.map +1 -0
- package/dist/utils/cli-context.js +10 -0
- package/dist/utils/cli-context.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +17 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +27 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/platform.d.ts +8 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +21 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/utils/port.d.ts +5 -0
- package/dist/utils/port.d.ts.map +1 -0
- package/dist/utils/port.js +25 -0
- package/dist/utils/port.js.map +1 -0
- package/dist/utils/server-bundle.d.ts +11 -0
- package/dist/utils/server-bundle.d.ts.map +1 -0
- package/dist/utils/server-bundle.js +71 -0
- package/dist/utils/server-bundle.js.map +1 -0
- package/lib/api-dev-runner.js +6 -0
- package/lib/api-dev.js +85 -0
- package/lib/bootstrap.js +114 -0
- package/lib/build.js +29 -0
- package/lib/db-backup.js +46 -0
- package/lib/dev-banner.js +40 -0
- package/lib/dev.js +134 -0
- package/lib/docker.js +157 -0
- package/lib/doctor.js +210 -0
- package/lib/http.js +147 -0
- package/lib/i18n/index.js +32 -0
- package/lib/i18n/strings.js +559 -0
- package/lib/lifecycle.js +160 -0
- package/lib/paths.js +75 -0
- package/lib/pm2.js +32 -0
- package/lib/process.js +45 -0
- package/{scripts/publish-packages.js → lib/publish.js} +255 -58
- package/lib/root.js +31 -0
- package/lib/spawn.js +91 -0
- package/lib/status.js +108 -0
- package/package.json +34 -72
- package/scripts/install-bundled-runtime.mjs +46 -0
- package/server/bin/reactpress-server.js +4 -4
- package/server/dist/app.module.d.ts +2 -0
- package/server/dist/app.module.js +105 -0
- package/server/dist/app.module.js.map +1 -0
- package/server/dist/common/api-messages.d.ts +32 -0
- package/server/dist/common/api-messages.js +36 -0
- package/server/dist/common/api-messages.js.map +1 -0
- package/server/dist/filters/http-exception.filter.d.ts +4 -0
- package/server/dist/filters/http-exception.filter.js +36 -0
- package/server/dist/filters/http-exception.filter.js.map +1 -0
- package/server/dist/generate-swagger.d.ts +1 -0
- package/server/dist/generate-swagger.js +73 -0
- package/server/dist/generate-swagger.js.map +1 -0
- package/server/dist/interceptors/transform.interceptor.d.ts +9 -0
- package/server/dist/interceptors/transform.interceptor.js +36 -0
- package/server/dist/interceptors/transform.interceptor.js.map +1 -0
- package/server/dist/logger/index.d.ts +4 -0
- package/server/dist/logger/index.js +33 -0
- package/server/dist/logger/index.js.map +1 -0
- package/server/dist/main.d.ts +6 -0
- package/server/dist/main.js +263 -0
- package/server/dist/main.js.map +1 -0
- package/server/dist/modules/api-key/api-key.controller.d.ts +14 -0
- package/server/dist/modules/api-key/api-key.controller.js +63 -0
- package/server/dist/modules/api-key/api-key.controller.js.map +1 -0
- package/server/dist/modules/api-key/api-key.entity.d.ts +11 -0
- package/server/dist/modules/api-key/api-key.entity.js +63 -0
- package/server/dist/modules/api-key/api-key.entity.js.map +1 -0
- package/server/dist/modules/api-key/api-key.guard.d.ts +7 -0
- package/server/dist/modules/api-key/api-key.guard.js +40 -0
- package/server/dist/modules/api-key/api-key.guard.js.map +1 -0
- package/server/dist/modules/api-key/api-key.module.d.ts +2 -0
- package/server/dist/modules/api-key/api-key.module.js +28 -0
- package/server/dist/modules/api-key/api-key.module.js.map +1 -0
- package/server/dist/modules/api-key/api-key.service.d.ts +15 -0
- package/server/dist/modules/api-key/api-key.service.js +81 -0
- package/server/dist/modules/api-key/api-key.service.js.map +1 -0
- package/server/dist/modules/article/article-revision.entity.d.ts +11 -0
- package/server/dist/modules/article/article-revision.entity.js +53 -0
- package/server/dist/modules/article/article-revision.entity.js.map +1 -0
- package/server/dist/modules/article/article.controller.d.ts +32 -0
- package/server/dist/modules/article/article.controller.js +242 -0
- package/server/dist/modules/article/article.controller.js.map +1 -0
- package/server/dist/modules/article/article.entity.d.ts +24 -0
- package/server/dist/modules/article/article.entity.js +133 -0
- package/server/dist/modules/article/article.entity.js.map +1 -0
- package/server/dist/modules/article/article.module.d.ts +2 -0
- package/server/dist/modules/article/article.module.js +42 -0
- package/server/dist/modules/article/article.module.js.map +1 -0
- package/server/dist/modules/article/article.service.d.ts +38 -0
- package/server/dist/modules/article/article.service.js +357 -0
- package/server/dist/modules/article/article.service.js.map +1 -0
- package/server/dist/modules/article/article.util.d.ts +1 -0
- package/server/dist/modules/article/article.util.js +9 -0
- package/server/dist/modules/article/article.util.js.map +1 -0
- package/server/dist/modules/article/scheduled-publish.service.d.ts +13 -0
- package/server/dist/modules/article/scheduled-publish.service.js +65 -0
- package/server/dist/modules/article/scheduled-publish.service.js.map +1 -0
- package/server/dist/modules/auth/auth.controller.d.ts +12 -0
- package/server/dist/modules/auth/auth.controller.js +66 -0
- package/server/dist/modules/auth/auth.controller.js.map +1 -0
- package/server/dist/modules/auth/auth.module.d.ts +2 -0
- package/server/dist/modules/auth/auth.module.js +41 -0
- package/server/dist/modules/auth/auth.module.js.map +1 -0
- package/server/dist/modules/auth/auth.service.d.ts +26 -0
- package/server/dist/modules/auth/auth.service.js +128 -0
- package/server/dist/modules/auth/auth.service.js.map +1 -0
- package/server/dist/modules/auth/jwt-auth.guard.d.ts +7 -0
- package/server/dist/modules/auth/jwt-auth.guard.js +30 -0
- package/server/dist/modules/auth/jwt-auth.guard.js.map +1 -0
- package/server/dist/modules/auth/jwt.strategy.d.ts +9 -0
- package/server/dist/modules/auth/jwt.strategy.js +39 -0
- package/server/dist/modules/auth/jwt.strategy.js.map +1 -0
- package/server/dist/modules/auth/roles.guard.d.ts +10 -0
- package/server/dist/modules/auth/roles.guard.js +46 -0
- package/server/dist/modules/auth/roles.guard.js.map +1 -0
- package/server/dist/modules/category/category.controller.d.ts +11 -0
- package/server/dist/modules/category/category.controller.js +91 -0
- package/server/dist/modules/category/category.controller.js.map +1 -0
- package/server/dist/modules/category/category.entity.d.ts +9 -0
- package/server/dist/modules/category/category.entity.js +60 -0
- package/server/dist/modules/category/category.entity.js.map +1 -0
- package/server/dist/modules/category/category.module.d.ts +2 -0
- package/server/dist/modules/category/category.module.js +27 -0
- package/server/dist/modules/category/category.module.js.map +1 -0
- package/server/dist/modules/category/category.service.d.ts +12 -0
- package/server/dist/modules/category/category.service.js +90 -0
- package/server/dist/modules/category/category.service.js.map +1 -0
- package/server/dist/modules/comment/comment.controller.d.ts +12 -0
- package/server/dist/modules/comment/comment.controller.js +100 -0
- package/server/dist/modules/comment/comment.controller.js.map +1 -0
- package/server/dist/modules/comment/comment.entity.d.ts +17 -0
- package/server/dist/modules/comment/comment.entity.js +104 -0
- package/server/dist/modules/comment/comment.entity.js.map +1 -0
- package/server/dist/modules/comment/comment.module.d.ts +2 -0
- package/server/dist/modules/comment/comment.module.js +39 -0
- package/server/dist/modules/comment/comment.module.js.map +1 -0
- package/server/dist/modules/comment/comment.service.d.ts +26 -0
- package/server/dist/modules/comment/comment.service.js +182 -0
- package/server/dist/modules/comment/comment.service.js.map +1 -0
- package/server/dist/modules/comment/html.d.ts +15 -0
- package/server/dist/modules/comment/html.js +632 -0
- package/server/dist/modules/comment/html.js.map +1 -0
- package/server/dist/modules/file/file.controller.d.ts +10 -0
- package/server/dist/modules/file/file.controller.js +84 -0
- package/server/dist/modules/file/file.controller.js.map +1 -0
- package/server/dist/modules/file/file.entity.d.ts +9 -0
- package/server/dist/modules/file/file.entity.js +60 -0
- package/server/dist/modules/file/file.entity.js.map +1 -0
- package/server/dist/modules/file/file.module.d.ts +2 -0
- package/server/dist/modules/file/file.module.js +27 -0
- package/server/dist/modules/file/file.module.js.map +1 -0
- package/server/dist/modules/file/file.service.d.ts +17 -0
- package/server/dist/modules/file/file.service.js +111 -0
- package/server/dist/modules/file/file.service.js.map +1 -0
- package/server/dist/modules/health/health.controller.d.ts +11 -0
- package/server/dist/modules/health/health.controller.js +57 -0
- package/server/dist/modules/health/health.controller.js.map +1 -0
- package/server/dist/modules/health/health.module.d.ts +2 -0
- package/server/dist/modules/health/health.module.js +20 -0
- package/server/dist/modules/health/health.module.js.map +1 -0
- package/server/dist/modules/install/install.controller.d.ts +11 -0
- package/server/dist/modules/install/install.controller.js +49 -0
- package/server/dist/modules/install/install.controller.js.map +1 -0
- package/server/dist/modules/install/install.module.d.ts +2 -0
- package/server/dist/modules/install/install.module.js +26 -0
- package/server/dist/modules/install/install.module.js.map +1 -0
- package/server/dist/modules/install/install.service.d.ts +12 -0
- package/server/dist/modules/install/install.service.js +63 -0
- package/server/dist/modules/install/install.service.js.map +1 -0
- package/server/dist/modules/knowledge/knowledge.controller.d.ts +14 -0
- package/server/dist/modules/knowledge/knowledge.controller.js +128 -0
- package/server/dist/modules/knowledge/knowledge.controller.js.map +1 -0
- package/server/dist/modules/knowledge/knowledge.entity.d.ts +18 -0
- package/server/dist/modules/knowledge/knowledge.entity.js +109 -0
- package/server/dist/modules/knowledge/knowledge.entity.js.map +1 -0
- package/server/dist/modules/knowledge/knowledge.module.d.ts +2 -0
- package/server/dist/modules/knowledge/knowledge.module.js +27 -0
- package/server/dist/modules/knowledge/knowledge.module.js.map +1 -0
- package/server/dist/modules/knowledge/knowledge.service.d.ts +14 -0
- package/server/dist/modules/knowledge/knowledge.service.js +144 -0
- package/server/dist/modules/knowledge/knowledge.service.js.map +1 -0
- package/server/dist/modules/page/page.controller.d.ts +12 -0
- package/server/dist/modules/page/page.controller.js +102 -0
- package/server/dist/modules/page/page.controller.js.map +1 -0
- package/server/dist/modules/page/page.entity.d.ts +15 -0
- package/server/dist/modules/page/page.entity.js +94 -0
- package/server/dist/modules/page/page.entity.js.map +1 -0
- package/server/dist/modules/page/page.module.d.ts +2 -0
- package/server/dist/modules/page/page.module.js +27 -0
- package/server/dist/modules/page/page.module.js.map +1 -0
- package/server/dist/modules/page/page.service.d.ts +12 -0
- package/server/dist/modules/page/page.service.js +98 -0
- package/server/dist/modules/page/page.service.js.map +1 -0
- package/server/dist/modules/search/search.controller.d.ts +8 -0
- package/server/dist/modules/search/search.controller.js +67 -0
- package/server/dist/modules/search/search.controller.js.map +1 -0
- package/server/dist/modules/search/search.entity.d.ts +8 -0
- package/server/dist/modules/search/search.entity.js +59 -0
- package/server/dist/modules/search/search.entity.js.map +1 -0
- package/server/dist/modules/search/search.module.d.ts +2 -0
- package/server/dist/modules/search/search.module.js +27 -0
- package/server/dist/modules/search/search.module.js.map +1 -0
- package/server/dist/modules/search/search.service.d.ts +12 -0
- package/server/dist/modules/search/search.service.js +84 -0
- package/server/dist/modules/search/search.service.js.map +1 -0
- package/server/dist/modules/setting/setting.constant.d.ts +3 -0
- package/server/dist/modules/setting/setting.constant.js +25 -0
- package/server/dist/modules/setting/setting.constant.js.map +1 -0
- package/server/dist/modules/setting/setting.controller.d.ts +12 -0
- package/server/dist/modules/setting/setting.controller.js +77 -0
- package/server/dist/modules/setting/setting.controller.js.map +1 -0
- package/server/dist/modules/setting/setting.entity.d.ts +26 -0
- package/server/dist/modules/setting/setting.entity.js +149 -0
- package/server/dist/modules/setting/setting.entity.js.map +1 -0
- package/server/dist/modules/setting/setting.module.d.ts +2 -0
- package/server/dist/modules/setting/setting.module.js +28 -0
- package/server/dist/modules/setting/setting.module.js.map +1 -0
- package/server/dist/modules/setting/setting.service.d.ts +10 -0
- package/server/dist/modules/setting/setting.service.js +106 -0
- package/server/dist/modules/setting/setting.service.js.map +1 -0
- package/server/dist/modules/smtp/mail.util.d.ts +6 -0
- package/server/dist/modules/smtp/mail.util.js +33 -0
- package/server/dist/modules/smtp/mail.util.js.map +1 -0
- package/server/dist/modules/smtp/smtp.controller.d.ts +9 -0
- package/server/dist/modules/smtp/smtp.controller.js +69 -0
- package/server/dist/modules/smtp/smtp.controller.js.map +1 -0
- package/server/dist/modules/smtp/smtp.entity.d.ts +9 -0
- package/server/dist/modules/smtp/smtp.entity.js +60 -0
- package/server/dist/modules/smtp/smtp.entity.js.map +1 -0
- package/server/dist/modules/smtp/smtp.module.d.ts +2 -0
- package/server/dist/modules/smtp/smtp.module.js +28 -0
- package/server/dist/modules/smtp/smtp.module.js.map +1 -0
- package/server/dist/modules/smtp/smtp.service.d.ts +11 -0
- package/server/dist/modules/smtp/smtp.service.js +83 -0
- package/server/dist/modules/smtp/smtp.service.js.map +1 -0
- package/server/dist/modules/tag/tag.controller.d.ts +12 -0
- package/server/dist/modules/tag/tag.controller.js +101 -0
- package/server/dist/modules/tag/tag.controller.js.map +1 -0
- package/server/dist/modules/tag/tag.entity.d.ts +9 -0
- package/server/dist/modules/tag/tag.entity.js +59 -0
- package/server/dist/modules/tag/tag.entity.js.map +1 -0
- package/server/dist/modules/tag/tag.module.d.ts +2 -0
- package/server/dist/modules/tag/tag.module.js +27 -0
- package/server/dist/modules/tag/tag.module.js.map +1 -0
- package/server/dist/modules/tag/tag.service.d.ts +13 -0
- package/server/dist/modules/tag/tag.service.js +104 -0
- package/server/dist/modules/tag/tag.service.js.map +1 -0
- package/server/dist/modules/user/user.controller.d.ts +13 -0
- package/server/dist/modules/user/user.controller.js +115 -0
- package/server/dist/modules/user/user.controller.js.map +1 -0
- package/server/dist/modules/user/user.entity.d.ts +15 -0
- package/server/dist/modules/user/user.entity.js +96 -0
- package/server/dist/modules/user/user.entity.js.map +1 -0
- package/server/dist/modules/user/user.module.d.ts +2 -0
- package/server/dist/modules/user/user.module.js +28 -0
- package/server/dist/modules/user/user.module.js.map +1 -0
- package/server/dist/modules/user/user.service.d.ts +16 -0
- package/server/dist/modules/user/user.service.js +152 -0
- package/server/dist/modules/user/user.service.js.map +1 -0
- package/server/dist/modules/view/view.controller.d.ts +11 -0
- package/server/dist/modules/view/view.controller.js +92 -0
- package/server/dist/modules/view/view.controller.js.map +1 -0
- package/server/dist/modules/view/view.entity.d.ts +14 -0
- package/server/dist/modules/view/view.entity.js +88 -0
- package/server/dist/modules/view/view.entity.js.map +1 -0
- package/server/dist/modules/view/view.module.d.ts +2 -0
- package/server/dist/modules/view/view.module.js +27 -0
- package/server/dist/modules/view/view.module.js.map +1 -0
- package/server/dist/modules/view/view.service.d.ts +11 -0
- package/server/dist/modules/view/view.service.js +89 -0
- package/server/dist/modules/view/view.service.js.map +1 -0
- package/server/dist/modules/webhook/webhook.controller.d.ts +12 -0
- package/server/dist/modules/webhook/webhook.controller.js +63 -0
- package/server/dist/modules/webhook/webhook.controller.js.map +1 -0
- package/server/dist/modules/webhook/webhook.entity.d.ts +9 -0
- package/server/dist/modules/webhook/webhook.entity.js +54 -0
- package/server/dist/modules/webhook/webhook.entity.js.map +1 -0
- package/server/dist/modules/webhook/webhook.module.d.ts +2 -0
- package/server/dist/modules/webhook/webhook.module.js +27 -0
- package/server/dist/modules/webhook/webhook.module.js.map +1 -0
- package/server/dist/modules/webhook/webhook.service.d.ts +16 -0
- package/server/dist/modules/webhook/webhook.service.js +97 -0
- package/server/dist/modules/webhook/webhook.service.js.map +1 -0
- package/server/dist/public/favicon.png +0 -0
- package/server/dist/public/index.html +439 -0
- package/server/dist/public/swagger/custom.css +11 -0
- package/server/dist/starter.d.ts +1 -0
- package/server/dist/starter.js +84 -0
- package/server/dist/starter.js.map +1 -0
- package/server/dist/tsconfig.build.tsbuildinfo +16966 -0
- package/server/dist/utils/date.util.d.ts +1 -0
- package/server/dist/utils/date.util.js +13 -0
- package/server/dist/utils/date.util.js.map +1 -0
- package/server/dist/utils/ip.util.d.ts +2 -0
- package/server/dist/utils/ip.util.js +27 -0
- package/server/dist/utils/ip.util.js.map +1 -0
- package/server/dist/utils/markdown.util.d.ts +4 -0
- package/server/dist/utils/markdown.util.js +42 -0
- package/server/dist/utils/markdown.util.js.map +1 -0
- package/server/dist/utils/oss/aliyun-oss-client.d.ts +6 -0
- package/server/dist/utils/oss/aliyun-oss-client.js +28 -0
- package/server/dist/utils/oss/aliyun-oss-client.js.map +1 -0
- package/server/dist/utils/oss/oss-client.d.ts +6 -0
- package/server/dist/utils/oss/oss-client.js +10 -0
- package/server/dist/utils/oss/oss-client.js.map +1 -0
- package/server/dist/utils/oss.util.d.ts +13 -0
- package/server/dist/utils/oss.util.js +49 -0
- package/server/dist/utils/oss.util.js.map +1 -0
- package/server/dist/utils/ua.util.d.ts +9 -0
- package/server/dist/utils/ua.util.js +36 -0
- package/server/dist/utils/ua.util.js.map +1 -0
- package/server/dist/utils/uniqueid.util.d.ts +1 -0
- package/server/dist/utils/uniqueid.util.js +9 -0
- package/server/dist/utils/uniqueid.util.js.map +1 -0
- package/server/dist/utils/upload.util.d.ts +5 -0
- package/server/dist/utils/upload.util.js +34 -0
- package/server/dist/utils/upload.util.js.map +1 -0
- package/server/dist/utils/user.util.d.ts +1 -0
- package/server/dist/utils/user.util.js +18 -0
- package/server/dist/utils/user.util.js.map +1 -0
- package/server/ecosystem.config.js +18 -0
- package/server/package.json +146 -0
- package/server/public/favicon.png +0 -0
- package/server/public/index.html +439 -0
- package/server/public/swagger/custom.css +11 -0
- package/templates/config.default.json +12 -0
- package/templates/docker-compose.prod.yml +56 -0
- package/templates/docker-compose.yml +27 -0
- package/templates/env.default +11 -0
- package/templates/package.json +10 -0
- package/ui/banner.js +22 -0
- package/ui/interactive.js +168 -0
- package/ui/theme.js +25 -0
- package/CONTRIBUTING.md +0 -122
- package/client/bin/reactpress-client.js +0 -190
- package/scripts/build-packages.js +0 -271
- package/scripts/deploy.sh +0 -25
- package/scripts/dev.js +0 -39
- package/scripts/reactpress-server-old.js +0 -130
- package/scripts/reactpress-server.js +0 -666
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>ReactPress › Installation</title>
|
|
7
|
+
<style>
|
|
8
|
+
/* 保持原有样式不变 */
|
|
9
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
10
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f1f1f1; color: #444; line-height: 1.4; }
|
|
11
|
+
.wp-container { max-width: 600px; margin: 40px auto; background: #fff; border: 1px solid #ccd0d4; box-shadow: 0 1px 3px rgba(0,0,0,0.04); }
|
|
12
|
+
.wp-header { background: #0073aa; color: #fff; padding: 24px; text-align: center; border-bottom: 1px solid #005a87; }
|
|
13
|
+
.wp-header h1 { font-size: 24px; font-weight: 400; margin-bottom: 8px; }
|
|
14
|
+
.wp-header p { font-size: 16px; opacity: 0.9; }
|
|
15
|
+
.wp-content { padding: 24px; }
|
|
16
|
+
.wp-step { display: none; }
|
|
17
|
+
.wp-step.active { display: block; }
|
|
18
|
+
.wp-step h2 { font-size: 22px; font-weight: 600; margin-bottom: 20px; color: #1d2327; }
|
|
19
|
+
.wp-description { background: #f0f6fc; border: 1px solid #c3e4f0; border-left: 4px solid #0073aa; padding: 12px 16px; margin-bottom: 20px; font-size: 14px; color: #0c4a6e; }
|
|
20
|
+
.wp-form-table { width: 100%; margin-bottom: 20px; }
|
|
21
|
+
.wp-form-table th { text-align: left; padding: 10px 0; width: 140px; vertical-align: top; font-weight: 600; color: #1d2327; }
|
|
22
|
+
.wp-form-table td { padding: 10px 0; }
|
|
23
|
+
.wp-form-table input[type="text"], .wp-form-table input[type="password"], .wp-form-table input[type="number"], .wp-form-table input[type="url"] { width: 100%; max-width: 320px; padding: 8px 12px; border: 1px solid #8c8f94; border-radius: 4px; font-size: 14px; line-height: 1.4; transition: border-color 0.15s ease-in-out; }
|
|
24
|
+
.wp-form-table input:focus { border-color: #0073aa; outline: 0; box-shadow: 0 0 0 1px #0073aa; }
|
|
25
|
+
.wp-form-table .description { font-size: 13px; color: #646970; margin-top: 4px; }
|
|
26
|
+
.wp-button { background: #0073aa; color: #fff; border: 1px solid #0073aa; padding: 8px 16px; font-size: 14px; font-weight: 600; border-radius: 3px; cursor: pointer; transition: all 0.15s ease-in-out; text-decoration: none; display: inline-block; }
|
|
27
|
+
.wp-button:hover { background: #005a87; border-color: #005a87; }
|
|
28
|
+
.wp-button:disabled { background: #f0f0f1; border-color: #dcdcde; color: #a7aaad; cursor: not-allowed; }
|
|
29
|
+
.wp-button.button-large { padding: 12px 24px; font-size: 16px; }
|
|
30
|
+
.wp-notice { border: 1px solid #c3c4c7; border-left-width: 4px; padding: 12px; margin: 16px 0; background: #fff; }
|
|
31
|
+
.wp-notice.notice-success { border-left-color: #00a32a; background: #f7fcf7; }
|
|
32
|
+
.wp-notice.notice-error { border-left-color: #d63638; background: #fcf2f2; }
|
|
33
|
+
.wp-notice p { margin: 0; font-size: 14px; }
|
|
34
|
+
.wp-progress { background: #f0f0f1; height: 4px; margin-bottom: 20px; }
|
|
35
|
+
.wp-progress-bar { background: #0073aa; height: 100%; transition: width 0.3s ease; }
|
|
36
|
+
.wp-loader { display: inline-block; width: 16px; height: 16px; border: 2px solid #f3f3f3; border-top: 2px solid #0073aa; border-radius: 50%; animation: wp-spin 1s linear infinite; margin-right: 8px; }
|
|
37
|
+
@keyframes wp-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }
|
|
38
|
+
.wp-footer { background: #f6f7f7; border-top: 1px solid #c3c4c7; padding: 16px 24px; text-align: center; font-size: 13px; color: #646970; }
|
|
39
|
+
.text-center { text-align: center; }
|
|
40
|
+
.countdown-container { display: none; text-align: center; margin: 20px 0; }
|
|
41
|
+
.countdown-timer { font-weight: bold; color: #0073aa; }
|
|
42
|
+
|
|
43
|
+
/* 新增重试按钮样式 */
|
|
44
|
+
.retry-button {
|
|
45
|
+
background: #d63638;
|
|
46
|
+
color: white;
|
|
47
|
+
border: none;
|
|
48
|
+
padding: 8px 16px;
|
|
49
|
+
border-radius: 3px;
|
|
50
|
+
cursor: pointer;
|
|
51
|
+
margin-top: 10px;
|
|
52
|
+
}
|
|
53
|
+
.retry-button:hover {
|
|
54
|
+
background: #b32d2e;
|
|
55
|
+
}
|
|
56
|
+
</style>
|
|
57
|
+
</head>
|
|
58
|
+
<body>
|
|
59
|
+
<div class="wp-container">
|
|
60
|
+
<div class="wp-header">
|
|
61
|
+
<h1>ReactPress</h1>
|
|
62
|
+
<p>5-Minute Installation</p>
|
|
63
|
+
</div>
|
|
64
|
+
|
|
65
|
+
<div class="wp-progress">
|
|
66
|
+
<div class="wp-progress-bar" id="progressBar" style="width: 33%;"></div>
|
|
67
|
+
</div>
|
|
68
|
+
|
|
69
|
+
<div class="wp-content">
|
|
70
|
+
<!-- Step 1: Database Configuration -->
|
|
71
|
+
<div class="wp-step active" id="step1">
|
|
72
|
+
<h2>Database Connection Information</h2>
|
|
73
|
+
|
|
74
|
+
<div class="wp-description">
|
|
75
|
+
You should have this information available from your web hosting provider. If you don't have it, contact them before continuing.
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<table class="wp-form-table">
|
|
79
|
+
<tr>
|
|
80
|
+
<th><label for="dbHost">Database Host</label></th>
|
|
81
|
+
<td>
|
|
82
|
+
<input type="text" id="dbHost" value="127.0.0.1" />
|
|
83
|
+
<p class="description">Usually "localhost" or "127.0.0.1"</p>
|
|
84
|
+
</td>
|
|
85
|
+
</tr>
|
|
86
|
+
<tr>
|
|
87
|
+
<th><label for="dbPort">Database Port</label></th>
|
|
88
|
+
<td>
|
|
89
|
+
<input type="number" id="dbPort" value="3306" />
|
|
90
|
+
<p class="description">Default MySQL port is 3306</p>
|
|
91
|
+
</td>
|
|
92
|
+
</tr>
|
|
93
|
+
<tr>
|
|
94
|
+
<th><label for="dbUser">Username</label></th>
|
|
95
|
+
<td>
|
|
96
|
+
<input type="text" id="dbUser" value="" placeholder="Database username" />
|
|
97
|
+
<p class="description">Your MySQL username</p>
|
|
98
|
+
</td>
|
|
99
|
+
</tr>
|
|
100
|
+
<tr>
|
|
101
|
+
<th><label for="dbPassword">Password</label></th>
|
|
102
|
+
<td>
|
|
103
|
+
<input type="password" id="dbPassword" value="" placeholder="Database password" />
|
|
104
|
+
<p class="description">Your MySQL password</p>
|
|
105
|
+
</td>
|
|
106
|
+
</tr>
|
|
107
|
+
<tr>
|
|
108
|
+
<th><label for="dbName">Database Name</label></th>
|
|
109
|
+
<td>
|
|
110
|
+
<input type="text" id="dbName" value="reactpress" />
|
|
111
|
+
<p class="description">The name of the database you want to use with ReactPress</p>
|
|
112
|
+
</td>
|
|
113
|
+
</tr>
|
|
114
|
+
</table>
|
|
115
|
+
|
|
116
|
+
<div id="dbResult"></div>
|
|
117
|
+
|
|
118
|
+
<p class="text-center">
|
|
119
|
+
<button class="wp-button button-large" onclick="testDatabase()" id="testBtn">
|
|
120
|
+
Test Database Connection
|
|
121
|
+
</button>
|
|
122
|
+
</p>
|
|
123
|
+
</div>
|
|
124
|
+
|
|
125
|
+
<!-- Step 2: Site Configuration -->
|
|
126
|
+
<div class="wp-step" id="step2">
|
|
127
|
+
<h2>Site Information</h2>
|
|
128
|
+
|
|
129
|
+
<div class="wp-description">
|
|
130
|
+
Please provide the following information. Don't worry, you can always change these settings later.
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<table class="wp-form-table">
|
|
134
|
+
<tr>
|
|
135
|
+
<th><label for="clientUrl">Client Site URL</label></th>
|
|
136
|
+
<td>
|
|
137
|
+
<input type="url" id="clientUrl" value="http://localhost:3001" />
|
|
138
|
+
<p class="description">The URL where your ReactPress frontend will be accessible</p>
|
|
139
|
+
</td>
|
|
140
|
+
</tr>
|
|
141
|
+
<tr>
|
|
142
|
+
<th><label for="serverUrl">API Server URL</label></th>
|
|
143
|
+
<td>
|
|
144
|
+
<input type="url" id="serverUrl" value="http://localhost:3002" />
|
|
145
|
+
<p class="description">The URL where your ReactPress API server will run</p>
|
|
146
|
+
</td>
|
|
147
|
+
</tr>
|
|
148
|
+
</table>
|
|
149
|
+
|
|
150
|
+
<div id="installResult"></div>
|
|
151
|
+
|
|
152
|
+
<p class="text-center">
|
|
153
|
+
<button class="wp-button button-large" onclick="installReactPress()" id="installBtn">
|
|
154
|
+
Install & Start ReactPress
|
|
155
|
+
</button>
|
|
156
|
+
</p>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<!-- Step 3: Success -->
|
|
160
|
+
<div class="wp-step" id="step3">
|
|
161
|
+
<h2>🎉 Installation Complete!</h2>
|
|
162
|
+
|
|
163
|
+
<div class="wp-notice notice-success">
|
|
164
|
+
<p><strong>ReactPress has been installed successfully!</strong></p>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<p>Your ReactPress server configuration has been saved. You can:</p>
|
|
168
|
+
|
|
169
|
+
<ul style="margin: 16px 0 16px 20px;">
|
|
170
|
+
<li>Close this browser window</li>
|
|
171
|
+
<li>Restart the server by running <code>npx @fecommunity/reactpress-server</code> in your terminal</li>
|
|
172
|
+
<li>Access your admin panel at <strong id="adminUrl">http://localhost:3001/admin</strong> (when client is running)</li>
|
|
173
|
+
</ul>
|
|
174
|
+
|
|
175
|
+
<!-- 重定向状态显示 -->
|
|
176
|
+
<div class="wp-notice" id="redirectStatus">
|
|
177
|
+
<p>Waiting for server to start...</p>
|
|
178
|
+
</div>
|
|
179
|
+
|
|
180
|
+
<div class="text-center">
|
|
181
|
+
<button class="wp-button" onclick="checkServerStatus()" id="checkStatusBtn">
|
|
182
|
+
Check Server Status
|
|
183
|
+
</button>
|
|
184
|
+
<button class="retry-button" onclick="retryRedirect()" id="retryBtn" style="display: none;">
|
|
185
|
+
Retry Connection
|
|
186
|
+
</button>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<div class="wp-description">
|
|
190
|
+
<strong>Note:</strong> To start the server with your new configuration, run <code>npx @fecommunity/reactpress-server</code> in your terminal.
|
|
191
|
+
</div>
|
|
192
|
+
</div>
|
|
193
|
+
</div>
|
|
194
|
+
|
|
195
|
+
<div class="wp-footer">
|
|
196
|
+
<p>Need help? <a href="https://github.com/fecommunity/reactpress/issues" target="_blank">ReactPress Documentation</a></p>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
<script>
|
|
201
|
+
// State management
|
|
202
|
+
let currentStep = 1;
|
|
203
|
+
const totalSteps = 3;
|
|
204
|
+
let isTestingConnection = false;
|
|
205
|
+
let countdownInterval = null;
|
|
206
|
+
let serverUrl = 'http://localhost:3002';
|
|
207
|
+
let redirectAttempts = 0;
|
|
208
|
+
const maxRedirectAttempts = 30; // 30秒超时
|
|
209
|
+
|
|
210
|
+
// Update progress bar
|
|
211
|
+
function updateProgress() {
|
|
212
|
+
const progress = (currentStep / totalSteps) * 100;
|
|
213
|
+
document.getElementById('progressBar').style.width = progress + '%';
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Show a specific step
|
|
217
|
+
function showStep(step) {
|
|
218
|
+
document.querySelectorAll('.wp-step').forEach(s => s.classList.remove('active'));
|
|
219
|
+
document.getElementById('step' + step).classList.add('active');
|
|
220
|
+
currentStep = step;
|
|
221
|
+
updateProgress();
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Show a notice message
|
|
225
|
+
function showNotice(message, type = 'error', containerId = 'dbResult') {
|
|
226
|
+
const container = document.getElementById(containerId);
|
|
227
|
+
container.innerHTML = `
|
|
228
|
+
<div class="wp-notice notice-${type}">
|
|
229
|
+
<p>${message}</p>
|
|
230
|
+
</div>
|
|
231
|
+
`;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// 检查服务器状态
|
|
235
|
+
async function checkServerStatus() {
|
|
236
|
+
const statusElement = document.getElementById('redirectStatus');
|
|
237
|
+
const checkBtn = document.getElementById('checkStatusBtn');
|
|
238
|
+
const retryBtn = document.getElementById('retryBtn');
|
|
239
|
+
|
|
240
|
+
statusElement.innerHTML = '<p>Checking server status...</p>';
|
|
241
|
+
statusElement.className = 'wp-notice';
|
|
242
|
+
checkBtn.disabled = true;
|
|
243
|
+
|
|
244
|
+
try {
|
|
245
|
+
const response = await fetch(`${serverUrl}/api`, {
|
|
246
|
+
method: 'GET',
|
|
247
|
+
headers: { 'Content-Type': 'application/json' },
|
|
248
|
+
// 添加超时处理
|
|
249
|
+
signal: AbortSignal.timeout(5000)
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
if (response.ok) {
|
|
253
|
+
statusElement.innerHTML = '<p>Server is running! Redirecting to API documentation...</p>';
|
|
254
|
+
statusElement.className = 'wp-notice notice-success';
|
|
255
|
+
|
|
256
|
+
// 服务器已启动,重定向到API页面
|
|
257
|
+
setTimeout(() => {
|
|
258
|
+
window.location.href = `${serverUrl}/api`;
|
|
259
|
+
}, 1000);
|
|
260
|
+
} else {
|
|
261
|
+
statusElement.innerHTML = '<p>Server responded but with an error. Please try again later.</p>';
|
|
262
|
+
statusElement.className = 'wp-notice notice-error';
|
|
263
|
+
retryBtn.style.display = 'inline-block';
|
|
264
|
+
}
|
|
265
|
+
} catch (error) {
|
|
266
|
+
statusElement.innerHTML = `<p>Cannot connect to server: ${error.message}. The server may still be starting up.</p>`;
|
|
267
|
+
statusElement.className = 'wp-notice notice-error';
|
|
268
|
+
retryBtn.style.display = 'inline-block';
|
|
269
|
+
} finally {
|
|
270
|
+
checkBtn.disabled = false;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// 重试重定向
|
|
275
|
+
function retryRedirect() {
|
|
276
|
+
const retryBtn = document.getElementById('retryBtn');
|
|
277
|
+
retryBtn.style.display = 'none';
|
|
278
|
+
checkServerStatus();
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// 启动服务器状态检查
|
|
282
|
+
function startServerStatusCheck() {
|
|
283
|
+
// 每2秒检查一次服务器状态,最多尝试30次(60秒)
|
|
284
|
+
const checkInterval = setInterval(() => {
|
|
285
|
+
if (redirectAttempts >= maxRedirectAttempts) {
|
|
286
|
+
clearInterval(checkInterval);
|
|
287
|
+
const statusElement = document.getElementById('redirectStatus');
|
|
288
|
+
statusElement.innerHTML = '<p>Server did not start in time. Please check your terminal for errors and try restarting the server manually.</p>';
|
|
289
|
+
statusElement.className = 'wp-notice notice-error';
|
|
290
|
+
document.getElementById('retryBtn').style.display = 'inline-block';
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
fetch(`${serverUrl}/api`, {
|
|
295
|
+
method: 'HEAD',
|
|
296
|
+
// 添加超时处理
|
|
297
|
+
signal: AbortSignal.timeout(3000)
|
|
298
|
+
})
|
|
299
|
+
.then(response => {
|
|
300
|
+
if (response.ok) {
|
|
301
|
+
clearInterval(checkInterval);
|
|
302
|
+
const statusElement = document.getElementById('redirectStatus');
|
|
303
|
+
statusElement.innerHTML = '<p>Server is running! Redirecting to API documentation...</p>';
|
|
304
|
+
statusElement.className = 'wp-notice notice-success';
|
|
305
|
+
|
|
306
|
+
// 服务器已启动,重定向到API页面
|
|
307
|
+
setTimeout(() => {
|
|
308
|
+
window.location.href = `${serverUrl}/api`;
|
|
309
|
+
}, 1000);
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
.catch(() => {
|
|
313
|
+
// 忽略错误,继续尝试
|
|
314
|
+
redirectAttempts++;
|
|
315
|
+
const statusElement = document.getElementById('redirectStatus');
|
|
316
|
+
statusElement.innerHTML = `<p>Waiting for server to start... (${redirectAttempts}/${maxRedirectAttempts})</p>`;
|
|
317
|
+
});
|
|
318
|
+
}, 2000);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Validate database input fields
|
|
322
|
+
function validateDatabaseInputs() {
|
|
323
|
+
const host = document.getElementById('dbHost').value.trim();
|
|
324
|
+
const port = document.getElementById('dbPort').value.trim();
|
|
325
|
+
const user = document.getElementById('dbUser').value.trim();
|
|
326
|
+
const password = document.getElementById('dbPassword').value;
|
|
327
|
+
const database = document.getElementById('dbName').value.trim();
|
|
328
|
+
|
|
329
|
+
if (!host || !port || !user || !database) {
|
|
330
|
+
showNotice('Please fill in all required fields.', 'error');
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
if (isNaN(port) || port < 1 || port > 65535) {
|
|
335
|
+
showNotice('Please enter a valid port number (1-65535).', 'error');
|
|
336
|
+
return false;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
return { host, port, user, password, database };
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Test database connection
|
|
343
|
+
async function testDatabase() {
|
|
344
|
+
if (isTestingConnection) return;
|
|
345
|
+
|
|
346
|
+
const dbData = validateDatabaseInputs();
|
|
347
|
+
if (!dbData) return;
|
|
348
|
+
|
|
349
|
+
isTestingConnection = true;
|
|
350
|
+
const testBtn = document.getElementById('testBtn');
|
|
351
|
+
const originalText = testBtn.innerHTML;
|
|
352
|
+
|
|
353
|
+
testBtn.disabled = true;
|
|
354
|
+
testBtn.innerHTML = '<span class="wp-loader"></span>Testing connection...';
|
|
355
|
+
|
|
356
|
+
try {
|
|
357
|
+
const response = await fetch('/test-db', {
|
|
358
|
+
method: 'POST',
|
|
359
|
+
headers: { 'Content-Type': 'application/json' },
|
|
360
|
+
body: JSON.stringify(dbData)
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
const result = await response.json();
|
|
364
|
+
|
|
365
|
+
if (result.success) {
|
|
366
|
+
showNotice(result.message, 'success');
|
|
367
|
+
setTimeout(() => {
|
|
368
|
+
showStep(2);
|
|
369
|
+
}, 1500);
|
|
370
|
+
} else {
|
|
371
|
+
showNotice(result.message, 'error');
|
|
372
|
+
}
|
|
373
|
+
} catch (error) {
|
|
374
|
+
showNotice('Failed to connect to server. Please try again.', 'error');
|
|
375
|
+
} finally {
|
|
376
|
+
isTestingConnection = false;
|
|
377
|
+
testBtn.disabled = false;
|
|
378
|
+
testBtn.innerHTML = originalText;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
// Install ReactPress
|
|
383
|
+
async function installReactPress() {
|
|
384
|
+
const dbData = validateDatabaseInputs();
|
|
385
|
+
if (!dbData) {
|
|
386
|
+
showStep(1);
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const clientUrl = document.getElementById('clientUrl').value.trim();
|
|
391
|
+
serverUrl = document.getElementById('serverUrl').value.trim();
|
|
392
|
+
|
|
393
|
+
if (!clientUrl || !serverUrl) {
|
|
394
|
+
showNotice('Please fill in all site URLs.', 'error', 'installResult');
|
|
395
|
+
return;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// 更新管理URL显示
|
|
399
|
+
document.getElementById('adminUrl').textContent = `${clientUrl}/admin`;
|
|
400
|
+
|
|
401
|
+
const installBtn = document.getElementById('installBtn');
|
|
402
|
+
const originalText = installBtn.innerHTML;
|
|
403
|
+
|
|
404
|
+
installBtn.disabled = true;
|
|
405
|
+
installBtn.innerHTML = '<span class="wp-loader"></span>Installing & Starting...';
|
|
406
|
+
|
|
407
|
+
try {
|
|
408
|
+
const response = await fetch('/install', {
|
|
409
|
+
method: 'POST',
|
|
410
|
+
headers: { 'Content-Type': 'application/json' },
|
|
411
|
+
body: JSON.stringify({
|
|
412
|
+
db: dbData,
|
|
413
|
+
site: { clientUrl, serverUrl }
|
|
414
|
+
})
|
|
415
|
+
});
|
|
416
|
+
|
|
417
|
+
const result = await response.json();
|
|
418
|
+
|
|
419
|
+
if (result.success) {
|
|
420
|
+
showStep(3);
|
|
421
|
+
// 启动服务器状态检查
|
|
422
|
+
startServerStatusCheck();
|
|
423
|
+
} else {
|
|
424
|
+
showNotice(result.message, 'error', 'installResult');
|
|
425
|
+
}
|
|
426
|
+
} catch (error) {
|
|
427
|
+
showNotice('Installation failed. Please try again.', 'error', 'installResult');
|
|
428
|
+
} finally {
|
|
429
|
+
installBtn.disabled = false;
|
|
430
|
+
installBtn.innerHTML = originalText;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
// Initialize the wizard
|
|
435
|
+
updateProgress();
|
|
436
|
+
document.getElementById('dbHost').focus();
|
|
437
|
+
</script>
|
|
438
|
+
</body>
|
|
439
|
+
</html>
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# ReactPress 3.0 生产部署示例
|
|
2
|
+
# 用法: 复制到项目根目录,按需修改环境变量后 docker compose -f docker-compose.prod.yml up -d
|
|
3
|
+
|
|
4
|
+
services:
|
|
5
|
+
db:
|
|
6
|
+
image: mysql:8.0
|
|
7
|
+
restart: unless-stopped
|
|
8
|
+
environment:
|
|
9
|
+
MYSQL_ROOT_PASSWORD: ${DB_PASSWD:-reactpress}
|
|
10
|
+
MYSQL_DATABASE: ${DB_DATABASE:-reactpress}
|
|
11
|
+
volumes:
|
|
12
|
+
- reactpress_mysql_data:/var/lib/mysql
|
|
13
|
+
ports:
|
|
14
|
+
- '${DB_PORT:-3306}:3306'
|
|
15
|
+
healthcheck:
|
|
16
|
+
test: ['CMD', 'mysqladmin', 'ping', '-h', 'localhost']
|
|
17
|
+
interval: 10s
|
|
18
|
+
timeout: 5s
|
|
19
|
+
retries: 5
|
|
20
|
+
|
|
21
|
+
api:
|
|
22
|
+
image: node:20-alpine
|
|
23
|
+
restart: unless-stopped
|
|
24
|
+
working_dir: /app
|
|
25
|
+
depends_on:
|
|
26
|
+
db:
|
|
27
|
+
condition: service_healthy
|
|
28
|
+
environment:
|
|
29
|
+
NODE_ENV: production
|
|
30
|
+
DB_HOST: db
|
|
31
|
+
DB_PORT: 3306
|
|
32
|
+
DB_USER: root
|
|
33
|
+
DB_PASSWD: ${DB_PASSWD:-reactpress}
|
|
34
|
+
DB_DATABASE: ${DB_DATABASE:-reactpress}
|
|
35
|
+
SERVER_PORT: 3002
|
|
36
|
+
SERVER_SITE_URL: http://localhost:3002
|
|
37
|
+
SERVER_API_PREFIX: /api
|
|
38
|
+
ports:
|
|
39
|
+
- '3002:3002'
|
|
40
|
+
command: sh -c "npm i -g @fecommunity/reactpress-cli@3 && reactpress-cli start --api-only"
|
|
41
|
+
# 生产建议挂载已 init 的项目目录,或使用自定义镜像内置 dist
|
|
42
|
+
|
|
43
|
+
client:
|
|
44
|
+
image: node:20-alpine
|
|
45
|
+
restart: unless-stopped
|
|
46
|
+
depends_on:
|
|
47
|
+
- api
|
|
48
|
+
environment:
|
|
49
|
+
CLIENT_SITE_URL: http://localhost:3001
|
|
50
|
+
SERVER_SITE_URL: http://api:3002
|
|
51
|
+
ports:
|
|
52
|
+
- '3001:3001'
|
|
53
|
+
command: sh -c "npm i -g @fecommunity/reactpress-client@3 && reactpress-client start"
|
|
54
|
+
|
|
55
|
+
volumes:
|
|
56
|
+
reactpress_mysql_data:
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
services:
|
|
2
|
+
db:
|
|
3
|
+
image: mysql:8.0
|
|
4
|
+
container_name: reactpress_cli_db
|
|
5
|
+
restart: unless-stopped
|
|
6
|
+
environment:
|
|
7
|
+
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-reactpress_root}
|
|
8
|
+
MYSQL_DATABASE: ${DB_DATABASE:-reactpress}
|
|
9
|
+
MYSQL_USER: ${DB_USER:-reactpress}
|
|
10
|
+
MYSQL_PASSWORD: ${DB_PASSWD:-reactpress}
|
|
11
|
+
command:
|
|
12
|
+
- --character-set-server=utf8mb4
|
|
13
|
+
- --collation-server=utf8mb4_unicode_ci
|
|
14
|
+
- --default-authentication-plugin=mysql_native_password
|
|
15
|
+
volumes:
|
|
16
|
+
- reactpress_cli_db_data:/var/lib/mysql
|
|
17
|
+
ports:
|
|
18
|
+
- "${DB_PORT:-3306}:3306"
|
|
19
|
+
healthcheck:
|
|
20
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-reactpress_root}"]
|
|
21
|
+
interval: 5s
|
|
22
|
+
timeout: 5s
|
|
23
|
+
retries: 12
|
|
24
|
+
start_period: 20s
|
|
25
|
+
|
|
26
|
+
volumes:
|
|
27
|
+
reactpress_cli_db_data:
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# ReactPress — auto-generated by reactpress-cli (do not edit DB_* unless you know what you are doing)
|
|
2
|
+
DB_HOST=127.0.0.1
|
|
3
|
+
DB_PORT=3306
|
|
4
|
+
DB_USER=reactpress
|
|
5
|
+
DB_PASSWD=reactpress
|
|
6
|
+
DB_DATABASE=reactpress
|
|
7
|
+
|
|
8
|
+
CLIENT_SITE_URL=http://localhost:3001
|
|
9
|
+
SERVER_SITE_URL=http://localhost:3002
|
|
10
|
+
SERVER_PORT=3002
|
|
11
|
+
SERVER_API_PREFIX=/api
|
package/ui/banner.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
const { brand } = require('./theme');
|
|
3
|
+
const { getMonorepoRoot } = require('../lib/root');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { t } = require('../lib/i18n');
|
|
6
|
+
|
|
7
|
+
function printBanner() {
|
|
8
|
+
const version = require(path.join(getMonorepoRoot(), 'package.json')).version;
|
|
9
|
+
console.log('');
|
|
10
|
+
console.log(brand.primary(' ╭─────────────────────────────────────────╮'));
|
|
11
|
+
console.log(
|
|
12
|
+
brand.primary(' │') +
|
|
13
|
+
chalk.bold.white(' ReactPress') +
|
|
14
|
+
brand.muted(t('banner.subtitle')) +
|
|
15
|
+
brand.primary('│'),
|
|
16
|
+
);
|
|
17
|
+
console.log(brand.primary(' ╰─────────────────────────────────────────╯'));
|
|
18
|
+
console.log(brand.muted(` v${version} · init · dev · build · deploy · publish`));
|
|
19
|
+
console.log('');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = { printBanner };
|