edwardspec/mediawiki-aws-s3

允许MediaWiki使用Amazon S3存储上传的文件。

资助包维护!
Patreon

安装次数: 9,416

依赖项: 0

建议者: 0

安全性: 0

星星: 42

观察者: 6

分支: 32

公开问题: 0

类型:mediawiki-extension

v0.13.0 2023-12-31 10:01 UTC

This package is auto-updated.

Last update: 2024-09-09 00:53:52 UTC


README

扩展:AWS - https://www.mediawiki.org/wiki/Extension:AWS

功能:将图像存储在Amazon S3而不是本地目录中。

需要的原因:当图像在S3中时,运行MediaWiki的Amazon EC2实例不包含任何重要数据,可以被自动扩展创建/销毁。

安装

注意:此版本的Extension:AWS需要MediaWiki 1.35+。对于MediaWiki的较旧版本(1.27-1.34),请使用以下说明:https://github.com/edwardspec/mediawiki-aws-s3/blob/REL1_34/README.md

1) 下载扩展: git clone --depth 1 https://github.com/edwardspec/mediawiki-aws-s3.git AWS

2) 将AWS目录移动到您的MediaWiki的"extensions"目录中,例如 /var/www/html/w/extensions (假设MediaWiki在/var/www/html/w

3) 创建文件 /var/www/html/w/composer.local.json,内容如下

{
	"extra": {
		"merge-plugin": {
			"include": [
				"extensions/AWS/composer.json"
			]
		}
	}
}

4) 从 /var/www/html/w 运行 composer update(以下载依赖项)。如果您尚未安装Composer,请参阅https://www.mediawiki.org/wiki/Composer了解如何安装它。

5) 为图像创建一个S3存储桶,例如 wonderfulbali234。注意:此名称将出现在图像URL中。

6a) 如果您的EC2实例具有IAM实例配置文件(推荐),请将“所需IAM权限”(见下文)中的所有内容复制到IAM角色的内联策略中。请参阅https://console.aws.amazon.com/iam/home#/roles

6b) 如果您的EC2实例没有IAM配置文件,则获取AWS API密钥/密钥。您需要将其写入LocalSettings.php(见下文)。

7) 修改LocalSettings.php(见下文)。

LocalSettings.php中的配置

wfLoadExtension( 'AWS' );

// Configure AWS credentials.
// THIS IS NOT NEEDED if your EC2 instance has an IAM instance profile.
$wgAWSCredentials = [
	'key' => '<something>',
	'secret' => '<something>',
	'token' => false
];

$wgAWSRegion = 'us-east-1'; # Northern Virginia

// Replace <something> with the name of your S3 bucket, e.g. wonderfulbali234.
$wgAWSBucketName = "<something>";

// if your images are stored in directory called "some_prefix"
// you can specify an optional prefix
$wgAWSBucketTopSubdirectory="/some_prefix";

如果您未通过$wgAWSCredentials指定凭据,则它们将使用默认凭据链检索。这意味着它们来自IAM实例配置文件(如果此EC2实例具有)或来自环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

所需的IAM权限

<something>替换为您的S3存储桶名称,例如wonderfulbali234

{
        "Effect": "Allow",
        "Action": [
                "s3:*"
        ],
        "Resource": [
                "arn:aws:s3:::<something>/*"
        ]
},
{
        "Effect": "Allow",
        "Action": [
                "s3:Get*",
                "s3:List*"
        ],
        "Resource": [
                "arn:aws:s3:::<something>"
        ]
}

自定义S3域名

您可以使用域名来存储图像(例如,img.mysite.com)。当您希望CDN(如CloudFlare)缓存您的图像时,需要此功能。有关详细信息,请参阅[https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html 存储桶的虚拟主机托管]。

1) 在您的DNS提供商处,添加一个CNAME条目。例如,将img.mysite.com指向<your-wgAWSBucketName>.s3.<location>.amazonaws.com)。

2) 在LocalSettings.php中设置$wgAWSBucketDomain。以下值是受支持的

$wgAWSBucketDomain = 'img.mysite.com';

// This will use <bucket-name>.cloudfront.net
$wgAWSBucketDomain = '$1.cloudfront.net';

// Default
$wgAWSBucketDomain = '$1.s3.amazonaws.com';

迁移图像

默认情况下,扩展将所有图像存储在存储桶的最高级目录中。

如果您正在迁移现有的images文件夹,MediaWiki将使用哈希目录结构。您需要将其添加到您的LocalSettings.php中,以便正确生成图像路径。

$wgAWSRepoHashLevels = '2'; # Default 0
# 2 means that S3 objects will be named a/ab/Filename.png (same as when MediaWiki stores files in local directories)

$wgAWSRepoDeletedHashLevels = '3'; # Default 0
# 3 for naming a/ab/abc/Filename.png (same as when MediaWiki stores deleted files in local directories)

如果您的images文件夹以前是为多个拆分到不同子目录的wiki服务的,您需要设置$wgAWSBucketTopSubdirectory。不建议新wiki使用此设置。

$wgAWSBucketTopSubdirectory = '/something';
# images will be in bucketname.s3.amazonaws.com/something/File.png instead of bucketname.s3.amazonaws.com/File.png.

故障排除

我的维基使用了扩展:多媒体查看器(或以弹出窗口显示图片),但现在它们不工作

如果您遇到此问题,请将CORS策略附加到包含图片的S3存储桶。这将允许托管您的维基的域中的JavaScript(在这种情况下,扩展:多媒体查看器的弹出显示脚本)从Amazon S3 URL下载图片。例如,如果您的维基的域是www.example.com,您可以使用以下策略

<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>http://www.example.com</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
 </CORSRule>
</CORSConfiguration>

即使扩展显示已安装,仍然使用本地存储

如果某些设置缺失,可能会发生这种情况。请确保您至少设置了$wgAWSBucketName$wgAWSRegion

即使扩展显示已安装,我仍然得到异常

如果某些设置缺失,可能会发生这种情况。请确保设置了$wgAWSRegion(即使您的配置不使用它,例如,当使用非亚马逊提供商时)。

非标准配置

使用其他与S3兼容的服务(而非Amazon S3本身)

您可以使用支持S3 API的非亚马逊软件(如Apache CloudStack、Digital Ocean等)来代替Amazon S3本身。要启用此功能,请将以下行添加到LocalSettings.php中

//The url used for the API (PutObject, etc.)
$wgFileBackends['s3']['endpoint'] = 'https://my-custom-url';
//The url used for showing images. $1 is translated to the bucket name.
$wgAWSBucketDomain = '$1.my-custom-url';

请确保也设置了$wgAWSBucketName$wgAWSRegion

某些软件(如MinIO)不使用子域名进行存储桶,在这种情况下,您需要以下配置

$wgFileBackends['s3']['use_path_style_endpoint'] = true;