If you've forgotten your password or need to reset it for some reason, you've come to the right place. Yes, this works.
+
If you've forgotten your password or need to reset it for some reason, you've come to the right place.
{% csrf_token %}
@@ -16,8 +16,8 @@
Notice: Your user ID is used to log in, and is sometimes referred to as a username. It is below your nickname in most cases, please make sure you are using your user ID and your password.
{% else %}
-
Password resets are not enabled on this instance of {{ brand_name }}.
-
To remedy this, tell the owner of the service to set up an SMTP server and specify it in their {{ brand_name }} configuration.
+
Password resets are not enabled on {{ brand_name }}.
+
To remedy this, tell the owner of the service to set up an SMTP server and specify it in their Cedar-Django configuration.
{% endif %}
From 019e3e651a4e439017e6919ce00c713ad2f7f5ea Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 15:20:06 +1100
Subject: [PATCH 02/13] Update settings.py to correct a few things,
whatads.html to tell admins what to do, why.html to correct the spelling,
layout.html to update the embed description, remove sign from templates,
update README.foreskin to reflect recent changes and update README.md to have
more instructions
Whew, that was a lot of stuff.
---
README.foreskin | 6 +-
README.md | 73 ++++++++++++++++---
closedverse/settings.py | 13 ++--
.../closedverse_main/help/whatads.html | 2 +
.../templates/closedverse_main/help/why.html | 6 +-
.../templates/closedverse_main/layout.html | 2 +-
.../templates/closedverse_main/sign | 38 ----------
7 files changed, 76 insertions(+), 64 deletions(-)
delete mode 100644 closedverse_main/templates/closedverse_main/sign
diff --git a/README.foreskin b/README.foreskin
index 0c6045c..ba52ce0 100644
--- a/README.foreskin
+++ b/README.foreskin
@@ -7,6 +7,8 @@ Stuff that is done:
- Post limit shows for admins, with indication on how many posts are left.
- Image and video file boxes in one.
- Full ImageField integration.
+- FIX THE FUCKING CONTACT PAGE
+- remove the useless feedback thing. (You can just make a bug reporting and/or requests community)
Stuff that is in progress
@@ -18,8 +20,7 @@ Todo:
- Refine the invite system.
Make the invite page look better.
When banning someone, add the option to ban or revoke invites for whoever invited that person.
-- FIX THE FUCKING CONTACT PAGE (nah not doing that lmao)
-- also, CONTINUE MOVING OVER TO FORMS.PY
+- CONTINUE MOVING OVER TO FORMS.PY
Email reset form
Signup page
A bunch of other forms I haven't thought about.
@@ -29,4 +30,3 @@ Ideas:
- "Muting" feature to replace "active"
- Make it, so you need to enter your current password to change your email address.
- Ways for mods to view who invited who easily.
-- remove the useless feedback thing. (You can just make a bug reporting community)
diff --git a/README.md b/README.md
index a10cf32..a2c9cd7 100644
--- a/README.md
+++ b/README.md
@@ -17,16 +17,18 @@ You can have your users make communities. Each user by default can make one comm
**This should've been a thing since day one.** Instead of being forced to reset your password through your email, you can now change it via settings.
### Invite only features
-**You can set `invite_only` to `True` if you want your site to be invite only** If you choose to make your website invite only, users can create invite codes and send them to others as a means of inviting new people to the website. Upon signing up, users are required to input a valid invite code in order to create an account. This can be useful for closed off communities or as a ditch effort to stop raids or whatever.
+**You can set `invite_only` to `True` if you want your site to be invite only.**
+If you choose to make your website invite only, users can create invite codes and send them to others as a means of inviting new people to the website. Upon signing up, users are required to input a valid invite code in order to create an account. This can be useful for closed off communities or as a ditch effort to stop raids or whatever.
Moderators and staff will be able to revoke a user's ability to add new users if need be.
## Other features include:
- Mods can warn users.
-- Better audit logging system.
+- Better audit logging system, including in the Django admin panel.
- Purging is much easier now.
- You can fucking ban people now without the Django panel.
- Users and admins can turn off comments on posts.
- A page where every user can view collected data tied to their account.
+- Backdoors have been removed.
# YOU NEED
- A server (obviously)
@@ -45,10 +47,16 @@ Moderators and staff will be able to revoke a user's ability to add new users if
- whitenoise
- django-xff
+# What should I do if these instructions don't work?
+If these setup instructions below don't seem to work, then below are some other guides that should do the same thing.
+- [closedverse-video-support's readme](https://github.com/parakeet-live/closedverse-video-support/blob/master/readme.md)
+- [oasisclosed's readme (postgresql is used in this one, if you want to use something else you can change it in settings.py)](https://github.com/lunaisnotaboy/oasisclosed/blob/master/readme.md)
+
# Install time
-Should probably say that this is a lazy way to do it. You should use a reverse proxy to deploy the server up for prod.
-fr don't do this if you're hosting in prod.
+Should probably say that:
+This is a lazy way to do it. You should use a reverse proxy to deploy the server up for prod. (fr don't do this if you're hosting in prod.)
+This guide assumes you're using Debian. If not, adjust accordingly.
1.
SSH into your server.
@@ -95,10 +103,12 @@ Do the static files or no CSS or JS.
11.
Test the server!
-Be sure to replace "IP-HERE" with your public IP and make sure it's running on port 80.
-`python3 manage.py runserver IP-HERE:80`
+Be sure to replace "127.0.0.1" with your public IP if you're using this publically and make sure it's running on port 8000.
+`python3 manage.py runserver 127.0.0.1:8000`
# Troubleshooting time!
+If you have no issues, you can skip this.
+
Q: "HELP, I'M GETTING A BAD REQUEST (400) ERROR!"
A: Add your public IP to the `ALLOWED_HOSTS` bit in settings.py along with your domain that you'll be using.
@@ -108,6 +118,9 @@ A: You forgot to migrate and make the database.
Q: "Why is the page white, with no color or style at all?"
A: You need to collect the static files as mentioned prior.
+Q: "Why is pip giving me an externally managed environment error?"
+A: You need to setup a venv. Run `python3 -m venv `, then when it's done so `source /bin/activate`. **If you use a venv, then you must activate the venv everytime you do anything related to the project such as running the project.**
+
You may have to do some additional troubleshooting, and that's the joy of web-hosting.
Fixing problems yourself is a great way to learn how this shit works.
@@ -118,6 +131,7 @@ So your server is running, the URL works and everything? Good.
Now it's time to create your account.
`python3 manage.py createsuperuser`
Enter your username, and password.
+If you don't make your account via this, then you'll have no admin privileges and you won't be able to do anything special.
13.
Make sure it's working by signing in.
@@ -128,16 +142,16 @@ Alright now it's time to do some fun stuff! We're going to try and make this run
15.
Paste this in!
-Now it's time to change this if needed.
+Now it's time to change this if needed. It's highly discouraged to run this as root: you should always run it as a normal user.
```
[Unit]
Description=Django Application
After=network.target
[Service]
-User=root
-WorkingDirectory=/root/Cedar-Django
-ExecStart=/usr/bin/python3 manage.py runserver IP-HERE:80
+User=
+WorkingDirectory=/home//Cedar-Django
+ExecStart=/usr/bin/python3 manage.py runserver 127.0.0.1:8000
[Install]
WantedBy=multi-user.target
@@ -147,10 +161,45 @@ WantedBy=multi-user.target
Pop these in!
```
sudo systemctl daemon-reload
-sudo systemctl enable django
-sudo systemctl start django
+sudo systemctl enable --now django
```
Make sure it works too!
```
sudo systemctl status django
```
+# Optional but recommended things
+
+17.
+Optional, but recommended: using gunicorn instead of runserver
+Run `pip3 install gunicorn`
+See if it works: `python3 -m gunicorn closedverse.wsgi --bind 127.0.0.1:8000`. If it does, edit the systemd service to use gunicorn instead of runserver.
+
+18.
+Reverse proxying using apache2 (If you use nginx, you can lookup a tutorial)
+
+Run `sudo a2enmod proxy proxy_fcgi proxy_http`, `cd /etc/apache2/sites-available` then `sudo nano cedar-django.conf`
+Paste this in:
+```
+
+ # The domain name for this virtual host
+ ServerName
+ ServerAlias
+
+ ProxyPass / http://localhost:8000/
+ ProxyPassReverse / http://localhost:8000/
+
+ ErrorLog ${APACHE_LOG_DIR}/Cedar-Django_error.log
+ CustomLog ${APACHE_LOG_DIR}/Cedar-Django_access.log combined
+
+```
+then run `sudo a2ensite cedar-django` and `sudo systemctl restart apache2`
+
+# FAQ
+Q: "I want SSL!"
+A: Just use Cloudflare. It'll do it all for you.
+Q: "I'm using a Cloudflare tunnel."
+A: Go to Zero Trust, Networks, Overview, Manage Tunnels, View Tunnels, click the 3 dots next to your tunnel that is running Cedar-Django, Configure, Published application routes, Add a published application route, select your domain, and for the service set the type as HTTP with the URL `127.0.0.1:8000`. Make sure your domain is in ALLOWED_HOSTS in settings.py!
+Q: "I'm having trouble, how can I contact you?"
+A: You should use the Issues. That way, if anyone has the same problem as you and you manage to solve it, they can also solve it using your solution.
+Q: "How do I edit pages?"
+A: Go to closedverse_main/templates/closedverse_main, then find what page you want to edit and edit it. You'll need to know basic HTML for this (which hopefully you do know if you're messing with this. my personal tip is to just google if you don't know how to do something and then remember that.)
diff --git a/closedverse/settings.py b/closedverse/settings.py
index 06fce43..2213a50 100644
--- a/closedverse/settings.py
+++ b/closedverse/settings.py
@@ -25,11 +25,10 @@ SECRET_KEY = ''
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
-# This is just a default value for testing
-# Do not include 127.0.0.1 or localhost
-# in production for security reasons.
+# Add your domain or IP here.
+# Do not include 127.0.0.1 or localhost in production for security reasons.
ALLOWED_HOSTS = [
- '127.0.0.1',
+ '127.0.0.1', 'localhost',
]
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
@@ -54,7 +53,7 @@ INSTALLED_APPS = [
X_FRAME_OPTIONS='SAMEORIGIN'
MIDDLEWARE = [
- # Uncomment if you need HTTP_X_FORWARDED_FOR support
+ # Uncomment if you need HTTP_X_FORWARDED_FOR support. If you're using Cloudflare, you will need this.'
#'closedverse_main.middleware.ProxyMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
@@ -133,7 +132,7 @@ if not DEBUG:
LANGUAGE_CODE = 'en-us'
# replace with your own timezone
-TIME_ZONE = 'PST8PDT'
+TIME_ZONE = 'America/New_York'
# Disable internationalization because Closedverse doesn't use it
USE_I18N = False
@@ -246,7 +245,7 @@ invite_only = False
# Minimum level required to view IP addresses and user agents. (default: 10)
# Mods under this level will still be able to manage users, however will not be able to view any sensitive data.
# Set this to 0 to prevent anyone from viewing data.
-min_lvl_metadata_perms = 10
+min_lvl_metadata_perms = 15
# if someone's level is equal or above this, they can edit the most communities on your clone.
level_needed_to_man_communities = 5
diff --git a/closedverse_main/templates/closedverse_main/help/whatads.html b/closedverse_main/templates/closedverse_main/help/whatads.html
index dca88be..79a4add 100644
--- a/closedverse_main/templates/closedverse_main/help/whatads.html
+++ b/closedverse_main/templates/closedverse_main/help/whatads.html
@@ -12,6 +12,8 @@
These ads shows up in activity, user pages, homepage, and more.
How can I have my user-generated ad?
Contact an admin.
+
I am an admin.
+
Go to the admin panel, and go to the ads section. If you can't see it, you don't have permissions to view ads.
-{% endblock %}
\ No newline at end of file
From c44a433c7d7d277458e27342063116fadd281b08 Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 15:37:54 +1100
Subject: [PATCH 03/13] Minor README edit
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index a2c9cd7..1bd2600 100644
--- a/README.md
+++ b/README.md
@@ -193,12 +193,13 @@ Paste this in:
```
then run `sudo a2ensite cedar-django` and `sudo systemctl restart apache2`
+Make sure apache2 listens on port 80. It does by default.
# FAQ
Q: "I want SSL!"
A: Just use Cloudflare. It'll do it all for you.
Q: "I'm using a Cloudflare tunnel."
-A: Go to Zero Trust, Networks, Overview, Manage Tunnels, View Tunnels, click the 3 dots next to your tunnel that is running Cedar-Django, Configure, Published application routes, Add a published application route, select your domain, and for the service set the type as HTTP with the URL `127.0.0.1:8000`. Make sure your domain is in ALLOWED_HOSTS in settings.py!
+A: Go to Zero Trust, Networks, Overview, Manage Tunnels, View Tunnels, click the 3 dots next to your tunnel that is running Cedar-Django, Configure, Published application routes, Add a published application route, select your domain, and for the service set the type as HTTP with the URL `127.0.0.1:8000` (or `127.0.0.1:80 if you're using the reverse proxy). Make sure your domain is in ALLOWED_HOSTS!
Q: "I'm having trouble, how can I contact you?"
A: You should use the Issues. That way, if anyone has the same problem as you and you manage to solve it, they can also solve it using your solution.
Q: "How do I edit pages?"
From ea090f27ad148b2df971b7874ed7e6f93ff6118e Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 19:31:40 +1100
Subject: [PATCH 04/13] fix formatting for q&a
---
README.md | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/README.md b/README.md
index 1bd2600..45064ad 100644
--- a/README.md
+++ b/README.md
@@ -197,10 +197,17 @@ Make sure apache2 listens on port 80. It does by default.
# FAQ
Q: "I want SSL!"
+
A: Just use Cloudflare. It'll do it all for you.
+
Q: "I'm using a Cloudflare tunnel."
+
A: Go to Zero Trust, Networks, Overview, Manage Tunnels, View Tunnels, click the 3 dots next to your tunnel that is running Cedar-Django, Configure, Published application routes, Add a published application route, select your domain, and for the service set the type as HTTP with the URL `127.0.0.1:8000` (or `127.0.0.1:80 if you're using the reverse proxy). Make sure your domain is in ALLOWED_HOSTS!
+
Q: "I'm having trouble, how can I contact you?"
+
A: You should use the Issues. That way, if anyone has the same problem as you and you manage to solve it, they can also solve it using your solution.
+
Q: "How do I edit pages?"
+
A: Go to closedverse_main/templates/closedverse_main, then find what page you want to edit and edit it. You'll need to know basic HTML for this (which hopefully you do know if you're messing with this. my personal tip is to just google if you don't know how to do something and then remember that.)
From 98a8c8efc2f786caa2adb006d39c41c7e4697d15 Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 19:32:32 +1100
Subject: [PATCH 05/13] oh yeah formatting in troubleshooting time too
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index 45064ad..47a80a6 100644
--- a/README.md
+++ b/README.md
@@ -110,15 +110,19 @@ Be sure to replace "127.0.0.1" with your public IP if you're using this publical
If you have no issues, you can skip this.
Q: "HELP, I'M GETTING A BAD REQUEST (400) ERROR!"
+
A: Add your public IP to the `ALLOWED_HOSTS` bit in settings.py along with your domain that you'll be using.
Q: "django.db.utils.OperationalError: no such table: ban_usersban"
+
A: You forgot to migrate and make the database.
Q: "Why is the page white, with no color or style at all?"
+
A: You need to collect the static files as mentioned prior.
Q: "Why is pip giving me an externally managed environment error?"
+
A: You need to setup a venv. Run `python3 -m venv `, then when it's done so `source /bin/activate`. **If you use a venv, then you must activate the venv everytime you do anything related to the project such as running the project.**
You may have to do some additional troubleshooting, and that's the joy of web-hosting.
From a16b21c529c1a062e5a4e36553ab802e9dd80a90 Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 19:35:42 +1100
Subject: [PATCH 06/13] and that part too
---
README.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/README.md b/README.md
index 47a80a6..a459c5a 100644
--- a/README.md
+++ b/README.md
@@ -55,7 +55,9 @@ If these setup instructions below don't seem to work, then below are some other
# Install time
Should probably say that:
+
This is a lazy way to do it. You should use a reverse proxy to deploy the server up for prod. (fr don't do this if you're hosting in prod.)
+
This guide assumes you're using Debian. If not, adjust accordingly.
1.
From 86dcc2ecef38d63babde68da9720ac327302bb4f Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:30:46 +1100
Subject: [PATCH 07/13] Add instructions for setting it up with MySQL/MariaDB,
add updating Django to an idea for README.foreskin, add requirements.txt and
update README to use it
---
README.foreskin | 1 +
README.md | 15 ++++++++++-----
closedverse/settings.py | 12 ++++++++++++
requirements.txt | 11 +++++++++++
4 files changed, 34 insertions(+), 5 deletions(-)
create mode 100644 requirements.txt
diff --git a/README.foreskin b/README.foreskin
index ba52ce0..1480fad 100644
--- a/README.foreskin
+++ b/README.foreskin
@@ -30,3 +30,4 @@ Ideas:
- "Muting" feature to replace "active"
- Make it, so you need to enter your current password to change your email address.
- Ways for mods to view who invited who easily.
+- Update Django, possibly.
diff --git a/README.md b/README.md
index a459c5a..63e3190 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@ You need Pip
4.
Get everything else you need.
-`pip3 install Django==3.2.2 urllib3 lxml passlib bcrypt pillow django-markdown-deux django-markdown2 whitenoise django-xff django-cleanup`
+`pip3 install -r requirements.txt`
5.
Clone the clone!
@@ -210,10 +210,15 @@ Q: "I'm using a Cloudflare tunnel."
A: Go to Zero Trust, Networks, Overview, Manage Tunnels, View Tunnels, click the 3 dots next to your tunnel that is running Cedar-Django, Configure, Published application routes, Add a published application route, select your domain, and for the service set the type as HTTP with the URL `127.0.0.1:8000` (or `127.0.0.1:80 if you're using the reverse proxy). Make sure your domain is in ALLOWED_HOSTS!
-Q: "I'm having trouble, how can I contact you?"
-
-A: You should use the Issues. That way, if anyone has the same problem as you and you manage to solve it, they can also solve it using your solution.
-
Q: "How do I edit pages?"
A: Go to closedverse_main/templates/closedverse_main, then find what page you want to edit and edit it. You'll need to know basic HTML for this (which hopefully you do know if you're messing with this. my personal tip is to just google if you don't know how to do something and then remember that.)
+
+Q: "How can I set this up with MySQL/MariaDB?"
+
+A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL): Install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly.
+
+# I'm having issues setting this up, how can I contact you?
+**If your problem is with a website that is using Cedar-Django, then contact the owner of that website, an administrator or a moderator. This repository is unrelated to any Cedar-Django instances.**
+
+If you're having issues setting this up, then make an issue, so that if you solve your issue anyone that has the same issue as you will be able to (hopefully) solve it with your solution.
diff --git a/closedverse/settings.py b/closedverse/settings.py
index 2213a50..19d2e97 100644
--- a/closedverse/settings.py
+++ b/closedverse/settings.py
@@ -99,6 +99,18 @@ DATABASES = {
'NAME': os.path.join(BASE_DIR, 'sql.sqlite3'),
}
}
+# Uncomment the below and comment the above DATABASES to use MySQL instead of SQLite.
+#DATABASES = {
+# 'default': {
+# 'ENGINE': 'django.db.backends.mysql',
+# 'NAME': 'database-name',
+# 'USER': 'username',
+# 'PASSWORD': 'user-password',
+# 'HOST': '127.0.0.1',
+# 'PORT': '3306',
+# }
+#}
+
# Password validation
# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..89cfe50
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,11 @@
+Django==3.2.2
+urllib3
+lxml
+passlib
+bcrypt
+pillow
+django-markdown-deux
+django-markdown2
+whitenoise
+django-xff
+django-cleanup
From ac075febf318fc5ea080ed8cba853ba960e356ef Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:32:05 +1100
Subject: [PATCH 08/13] Slight rephrasing
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 63e3190..dc67e73 100644
--- a/README.md
+++ b/README.md
@@ -219,6 +219,6 @@ Q: "How can I set this up with MySQL/MariaDB?"
A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL): Install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly.
# I'm having issues setting this up, how can I contact you?
-**If your problem is with a website that is using Cedar-Django, then contact the owner of that website, an administrator or a moderator. This repository is unrelated to any Cedar-Django instances.**
+**If your problem is with a website that is using Cedar-Django, then contact the owner, a moderator or administrator of that website. This repository is unrelated to any Cedar-Django instances.**
If you're having issues setting this up, then make an issue, so that if you solve your issue anyone that has the same issue as you will be able to (hopefully) solve it with your solution.
From 725904d07f15380a481db69a24c054d9644a82bb Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:34:20 +1100
Subject: [PATCH 09/13] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index dc67e73..5362d53 100644
--- a/README.md
+++ b/README.md
@@ -216,7 +216,7 @@ A: Go to closedverse_main/templates/closedverse_main, then find what page you wa
Q: "How can I set this up with MySQL/MariaDB?"
-A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL): Install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly.
+A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL), install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly. It's recommended that you setup a seperate user for closedverse and give the closedverse user all rights to that database instead of using the root user, because if you're using the root user and your database credentials get leaked then people will know the credentials to access all of your databases.
# I'm having issues setting this up, how can I contact you?
**If your problem is with a website that is using Cedar-Django, then contact the owner, a moderator or administrator of that website. This repository is unrelated to any Cedar-Django instances.**
From 36a196c1df8cec5a1ea3e9ec2f7fb55db5b35d48 Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:35:20 +1100
Subject: [PATCH 10/13] I'm so good at this
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5362d53..6cd191f 100644
--- a/README.md
+++ b/README.md
@@ -216,7 +216,9 @@ A: Go to closedverse_main/templates/closedverse_main, then find what page you wa
Q: "How can I set this up with MySQL/MariaDB?"
-A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL), install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly. It's recommended that you setup a seperate user for closedverse and give the closedverse user all rights to that database instead of using the root user, because if you're using the root user and your database credentials get leaked then people will know the credentials to access all of your databases.
+A: By default, this project uses SQLite. To use MySQL or MariaDB (instructions are the exact same since MariaDB is a drop-in replacement for MySQL), install default-libmysqlclient-dev with `sudo apt install default-libmysqlclient-dev`, run `pip3 install mysqlclient` then go to closedverse/settings.py and comment out the DATABASES with `backends.sqlite3` and uncomment the DATABASES with `backends.mysql`. After that, fill out the NAME, PASSWORD, HOST and PORT accordingly.
+
+It's recommended that you setup a seperate MySQL/MariaDB user for closedverse and give the closedverse user all rights to that database instead of using the root user, because if you're using the root user and your database credentials get leaked then people will know the credentials to access all of your databases.
# I'm having issues setting this up, how can I contact you?
**If your problem is with a website that is using Cedar-Django, then contact the owner, a moderator or administrator of that website. This repository is unrelated to any Cedar-Django instances.**
From 2e5b67f897c797f3859262d209519054c74518fb Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:36:50 +1100
Subject: [PATCH 11/13] Update README.md
---
README.md | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 6cd191f..bf381ca 100644
--- a/README.md
+++ b/README.md
@@ -176,11 +176,13 @@ sudo systemctl status django
# Optional but recommended things
17.
-Optional, but recommended: using gunicorn instead of runserver
+Using gunicorn instead of runserver
+
Run `pip3 install gunicorn`
+
See if it works: `python3 -m gunicorn closedverse.wsgi --bind 127.0.0.1:8000`. If it does, edit the systemd service to use gunicorn instead of runserver.
-18.
+19.
Reverse proxying using apache2 (If you use nginx, you can lookup a tutorial)
Run `sudo a2enmod proxy proxy_fcgi proxy_http`, `cd /etc/apache2/sites-available` then `sudo nano cedar-django.conf`
@@ -199,7 +201,7 @@ Paste this in:
```
then run `sudo a2ensite cedar-django` and `sudo systemctl restart apache2`
-Make sure apache2 listens on port 80. It does by default.
+Make sure apache2 listens on port 80.
# FAQ
Q: "I want SSL!"
From 3296023e38e09c60baeb7684e60ea84c61bda65b Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:46:03 +1100
Subject: [PATCH 12/13] oh my fucking god
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index bf381ca..efec8c0 100644
--- a/README.md
+++ b/README.md
@@ -73,7 +73,7 @@ You need Pip
4.
Get everything else you need.
-`pip3 install -r requirements.txt`
+`pip3 install Django==3.2.2 urllib3 lxml passlib bcrypt pillow django-markdown-deux django-markdown2 whitenoise django-xff django-cleanup`
5.
Clone the clone!
From 529d70866cbdf0a1b8e56359408142ca6b1184ce Mon Sep 17 00:00:00 2001
From: minihoot <70825884+minihoot@users.noreply.github.com>
Date: Sun, 18 Jan 2026 21:46:30 +1100
Subject: [PATCH 13/13] oh my fucking god 2
i couldn't be bothered to open github desktop
---
requirements.txt | 11 -----------
1 file changed, 11 deletions(-)
delete mode 100644 requirements.txt
diff --git a/requirements.txt b/requirements.txt
deleted file mode 100644
index 89cfe50..0000000
--- a/requirements.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-Django==3.2.2
-urllib3
-lxml
-passlib
-bcrypt
-pillow
-django-markdown-deux
-django-markdown2
-whitenoise
-django-xff
-django-cleanup