Skip to content

Issue creating database backup #240

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
ryosoftware opened this issue Nov 8, 2023 · 7 comments
Closed

Issue creating database backup #240

ryosoftware opened this issue Nov 8, 2023 · 7 comments

Comments

@ryosoftware
Copy link

ryosoftware commented Nov 8, 2023

Version

4.2.3

Details & Steps to reproduce

I'm trying to create a backup from the database from outside the container while container is running.
To do it I'm executing the following command, that is working fine with other apps/dockers:

sqlite3 -cmd ".timeout 60000" "file:/home/hal/dockers-data/2fa/database.sqlite?mode=ro" ".backup 'database.sqlite'"
The backup is correctly done but when I restore it and I try to login the app from the web UI I'm getting the following error:

SQLSTATE[HY000]: General error: 8 attempt to write a readonly database (Connection: sqlite, SQL: update "users" set "last_seen_at" = 2023-11-08 08:18:29, "updated_at" = 2023-11-08 08:18:29 where "id" = 1)
Laravel logs says this error:

[previous exception] [object] (PDOException(code: HY000): SQLSTATE[HY000]: General error: 8 attempt to write a readonly database at /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php:605)
[stacktrace]
#0 /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php(605): PDOStatement->execute()
#1 /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php(788): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}()
#2 /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php(755): Illuminate\\Database\\Connection->runQueryCallback()
#3 /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php(612): Illuminate\\Database\\Connection->run()
#4 /srv/vendor/laravel/framework/src/Illuminate/Database/Connection.php(545): Illuminate\\Database\\Connection->affectingStatement()
#5 /srv/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php(3422): Illuminate\\Database\\Connection->update()
#6 /srv/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php(1059): Illuminate\\Database\\Query\\Builder->update()
#7 /srv/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1213): Illuminate\\Database\\Eloquent\\Builder->update()
#8 /srv/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(1130): Illuminate\\Database\\Eloquent\\Model->performUpdate()
#9 /srv/app/Http/Middleware/KickOutInactiveUser.php(40): Illuminate\\Database\\Eloquent\\Model->save()
#10 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\\Http\\Middleware\\KickOutInactiveUser->handle()
#11 /srv/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#12 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle()
#13 /srv/app/Http/Middleware/SetLanguage.php(68): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#14 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\\Http\\Middleware\\SetLanguage->handle()
#15 /srv/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#16 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Auth\\Middleware\\Authenticate->handle()
#17 /srv/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(159): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#18 /srv/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(135): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequest()
#19 /srv/vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php(87): Illuminate\\Routing\\Middleware\\ThrottleRequests->handleRequestUsingNamedLimiter()
#20 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Routing\\Middleware\\ThrottleRequests->handle()
#21 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#22 /srv/vendor/laravel/framework/src/Illuminate/Routing/Router.php(800): Illuminate\\Pipeline\\Pipeline->then()
#23 /srv/vendor/laravel/framework/src/Illuminate/Routing/Router.php(777): Illuminate\\Routing\\Router->runRouteWithinStack()
#24 /srv/vendor/laravel/framework/src/Illuminate/Routing/Router.php(741): Illuminate\\Routing\\Router->runRoute()
#25 /srv/vendor/laravel/framework/src/Illuminate/Routing/Router.php(730): Illuminate\\Routing\\Router->dispatchToRoute()
#26 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(200): Illuminate\\Routing\\Router->dispatch()
#27 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#28 /srv/app/Http/Middleware/ForceJsonResponse.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): App\\Http\\Middleware\\ForceJsonResponse->handle()
#30 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#32 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle()
#33 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#34 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#35 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle()
#36 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#37 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#38 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(89): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#39 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#40 /srv/vendor/laravel/framework/src/Illuminate/Http/Middleware/HandleCors.php(62): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#41 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle()
#42 /srv/vendor/laravel/framework/src/Illuminate/Http/Middleware/TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#43 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle()
#44 /srv/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then()
#46 /srv/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#47 /srv/public/index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle()
#48 {main}
"}

Expectation

I can restore the backups I made.

@ryosoftware
Copy link
Author

ryosoftware commented Nov 8, 2023

I have also tried same command (to backup the database) with docker stopped with same result.
(I do restores with the docker stopped in both cases).

@Bubka
Copy link
Owner

Bubka commented Nov 9, 2023

It looks like a permission issue (See #210). Did user:group of the database file changed during restore?

@ryosoftware
Copy link
Author

Nope, isn't
I have tried to set 0777 permission to database.sqlite file but issue still continues.

@ryosoftware
Copy link
Author

In any case, I can confirm user used to backup the database (1001.1001) is the same that was restored (using tar with root permissions).
I also tried to restore the database in other device (dockerized installation) and the issue continues. Also tried to open the database file with dbeaver and dbeaver sais the database is locked.

@Bubka
Copy link
Owner

Bubka commented Nov 9, 2023

Unless you build your own image for 1001:1001, the official image uses 1000:1000. Moreover, SQLite needs the parent folder of the db file to be writable (https://matthewsetter.com/sqlite-attempt-to-write-to-readonly-database/).

@ryosoftware
Copy link
Author

ryosoftware commented Nov 9, 2023

Yes, yes. I build my own for 1001 user due to the user that runs dockers in my machine is "hal", that has the id 1001 ;)

@ryosoftware
Copy link
Author

You can close and forget this. I have also tried it now and seems to working fine. I really do not know why was yesterday not working but now it does.
Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants