MeteorUp 卷以及 Meteor 如何访问它们的内容
MeteorUp volumes and how Meteor can access to their contents
首先,感谢您阅读我的问题。这是我第一次使用 Whosebug,我做了很多研究来寻找可以帮助我的答案。
语境
我正在开发用作 CMS 的 Meteor 应用程序,我在 mongoDb 集合中创建内容和存储数据。目标是使用这些数据和一个 React 项目来构建一个静态网站,并将其发送到 AWS S3 存储桶进行托管。
我正在使用 meteorUp 部署我的 Meteor 应用程序(在 AWS EC2 实例上),根据 MeteorUp 文档 (http://meteor-up.com/docs.html#volumes),我在我的 [=156= 中添加了一个 docker 卷]:
module.exports = {
...
meteor: {
...
volumes: {
'/opt/front': '/front'
},
...
},
...
};
部署后,音量已在“/opt/myproject/config/start.sh”中设置好:
sudo docker run \
-d \
--restart=always \
$VOLUME \
\
--expose=3000 \
\
--hostname="$HOSTNAME-$APPNAME" \
--env-file=$ENV_FILE \
\
--log-opt max-size=100m --log-opt max-file=10 \
-v /opt/front:/front \
--memory-reservation 600M \
\
--name=$APPNAME \
$IMAGE
echo "Ran abernix/meteord:node-8.4.0-base"
# When using a private docker registry, the cleanup run in
# Prepare Bundle is only done on one server, so we also
# cleanup here so the other servers don't run out of disk space
if [[ $VOLUME == "" ]]; then
# The app starts much faster when prepare bundle is enabled,
# so we do not need to wait as long
sleep 3s
else
sleep 15s
fi
在我的 EC2 上,“/opt/front”包含用于生成静态网站的 React 项目。
此文件夹包含一个 package.json 文件,每个模块都在 'node_modules' 目录中。 'react-scripts' 是其中之一,package.json 包含以下脚本行:
"build": "react-scripts build",
React 项目
React App 由 JSON 文件提供,在 'opt/front/src/assets/datas/publish.json'.
中可用
这个JSON文件可以手写(所以项目可以独立开发)或者我的Meteor App生成。
流星应用程序
客户端,在用户界面上,我们有一个 'Publish' 按钮,管理员可以在 she/he 想要生成静态网站(使用 CMS 数据)并将其部署到S3 存储桶。
它调用一个 Meteor 方法(服务器端)
它的动作分为 3 个步骤:
1.收集所有有用的数据并将它们保存到发布集合中
2。 JSON创作
一个。获取 Public 集合第一个进入 javascript 对象的条目。
b。在 React 项目目录 ('opt/front/src/assets/datas/publish.json') 中使用该对象编写一个 JSON 文件。
代码如下:
import fs from 'fs';
let publishDatas = Publish.find({}, {sort : { createdAt : -1}}).fetch();
let jsonDatasString = JSON.stringify(publishDatas[0]);
fs.writeFile('/front/src/assets/datas/publish.json', jsonDatasString, 'utf8', function (err) {
if (err) {
return console.log(err);
}
});
2。静态网站建设
一个。 运行 CD 命令到达 React 项目的目录然后 运行 'build' 脚本使用此代码:
process_exec_sync = function (command) {
// Load future from fibers
var Future = Npm.require("fibers/future");
// Load exec
var child = Npm.require("child_process");
// Create new future
var future = new Future();
// Run command synchronous
child.exec(command, {maxBuffer: 1024 * 10000}, function(error, stdout, stderr) {
// return an onbject to identify error and success
var result = {};
// test for error
if (error) {
result.error = error;
}
// return stdout
result.stdout = stdout;
future.return(result);
});
// wait for future
return future.wait();
}
var build = process_exec_sync('(cd front && npm run build)');
b。如果 'build' 没问题,那么我将 'front/build' 内容发送到我的 S3 存储桶。
行为:
On local environment (Meteor 运行ning on development mode):
仅供参考:React 项目目录的名称和位置略有不同。
它位于我的 meteor 项目目录中,所以它不是 'front',而是命名为“.#front”,因为我不希望 Meteor 在每次修改、添加或删除文件时重新启动。
一切正常,但我完全意识到我处于开发模式并且我受益于我的本地环境。
在生产环境中(Meteor 运行在docker容器中在生产模式下运行):
步骤2.b:效果很好,我可以在'opt/front/src/assets/datas/'
中看到新生成的文件
步骤 3.a:我收到以下错误:
"Error running ls: Command failed: (cd /front && npm run build)
(node:39) ExperimentalWarning: The WHATWG Encoding Standard
implementation is an experimental API. It should not yet be used in
production applications.
npm ERR! code ELIFECYCLE npm ERR! errno 1 npm
ERR! front@0.1.0 build: react-scripts build
npm ERR! Exit status 1
npm ERR! npm ERR! Failed at the front@0.1.0 build script. npm ERR!
This is probably not a problem with npm. There is likely additional
logging output above.
npm ERR! A complete log of this run can be found in: npm ERR!
/root/.npm/_logs/2021-09-16T13_55_24_043Z-debug.log [exec-fail]"
所以这是我的问题:
在生产模式下,是否可以使用 Meteor 到达另一个目录和 运行 来自 package.json 的脚本?
几个月来我一直在寻找答案,但找不到类似或附近的案例。
我是不是做错了什么?
我是不是用错了方法?
我疯了吗? :D
非常感谢您阅读到最后。
感谢您的回答!
!!!!!更新!!!!!
我找到了解决方案!
事实上,我不得不用 ssh 检查我的 EC2 上的一些东西:
- 连接后,我必须转到“/opt/front/”并尝试使用 'npm run build'
构建 React-app
- 我遇到了第一个错误,因为该目录上的 CHMOD 未设置为 777(菜鸟!)
- 然后,我因为node-sass.
出错了
原因是我的docker使用的是Node v8,而我的EC2使用的是Node v16。
我必须安装 NVM 并使用 Node v8,然后删除我的 React-App node_modules(和 package-lock.json)然后重新安装它。
完成后,一切正常!
我现在有一个 Meteor 应用程序作为 CMS / 预览网站托管在 EC2 实例上,可以在 S3 存储桶上发布静态网站。
感谢您阅读我!
!!!!!更新 !!!!!
我找到了解决方案!
事实上,我不得不用 ssh 检查我的 EC2 上的一些东西:
连接后,我必须转到“/opt/front/”并尝试使用 'npm run build' 构建 React-app
我遇到了第一个错误,因为该目录上的 CHMOD 未设置为 777(菜鸟!)
然后,我因为 node-sass 而出错。
原因是我的 docker 使用的是 Node v8,而我的 EC2 使用的是 Node v16。
我必须安装 NVM 并使用 Node v8,然后删除我的 React-App node_modules(和 package-lock.json),然后重新安装它。
完成后,一切正常!
我现在有一个 Meteor 应用程序作为 CMS / 预览网站托管在 EC2 实例上,可以在 S3 存储桶上发布静态网站。
感谢您阅读我!
首先,感谢您阅读我的问题。这是我第一次使用 Whosebug,我做了很多研究来寻找可以帮助我的答案。
语境
我正在开发用作 CMS 的 Meteor 应用程序,我在 mongoDb 集合中创建内容和存储数据。目标是使用这些数据和一个 React 项目来构建一个静态网站,并将其发送到 AWS S3 存储桶进行托管。
我正在使用 meteorUp 部署我的 Meteor 应用程序(在 AWS EC2 实例上),根据 MeteorUp 文档 (http://meteor-up.com/docs.html#volumes),我在我的 [=156= 中添加了一个 docker 卷]:
module.exports = {
...
meteor: {
...
volumes: {
'/opt/front': '/front'
},
...
},
...
};
部署后,音量已在“/opt/myproject/config/start.sh”中设置好:
sudo docker run \
-d \
--restart=always \
$VOLUME \
\
--expose=3000 \
\
--hostname="$HOSTNAME-$APPNAME" \
--env-file=$ENV_FILE \
\
--log-opt max-size=100m --log-opt max-file=10 \
-v /opt/front:/front \
--memory-reservation 600M \
\
--name=$APPNAME \
$IMAGE
echo "Ran abernix/meteord:node-8.4.0-base"
# When using a private docker registry, the cleanup run in
# Prepare Bundle is only done on one server, so we also
# cleanup here so the other servers don't run out of disk space
if [[ $VOLUME == "" ]]; then
# The app starts much faster when prepare bundle is enabled,
# so we do not need to wait as long
sleep 3s
else
sleep 15s
fi
在我的 EC2 上,“/opt/front”包含用于生成静态网站的 React 项目。 此文件夹包含一个 package.json 文件,每个模块都在 'node_modules' 目录中。 'react-scripts' 是其中之一,package.json 包含以下脚本行:
"build": "react-scripts build",
React 项目
React App 由 JSON 文件提供,在 'opt/front/src/assets/datas/publish.json'.
中可用这个JSON文件可以手写(所以项目可以独立开发)或者我的Meteor App生成。
流星应用程序
客户端,在用户界面上,我们有一个 'Publish' 按钮,管理员可以在 she/he 想要生成静态网站(使用 CMS 数据)并将其部署到S3 存储桶。
它调用一个 Meteor 方法(服务器端)
它的动作分为 3 个步骤:
1.收集所有有用的数据并将它们保存到发布集合中
2。 JSON创作
一个。获取 Public 集合第一个进入 javascript 对象的条目。
b。在 React 项目目录 ('opt/front/src/assets/datas/publish.json') 中使用该对象编写一个 JSON 文件。
代码如下:
import fs from 'fs';
let publishDatas = Publish.find({}, {sort : { createdAt : -1}}).fetch();
let jsonDatasString = JSON.stringify(publishDatas[0]);
fs.writeFile('/front/src/assets/datas/publish.json', jsonDatasString, 'utf8', function (err) {
if (err) {
return console.log(err);
}
});
2。静态网站建设
一个。 运行 CD 命令到达 React 项目的目录然后 运行 'build' 脚本使用此代码:
process_exec_sync = function (command) {
// Load future from fibers
var Future = Npm.require("fibers/future");
// Load exec
var child = Npm.require("child_process");
// Create new future
var future = new Future();
// Run command synchronous
child.exec(command, {maxBuffer: 1024 * 10000}, function(error, stdout, stderr) {
// return an onbject to identify error and success
var result = {};
// test for error
if (error) {
result.error = error;
}
// return stdout
result.stdout = stdout;
future.return(result);
});
// wait for future
return future.wait();
}
var build = process_exec_sync('(cd front && npm run build)');
b。如果 'build' 没问题,那么我将 'front/build' 内容发送到我的 S3 存储桶。
行为:
On local environment (Meteor 运行ning on development mode):
仅供参考:React 项目目录的名称和位置略有不同。 它位于我的 meteor 项目目录中,所以它不是 'front',而是命名为“.#front”,因为我不希望 Meteor 在每次修改、添加或删除文件时重新启动。
一切正常,但我完全意识到我处于开发模式并且我受益于我的本地环境。
在生产环境中(Meteor 运行在docker容器中在生产模式下运行):
步骤2.b:效果很好,我可以在'opt/front/src/assets/datas/'
中看到新生成的文件步骤 3.a:我收到以下错误:
"Error running ls: Command failed: (cd /front && npm run build)
(node:39) ExperimentalWarning: The WHATWG Encoding Standard implementation is an experimental API. It should not yet be used in production applications.
npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! front@0.1.0 build:
react-scripts build
npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the front@0.1.0 build script. npm ERR!This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in: npm ERR!
/root/.npm/_logs/2021-09-16T13_55_24_043Z-debug.log [exec-fail]"
所以这是我的问题: 在生产模式下,是否可以使用 Meteor 到达另一个目录和 运行 来自 package.json 的脚本?
几个月来我一直在寻找答案,但找不到类似或附近的案例。
我是不是做错了什么?
我是不是用错了方法?
我疯了吗? :D
非常感谢您阅读到最后。
感谢您的回答!
!!!!!更新!!!!!
我找到了解决方案!
事实上,我不得不用 ssh 检查我的 EC2 上的一些东西:
- 连接后,我必须转到“/opt/front/”并尝试使用 'npm run build' 构建 React-app
- 我遇到了第一个错误,因为该目录上的 CHMOD 未设置为 777(菜鸟!)
- 然后,我因为node-sass. 出错了
原因是我的docker使用的是Node v8,而我的EC2使用的是Node v16。
我必须安装 NVM 并使用 Node v8,然后删除我的 React-App node_modules(和 package-lock.json)然后重新安装它。
完成后,一切正常!
我现在有一个 Meteor 应用程序作为 CMS / 预览网站托管在 EC2 实例上,可以在 S3 存储桶上发布静态网站。
感谢您阅读我!
!!!!!更新 !!!!!
我找到了解决方案!
事实上,我不得不用 ssh 检查我的 EC2 上的一些东西:
连接后,我必须转到“/opt/front/”并尝试使用 'npm run build' 构建 React-app 我遇到了第一个错误,因为该目录上的 CHMOD 未设置为 777(菜鸟!) 然后,我因为 node-sass 而出错。 原因是我的 docker 使用的是 Node v8,而我的 EC2 使用的是 Node v16。
我必须安装 NVM 并使用 Node v8,然后删除我的 React-App node_modules(和 package-lock.json),然后重新安装它。
完成后,一切正常!
我现在有一个 Meteor 应用程序作为 CMS / 预览网站托管在 EC2 实例上,可以在 S3 存储桶上发布静态网站。
感谢您阅读我!