diff --git a/README.md b/README.md
index e0a8598555c2abf64140d36344027570e170a4f6..efb9ec9bf40ece7a899a9f211a571706bd49c8d3 100644
--- a/README.md
+++ b/README.md
@@ -118,6 +118,21 @@ docker-compose up -d --build
 | --require-api-key-origin | Require use of an API key for programmatic access to the API, unless the request origin matches this domain | `No restrictions on domain origin` |
 | --load-only   | Set available languages    | `all from argostranslate`    |
 
+## Run with Gunicorn
+
+```
+pip install gunicorn
+gunicorn --bind 0.0.0.0:5000 'wsgi:app'
+```
+
+You can pass application arguments directly to Gunicorn via:
+
+
+```
+gunicorn --bind 0.0.0.0:5000 'wsgi:app(api_keys=True)'
+```
+
+
 ## Manage API Keys
 
 LibreTranslate supports per-user limit quotas, e.g. you can issue API keys to users so that they can enjoy higher requests limits per minute (if you also set `--req-limit`). By default all users are rate-limited based on `--req-limit`, but passing an optional `api_key` parameter to the REST endpoints allows a user to enjoy higher request limits.
diff --git a/app/main.py b/app/main.py
index a4ac6f981e43840ba018c68b083510428fb2d181..905794678fb8b4484e9b95626b9cb164ae6f76c6 100644
--- a/app/main.py
+++ b/app/main.py
@@ -1,4 +1,5 @@
 import argparse
+import sys
 import operator
 
 from app.app import create_app
@@ -103,17 +104,20 @@ def main():
     args = parser.parse_args()
     app = create_app(args)
 
-    if args.debug:
-        app.run(host=args.host, port=args.port)
+    if sys.argv[0] == '--wsgi':
+        return app
     else:
-        from waitress import serve
+        if args.debug:
+            app.run(host=args.host, port=args.port)
+        else:
+            from waitress import serve
 
-        serve(
-            app,
-            host=args.host,
-            port=args.port,
-            url_scheme="https" if args.ssl else "http",
-        )
+            serve(
+                app,
+                host=args.host,
+                port=args.port,
+                url_scheme="https" if args.ssl else "http",
+            )
 
 
 if __name__ == "__main__":
diff --git a/wsgi.py b/wsgi.py
new file mode 100644
index 0000000000000000000000000000000000000000..aaf531ee3157fa4dfb3d5993d739dc3c16c53118
--- /dev/null
+++ b/wsgi.py
@@ -0,0 +1,19 @@
+from app import main
+
+def app(*args, **kwargs):
+    import sys
+    sys.argv = ['--wsgi']
+    for k in kwargs:
+        ck = k.replace("_", "-")
+        if isinstance(kwargs[k], bool) and kwargs[k]:
+            sys.argv.append("--" + ck)
+        else:
+            sys.argv.append("--" + ck)
+            sys.argv.append(kwargs[k])
+
+    instance = main()
+
+    if len(kwargs) == 0:
+        return instance(*args, **kwargs)
+    else:
+        return instance