# CampusConnect Manual Deployment

Target domain:

```text
https://campusconnect.sherubtse.edu.bt/
```

This project is a Node.js Express application. In production, run the Node app
on a private local port such as `127.0.0.1:3000`, then use Apache as the public
HTTPS reverse proxy.


## Server Requirements

- Ubuntu Server 22.04 or newer
- Node.js 20 or newer
- npm 10 or newer
- PostgreSQL 14 or newer
- Apache with `proxy`, `proxy_http`, `headers`, `rewrite`, and `ssl`
- PM2 for keeping the Node process running
- DNS A/AAAA record for `campusconnect.sherubtse.edu.bt`
- TLS certificate for `campusconnect.sherubtse.edu.bt`


## Install Application

```bash
sudo mkdir -p /var/www
cd /var/www
git clone <repository-url> campusconnect
cd campusconnect
npm ci --omit=dev
```

Create `.env` in `/var/www/campusconnect`.

```env
PORT=3000
DB_HOST=127.0.0.1
DB_NAME=campusconnect
DB_USER=campusconnect_user
DB_PASS=replace_with_database_password
SESSION_SECRET=replace_with_long_random_secret
JWT_SECRET=replace_with_long_random_secret
EMAIL_USER=replace_with_email_account
EMAIL_PASS=replace_with_email_app_password
```

Email must work because new accounts require email verification before login.


## PostgreSQL

```sql
CREATE DATABASE campusconnect;
CREATE USER campusconnect_user WITH PASSWORD 'replace_with_strong_password';
GRANT ALL PRIVILEGES ON DATABASE campusconnect TO campusconnect_user;
\c campusconnect
GRANT ALL ON SCHEMA public TO campusconnect_user;
```

Start the app once to create/update the tables:

```bash
npm start
```


## PM2

```bash
sudo npm install -g pm2
cd /var/www/campusconnect
pm2 start server.js --name campusconnect
pm2 save
pm2 startup
```

Useful checks:

```bash
pm2 status
pm2 logs campusconnect
pm2 restart campusconnect
```


## Apache Reverse Proxy

Enable modules:

```bash
sudo a2enmod proxy proxy_http headers rewrite ssl
sudo systemctl restart apache2
```

Example virtual host:

```apache
<VirtualHost *:80>
    ServerName campusconnect.sherubtse.edu.bt
    Redirect permanent / https://campusconnect.sherubtse.edu.bt/
</VirtualHost>

<VirtualHost *:443>
    ServerName campusconnect.sherubtse.edu.bt

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/campusconnect.sherubtse.edu.bt/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/campusconnect.sherubtse.edu.bt/privkey.pem

    ProxyPreserveHost On
    RequestHeader set X-Forwarded-Proto "https"
    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/

    ErrorLog ${APACHE_LOG_DIR}/campusconnect_error.log
    CustomLog ${APACHE_LOG_DIR}/campusconnect_access.log combined
</VirtualHost>
```

Enable the site:

```bash
sudo a2ensite campusconnect.conf
sudo apachectl configtest
sudo systemctl reload apache2
```


## Demo Database

To empty the database and create demo users:

```bash
cd /var/www/campusconnect
CONFIRM_FLUSH=YES node scripts/flushDatabase.js --seed-demo-accounts
pm2 restart campusconnect
```

All demo users use password `demo`.


## Post-Deployment Checks

- `https://campusconnect.sherubtse.edu.bt/`
- `/auth/login`
- `/auth/register`
- `/student/dashboard`
- `/finance/dashboard`
- `/exam-cell/dashboard`
- `/sports`
- `/sports/admin`
- `/guesthouse`
- `/guesthouse/admin`
- `/hall`
- `/hall/admin`
- `/admin/dashboard`

Also test:

- New public student registration receives an email verification link.
- Unverified users cannot log in.
- IT Admin can add programmes.
- Solo roles cannot be duplicated.
- Sports and guesthouse online payment confirmation changes records to confirmed.
- Excel reports download with data or a clear no-records row.
