1

目前 WordPress 和 MySQL 实例在 Swisscom 云上运行。但是上周突然wp-content,由于内容丢失,被删除,无法正常运行网站。之后我与 Swisscom 进行了沟通,他们已经解释了问题和可能的解决方案。他们建议使用外部服务来存储内容媒体文件和其他文档。但我不知道该怎么做。

如果有人解决了同样的问题,请提供您的解决方案或提出一些建议。

4

2 回答 2

1

这是 Swisscom 产品管理部门的官方回答:

我们不正式支持应用程序云上的 Wordpress。有很多关于如何在 Cloud Foundry 上部署 Wordpress 的示例可用,但它们仅适用于某些配置。据我们所知,没有适用于每个 wordpress 安装和配置的有效通用解决方案。因此,我们不正式支持它。问题存在于文件系统领域(Wordpress 需要非临时文件系统才能工作)以及 Wordpress 及其插件的意识,它们可能在多个实例中运行(在水平缩放的情况下)

于 2017-02-24T09:05:26.873 回答
0

编辑版本:

此解决方案不适合将 wordpress 部署到云端,因为在应用程序重新启动或暂存时,临时文件系统会导致数据丢失。这可能随时发生。另一个问题可能是具有多个实例的应用程序的水平扩展,所有实例都具有不同步的不同临时文件系统。因此,该解决方案不能用于生产。

这是由于 Wordpress 的架构目前还没有为云环境做好准备,而不是云本身。部署到云端的应用程序应遵守十二因素应用程序规则

这个小方法可用于博客和所有备份足够且不需要多个实例的情况。

我尝试在 Swisscom Cloud 上进行 wordpress 的基本安装。首先我下载了​​wordpress的代码。它应该存在一个名为“wp-config-sample.php”的文件。将其重命名为“wp-config.php”并替换文件中的以下行:

// ** Read MySQL service properties from _ENV['VCAP_SERVICES']
$services = json_decode($_ENV['VCAP_SERVICES'], true);
$service = $services['mariadb'][0];  // pick the first MySQL service

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', $service['credentials']['database']);

/** MySQL database username */
define('DB_USER', $service['credentials']['username']);

/** MySQL database password */
define('DB_PASSWORD', $service['credentials']['password']);

/** MySQL hostname */
define('DB_HOST', $service['credentials']['host'] . ':' .      $service['credentials']['port']);

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');

这些行允许 wordpress 从环境变量中获取数据库凭据。在这种特定情况下,变量键指向 Swisscom mariadb 服务。如果应用程序重新启动,这些信息将自动提供给应用程序。

确保创建一个 mariadb 并将其绑定到应用程序。这可以在部署的不同阶段以不同的方式完成。

为了定期执行应用程序媒体的备份,我安装了一个插件来备份到兼容的 S3 存储。Swisscom 动态存储服务是与 S3 兼容的存储,您可以将此服务与插件updraftplus一起使用。所以首先我使用 wordpress 插件管理器安装了插件。然后我创建了一个附加到应用程序的动态存储服务。重新部署应用程序后,您可以使用 Cloud Foundry cli 列出应用程序的环境变量:

    cf env appName

你应该得到这样的东西:

       {
"VCAP_SERVICES": {
  "dynstrg": [
   {
    "credentials": {
     "accessHost": "ds31s3.swisscom.com",
     "accessKey": "key",
     "sharedSecret": "secret"
    },
    "label": "dynstrg",
    "name": "test-ivan-dynstrg",
    "plan": "usage",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [],
    "volume_mounts": []
   }
  ],
  "mariadb": [
   {
    "credentials": {
     "database": "database",
     "database_uri": "mysql://uri",
     "host": "10.0.20.18",
     "jdbcUrl": "jdbc:mysql://uri",
     "name": "name",
     "password": "pass",
     "port": 3306,
     "uri": "uri",
     "username": "user"
    },
    "label": "mariadb",
    "name": "test-ivan-mariadb",
    "plan": "small",
    "provider": null,
    "syslog_drain_url": null,
    "tags": [],
    "volume_mounts": []
   }
  ]
 }
}

记下“accessHost”、“accessKey”和“sharedSecret”。

此时您需要在动态存储上创建一个桶。您可以使用不同类型的应用程序执行此操作。这一步非常重要。没有存储桶,插件将无法工作。

创建存储桶后,请记下它的名称。

现在您可以配置“updraftplus”插件:您需要选择 S3 兼容(通用)服务并在 S3 端点字段中输入 accessHost,在 S3 访问密钥中输入 accessKey,在 S3 密钥中输入 sharedSecret,以及字段 S3 位置中的存储桶名称。这应该正确配置插件。现在您可以备份两个文件而不是数据库。

请记住,当应用程序重新启动时,插件将不再安装(它安装在临时文件系统上),因此您需要重新安装它并在之后执行恢复过程。

此解决方案仍可能导致数据丢失。备份可能比应用程序崩溃或重新启动更早。

但是对于个人博客的用例可能很有用。

于 2017-02-17T21:08:25.513 回答