#!/usr/bin/env python3
"""ゴルフスコア管理 WebUI"""
from flask import Flask, render_template, request, jsonify, redirect, url_for, send_from_directory
import sqlite3
from pathlib import Path
from datetime import datetime
app = Flask(__name__)
app.config["APPLICATION_ROOT"] = "/golf"
app.config["PREFERRED_URL_SCHEME"] = "https"
@app.context_processor
def inject_base_path():
return {"base_path": "/golf"}
from werkzeug.middleware.proxy_fix import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app, x_prefix=1)
DB_PATH = Path("/app/golf.db")
def get_db():
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
return conn
-------------割愛-------------
/mnt/data/docker/golf_app/Dockerfile
FROM python:3.11-slim WORKDIR /app RUN pip install flask gunicorn COPY . . EXPOSE 5001 CMD ["gunicorn", "--bind", "0.0.0.0:5001", "--workers", "2", "--timeout", "120", "--root-path", "/golf", "app:application"]
/mnt/data/docker/golf_app/docker-compose.yml
version: '3.8'
services:
golf-app:
build: .
container_name: golf_app
ports:
- "5001:5001"
volumes:
- /mnt/data/docker/golf_app:/app
restart: unless-stopped
TWAアプリのHTTPS要件を満たすため、Tailscale ServeでHTTPS→Apache→Flaskの経路を設定
sudo tailscale serve --bg 80
/etc/apache2/sites-available/vafee2.conf 追記
ProxyHTMLURLMap http://127.0.0.1:5001 https://ubuntu-sv.tailde37b8.ts.net/golf
ProxyPass /golf/ http://127.0.0.1:5001/golf/
ProxyPassReverse /golf/ http://127.0.0.1:5001/golf/
<Location /golf/>
ProxyHTMLEnable On
ProxyHTMLURLMap / /golf/
ProxyHTMLURLMap /static/ /golf/static/
</Location>
必要なApacheモジュール
sudo a2enmod proxy proxy_http proxy_html headers sudo systemctl reload apache2
Tailscale Serve
# 設定確認 sudo tailscale serve status # → https://ubuntu-sv.tailde37b8.ts.net (tailnet only) # |-- / proxy http://127.0.0.1:80 # 設定が消えた場合の再設定 sudo tailscale serve --bg 80