shinymanager icon indicating copy to clipboard operation
shinymanager copied to clipboard

Setup for MariaDB

Open f-zehner opened this issue 1 year ago • 2 comments

Thought you might be interested in this marginally adapted yml-file for the use with MariaDB.

# needed R packages for DB connection. Use comma separation for multiple dependencies like [package1, package2]
r_packages: [RMariaDB]

# connection using DBI Interface
# Possible to use !expr Sys.getenv(`NAME_ENV_VAR`)
# all args to be passed to DBI::dbConnect
connect:
  drv: !expr RMariaDB::MariaDB()
  host: "localhost"
  dbname: "dbname"
  port: 3306
  user: "username"
  password: "************"

tables:
  credentials:
    tablename: credentials                    # if you want to change tablename
    # user, password, start, expire, admin = mandatory with this name
    # after you can add optionnal custom columns next, getting back in server.R and admin interface
    init: CREATE TABLE {`tablename`} (
            `user`  varchar(100) PRIMARY KEY, 
            `password`  varchar(256),         
            `start`  date,                   
            `expire` date,                   
            `admin` boolean                  
            
        )
    # Keep same {glue_name*}, update request only if needed.   
    select: SELECT * FROM {`tablename`} WHERE `user` IN ({user*})
    update: UPDATE {`tablename`} SET {`name`} = {value} WHERE `user` IN ({udpate_users*})
    delete: DELETE FROM {`tablename`} WHERE `user` IN ({del_users*})
  pwd_mngt:
    tablename: pwd_mngt                       # if you want to change tablename
    # user, must_change, have_changed, date_change, n_wrong_pwd = mandatory with this name
    #  No additionnal columns here
    init: CREATE TABLE {`tablename`} (
            `user`  varchar(100) PRIMARY KEY, 
            `must_change`  boolean,           
            `have_changed`  boolean,        
            `date_change` date, 
            `n_wrong_pwd` smallint
          )
    # Keep same {glue_name*}, update request only if needed.  
    select: SELECT * FROM {`tablename`} WHERE `user` IN ({user*})
    update: UPDATE {`tablename`} SET {`name`} = {value} WHERE `user` IN ({udpate_users*})
    delete: DELETE FROM {`tablename`} WHERE `user` IN ({del_users*})
  logs:
    tablename: logs                           # if you want to change tablename
    #  all = mandatory with this name
    #  No additionnal columns here
    init: CREATE TABLE {`tablename`} (
            `id` SERIAL PRIMARY KEY,
            `user`  varchar(100),             
            `server_connected` timestamp, 
            `token`  varchar(100),          
            `logout` timestamp,          
            `status`  varchar(100),          
            `app` varchar(100)               
          )
    # Keep same {glue_name*}, update request only if needed. 
    check_token : SELECT * FROM {`tablename`} WHERE `token` IN ({token*})
    select: SELECT * FROM {`tablename`} WHERE `user` IN ({user*}) AND `server_connected` >= {`date_h_begin`}  AND `server_connected` <= {`date_h_end`}
    update: UPDATE {`tablename`} SET {`name`} = {value} WHERE `token` IN ({token*})

Works, although the whole app has become super-slow since I included MariaDB via shinymanager. Will need to see whether I can improve this.

EDIT: It seems that shinymanager does not manage the DB connections properly when using MariaDB. I just copied a MWE from my local dev environment to the server and while the app loaded quickly the first time, when I reloaded the app, it also was really slow (>1min loading time), so it seems it generates connection zombies.

f-zehner avatar Feb 06 '24 10:02 f-zehner

Hi @f-zehner,

I have the same performance problems as you with an R shiny application that integrates shinymanager + MariaDB, have you been able to solve the problem?

Thank you very much. Sergio

sciordia avatar Mar 01 '24 14:03 sciordia

Hi @sciordia,

Interesting. Unfortunately, I haven't. Just using a workaround by falling back to a non-DB variant (setting up a dataframe loaded via an RDS that is managed via a different interface based on MariaDB). If you do not need the admin panel and user log information shinymanager provides this is a quite well working variant because it's slim. Did you use my YAML posted above or one you created yourself? (just trying to make sure I did not introduce the performance problems with my YAML)

Best, Fabian

f-zehner avatar Mar 05 '24 08:03 f-zehner

Hi. Some performance improvment on last version 1.0.510.

  • For SQL Database, we used now by default one unique connection per session rather connect/disconnect each request (can be configure adding connect_every_request: true in SQL config yml
  • We don't import unused database (like admin user, logs, ...) when not needed

bthieurmel avatar Apr 23 '24 14:04 bthieurmel

Hi @bthieurmel Thanks so much for your work! Indeed, the performance issues with MariaDB are resolved 💪 However, unfortunately, I have two subsequent issues. Let me know if you want me to open new issues for those instead of adding them here. They seem, however, related to your recent release, so it might be reasonable to report them in here:

  • marginal one: somewhere you seem to have left dev code as "[1] "con" is printed to the console once the database connection is established.
  • severe: Can't add a new user in the admin panel. Once I do this, the admin panel reports an error Failed to update user and the console contains the following error: Error : Incorrect integer value: 'FALSE' for column reco_shinyusers.credentials.admin at row 1 [1366]. For me, this doesn't look like a mistake on my end, but I might be wrong.

Thanks again for your work

EDIT: The admin panel is able, however, to update the credentials-table (e.g., if I ask for password changes), so I'm pretty confident the above issue is a bug in the add user-feature.

f-zehner avatar Apr 25 '24 12:04 f-zehner

Hi. Due to MariaDB boolean gestion as integer and DBI support. We needed to explicitly convert first value to 0 / 1.

Fix on github version.

bthieurmel avatar Apr 25 '24 15:04 bthieurmel