prodv1
This commit is contained in:
98
README.md
98
README.md
@@ -33,6 +33,100 @@ flask run --debug
|
||||
|
||||
Open http://127.0.0.1:5000
|
||||
|
||||
## Production (WSGI)
|
||||
|
||||
This repo includes a `wsgi.py` entrypoint for production WSGI servers.
|
||||
|
||||
### Important (Windows)
|
||||
|
||||
If you try to run Gunicorn directly on Windows you will see an error like:
|
||||
|
||||
```
|
||||
ModuleNotFoundError: No module named 'fcntl'
|
||||
```
|
||||
|
||||
That’s expected: **Gunicorn is Unix-only**. On Windows, run the app via:
|
||||
|
||||
- **Docker** (recommended) so Gunicorn runs inside a Linux container, or
|
||||
- **WSL2/Linux** (Gunicorn works), or
|
||||
- use a Windows-native WSGI server (e.g. Waitress) instead of Gunicorn.
|
||||
|
||||
Examples:
|
||||
|
||||
```bash
|
||||
# gunicorn (Linux)
|
||||
gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app
|
||||
|
||||
# uWSGI
|
||||
uwsgi --http :8000 --wsgi-file wsgi.py --callable app
|
||||
```
|
||||
|
||||
Note: unlike `flask run`, WSGI servers typically don't auto-load `.env` / `.flaskenv`.
|
||||
`wsgi.py` attempts to load `.env` (best-effort), but for real production you should set
|
||||
environment variables via your process manager / secrets.
|
||||
|
||||
## Docker
|
||||
|
||||
### Docker Compose (recommended)
|
||||
|
||||
This repo includes a `docker-compose.yml` for a one-command startup.
|
||||
|
||||
```powershell
|
||||
docker compose up --build
|
||||
```
|
||||
|
||||
Run in the background:
|
||||
|
||||
```powershell
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Stop:
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
```
|
||||
|
||||
Data persistence:
|
||||
|
||||
- SQLite DB is mounted to `./instance` on your host
|
||||
- uploads are mounted to `./app/static/uploads` on your host
|
||||
|
||||
Build:
|
||||
|
||||
```bash
|
||||
docker build -t signage:latest .
|
||||
```
|
||||
|
||||
Run (with persistent SQLite DB + uploads):
|
||||
|
||||
```bash
|
||||
docker run --rm -p 8000:8000 \
|
||||
-e SECRET_KEY="change-me" \
|
||||
-v %cd%/instance:/app/instance \
|
||||
-v %cd%/app/static/uploads:/app/app/static/uploads \
|
||||
signage:latest
|
||||
```
|
||||
|
||||
PowerShell variant (sometimes volume path quoting is easier):
|
||||
|
||||
```powershell
|
||||
docker run --rm -p 8000:8000 `
|
||||
-e SECRET_KEY="change-me" `
|
||||
-v "${PWD}/instance:/app/instance" `
|
||||
-v "${PWD}/app/static/uploads:/app/app/static/uploads" `
|
||||
signage:latest
|
||||
```
|
||||
|
||||
Then open: http://127.0.0.1:8000
|
||||
|
||||
Notes:
|
||||
|
||||
- The container starts with Gunicorn using `wsgi:app`.
|
||||
- You can override Gunicorn settings via env vars:
|
||||
- `GUNICORN_WORKERS` (default: 2)
|
||||
- `GUNICORN_BIND` (default: `0.0.0.0:8000`)
|
||||
|
||||
## Notes
|
||||
|
||||
- SQLite DB is stored at `instance/signage.sqlite`.
|
||||
@@ -121,3 +215,7 @@ If the reset email is not received:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user