Error Migrating to V5

I am having problems migrating my selfhosted v4 instance to v5.

I am running the latest version of v4 on ubuntu 20.04 with php 7.3
I am running the latest v5 on ubuntu 20.04 with with php8
Both instances run behind a reverse proxy container that has valid lets encrypt certs
Both instances have nginx configured on the ubuntu image with 80/443 and self singed certs (the reverse proxy container points to this on 443)

I have followed all the instructions and have the same email password combination created on the v5 instance.

When running the migrate i get all the way to the last step and then get the error Oops, something went wrong. Migration can't be processed at the moment. Please checks the logs.

In the logs on the v4 instance i get the following

[2021-07-01 23:36:03] production.ERROR: ***Unirest\Exception*** [0] : /var/www/invoiceninja/vendor/mashape/unirest-php/src/Unirest/Request.php [Line 476] => SSL certificate problem: self signed certificate  {"context":"PHP","user_id":1,"account_id":1,"user_name":"USER","method":"POST","user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36","locale":"en","ip":"10.0.0.38","count":5,"is_console":"no","is_api":"no","db_server":"mysql","url":"migration/auth"} []

the migration is going via the reverse proxy container as that is where the DNS points to. I have also tried going direct but that fails at an earlier step.

there is also a stacktrace.log

2021-07-01 11:36:03 SSL certificate problem: self signed certificate: #0 /var/www/invoiceninja/vendor/mashape/unirest-php/src/Unirest/Request.php(292): Unirest\Request::send('POST', 'https://10.0.0....', '{"email":"josh@...', Array, NULL, NULL)
#1 /var/www/invoiceninja/app/Services/Migration/AuthService.php(56): Unirest\Request::post('https://10.0.0....', Array, '{"email":"josh@...')
#2 /var/www/invoiceninja/app/Http/Controllers/Migration/StepsController.php(137): App\Services\Migration\AuthService->start()
#3 [internal function]: App\Http\Controllers\Migration\StepsController->handleAuth(Object(App\Http\Requests\MigrationAuthRequest))
#4 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array)
#5 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('handleAuth', Array)
#6 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Route.php(212): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\Migration\StepsController), 'handleAuth')
#7 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Route.php(169): Illuminate\Routing\Route->runController()
#8 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Route->run()
#9 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#10 /var/www/invoiceninja/app/Http/Middleware/EligibleForMigration.php(19): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#11 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\EligibleForMigration->handle(Object(Illuminate\Http\Request), Object(Closure))
#12 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#13 /var/www/invoiceninja/app/Http/Middleware/Authenticate.php(122): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#14 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure), 'user')
#15 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#16 /var/www/invoiceninja/app/Http/Middleware/DatabaseLookup.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#17 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\DatabaseLookup->handle(Object(Illuminate\Http\Request), Object(Closure), 'user')
#18 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#19 /var/www/invoiceninja/app/Http/Middleware/StartupCheck.php(241): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#20 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\StartupCheck->handle(Object(Illuminate\Http\Request), Object(Closure))
#21 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#22 /var/www/invoiceninja/app/Http/Middleware/QueryLogging.php(32): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#23 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\QueryLogging->handle(Object(Illuminate\Http\Request), Object(Closure))
#24 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#25 /var/www/invoiceninja/app/Http/Middleware/DuplicateSubmissionCheck.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#26 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\DuplicateSubmissionCheck->handle(Object(Illuminate\Http\Request), Object(Closure))
#27 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#28 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(30): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#29 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))
#30 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#31 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(68): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#32 /var/www/invoiceninja/app/Http/Middleware/VerifyCsrfToken.php(44): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#33 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): App\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))
#34 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#35 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#36 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#37 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#38 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#39 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#40 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#41 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#42 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#43 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#44 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(68): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#45 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))
#46 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#47 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#48 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Router.php(660): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#49 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Router.php(635): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#50 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Router.php(601): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))
#51 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Router.php(590): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#52 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#53 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#54 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#55 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#56 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#57 /var/www/invoiceninja/vendor/barryvdh/laravel-cors/src/HandlePreflight.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#58 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(149): Barryvdh\Cors\HandlePreflight->handle(Object(Illuminate\Http\Request), Object(Closure))
#59 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#60 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Pipeline/Pipeline.php(102): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#61 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#62 /var/www/invoiceninja/vendor/turbo124/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#63 /var/www/invoiceninja/public/index.php(51): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))

I believe this is the key part, @david any thought to resolve this?

I assume you can’t use Let’s Encrypt because it’s a local domain.

Hi @hillel

The reverse proxy container is using valid SSL certs from let’s encrypt with a valid .co.uk domain

Locally on the invoice ninja VM self signed certs are used, but only ever the reverse proxy container will talk directly to this. All traffic goes via the valid SSL certs on the reverse proxy container. (So the migration should to?)

@AltF4

I would have thought that if you have a self signed certificate anywhere along the data path you could receive this error?

But from the perspective of either invoice ninja VM, when they connect to the other instance it will all appear to be over valid SSL. They shouldn’t see anything behind the reverse proxy connection?

I have now installed a valid ssl cert on the new invoice ninja VM directly and am communicating directly with this box rather than via the reverse proxy. This now appears to work and I get the

“Migration has started. We’ll update you with status, on your company e-mail.”

How long should this process take? I have left for over an hour and get no email (email alerts do work as I get emails for other things). There are no errors in either log file… where do i start to debug?

Edit: How does the migration process work? Is it a push from the old v4 instance to the new instance or a pull by the new instance from the old v4 instance? Or does it use some other process rather than http?

Looking in the nginx access log on the new instance this is what I see (10.0.0.25 is the ip of the v4 instance)

    10.0.0.25 - - [24/Jul/2021:13:35:05 +0100] "POST /api/v1/login?include=token HTTP/1.1" 200 123652 "-" "unirest-php/2.0"
    10.0.0.25 - - [24/Jul/2021:13:35:10 +0100] "POST /api/v1/migration/start HTTP/1.1" 500 2859 "-" "unirest-php/2.0"
    10.0.0.25 - - [24/Jul/2021:13:35:36 +0100] "POST /api/v1/migration/start HTTP/1.1" 200 31 "-" "unirest-php/2.0"
    10.0.0.111 - - [24/Jul/2021:13:54:52 +0100] "POST /api/v1/refresh?current_company=true&updated_at=1627129354&first_load=true HTTP/1.1" 200 15147 "https:/domain.co.uk/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"
    10.0.0.25 - - [24/Jul/2021:13:57:50 +0100] "POST /api/v1/login?include=token HTTP/1.1" 200 137207 "-" "unirest-php/2.0"

A fresh install and connecting directly to the v5 instance appears to have allowed the migration to happen properly. Not sure what was going on there

how long did your migration take?

when it ran properly it was done in less than a minute. I did only have a small number of invoices and customers though (<200)