167 lines
4.8 KiB
Markdown
Executable File
167 lines
4.8 KiB
Markdown
Executable File
# RisingCompute — PostgreSQL Setup
|
|
|
|
This is the database side of the RisingCompute site. The Django backend connects to a single PostgreSQL database called `risingcompute`. Follow these steps on the **server** (or your dev laptop) before running `python manage.py migrate`.
|
|
|
|
---
|
|
|
|
## 1. Install PostgreSQL
|
|
|
|
### Ubuntu / Debian server
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install -y postgresql postgresql-contrib
|
|
sudo systemctl enable --now postgresql
|
|
```
|
|
|
|
### macOS (development)
|
|
```bash
|
|
brew install postgresql@16
|
|
brew services start postgresql@16
|
|
```
|
|
|
|
### Verify
|
|
```bash
|
|
psql --version
|
|
# expect: psql (PostgreSQL) 14.x or newer
|
|
```
|
|
|
|
Use **PostgreSQL 14+** — Django 5 supports 13+, but 16 is the recommended LTS as of this build.
|
|
|
|
---
|
|
|
|
## 2. Create the database and user
|
|
|
|
Switch to the `postgres` superuser and open a `psql` shell:
|
|
|
|
```bash
|
|
sudo -u postgres psql
|
|
```
|
|
|
|
Then, inside `psql`, paste these four statements (edit the password to something strong):
|
|
|
|
```sql
|
|
CREATE USER risingcompute WITH PASSWORD 'change-this-to-a-strong-password';
|
|
CREATE DATABASE risingcompute OWNER risingcompute ENCODING 'UTF8';
|
|
GRANT ALL PRIVILEGES ON DATABASE risingcompute TO risingcompute;
|
|
ALTER USER risingcompute CREATEDB; -- needed for running tests
|
|
\q
|
|
```
|
|
|
|
The `CREATEDB` privilege is only needed if you want to run Django's test suite (which creates a throwaway `test_risingcompute` DB).
|
|
|
|
---
|
|
|
|
## 3. Allow local TCP connections (server only)
|
|
|
|
By default, PostgreSQL on Linux only accepts Unix-socket connections from local users. Django connects over TCP, so enable `md5` (password) auth on `127.0.0.1`.
|
|
|
|
Edit `/etc/postgresql/16/main/pg_hba.conf` (adjust the version number) and make sure these two lines exist near the top:
|
|
|
|
```
|
|
# TYPE DATABASE USER ADDRESS METHOD
|
|
local all all peer
|
|
host risingcompute risingcompute 127.0.0.1/32 md5
|
|
host risingcompute risingcompute ::1/128 md5
|
|
```
|
|
|
|
Reload:
|
|
|
|
```bash
|
|
sudo systemctl reload postgresql
|
|
```
|
|
|
|
On macOS via Homebrew, this is already set up — no edit needed.
|
|
|
|
---
|
|
|
|
## 4. Test the connection
|
|
|
|
```bash
|
|
psql -h 127.0.0.1 -U risingcompute -d risingcompute -W
|
|
# enter the password you set above
|
|
# you should land at: risingcompute=>
|
|
\q
|
|
```
|
|
|
|
If you can connect, the database side is done.
|
|
|
|
---
|
|
|
|
## 5. Wire it into Django
|
|
|
|
In `backend/.env` (copy from `backend/.env.example`), set:
|
|
|
|
```
|
|
DATABASE_URL=postgres://risingcompute:your-password-here@127.0.0.1:5432/risingcompute
|
|
DJANGO_SECRET_KEY=generate-a-50-char-random-string
|
|
DJANGO_DEBUG=False
|
|
DJANGO_ALLOWED_HOSTS=risingcompute.in,www.risingcompute.in,localhost,127.0.0.1
|
|
CORS_ALLOWED_ORIGINS=https://risingcompute.in,https://www.risingcompute.in,http://localhost:5173
|
|
```
|
|
|
|
Generate a Django secret key:
|
|
|
|
```bash
|
|
python -c "from secrets import token_urlsafe; print(token_urlsafe(50))"
|
|
```
|
|
|
|
---
|
|
|
|
## 6. Run migrations and create the admin user
|
|
|
|
From `backend/`:
|
|
|
|
```bash
|
|
python -m venv .venv
|
|
source .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
pip install -r requirements.txt
|
|
|
|
python manage.py migrate
|
|
python manage.py createsuperuser
|
|
python manage.py runserver 0.0.0.0:8000
|
|
```
|
|
|
|
Visit `http://127.0.0.1:8000/admin/` and sign in. You should see `Contact submissions`, `Newsletter signups`, `Job applications`, `Blog posts`, and `Products` (seeded by the data migration).
|
|
|
|
---
|
|
|
|
## 7. Production checklist
|
|
|
|
When you deploy to a real server:
|
|
|
|
- [ ] Set `DJANGO_DEBUG=False`
|
|
- [ ] Generate a fresh `DJANGO_SECRET_KEY` (do not reuse the dev key)
|
|
- [ ] Use a separate Postgres user per environment (staging / prod)
|
|
- [ ] Put Django behind Gunicorn + Nginx (or any WSGI host)
|
|
- [ ] Enable TLS on the database connection (`?sslmode=require` in `DATABASE_URL`) if the DB is on a different host
|
|
- [ ] Schedule daily `pg_dump` backups to object storage
|
|
- [ ] Restrict the Postgres port (5432) at the firewall — only the app server should reach it
|
|
- [ ] Rotate the database password and the Django secret key on a schedule
|
|
|
|
---
|
|
|
|
## 8. Backup & restore (one-liners)
|
|
|
|
**Backup:**
|
|
```bash
|
|
pg_dump -h 127.0.0.1 -U risingcompute -Fc risingcompute > risingcompute-$(date +%Y%m%d).dump
|
|
```
|
|
|
|
**Restore (into an empty database):**
|
|
```bash
|
|
pg_restore -h 127.0.0.1 -U risingcompute -d risingcompute --clean --if-exists risingcompute-YYYYMMDD.dump
|
|
```
|
|
|
|
---
|
|
|
|
## 9. Common errors
|
|
|
|
| Error | Fix |
|
|
|---|---|
|
|
| `FATAL: password authentication failed` | Re-check the password in `DATABASE_URL`; make sure `pg_hba.conf` uses `md5` for the host line. |
|
|
| `could not connect to server: Connection refused` | PostgreSQL isn't running. `sudo systemctl status postgresql`. |
|
|
| `permission denied for schema public` (PG 15+) | Run as superuser: `GRANT ALL ON SCHEMA public TO risingcompute;` |
|
|
| `relation "..." does not exist` | You haven't run `python manage.py migrate` yet. |
|
|
|
|
That's the whole database side. The Django app picks up `DATABASE_URL` automatically — no other config needed.
|