Upgrade Rundeck 4.7 -> 5.9 

disk 100% になったのでつメンテついでにupgrade

# preparation
まず容量確保

```
sudo docker volume ls -f dangling=true
sudo docker image prune
```


# image

`jordan/rundeck` を docker-composeで動かしてます。

https://hub.docker.com/r/jordan/rundeck/tags?name=4.10

pullしとく
```r
sudo docker pull jordan/rundeck:4.8.0
sudo docker pull jordan/rundeck:4.9.0
sudo docker pull jordan/rundeck:4.10.1
sudo docker pull jordan/rundeck:4.11.0
sudo docker pull jordan/rundeck:4.12.1
sudo docker pull jordan/rundeck:4.13.0
sudo docker pull jordan/rundeck:4.14.2
sudo docker pull jordan/rundeck:4.15.0
sudo docker pull jordan/rundeck:4.16.0
sudo docker pull jordan/rundeck:4.17.3
sudo docker pull jordan/rundeck:5.0.1
sudo docker pull jordan/rundeck:5.1.2
sudo docker pull jordan/rundeck:5.2.0
sudo docker pull jordan/rundeck:5.3.0
sudo docker pull jordan/rundeck:5.3.0
sudo docker pull jordan/rundeck:5.4.0
sudo docker pull jordan/rundeck:5.5.0
sudo docker pull jordan/rundeck:5.6.0
sudo docker pull jordan/rundeck:5.7.0
sudo docker pull jordan/rundeck:5.8.0
sudo docker pull jordan/rundeck:5.9.0
```

# procedure
## backup

```r
root@1586c7ab5337:/var/log/rundeck# mysqldump rundeckdb > dump.sql
```

```r
/srv/rundeck4/var/log/rundeck$ ll | grep sql
-rw-r--r-- 1 root root  68M 2025-03-07 12:10:19 dump.sql
/srv/rundeck4/var/log/rundeck$ cp dump.sql ~/2025-03-07-dump.sql
/srv/rundeck4/var/log/rundeck$
```

# Upgrade

## 4.7.0 → 4.8.0
早速 error (ToT)

```java
An Error Occurred
Error Details
Error 500: Internal Server Error
URI
/menu/home
Class
org.jasypt.exceptions.EncryptionOperationNotPossibleException
Message
null
Trace
    Line | Method
->>  780 | proceed           in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|     97 | invoke            in org.springframework.aop.interceptor.ExposeInvocationInterceptor
|    186 | proceed . . . . . in org.springframework.aop.framework.ReflectiveMethodInvocation
|    763 | proceed           in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|    708 | intercept . . . . in org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor
|    223 | invoke            in org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker
|    188 | invoke . . . . .  in org.grails.core.DefaultGrailsControllerClass
|     90 | handle            in org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter
|   1067 | doDispatch . . .  in org.springframework.web.servlet.DispatcherServlet
|    963 | doService         in     ''
|   1006 | processRequest .  in org.springframework.web.servlet.FrameworkServlet
|    898 | doGet             in     ''
|    883 | service . . . . . in     ''
|    799 | handle            in org.eclipse.jetty.servlet.ServletHolder
|   1656 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$ChainEnd
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs . . . . . .  in javax.security.auth.Subject
|     90 | doFilter          in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     36 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.SessionIdChangeFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.RundeckSecurityHeadersFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    327 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    115 | invoke            in org.springframework.security.web.access.intercept.FilterSecurityInterceptor
|     81 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    122 | doFilter . . . .  in org.springframework.security.web.access.ExceptionTranslationFilter
|    116 | doFilter          in     ''
|     64 | doFilter . . . .  in grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     54 | doFilter . . . .  in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    102 | doFilter . . . .  in org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter
|     93 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    149 | doFilter          in org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs . . . . . .  in javax.security.auth.Subject
|     90 | doFilter          in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    219 | doFilter          in org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
|    213 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     64 | doFilter . . . .  in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    110 | doFilter . . . .  in org.springframework.security.web.context.SecurityContextPersistenceFilter
|     80 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     58 | doFilter          in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    211 | doFilterInternal  in org.springframework.security.web.FilterChainProxy
|    183 | doFilter . . . .  in     ''
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     77 | doFilterInternal  in org.grails.web.servlet.mvc.GrailsWebRequestFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.grails.web.filters.HiddenHttpMethodFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    552 | doHandle          in org.eclipse.jetty.servlet.ServletHandler
|    143 | handle . . . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|    600 | handle            in org.eclipse.jetty.security.SecurityHandler
|    127 | handle . . . . .  in org.eclipse.jetty.server.handler.HandlerWrapper
|    235 | nextHandle        in org.eclipse.jetty.server.handler.ScopedHandler
|   1624 | doHandle . . . .  in org.eclipse.jetty.server.session.SessionHandler
|    233 | nextHandle        in org.eclipse.jetty.server.handler.ScopedHandler
|   1440 | doHandle . . . .  in org.eclipse.jetty.server.handler.ContextHandler
|    188 | nextScope         in org.eclipse.jetty.server.handler.ScopedHandler
|    505 | doScope . . . . . in org.eclipse.jetty.servlet.ServletHandler
|   1594 | doScope           in org.eclipse.jetty.server.session.SessionHandler
|    186 | nextScope . . . . in org.eclipse.jetty.server.handler.ScopedHandler
|   1355 | doScope           in org.eclipse.jetty.server.handler.ContextHandler
|    141 | handle . . . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|    127 | handle            in org.eclipse.jetty.server.handler.HandlerWrapper
|    516 | handle . . . . .  in org.eclipse.jetty.server.Server
|    487 | lambda$handle$1   in org.eclipse.jetty.server.HttpChannel
|    732 | dispatch . . . .  in     ''
|    479 | handle            in     ''
|    277 | onFillable . . .  in org.eclipse.jetty.server.HttpConnection
|    311 | succeeded         in org.eclipse.jetty.io.AbstractConnection$ReadCallback
|    105 | fillable . . . .  in org.eclipse.jetty.io.FillInterest
|    104 | run               in org.eclipse.jetty.io.ChannelEndPoint$1
|    338 | runTask . . . . . in org.eclipse.jetty.util.thread.strategy.EatWhatYouKill
|    315 | doProduce         in     ''
|    173 | tryProduce . . .  in     ''
|    131 | run               in     ''
|    409 | run . . . . . . . in org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread
|    883 | runJob            in org.eclipse.jetty.util.thread.QueuedThreadPool
|   1034 | run . . . . . . . in org.eclipse.jetty.util.thread.QueuedThreadPool$Runner
^    829 | run               in java.lang.Thread
 
Caused by IOException: Decryption failed.
->>  452 | getInputStream    in org.rundeck.plugin.encryption.JasyptEncryptionConverterPlugin$DecryptStream
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|     42 | getInputStream    in com.dtolabs.rundeck.core.storage.BaseStreamResource
|    464 | loadProjectConfigResource in rundeck.services.ProjectManagerService
|    738 | $tt__loadProjectConfig in     ''
|     43 | invoke . . . . .  in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     94 | doInTransaction   in grails.gorm.transactions.GrailsTransactionTemplate$2
|    140 | execute . . . . . in org.springframework.transaction.support.TransactionTemplate
|     91 | execute           in grails.gorm.transactions.GrailsTransactionTemplate
|    148 | getProjectConfig  in com.dtolabs.rundeck.server.projects.RundeckProject
|     56 | getProperty       in     ''
|    239 | doCall . . . . .  in rundeck.services.FrameworkService$_projectLabels_closure2
|    237 | projectLabels     in rundeck.services.FrameworkService
|    317 | refreshSessionProjects in     ''
|   2098 | $tt__home         in rundeck.controllers.MenuController
|     62 | invoke . . . . .  in jdk.internal.reflect.NativeMethodAccessorImpl
|     43 | invoke            in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     62 | invoke . . . . .  in jdk.internal.reflect.NativeMethodAccessorImpl
|     43 | invoke            in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     94 | doInTransaction . in grails.gorm.transactions.GrailsTransactionTemplate$2
|    140 | execute           in org.springframework.transaction.support.TransactionTemplate
|     91 | execute . . . . . in grails.gorm.transactions.GrailsTransactionTemplate
|    218 | invoke            in org.springframework.cglib.proxy.MethodProxy
|    793 | invokeJoinpoint . in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|    163 | proceed           in org.springframework.aop.framework.ReflectiveMethodInvocation
|    763 | proceed . . . . . in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|     97 | invoke            in org.springframework.aop.interceptor.ExposeInvocationInterceptor
|    186 | proceed . . . . . in org.springframework.aop.framework.ReflectiveMethodInvocation
|    763 | proceed           in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|    708 | intercept . . . . in org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor
|    223 | invoke            in org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker
|    188 | invoke . . . . .  in org.grails.core.DefaultGrailsControllerClass
|     90 | handle            in org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter
|   1067 | doDispatch . . .  in org.springframework.web.servlet.DispatcherServlet
|    963 | doService         in     ''
|   1006 | processRequest .  in org.springframework.web.servlet.FrameworkServlet
|    898 | doGet             in     ''
|    883 | service . . . . . in     ''
|    799 | handle            in org.eclipse.jetty.servlet.ServletHolder
|   1656 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$ChainEnd
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs . . . . . .  in javax.security.auth.Subject
|     90 | doFilter          in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     36 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.SessionIdChangeFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.RundeckSecurityHeadersFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    327 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    115 | invoke            in org.springframework.security.web.access.intercept.FilterSecurityInterceptor
|     81 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    122 | doFilter . . . .  in org.springframework.security.web.access.ExceptionTranslationFilter
|    116 | doFilter          in     ''
|     64 | doFilter . . . .  in grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     54 | doFilter . . . .  in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    102 | doFilter . . . .  in org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter
|     93 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    149 | doFilter          in org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs . . . . . .  in javax.security.auth.Subject
|     90 | doFilter          in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    219 | doFilter          in org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
|    213 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     64 | doFilter . . . .  in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    110 | doFilter . . . .  in org.springframework.security.web.context.SecurityContextPersistenceFilter
|     80 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     58 | doFilter          in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    211 | doFilterInternal  in org.springframework.security.web.FilterChainProxy
|    183 | doFilter . . . .  in     ''
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     77 | doFilterInternal  in org.grails.web.servlet.mvc.GrailsWebRequestFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.grails.web.filters.HiddenHttpMethodFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    552 | doHandle          in org.eclipse.jetty.servlet.ServletHandler
|    143 | handle . . . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|    600 | handle            in org.eclipse.jetty.security.SecurityHandler
|    127 | handle . . . . .  in org.eclipse.jetty.server.handler.HandlerWrapper
|    235 | nextHandle        in org.eclipse.jetty.server.handler.ScopedHandler
|   1624 | doHandle . . . .  in org.eclipse.jetty.server.session.SessionHandler
|    233 | nextHandle        in org.eclipse.jetty.server.handler.ScopedHandler
|   1440 | doHandle . . . .  in org.eclipse.jetty.server.handler.ContextHandler
|    188 | nextScope         in org.eclipse.jetty.server.handler.ScopedHandler
|    505 | doScope . . . . . in org.eclipse.jetty.servlet.ServletHandler
|   1594 | doScope           in org.eclipse.jetty.server.session.SessionHandler
|    186 | nextScope . . . . in org.eclipse.jetty.server.handler.ScopedHandler
|   1355 | doScope           in org.eclipse.jetty.server.handler.ContextHandler
|    141 | handle . . . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|    127 | handle            in org.eclipse.jetty.server.handler.HandlerWrapper
|    516 | handle . . . . .  in org.eclipse.jetty.server.Server
|    487 | lambda$handle$1   in org.eclipse.jetty.server.HttpChannel
|    732 | dispatch . . . .  in     ''
|    479 | handle            in     ''
|    277 | onFillable . . .  in org.eclipse.jetty.server.HttpConnection
|    311 | succeeded         in org.eclipse.jetty.io.AbstractConnection$ReadCallback
|    105 | fillable . . . .  in org.eclipse.jetty.io.FillInterest
|    104 | run               in org.eclipse.jetty.io.ChannelEndPoint$1
|    338 | runTask . . . . . in org.eclipse.jetty.util.thread.strategy.EatWhatYouKill
|    315 | doProduce         in     ''
|    173 | tryProduce . . .  in     ''
|    131 | run               in     ''
|    409 | run . . . . . . . in org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread
|    883 | runJob            in org.eclipse.jetty.util.thread.QueuedThreadPool
|   1034 | run . . . . . . . in org.eclipse.jetty.util.thread.QueuedThreadPool$Runner
^    829 | run               in java.lang.Thread
 
Caused by EncryptionOperationNotPossibleException: null
->> 1169 | decrypt           in org.jasypt.encryption.pbe.StandardPBEByteEncryptor
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|    450 | getInputStream    in org.rundeck.plugin.encryption.JasyptEncryptionConverterPlugin$DecryptStream
|     42 | getInputStream .  in com.dtolabs.rundeck.core.storage.BaseStreamResource
|    464 | loadProjectConfigResource in rundeck.services.ProjectManagerService
|    738 | $tt__loadProjectConfig in     ''
|     43 | invoke            in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     94 | doInTransaction . in grails.gorm.transactions.GrailsTransactionTemplate$2
|    140 | execute           in org.springframework.transaction.support.TransactionTemplate
|     91 | execute . . . . . in grails.gorm.transactions.GrailsTransactionTemplate
|    148 | getProjectConfig  in com.dtolabs.rundeck.server.projects.RundeckProject
|     56 | getProperty . . . in     ''
|    239 | doCall            in rundeck.services.FrameworkService$_projectLabels_closure2
|    237 | projectLabels . . in rundeck.services.FrameworkService
|    317 | refreshSessionProjects in     ''
|   2098 | $tt__home . . . . in rundeck.controllers.MenuController
|     62 | invoke            in jdk.internal.reflect.NativeMethodAccessorImpl
|     43 | invoke . . . . .  in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     62 | invoke            in jdk.internal.reflect.NativeMethodAccessorImpl
|     43 | invoke . . . . .  in jdk.internal.reflect.DelegatingMethodAccessorImpl
|     94 | doInTransaction   in grails.gorm.transactions.GrailsTransactionTemplate$2
|    140 | execute . . . . . in org.springframework.transaction.support.TransactionTemplate
|     91 | execute           in grails.gorm.transactions.GrailsTransactionTemplate
|    218 | invoke . . . . .  in org.springframework.cglib.proxy.MethodProxy
|    793 | invokeJoinpoint   in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|    163 | proceed . . . . . in org.springframework.aop.framework.ReflectiveMethodInvocation
|    763 | proceed           in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|     97 | invoke . . . . .  in org.springframework.aop.interceptor.ExposeInvocationInterceptor
|    186 | proceed           in org.springframework.aop.framework.ReflectiveMethodInvocation
|    763 | proceed . . . . . in org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation
|    708 | intercept         in org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor
|    223 | invoke . . . . .  in org.grails.core.DefaultGrailsControllerClass$MethodHandleInvoker
|    188 | invoke            in org.grails.core.DefaultGrailsControllerClass
|     90 | handle . . . . .  in org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter
|   1067 | doDispatch        in org.springframework.web.servlet.DispatcherServlet
|    963 | doService . . . . in     ''
|   1006 | processRequest    in org.springframework.web.servlet.FrameworkServlet
|    898 | doGet . . . . . . in     ''
|    883 | service           in     ''
|    799 | handle . . . . .  in org.eclipse.jetty.servlet.ServletHolder
|   1656 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$ChainEnd
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs              in javax.security.auth.Subject
|     90 | doFilter . . . .  in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     36 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.SessionIdChangeFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.rundeck.grails.plugins.securityheaders.RundeckSecurityHeadersFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|    327 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    115 | invoke . . . . .  in org.springframework.security.web.access.intercept.FilterSecurityInterceptor
|     81 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    122 | doFilter          in org.springframework.security.web.access.ExceptionTranslationFilter
|    116 | doFilter . . . .  in     ''
|     64 | doFilter          in grails.plugin.springsecurity.web.UpdateRequestContextHolderExceptionTranslationFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     54 | doFilter          in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    102 | doFilter          in org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter
|     93 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    149 | doFilter . . . .  in org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     91 | lambda$doFilter$0 in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    423 | doAs              in javax.security.auth.Subject
|     90 | doFilter . . . .  in org.springframework.security.web.jaasapi.JaasApiIntegrationFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    219 | doFilter . . . .  in org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter
|    213 | doFilter          in     ''
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     64 | doFilter          in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|    336 | doFilter . . . .  in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    110 | doFilter          in org.springframework.security.web.context.SecurityContextPersistenceFilter
|     80 | doFilter . . . .  in     ''
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|     58 | doFilter . . . .  in grails.plugin.springsecurity.web.SecurityRequestHolderFilter
|    336 | doFilter          in org.springframework.security.web.FilterChainProxy$VirtualFilterChain
|    211 | doFilterInternal  in org.springframework.security.web.FilterChainProxy
|    183 | doFilter          in     ''
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|     77 | doFilterInternal  in org.grails.web.servlet.mvc.GrailsWebRequestFilter
|    193 | doFilter          in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter . . . .  in org.eclipse.jetty.servlet.ServletHandler$Chain
|     67 | doFilterInternal  in org.grails.web.filters.HiddenHttpMethodFilter
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    193 | doFilter . . . .  in org.eclipse.jetty.servlet.FilterHolder
|   1626 | doFilter          in org.eclipse.jetty.servlet.ServletHandler$Chain
|    552 | doHandle . . . .  in org.eclipse.jetty.servlet.ServletHandler
|    143 | handle            in org.eclipse.jetty.server.handler.ScopedHandler
|    600 | handle . . . . .  in org.eclipse.jetty.security.SecurityHandler
|    127 | handle            in org.eclipse.jetty.server.handler.HandlerWrapper
|    235 | nextHandle . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|   1624 | doHandle          in org.eclipse.jetty.server.session.SessionHandler
|    233 | nextHandle . . .  in org.eclipse.jetty.server.handler.ScopedHandler
|   1440 | doHandle          in org.eclipse.jetty.server.handler.ContextHandler
|    188 | nextScope . . . . in org.eclipse.jetty.server.handler.ScopedHandler
|    505 | doScope           in org.eclipse.jetty.servlet.ServletHandler
|   1594 | doScope . . . . . in org.eclipse.jetty.server.session.SessionHandler
|    186 | nextScope         in org.eclipse.jetty.server.handler.ScopedHandler
|   1355 | doScope . . . . . in org.eclipse.jetty.server.handler.ContextHandler
|    141 | handle            in org.eclipse.jetty.server.handler.ScopedHandler
|    127 | handle . . . . .  in org.eclipse.jetty.server.handler.HandlerWrapper
|    516 | handle            in org.eclipse.jetty.server.Server
|    487 | lambda$handle$1 . in org.eclipse.jetty.server.HttpChannel
|    732 | dispatch          in     ''
|    479 | handle . . . . .  in     ''
|    277 | onFillable        in org.eclipse.jetty.server.HttpConnection
|    311 | succeeded . . . . in org.eclipse.jetty.io.AbstractConnection$ReadCallback
|    105 | fillable          in org.eclipse.jetty.io.FillInterest
|    104 | run . . . . . . . in org.eclipse.jetty.io.ChannelEndPoint$1
|    338 | runTask           in org.eclipse.jetty.util.thread.strategy.EatWhatYouKill
|    315 | doProduce . . . . in     ''
|    173 | tryProduce        in     ''
|    131 | run . . . . . . . in     ''
|    409 | run               in org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread
|    883 | runJob . . . . .  in org.eclipse.jetty.util.thread.QueuedThreadPool
|   1034 | run               in org.eclipse.jetty.util.thread.QueuedThreadPool$Runner
^    829 | run . . . . . . . in java.lang.Thread
RUNDECK
News
Help
```


## 暗号化キーを追加
元のcontainerで動いていた `/etc/rundeck/rundeck-config.properties` から `rundeck.storage.converter.1.config.password` の値を取得。
envに追加。

```yml
version: '3'
 
services:
  sv:
    restart: always
    image: jordan/rundeck:4.8.0
#    build:
#      context: .
    container_name: rundeck
    ports:
      - 80:4440
    environment:
      - EXTERNAL_SERVER_URL=http://rundeck.example.com
      - GUI_BRAND_HTML='<span class="title">TITLE</span>'
      - RUNDECK_STORAGE_PASSWORD=ae983999dd5d9f6c                 <------------
```

## 4.9.0 -> 4.10.1
## 4.10.1 -> 4.11.0
## 4.11.0 -> 4.12.1

起動しない

```r
sudo docker-compose up --force-recreate -d && sudo docker-compose logs -f
Recreating rundeck ... done
Attaching to rundeck
rundeck | =>Initializing rundeck - This may take a few minutes
rundeck | =>Initializing local MySQL...
rundeck | Starting MariaDB database server: mariadbd.
rundeck | Stopping MariaDB database server: mariadbd.
rundeck | sed: -e expression #1, char 65: unterminated `s' command
```

原因

> Next I got the error: "sed: -e expression #1, char 68: unterminated `s' command"
This was caused by an " char used as arg for GUI_BRAND_HTML and is fixed.

https://github.com/jjethwa/rundeck/issues/192


修正

```diff
     environment:
       - EXTERNAL_SERVER_URL=http://rundeck.example.com
-      - GUI_BRAND_HTML='<span class="title">TITLE</span>'
+      #- GUI_BRAND_HTML="TITLE"
```

動いた！



## 4.12.1 -> 4.13.0
## 4.13.0 -> 4.14.2
## 4.14.2 -> 4.17.3
時間なくなったのですっ飛ばしました。問題なし



## 4.17.3 -> 5.0.1
## 5.0.1 -> 5.1.2

## 5.1.2 -> 5.2.0

## 5.2.0 -> 5.9.0
時間なくなったのですっ飛ばしました。問題なし


終わり！ 機能はわからんけど、ボタンが大きくなって操作しやすくなりました。お疲れ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24737/37b31b59-2f96-4bfe-88bb-8a5acd9e5485.png)

最後にclean up。終わり！

```r
 sudo docker image prune 
```


# ref
https://qiita.com/tabimoba/items/acb1eb5882bc17167c81