# Deploying MV Rent to a server (Docker Compose)

Target: `root@93.127.166.135`. The stack runs the Spring Boot app + PostgreSQL in
containers. The server only needs Docker — no Java or Postgres install required.

---

## 1. Install Docker on the server (one time)

SSH in and install Docker + the Compose plugin:

```bash
ssh root@93.127.166.135

# Ubuntu/Debian:
curl -fsSL https://get.docker.com | sh
docker --version && docker compose version
```

Open the firewall for HTTP (and HTTPS if you'll add TLS later):

```bash
ufw allow 80/tcp && ufw allow 443/tcp   # skip if ufw isn't enabled
```

## 2. Copy the project to the server

From your **local machine** (in the project folder `car-rent`):

```bash
# excludes build output, .git and local uploads
rsync -az --delete \
  --exclude target --exclude .git --exclude uploads \
  ./  root@93.127.166.135:/opt/mvrent/
```

(Or `git clone` your repo into `/opt/mvrent` if it's pushed somewhere.)

## 3. Configure secrets

On the **server**:

```bash
cd /opt/mvrent
cp .env.example .env
nano .env          # set a strong DB_PASSWORD (and mail creds if you want email)
```

## 4. Build & start

```bash
cd /opt/mvrent
docker compose up -d --build
```

First run takes a few minutes (it builds the app image and downloads Postgres).
On startup the app creates the schema and seeds demo data automatically.

## 5. Verify

```bash
docker compose ps                 # both services "running"/"healthy"
docker compose logs -f app        # look for "Started CarRentalApplication"
curl -I http://localhost          # expect HTTP 200/302
```

Then open **http://93.127.166.135/** in a browser.

| Area | URL | Default login |
|------|-----|---------------|
| Public site | `/` | — |
| Admin | `/admin/login` | `admin` / `admin123` |
| Vendor portal | `/vendor/login` | created from admin |
| Driver portal | `/driver/login` | created from admin |

> ⚠️ **Change the admin password immediately** (Admin → profile) and delete the
> demo customer if this is production.

---

## Day-2 operations

**Update after code changes** (re-run rsync from step 2, then):
```bash
cd /opt/mvrent && docker compose up -d --build
```

**Logs / restart / stop:**
```bash
docker compose logs -f app
docker compose restart app
docker compose down            # stop (keeps data volumes)
```

**Back up the database:**
```bash
docker compose exec db pg_dump -U postgres mv_rent > backup-$(date +%F).sql
```

**Restore:**
```bash
cat backup-YYYY-MM-DD.sql | docker compose exec -T db psql -U postgres -d mv_rent
```

Uploaded files persist in the `uploads` Docker volume; DB in `db-data`.

---

## Optional: domain + HTTPS (nginx + Let's Encrypt)

If you point a domain at the server, put nginx in front and get a free cert.
First change the app's port mapping in `docker-compose.yml` from `"80:8080"` to
`"127.0.0.1:8080:8080"` (so only nginx is public), then:

```bash
apt install -y nginx certbot python3-certbot-nginx
# create /etc/nginx/sites-available/mvrent  ->  proxy_pass http://127.0.0.1:8080;
certbot --nginx -d yourdomain.com
```

Ask me and I'll generate the exact nginx server block for your domain.
