sonatype / nexus-public

Sonatype Nexus Repository Open-source codebase mirror
https://www.sonatype.com/products/repository-oss-download
Eclipse Public License 1.0
1.9k stars 563 forks source link

Integration with Ceph S3 Blob Stores #454

Closed foxpluto closed 2 weeks ago

foxpluto commented 3 weeks ago

I have configured a deb repo, and I have tried first to configure the repo via a Blob Store based on file, the result is a fully functional deb repo. Now I would like to use a Ceph S3 storage I have exposed to internet which is an AWS S3 compatible storage which I already use with other software (i.e. CyberDuck works and others.) The configurations are:

The creation went fine and i see on the bucket the creation of 2 files:

d92bd4e4-dea3a7e4-69bdec39-ad409fab-39772eb8-metrics.properties
metadata.properties

then I try to upload a deb file (the same deb file which works if the Blob Store is based on file) with curl:

curl -u "admin:XXXXXXX" -H "Content-Type: multipart/form-data" --data-binary "@./chronos_1.0.6-9bbe110_arm64.deb" "http://podman01.farm.rimoldi.it:8081/repository/deb-focal-test/"

The upload doesn't goes fine and I receive a 500 Internal server error.

Looking at the nexus log I found:

2024-08-17 21:32:27,286+0000 WARN  [qtp443799236-4070]  admin org.sonatype.nexus.repository.httpbridge.internal.ViewServlet - Failure servicing: POST /repository/deb-focal-test/
com.amazonaws.services.s3.model.AmazonS3Exception: SignatureDoesNotMatch (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: tx0000076f212214142246f-0066c116eb-86196ab-default; S3 Extended Request ID: 86196ab-default-default; Proxy: null)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1879)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1418)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1387)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1157)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:814)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:781)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:755)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:715)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:697)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:561)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:541)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5520)
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5467)
    at com.amazonaws.services.s3.AmazonS3Client.access$300(AmazonS3Client.java:422)
    at com.amazonaws.services.s3.AmazonS3Client$PutObjectStrategy.invokeServiceCall(AmazonS3Client.java:6601)
    at com.amazonaws.services.s3.AmazonS3Client.uploadObject(AmazonS3Client.java:1891)
    at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1851)
    at com.amazonaws.services.s3.EncryptingAmazonS3Client.putObject(EncryptingAmazonS3Client.java:157)
    at com.amazonaws.services.s3.EncryptingAmazonS3Client.putObject(EncryptingAmazonS3Client.java:150)
    at org.sonatype.nexus.blobstore.s3.internal.S3PropertiesFile.write(S3PropertiesFile.java:84)
    at org.sonatype.nexus.blobstore.s3.internal.S3PropertiesFile.write(S3PropertiesFile.java:1)
    at org.sonatype.nexus.blobstore.CloudBlobPropertiesSupport.store(CloudBlobPropertiesSupport.java:55)
    at org.sonatype.nexus.blobstore.s3.internal.S3BlobAttributes.store(S3BlobAttributes.java:55)
    at org.sonatype.nexus.blobstore.s3.internal.S3BlobStore.writeBlobAttributes(S3BlobStore.java:911)
    at org.sonatype.nexus.blobstore.s3.internal.S3BlobStore.create(S3BlobStore.java:345)
    at org.sonatype.nexus.blobstore.s3.internal.S3BlobStore.doCreate(S3BlobStore.java:301)
    at com.palominolabs.metrics.guice.TimedInterceptor.invoke(TimedInterceptor.java:26)
    at org.sonatype.nexus.blobstore.metrics.BlobStoreAnalyticsInterceptor.invoke(BlobStoreAnalyticsInterceptor.java:60)
    at org.sonatype.nexus.blobstore.BlobStoreSupport.create(BlobStoreSupport.java:125)
    at org.sonatype.nexus.common.stateguard.MethodInvocationAction.run(MethodInvocationAction.java:39)
    at org.sonatype.nexus.common.stateguard.StateGuard$GuardImpl.run(StateGuard.java:287)
    at org.sonatype.nexus.common.stateguard.GuardedInterceptor.invoke(GuardedInterceptor.java:54)
    at org.sonatype.nexus.blobstore.BlobStoreSupport.create(BlobStoreSupport.java:109)
    at org.sonatype.nexus.common.stateguard.MethodInvocationAction.run(MethodInvocationAction.java:39)
    at org.sonatype.nexus.common.stateguard.StateGuard$GuardImpl.run(StateGuard.java:287)
    at org.sonatype.nexus.common.stateguard.GuardedInterceptor.invoke(GuardedInterceptor.java:54)
    at org.sonatype.nexus.repository.content.fluent.internal.FluentBlobsImpl.ingest(FluentBlobsImpl.java:100)
    at org.sonatype.nexus.repository.content.fluent.internal.FluentBlobsImpl.ingest(FluentBlobsImpl.java:90)
    at org.sonatype.nexus.repository.content.fluent.internal.FluentBlobsImpl.ingest(FluentBlobsImpl.java:176)
    at org.sonatype.nexus.repository.apt.datastore.internal.AptContentFacetImpl.getTempBlob(AptContentFacetImpl.java:232)
    at org.sonatype.nexus.repository.apt.datastore.internal.hosted.AptHostedHandler.doPost(AptHostedHandler.java:99)
    at org.sonatype.nexus.repository.apt.datastore.internal.hosted.AptHostedHandler.handle(AptHostedHandler.java:70)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.apt.internal.snapshot.AptSnapshotHandler.handle(AptSnapshotHandler.java:64)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.content.handlers.LastDownloadedHandler.handle(LastDownloadedHandler.java:58)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ContentHeadersHandler.handle(ContentHeadersHandler.java:46)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.http.PartialFetchHandler.handle(PartialFetchHandler.java:59)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ConditionalRequestHandler.handle(ConditionalRequestHandler.java:67)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.nexus.clm.internal.datastore.FirewallContributedHandler.handle(FirewallContributedHandler.java:114)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsBytesTransferredHandler.handle(AnalyticsBytesTransferredHandler.java:51)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsBytesTransferredHandler.handle(AnalyticsBytesTransferredHandler.java:51)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.HandlerContributor.handle(HandlerContributor.java:67)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.ExceptionHandler.handle(ExceptionHandler.java:42)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.LoginsCounterHandler.handle(LoginsCounterHandler.java:87)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.security.SecurityHandler.handle(SecurityHandler.java:64)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at com.sonatype.analytics.internal.handler.AnalyticsMeteringHandler.handle(AnalyticsMeteringHandler.java:69)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.handlers.TimingHandler.handle(TimingHandler.java:58)
    at org.sonatype.nexus.repository.view.Context.proceed(Context.java:88)
    at org.sonatype.nexus.repository.view.Context.start(Context.java:179)
    at org.sonatype.nexus.repository.view.Router.dispatch(Router.java:65)
    at org.sonatype.nexus.repository.view.ConfigurableViewFacet.dispatch(ConfigurableViewFacet.java:52)
    at org.sonatype.nexus.repository.view.ConfigurableViewFacet.dispatch(ConfigurableViewFacet.java:43)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.dispatchAndSend(ViewServlet.java:212)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.doService(ViewServlet.java:174)
    at org.sonatype.nexus.repository.httpbridge.internal.ViewServlet.service(ViewServlet.java:126)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:293)
    at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:283)
    at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:184)
    at com.google.inject.servlet.DynamicServletPipeline.service(DynamicServletPipeline.java:71)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at org.sonatype.nexus.security.SecurityFilter.executeChain(SecurityFilter.java:96)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at org.sonatype.nexus.security.SecurityFilter.doFilterInternal(SecurityFilter.java:112)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:112)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458)
    at org.sonatype.nexus.security.SecurityFilter.executeChain(SecurityFilter.java:96)
    at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373)
    at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
    at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
    at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387)
    at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370)
    at org.sonatype.nexus.security.SecurityFilter.doFilterInternal(SecurityFilter.java:112)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.repository.httpbridge.internal.ExhaustRequestFilter.doFilter(ExhaustRequestFilter.java:80)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
    at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
    at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.sonatype.nexus.licensing.internal.LicensingRedirectFilter.doFilter(LicensingRedirectFilter.java:116)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.codahale.metrics.servlet.AbstractInstrumentedFilter.doFilter(AbstractInstrumentedFilter.java:112)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.ErrorPageFilter.doFilter(ErrorPageFilter.java:79)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.EnvironmentFilter.doFilter(EnvironmentFilter.java:101)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at org.sonatype.nexus.internal.web.HeaderPatternFilter.doFilter(HeaderPatternFilter.java:98)
    at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:82)
    at com.google.inject.servlet.DynamicFilterPipeline.dispatch(DynamicFilterPipeline.java:104)
    at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133)
    at org.sonatype.nexus.bootstrap.osgi.DelegatingFilter.doFilter(DelegatingFilter.java:73)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter(FilterHolder.java:201)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(ServletHandler.java:1626)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:552)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:600)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1624)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1440)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:505)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1594)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1355)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at com.codahale.metrics.jetty9.InstrumentedHandler.handle(InstrumentedHandler.java:239)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle(Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:338)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:315)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:173)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:409)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:883)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1034)
    at java.base/java.lang.Thread.run(Thread.java:840)

I have tried many different options but the error is alwayse the same.

foxpluto commented 3 weeks ago

Reading in the ceph cluster log I found the error which cause the problem:

2024-08-19 12:06:09 | 2024-08-19T10:06:09.752+0000 7f78235f1640  1 beast: 0x7f77f959c710: 10.0.25.12 - - [19/Aug/2024:10:06:09.752 +0000] "PUT /deb/focal/test/content/vol-33/chap-33/05015904-5e8b-431d-965e-fcf1a3e44588.properties HTTP/1.0" 403 219 - "aws-sdk-java/1.12.658 Linux/6.8.0-40-generic OpenJDK_64-Bit_Server_VM/17.0.12+7-LTS java/17.0.12 vendor/Red_Hat,_Inc. cfg/retry-mode/legacy" - latency=0.000000000s
-- | --

It seems that my cluster refuse with a 403 error the PUT of properties files.

The data file is in that directory but was written using a POST not a PUT.

I have no idea why ceph doesn't allow Nexus to use the PUT, I have double checked the user permissions and they seems to be ok.

I'll keep investigate

foxpluto commented 3 weeks ago

Actually some others PUT request goes fine:

2024-08-19 12:06:07 | 2024-08-19T10:06:07.660+0000 7f782c603640  1 beast: 0x7f77f959c710: 10.0.25.12 - fox [19/Aug/2024:10:06:07.468 +0000] "PUT /deb/focal/test/content/vol-33/chap-33/05015904-5e8b-431d-965e-fcf1a3e44588.bytes?uploadId=2%7E0P4_s4Rdg6ahwlONOhZDwT4Vs1nIQo9&partNumber=9 HTTP/1.0" 200 6119516 - "aws-sdk-java/1.12.658 Linux/6.8.0-40-generic OpenJDK_64-Bit_Server_VM/17.0.12+7-LTS java/17.0.12 vendor/Red_Hat,_Inc. cfg/retry-mode/legacy" - latency=0.191999570s
-- | --

doesn't seems a permission problem.

mrprescott commented 2 weeks ago

@foxpluto This isn't a supported feature of Repository, but we are monitoring demand to see when we reach critical mass to push it over the threshold to get onto the roadmap. I'm classifying this as an 'enhancement' for that reason.

foxpluto commented 2 weeks ago

Hi,

thanks for the reply, I had some other test and i found out the problem is an Nginx reverse proxy in front of my ceph repository. Using ceph without nginx it works perfectly. Do you have some documentation on how to configure reverse proxy in front of S3 ? My suspect is that Nginx drop some header and those are required to nexus.

Regards, S.

Axm11 commented 1 week ago

I found a possibly helpful config follow:

    server {
        ....
        underscores_in_headers on;
        ignore_invalid_headers off;

        location / {
        .....
        }
}

I encountered a similar problem using Aliyun OSS, but still haven't found a solution.