fix(deploy): take the Gitea address for Android updates from git remote
ci / api / api (push) Successful in 22s
ci / db / db (push) Successful in 2m4s
release / release (версия и заметки) (push) Successful in 5s
release / android (APK в релиз) (push) Successful in 4m11s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m33s
ci / api / api (push) Successful in 22s
ci / db / db (push) Successful in 2m4s
release / release (версия и заметки) (push) Successful in 5s
release / android (APK в релиз) (push) Successful in 4m11s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 1m33s
The server kept the git.example.lan placeholder from .env.example, so the /android page and in-app updates had no release. install.sh and update.sh now fill GITEA_URL and GITEA_REPO from the clone's origin (https, ssh and scp forms, credentials stripped) when they are empty or still the placeholder, and the API treats the placeholder as not configured. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
823d1eb841
commit
66f5749fc1
6 files changed
+78
-6
No files matched your search
+4
-2
@@ -45,6 +45,8 @@ SUPPORTED_LOCALES=ru,en
|
|||||||
MIN_ANDROID_VERSION_CODE=0
|
MIN_ANDROID_VERSION_CODE=0
|
||||||
|
|
||||||
# --- Самообновление Android (M5) ---
|
# --- Самообновление Android (M5) ---
|
||||||
GITEA_URL=https://git.example.lan
|
# Пусто — install.sh и update.sh возьмут из origin клона (например, https://gitea.example.com и owner/pipu-music).
|
||||||
GITEA_REPO=owner/pipu-music
|
# Если сервер не видит Gitea по внешнему адресу, укажите внутренний: GITEA_URL=http://10.0.0.5:3000
|
||||||
|
GITEA_URL=
|
||||||
|
GITEA_REPO=
|
||||||
GITEA_TOKEN=
|
GITEA_TOKEN=
|
||||||
@@ -76,6 +76,39 @@ for key in JWT_PRIVATE_KEY STREAM_SIGNING_KEY; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Самообновление Android: адрес Gitea и репозиторий — из origin этого клона, если в .env пусто
|
||||||
|
# или осталась заглушка из .env.example (https://host/owner/repo, git@host:owner/repo, ssh://git@host:port/owner/repo).
|
||||||
|
fill_gitea() {
|
||||||
|
local url repo origin host path
|
||||||
|
url="$(sed -n 's/^GITEA_URL=//p' .env)"
|
||||||
|
repo="$(sed -n 's/^GITEA_REPO=//p' .env)"
|
||||||
|
case "$url" in "" | *example.*) url="" ;; esac
|
||||||
|
case "$repo" in "" | owner/*) repo="" ;; esac
|
||||||
|
[ -n "$url" ] && [ -n "$repo" ] && return 0
|
||||||
|
origin="$(git -c safe.directory='*' remote get-url origin 2>/dev/null || true)"
|
||||||
|
[ -n "$origin" ] || return 0
|
||||||
|
case "$origin" in
|
||||||
|
http://* | https://*)
|
||||||
|
host="$(printf '%s' "$origin" | sed -E 's#^(https?://)([^@/]*@)?([^/]+)/.*#\1\3#')"
|
||||||
|
path="$(printf '%s' "$origin" | sed -E 's#^https?://[^/]+/##')" ;;
|
||||||
|
ssh://*)
|
||||||
|
host="https://$(printf '%s' "$origin" | sed -E 's#^ssh://([^@/]*@)?([^:/]+).*#\2#')"
|
||||||
|
path="$(printf '%s' "$origin" | sed -E 's#^ssh://[^/]+/##')" ;;
|
||||||
|
*:*)
|
||||||
|
host="https://$(printf '%s' "$origin" | sed -E 's#^([^@]*@)?([^:]+):.*#\2#')"
|
||||||
|
path="${origin#*:}" ;;
|
||||||
|
*) return 0 ;;
|
||||||
|
esac
|
||||||
|
path="${path%.git}"
|
||||||
|
[ -n "$url" ] || url="$host"
|
||||||
|
[ -n "$repo" ] || repo="$path"
|
||||||
|
for kv in "GITEA_URL=$url" "GITEA_REPO=$repo"; do
|
||||||
|
if grep -q "^${kv%%=*}=" .env; then sed -i "s|^${kv%%=*}=.*|$kv|" .env; else echo "$kv" >> .env; fi
|
||||||
|
done
|
||||||
|
echo "→ самообновление Android: $url, $repo (из git remote; поменять — в .env)"
|
||||||
|
}
|
||||||
|
fill_gitea
|
||||||
|
|
||||||
# LIBRARY_HOST, переданный при повторном запуске, попадает и в уже существующий .env
|
# LIBRARY_HOST, переданный при повторном запуске, попадает и в уже существующий .env
|
||||||
if [ -n "$LIBRARY_HOST" ]; then
|
if [ -n "$LIBRARY_HOST" ]; then
|
||||||
if grep -q '^LIBRARY_HOST=' .env; then
|
if grep -q '^LIBRARY_HOST=' .env; then
|
||||||
|
|||||||
@@ -26,6 +26,39 @@ for key in JWT_PRIVATE_KEY STREAM_SIGNING_KEY; do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Самообновление Android: адрес Gitea и репозиторий — из origin этого клона, если в .env пусто
|
||||||
|
# или осталась заглушка из .env.example (https://host/owner/repo, git@host:owner/repo, ssh://git@host:port/owner/repo).
|
||||||
|
fill_gitea() {
|
||||||
|
local url repo origin host path
|
||||||
|
url="$(sed -n 's/^GITEA_URL=//p' .env)"
|
||||||
|
repo="$(sed -n 's/^GITEA_REPO=//p' .env)"
|
||||||
|
case "$url" in "" | *example.*) url="" ;; esac
|
||||||
|
case "$repo" in "" | owner/*) repo="" ;; esac
|
||||||
|
[ -n "$url" ] && [ -n "$repo" ] && return 0
|
||||||
|
origin="$(git -c safe.directory='*' remote get-url origin 2>/dev/null || true)"
|
||||||
|
[ -n "$origin" ] || return 0
|
||||||
|
case "$origin" in
|
||||||
|
http://* | https://*)
|
||||||
|
host="$(printf '%s' "$origin" | sed -E 's#^(https?://)([^@/]*@)?([^/]+)/.*#\1\3#')"
|
||||||
|
path="$(printf '%s' "$origin" | sed -E 's#^https?://[^/]+/##')" ;;
|
||||||
|
ssh://*)
|
||||||
|
host="https://$(printf '%s' "$origin" | sed -E 's#^ssh://([^@/]*@)?([^:/]+).*#\2#')"
|
||||||
|
path="$(printf '%s' "$origin" | sed -E 's#^ssh://[^/]+/##')" ;;
|
||||||
|
*:*)
|
||||||
|
host="https://$(printf '%s' "$origin" | sed -E 's#^([^@]*@)?([^:]+):.*#\2#')"
|
||||||
|
path="${origin#*:}" ;;
|
||||||
|
*) return 0 ;;
|
||||||
|
esac
|
||||||
|
path="${path%.git}"
|
||||||
|
[ -n "$url" ] || url="$host"
|
||||||
|
[ -n "$repo" ] || repo="$path"
|
||||||
|
for kv in "GITEA_URL=$url" "GITEA_REPO=$repo"; do
|
||||||
|
if grep -q "^${kv%%=*}=" .env; then sed -i "s|^${kv%%=*}=.*|$kv|" .env; else echo "$kv" >> .env; fi
|
||||||
|
done
|
||||||
|
echo "→ самообновление Android: $url, $repo (из git remote; поменять — в .env)"
|
||||||
|
}
|
||||||
|
fill_gitea
|
||||||
|
|
||||||
# Папка с музыкой пуста — почти всегда это несмонтированный диск: api отдавал бы ошибки воспроизведения.
|
# Папка с музыкой пуста — почти всегда это несмонтированный диск: api отдавал бы ошибки воспроизведения.
|
||||||
LIBRARY_HOST="$(sed -n 's/^LIBRARY_HOST=//p' .env)"
|
LIBRARY_HOST="$(sed -n 's/^LIBRARY_HOST=//p' .env)"
|
||||||
if [ -n "$LIBRARY_HOST" ] && [ -z "$(ls -A "$LIBRARY_HOST" 2>/dev/null)" ] && [ "${PIPU_ALLOW_EMPTY_LIBRARY:-}" != 1 ]; then
|
if [ -n "$LIBRARY_HOST" ] && [ -z "$(ls -A "$LIBRARY_HOST" 2>/dev/null)" ] && [ "${PIPU_ALLOW_EMPTY_LIBRARY:-}" != 1 ]; then
|
||||||
|
|||||||
+1
-1
@@ -77,7 +77,7 @@
|
|||||||
| `BOOTSTRAP_ADMIN_PASSWORD` | пусто → сгенерировать и вывести в лог | |
|
| `BOOTSTRAP_ADMIN_PASSWORD` | пусто → сгенерировать и вывести в лог | |
|
||||||
| `TRANSCODE_CACHE_LIMIT_GB` | `50` | |
|
| `TRANSCODE_CACHE_LIMIT_GB` | `50` | |
|
||||||
| `TRANSCODE_CONCURRENCY` | `2` | |
|
| `TRANSCODE_CONCURRENCY` | `2` | |
|
||||||
| `GITEA_URL`, `GITEA_REPO`, `GITEA_TOKEN` | `https://git.home.lan`, `owner/pipu-music`, read-only токен | Для самообновления Android |
|
| `GITEA_URL`, `GITEA_REPO`, `GITEA_TOKEN` | пусто — из `git remote` (`install.sh`, `update.sh`); токен — для закрытого репозитория | Самообновление Android и страница `/android` |
|
||||||
| `PIPU_FILE_UID`, `PIPU_FILE_GID` | `1000` | Владелец файлов, которые агент записывает в принимающие хранилища |
|
| `PIPU_FILE_UID`, `PIPU_FILE_GID` | `1000` | Владелец файлов, которые агент записывает в принимающие хранилища |
|
||||||
| `UPLOADS_DIR` | `/uploads` | Staging очереди на добавление (лимит очереди задаётся в админке) |
|
| `UPLOADS_DIR` | `/uploads` | Staging очереди на добавление (лимит очереди задаётся в админке) |
|
||||||
| `LOG_LEVEL` | `info` | |
|
| `LOG_LEVEL` | `info` | |
|
||||||
|
|||||||
@@ -250,8 +250,10 @@ curl -s https://music.example.com/readyz
|
|||||||
приложение попросит обновиться.
|
приложение попросит обновиться.
|
||||||
|
|
||||||
Дальше приложение обновляется само: с версии M5 оно проверяет новые релизы через ваш сервер
|
Дальше приложение обновляется само: с версии M5 оно проверяет новые релизы через ваш сервер
|
||||||
и предлагает обновиться ([mobile.md](mobile.md#самообновление)). Для этого в `.env` сервера нужно заполнить
|
и предлагает обновиться ([mobile.md](mobile.md#самообновление)). Адрес Gitea и репозиторий (`GITEA_URL`, `GITEA_REPO`)
|
||||||
`GITEA_URL`, `GITEA_REPO` и `GITEA_TOKEN` (токен только на чтение).
|
`install.sh` и `update.sh` берут из `git remote` клона; `GITEA_TOKEN` (только на чтение) нужен, если репозиторий
|
||||||
|
закрытый. Если сервер не видит Gitea по внешнему адресу — впишите внутренний в `GITEA_URL`. Раздать приложение —
|
||||||
|
ссылка `https://<ваш-домен>/android`.
|
||||||
|
|
||||||
> Приложению нужен настоящий сертификат. С самоподписанным сертификатом и голым IP-адресом подключиться не получится.
|
> Приложению нужен настоящий сертификат. С самоподписанным сертификатом и голым IP-адресом подключиться не получится.
|
||||||
> Поэтому нужен домен с Let's Encrypt, как в этой инструкции.
|
> Поэтому нужен домен с Let's Encrypt, как в этой инструкции.
|
||||||
|
|||||||
@@ -100,8 +100,10 @@ func NewHandler(cfg Config, log *slog.Logger) *Handler {
|
|||||||
return &Handler{cfg: cfg, client: &http.Client{Timeout: 10 * time.Minute}, log: log}
|
return &Handler{cfg: cfg, client: &http.Client{Timeout: 10 * time.Minute}, log: log}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// configured — адрес и репозиторий заданы, и это не заглушка из .env.example.
|
||||||
func (h *Handler) configured() bool {
|
func (h *Handler) configured() bool {
|
||||||
return h.cfg.GiteaURL != "" && h.cfg.Repo != ""
|
return h.cfg.GiteaURL != "" && h.cfg.Repo != "" &&
|
||||||
|
!strings.Contains(h.cfg.GiteaURL, "example.") && !strings.HasPrefix(h.cfg.Repo, "owner/")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) get(ctx context.Context, url string) (*http.Response, error) {
|
func (h *Handler) get(ctx context.Context, url string) (*http.Response, error) {
|
||||||
|
|||||||
Reference in new issue
Block a user