Automatically ship your resourcepack to S3 (and more in the future). This enabled professional storage & serve to client more efficiently!
In plugins/ItemsAdder/config.yml, ensure hosting is set like this:
resource-pack:
no-host:
enabled: false
lobfile:
enabled: false
self-host:
enabled: false
external-host:
enabled: trueIAUP will automatically configure resource-pack.hosting.external-host.url
Minimum required keys:
s3.buckets3.access_keys3.secret_key
Common options:
s3.endpointAWS:https://s3.amazonaws.comMinIO:http(s)://<host>:<port>Cloudflare R2:https://<accountid>.r2.cloudflarestorage.coms3.regionAWS: real region (exampleus-east-1) R2:autos3.path_schemeSupports placeholders:{uid} {file} {name} {ext} {date} {ts}s3.public_url_baseUse when the bucket is publicly readable via a known domain (CDN/custom domain). URL is built as<public_url_base>/<path_scheme-resolved-objectKey>. IAUP does not auto-prepends3.bucketwhen this is set ands3.use_presigned_url: false.s3.use_presigned_urlUse when you do not want a public bucket. The URL will expire (s3.presigned_expiry_seconds).
Auto reload after manual upload:
global.auto_iareload_after_manual_upload: trueWhen enabled, a successful/iaup uploadtriggers/iareload.global.auto_iareload_after_auto_upload: trueWhen enabled, successful auto-upload fromiazipflow also triggers/iareload.
If you use s3.use_presigned_url: false, clients must be able to download the pack URL.
Either is needed:
- Gateway is attached to a CDN-enabled domain (recommended, cache compatible)
- S3 endpoint is public-readable
If you use s3.use_presigned_url: true, the pack URL is a signed URL and can work with private buckets. However, this may lead to client redownload cached pack...
Path-style endpoint note:
- Bucket prefix in generated URL (
/<bucket>/<object>) is only applied on endpoint path-style branch. - If
s3.public_url_baseis set, generated URL uses that base directly with object key path.
Replace <bucket-name> with your bucket name.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": { "AWS": "*" },
"Action": [
"s3:GetObjectTagging",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucket-name>/*"
]
},
{
"Effect": "Deny",
"Principal": { "AWS": "arn:aws:iam::*:root" },
"Action": [
"s3:DeleteObject",
"s3:PutObjectTagging",
"s3:DeleteObjectTagging",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::<bucket-name>/*"
]
}
]
}Replace <bucket-name> with your bucket name.
{
"ID": "",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": "s3:*",
"NotAction": [],
"Resource": [
"arn:aws:s3:::<bucket-name>",
"arn:aws:s3:::<bucket-name>/*"
],
"NotResource": [],
"Condition": {}
}
]
}- Generate the pack with ItemsAdder:
Run
/iazip(or any workflow that producesplugins/ItemsAdder/output/generated.zip). - Upload:
Run
/iaup upload - If you did not enable
global.auto_iareload_after_manual_upload, run:/iareload
/iaup uploaduploads the pack immediately/iaup reloadreloads IAUP config and rebinds hooks
Buildworkflow runs on push/PR tomain.Releaseworkflow is separate and supports:
- Comment command:
/release,/release patch,/release minor,/release major - Manual dispatch: run
Releaseworkflow and choose bump type
Release workflow does:
- Bumps
versioningradle.properties(semver) - Builds artifacts
- Commits version bump, tags
vX.Y.Z, pushes tomain - Creates GitHub Release with JAR assets
Optional Modrinth publish during release:
- Required secrets:
MODRINTH_TOKENMODRINTH_PROJECT_ID
- Optional repository variables:
MODRINTH_GAME_VERSIONS(JSON array, default["1.20.1"])MODRINTH_LOADERS(JSON array, default["paper","spigot","purpur"])