How to upgrade?

Hi, is there any procedure on how to upgrade self hosted CTFd ? Can’t find any information on that

There are several ways to update CTFd when it is self hosted. They mostly depend on how you have your CTFd instance setup.

One option is to use the export feature that CTFd provides and export all of the data with your instance. From there you can blow your existing instance away (delete everything) and then redeploy the latest version of CTFd. Following that, you can then use the import features to import your config that you had previously.

The other option that you have is to shutdown CTFd, run git pull and then start CTFd up again.

thx I appreciate it !

Hi, will both options keep all the configs, user and challenge info? Thanks

Hi, Sorry to revive an older thread. I had a CTFd server running 3.0.0. I’ve made an export and now I try to import it in the version 3.3.0. I get errors and the import is not working.


Can you tell me how I can run my CTF with all the previous challenges and pages I had in 3.0.0? Thanks for your help.

Actually the error message text is longer:

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: pages.format [SQL: SELECT pages.id AS pages_id, pages.title AS pages_title, pages.route AS pages_route, pages.content AS pages_content, pages.draft AS pages_draft, pages.hidden AS pages_hidden, pages.auth_required AS pages_auth_required, pages.format AS pages_format FROM pages WHERE pages.route != ? AND pages.draft IS NOT 1 AND pages.hidden IS NOT 1] [parameters: ('index',)] (Background on this error at: http://sqlalche.me/e/e3q8) // Werkzeug Debugger

sqlalchemy.exc.OperationalError

sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: pages.format [SQL: SELECT pages.id AS pages_id, pages.title AS pages_title, pages.route AS pages_route, pages.content AS pages_content, pages.draft AS pages_draft, pages.hidden AS pages_hidden, pages.auth_required AS pages_auth_required, pages.format AS pages_format FROM pages WHERE pages.route != ? AND pages.draft IS NOT 1 AND pages.hidden IS NOT 1] [parameters: ('index',)] (Background on this error at: http://sqlalche.me/e/e3q8)

Traceback (most recent call last)

  • File "/home/student/.local/lib/python3.8/site-packages/sqlalchemy/engine/base.py", line 1283, in _execute_context

                        for fn in self.dialect.dispatch.do_execute:
                            if fn(cursor, statement, parameters, context):
                                evt_handled = True
                                break
                    if not evt_handled:
                        self.dialect.do_execute(
                            cursor, statement, parameters, context
                        )
     
                if self._has_events or self.engine._has_events:
                    self.dispatch.after_cursor_execute(
  • File "/home/student/.local/lib/python3.8/site-packages/sqlalchemy/engine/default.py", line 590, in do_execute

     
        def do_executemany(self, cursor, statement, parameters, context=None):
            cursor.executemany(statement, parameters)
     
        def do_execute(self, cursor, statement, parameters, context=None):
            cursor.execute(statement, parameters)
     
        def do_execute_no_params(self, cursor, statement, context=None):
            cursor.execute(statement)
     
        def is_disconnect(self, e, connection, cursor):
  • The above exception was the direct cause of the following exception:
  • File "/home/student/.local/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__

     
        def __call__(self, environ, start_response):
            """The WSGI server calls the Flask application object as the
            WSGI application. This calls :meth:`wsgi_app` which can be
            wrapped to applying middleware."""
            return self.wsgi_app(environ, start_response)
     
        def __repr__(self):
            return "<%s %r>" % (self.__class__.__name__, self.name)
  • File "/home/student/.local/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app

                try:
                    ctx.push()
                    response = self.full_dispatch_request()
                except Exception as e:
                    error = e
                    response = self.handle_exception(e)
                except:  # noqa: B001
                    error = sys.exc_info()[1]
                    raise
                return response(environ, start_response)
            finally:
  • File "/home/student/.local/lib/python3.8/site-packages/flask_restx/api.py", line 639, in error_router

            if self._has_fr_route():
                try:
                    return self.handle_error(e)
                except Exception as f:
                    return original_handler(f)
            return original_handler(e)
     
        def handle_error(self, e):
            """
            Error handler for the API transforms a raised exception into a Flask response,
            with the appropriate HTTP status code and body.
  • File "/home/student/.local/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception

                # if we want to repropagate the exception, we can attempt to
                # raise it with the whole traceback in case we can do that
                # (the function was actually called from the except part)
                # otherwise, we just raise the error again
                if exc_value is e:
                    reraise(exc_type, exc_value, tb)
                else:
                    raise e
     
    <

Update: I solved my Upgrade issue. For anyone with the same issue the solution is a bit tedious but it works:

Install version 3.1 Import the 3.0.0 backup.
Export as a 3.1 backup.
Install version 3.2.0 import the 3.1 backup.
Export as a 3.2 backup.
Install the latest version and install the 3.2 backup.