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 上的一些东西:

原因是我的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 存储桶上发布静态网站。

感谢您阅读我!