docs: add Docker deployment guide
This commit is contained in:
1 parent
81eb8950dd
commit
0e111d61ff
2 files changed
+526
No files matched your search
@@ -655,6 +655,12 @@ SQLite
|
|||||||
|
|
||||||
HTTPS is strongly recommended.
|
HTTPS is strongly recommended.
|
||||||
|
|
||||||
|
---
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
- [Testing Guide](docs/TESTING.md)
|
||||||
|
- [Docker Deployment Guide](docs/DOCKER-Deploy.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|||||||
@@ -0,0 +1,520 @@
|
|||||||
|
# Docker Deployment Guide for BZOD
|
||||||
|
|
||||||
|
This guide covers deployment, upgrades, backup, restore, troubleshooting, and production best practices for **BZOD (nx9-url-shortener)** using Docker.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Overview
|
||||||
|
|
||||||
|
BZOD is a lightweight self-hosted URL shortener and landing page platform written in Rust.
|
||||||
|
|
||||||
|
Features include:
|
||||||
|
|
||||||
|
* URL shortening
|
||||||
|
* Human-readable custom slugs (`!office`, `!home`, etc.)
|
||||||
|
* Landing pages
|
||||||
|
* QR code generation
|
||||||
|
* Analytics
|
||||||
|
* Audit logging
|
||||||
|
* API access
|
||||||
|
* Backup and restore
|
||||||
|
* SQLite-based storage
|
||||||
|
* Docker deployment
|
||||||
|
|
||||||
|
BZOD is designed to remain simple:
|
||||||
|
|
||||||
|
* No PostgreSQL
|
||||||
|
* No Redis
|
||||||
|
* No external dependencies
|
||||||
|
* No vendor lock-in
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Quick Start
|
||||||
|
|
||||||
|
## Clone Repository
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/thakares/nx9-url-shortener.git
|
||||||
|
cd nx9-url-shortener
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build and Start
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d --build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Create Administrator
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod create-admin
|
||||||
|
```
|
||||||
|
|
||||||
|
Open:
|
||||||
|
|
||||||
|
```text
|
||||||
|
http://SERVER-IP:8654
|
||||||
|
```
|
||||||
|
|
||||||
|
Admin panel:
|
||||||
|
|
||||||
|
```text
|
||||||
|
http://SERVER-IP:8654/admin
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Docker Compose
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
bzod:
|
||||||
|
container_name: bzod
|
||||||
|
build: .
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
ports:
|
||||||
|
- "8654:8654"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
- ./data:/app/data
|
||||||
|
- ./config:/app/config
|
||||||
|
|
||||||
|
environment:
|
||||||
|
HOST: 0.0.0.0
|
||||||
|
PORT: 8654
|
||||||
|
DATA_DIR: /app/data
|
||||||
|
COOKIE_SECURE: "false"
|
||||||
|
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "./bzod", "doctor"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
Start:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker ps
|
||||||
|
docker logs -f bzod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Directory Layout
|
||||||
|
|
||||||
|
Typical deployment:
|
||||||
|
|
||||||
|
```text
|
||||||
|
bzod/
|
||||||
|
├── docker-compose.yml
|
||||||
|
├── Dockerfile
|
||||||
|
├── config/
|
||||||
|
├── data/
|
||||||
|
│ ├── admin.db
|
||||||
|
│ ├── content.db
|
||||||
|
│ ├── analytics.db
|
||||||
|
│ └── system.db
|
||||||
|
└── backups/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Root Landing Page
|
||||||
|
|
||||||
|
BZOD can serve a static landing page from:
|
||||||
|
|
||||||
|
```text
|
||||||
|
www/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
This page is available at:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://your-domain/
|
||||||
|
```
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
|
||||||
|
```text
|
||||||
|
https://bzo.in/
|
||||||
|
https://short.example.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
The root landing page is packaged automatically inside the Docker image.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Reverse Proxy Configuration
|
||||||
|
|
||||||
|
BZOD is intended to run behind a reverse proxy.
|
||||||
|
|
||||||
|
Example Nginx configuration:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
server {
|
||||||
|
server_name bzo.in;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8654;
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Example deployment:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Internet
|
||||||
|
↓
|
||||||
|
Nginx Proxy Manager
|
||||||
|
↓
|
||||||
|
BZOD Docker Container
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Environment Variables
|
||||||
|
|
||||||
|
| Variable | Description | Default |
|
||||||
|
| ------------- | ------------------ | --------- |
|
||||||
|
| HOST | Bind address | 0.0.0.0 |
|
||||||
|
| PORT | Listen port | 8654 |
|
||||||
|
| DATA_DIR | Database directory | /app/data |
|
||||||
|
| COOKIE_SECURE | Secure cookies | false |
|
||||||
|
| RUST_LOG | Logging level | info |
|
||||||
|
|
||||||
|
Production recommendation:
|
||||||
|
|
||||||
|
```text
|
||||||
|
COOKIE_SECURE=true
|
||||||
|
```
|
||||||
|
|
||||||
|
when HTTPS is enabled.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Backup
|
||||||
|
|
||||||
|
## Web UI
|
||||||
|
|
||||||
|
Navigate to:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Admin → Settings → Maintenance & DB Utilities
|
||||||
|
```
|
||||||
|
|
||||||
|
Click:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Download Backup
|
||||||
|
```
|
||||||
|
|
||||||
|
A compressed archive containing all databases will be downloaded.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CLI Backup
|
||||||
|
|
||||||
|
Create backup:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod backup
|
||||||
|
```
|
||||||
|
|
||||||
|
Example output:
|
||||||
|
|
||||||
|
```text
|
||||||
|
backup-2026-06-14.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Restore
|
||||||
|
|
||||||
|
## Web UI Restore
|
||||||
|
|
||||||
|
Navigate to:
|
||||||
|
|
||||||
|
```text
|
||||||
|
Admin → Settings → Maintenance & DB Utilities
|
||||||
|
```
|
||||||
|
|
||||||
|
Upload:
|
||||||
|
|
||||||
|
```text
|
||||||
|
backup.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
Type:
|
||||||
|
|
||||||
|
```text
|
||||||
|
RESTORE
|
||||||
|
```
|
||||||
|
|
||||||
|
Confirm restore.
|
||||||
|
|
||||||
|
The system will:
|
||||||
|
|
||||||
|
1. Validate archive contents
|
||||||
|
2. Restore databases
|
||||||
|
3. Reinitialize database access
|
||||||
|
4. Redirect to login
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CLI Restore
|
||||||
|
|
||||||
|
Copy backup archive into container or mounted volume.
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bash
|
||||||
|
|
||||||
|
cd /app/data
|
||||||
|
|
||||||
|
bzod restore --file backup.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Disaster Recovery
|
||||||
|
|
||||||
|
Example recovery procedure:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose down
|
||||||
|
|
||||||
|
# Restore backup archive
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod doctor
|
||||||
|
docker exec -it bzod bzod validate
|
||||||
|
```
|
||||||
|
|
||||||
|
Check:
|
||||||
|
|
||||||
|
* URLs
|
||||||
|
* Landing pages
|
||||||
|
* Analytics
|
||||||
|
* Audit logs
|
||||||
|
* Settings
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Useful CLI Commands
|
||||||
|
|
||||||
|
Health:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
Statistics:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod stats
|
||||||
|
```
|
||||||
|
|
||||||
|
Validate databases:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod validate
|
||||||
|
```
|
||||||
|
|
||||||
|
Create admin:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod create-admin
|
||||||
|
```
|
||||||
|
|
||||||
|
Shorten URL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod shorten https://example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Custom slug:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod shorten https://example.com --slug !office
|
||||||
|
```
|
||||||
|
|
||||||
|
Expand URL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod expand !office
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Upgrading
|
||||||
|
|
||||||
|
Pull latest source:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git pull
|
||||||
|
```
|
||||||
|
|
||||||
|
Rebuild:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose build --no-cache
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker logs -f bzod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Troubleshooting
|
||||||
|
|
||||||
|
## Read-Only SQLite Database
|
||||||
|
|
||||||
|
Symptoms:
|
||||||
|
|
||||||
|
```text
|
||||||
|
attempt to write a readonly database
|
||||||
|
```
|
||||||
|
|
||||||
|
Check ownership:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -lah data/
|
||||||
|
```
|
||||||
|
|
||||||
|
Fix permissions:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -u 0 -it bzod bash
|
||||||
|
|
||||||
|
chown -R bzod:bzod /app/data
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose restart bzod
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Missing Root Landing Page
|
||||||
|
|
||||||
|
Symptoms:
|
||||||
|
|
||||||
|
```text
|
||||||
|
404 on /
|
||||||
|
```
|
||||||
|
|
||||||
|
Verify:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod ls -lah /app/www
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/app/www/index.html
|
||||||
|
```
|
||||||
|
|
||||||
|
Rebuild image if necessary:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose build --no-cache
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Health Check Failure
|
||||||
|
|
||||||
|
Inspect logs:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker logs bzod
|
||||||
|
```
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker exec -it bzod bzod doctor
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Port Already In Use
|
||||||
|
|
||||||
|
Change host port mapping:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
ports:
|
||||||
|
- "8080:8654"
|
||||||
|
```
|
||||||
|
|
||||||
|
Access:
|
||||||
|
|
||||||
|
```text
|
||||||
|
http://SERVER-IP:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Production Recommendations
|
||||||
|
|
||||||
|
* Use HTTPS
|
||||||
|
* Run behind Nginx Proxy Manager or Nginx
|
||||||
|
* Use strong administrator credentials
|
||||||
|
* Schedule regular backups
|
||||||
|
* Periodically test restore procedures
|
||||||
|
* Monitor disk space
|
||||||
|
* Keep Docker images updated
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Validation Checklist
|
||||||
|
|
||||||
|
After deployment verify:
|
||||||
|
|
||||||
|
* [ ] Admin login works
|
||||||
|
* [ ] URL shortening works
|
||||||
|
* [ ] Custom slugs work
|
||||||
|
* [ ] Landing pages work
|
||||||
|
* [ ] QR generation works
|
||||||
|
* [ ] Analytics recorded
|
||||||
|
* [ ] Backup download works
|
||||||
|
* [ ] Restore workflow works
|
||||||
|
* [ ] Root landing page loads
|
||||||
|
* [ ] `bzod doctor` reports healthy
|
||||||
|
|
||||||
|
A deployment should not be considered production-ready until backup and restore procedures have been successfully tested.
|
||||||
Reference in new issue
Block a user