mirror of
https://gitverse.ru/kpa39l/gotosocial.git
synced 2026-09-29 18:05:09 +00:00
Compare commits
2 Commits
30121869f2
...
4f126cdfae
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f126cdfae | |||
| c8d490d1c6 |
@@ -1,6 +1,6 @@
|
|||||||
# GoToSocial — Статус
|
# GoToSocial — Статус
|
||||||
|
|
||||||
Обновлено: 2026-09-06 (поздний вечер, деплой завершён)
|
Обновлено: 2026-09-07
|
||||||
|
|
||||||
## Текущее состояние
|
## Текущее состояние
|
||||||
|
|
||||||
@@ -39,13 +39,33 @@ Split-domain работает: аккаунты `@user@dedinit.ru`, хост soc
|
|||||||
- 2026-09-06: gotosocial commit d9951b6 запушен на gitverse (56f228a..d9951b6)
|
- 2026-09-06: gotosocial commit d9951b6 запушен на gitverse (56f228a..d9951b6)
|
||||||
- 2026-09-06: dedinit.ru commit b049cb2 запушен на gitverse (3d2f07b..b049cb2)
|
- 2026-09-06: dedinit.ru commit b049cb2 запушен на gitverse (3d2f07b..b049cb2)
|
||||||
|
|
||||||
|
### Веб-клиент Phanpy + чистый подвал (2026-09-07)
|
||||||
|
- Phanpy (openengineering/phanpy:latest) в docker-compose, порт 8383 (внутри nginx слушает 8080!) → https://web.dedinit.ru (Caddy vps02 → 10.8.0.2:8383)
|
||||||
|
- DNS: web.dedinit.ru A 87.242.100.206 (добавлен пользователем); TLS от Caddy (авто-LE)
|
||||||
|
- CORS на API GtS уже `*` — Phanpy работает из браузера напрямую; проверено preflight 204 + allow-origin
|
||||||
|
- Кастомный page_footer.tmpl (без 🏳️🌈🏳️⚧️🦥 в подвале), смонтирован volume `./web/template/page_footer.tmpl:ro`
|
||||||
|
- Проверка при обновлении GtS: `./scripts/check-pride.sh` (python3-детект юникода, нормализация; grep-эмодзи ловил ложные срабатывания)
|
||||||
|
|
||||||
## В работе / Следующие шаги
|
## В работе / Следующие шаги
|
||||||
|
|
||||||
- [ ] Проверить SMTP-письмо (регистрация/восстановление пароля) — через админку
|
- [x] Регистрация открыта (10/день) + apex-webfinger динамический (change fix-apex-webfinger-and-registration, архив)
|
||||||
|
- [x] Веб-клиент Phanpy + чистый подвал (change add-webclient-and-clean-footer)
|
||||||
- [ ] Мониторинг: пробросить :9464 (метрики уже слушают), job в prometheus.yml, дашборд Grafana
|
- [ ] Мониторинг: пробросить :9464 (метрики уже слушают), job в prometheus.yml, дашборд Grafana
|
||||||
(инструкция по метрикам GtS получена от пользователя 2026-09-06)
|
(инструкция по метрикам GtS получена от пользователя 2026-09-06)
|
||||||
- [ ] Логи в json-формате при желании (log-format: json) — по умолчанию logfmt
|
- [ ] Логи в json-формате при желании (log-format: json) — по умолчанию logfmt
|
||||||
|
|
||||||
|
## Процедура при обновлении версии GtS (важно!)
|
||||||
|
|
||||||
|
1. Обновить тег образа в docker-compose.yml (например `0.23.0`).
|
||||||
|
2. Проверить шаблон подвала на флаги ДО перезапуска:
|
||||||
|
```bash
|
||||||
|
IMAGE=superseriousbusiness/gotosocial:0.23.0 /opt/gotosocial/scripts/check-pride.sh
|
||||||
|
```
|
||||||
|
(скрипт создаёт временный контейнер из образа, копирует шаблоны, ищет 🏳️🌈🏳️⚧️).
|
||||||
|
3. Если найдены — обновить `/opt/gotosocial/web/template/page_footer.tmpl` (убрать span с эмодзи),
|
||||||
|
затем `docker compose up -d gotosocial`.
|
||||||
|
4. Проверить: `curl -s https://social.dedinit.ru/@kpa39l | grep -c '🏳'` → 0.
|
||||||
|
|
||||||
## Отложено (post-MVP, по решению пользователя)
|
## Отложено (post-MVP, по решению пользователя)
|
||||||
|
|
||||||
- Мониторинг бэкапов (метрики в Prometheus + дашборд Grafana)
|
- Мониторинг бэкапов (метрики в Prometheus + дашборд Grafana)
|
||||||
|
|||||||
@@ -64,6 +64,19 @@ services:
|
|||||||
- ./.cache:/gotosocial/.cache
|
- ./.cache:/gotosocial/.cache
|
||||||
# Конфиг для справки (read-only; рабочий конфиг — env выше)
|
# Конфиг для справки (read-only; рабочий конфиг — env выше)
|
||||||
- ./config.yaml:/gotosocial/config.example.yaml:ro
|
- ./config.yaml:/gotosocial/config.example.yaml:ro
|
||||||
|
# Кастомный шаблон подвала: без радужных флагов/эмодзи (чистый Source - GoToSocial)
|
||||||
|
# ВАЖНО: при обновлении версии GtS проверить совместимость шаблона (см. STATUS.md)
|
||||||
|
- ./web/template/page_footer.tmpl:/gotosocial/web/template/page_footer.tmpl:ro
|
||||||
|
|
||||||
|
# --- Веб-клиент Phanpy (Mastodon-клиент, статический SPA) ---
|
||||||
|
# https://web.dedinit.ru (Caddy vps02 → 10.8.0.2:8383)
|
||||||
|
# Ходит на API social.dedinit.ru напрямую из браузера (CORS уже *).
|
||||||
|
phanpy:
|
||||||
|
image: openengineering/phanpy:latest
|
||||||
|
container_name: phanpy
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8383:8080"
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
gotosocial:
|
gotosocial:
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# gotosocial/webclient-and-clean-footer Specification
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
TBD - created by archiving change add-webclient-and-clean-footer. Update Purpose after archive.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
### Requirement: Веб-клиент рядом с GtS
|
||||||
|
|
||||||
|
- **MUST**: контейнер Phanpy (официальный образ openengineering/phanpy:latest)
|
||||||
|
запущен в docker-compose рядом с GtS, публикует порт 8383.
|
||||||
|
- **MUST**: `https://web.dedinit.ru` (Caddy на vps02 → 10.8.0.2:8383) отдаёт
|
||||||
|
интерфейс Phanpy, позволяющий логиниться через аккаунт social.dedinit.ru,
|
||||||
|
читать и писать посты.
|
||||||
|
- **MUST**: клиент работает с API без CORS-ошибок (GtS отдаёт
|
||||||
|
`access-control-allow-origin: *`).
|
||||||
|
|
||||||
|
#### Scenario: Доступ к веб-клиенту
|
||||||
|
|
||||||
|
- **GIVEN** DNS web.dedinit.ru → 87.242.100.206 (vps02) и Caddy-блок
|
||||||
|
- **WHEN** пользователь открывает https://web.dedinit.ru
|
||||||
|
- **THEN** загружается интерфейс Phanpy
|
||||||
|
- **THEN** можно войти через social.dedinit.ru и публиковать/читать посты
|
||||||
|
|
||||||
|
### Requirement: Чистый подвал без ЛГБТ-символики
|
||||||
|
|
||||||
|
- **MUST**: на всех публичных страницах social.dedinit.ru в подвале
|
||||||
|
отсутствуют эмодзи 🏳️🌈, 🏳️⚧️ (и любые ЛГБТ-символы).
|
||||||
|
- **MUST**: кастомный `page_footer.tmpl` смонтирован в контейнер GtS volume
|
||||||
|
(перезаписывает дефолтный).
|
||||||
|
- **SHOULD**: скрипт `scripts/check-pride.sh` фиксирует появление флагов при
|
||||||
|
обновлении образа GtS; процедура задокументирована в STATUS.md.
|
||||||
|
|
||||||
|
#### Scenario: Проверка подвала
|
||||||
|
|
||||||
|
- **GIVEN** открыта любая страница social.dedinit.ru (/, /about, /@kpa39l)
|
||||||
|
- **WHEN** выполняется поиск 🏳️🌈 / 🏳️⚧️ в HTML
|
||||||
|
- **THEN** совпадения отсутствуют
|
||||||
|
|
||||||
|
#### Scenario: Обновление версии GtS
|
||||||
|
|
||||||
|
- **GIVEN** обновляется image GtS
|
||||||
|
- **WHEN** выполняется scripts/check-pride.sh
|
||||||
|
- **THEN** скрипт скачивает шаблоны новой версии и проверяет их на флаги
|
||||||
|
- **THEN** при обнаружении флагов выводится ошибка (нужна правка шаблона)
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""check-pride — поиск ЛГБТ-символики (🏳️🌈, 🏳️⚧️, ⚧, радуга) в шаблонах GtS.
|
||||||
|
|
||||||
|
Надёжная проверка юникода (нормализация NFC/NFD) в отличие от grep-эмодзи.
|
||||||
|
Использование: check_pride.py <каталог_шаблонов>"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Символы в NFKD-форме (нормализуем и искомое, и файлы)
|
||||||
|
TARGETS = ["\U0001f3f3\ufe0f\u200d\U0001f308", # 🏳️🌈
|
||||||
|
"\U0001f3f3\ufe0f\u200d\U000026a7\ufe0f", # 🏳️⚧️
|
||||||
|
"\U000026a7\ufe0f", # ⚧️
|
||||||
|
"pride", "rainbow"]
|
||||||
|
TARGETS_NFKD = [t.replace("\ufe0f", "") for t in ["\U0001f3f3\ufe0f\u200d\U0001f308",
|
||||||
|
"\U0001f3f3\ufe0f\u200d\000026a7\ufe0f"]] # без VS
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if len(sys.argv) != 2:
|
||||||
|
print("Usage: check_pride.py <dir>", file=sys.stderr)
|
||||||
|
return 2
|
||||||
|
root = sys.argv[1]
|
||||||
|
import unicodedata
|
||||||
|
targets = TARGETS + TARGETS_NFKD
|
||||||
|
found = []
|
||||||
|
for dirpath, _dirnames, filenames in os.walk(root):
|
||||||
|
for fn in filenames:
|
||||||
|
p = os.path.join(dirpath, fn)
|
||||||
|
try:
|
||||||
|
data = open(p, "rb").read().decode("utf-8", errors="ignore")
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
nfd = unicodedata.normalize("NFD", data)
|
||||||
|
nfkd = unicodedata.normalize("NFKD", data)
|
||||||
|
for t in targets:
|
||||||
|
tnfd = unicodedata.normalize("NFD", t)
|
||||||
|
if tnfd in nfd or t in nfkd or t.lower() in data.lower():
|
||||||
|
found.append((p, t))
|
||||||
|
break
|
||||||
|
if found:
|
||||||
|
print("ОБНАРУЖЕНЫ ЛГБТ-символы:")
|
||||||
|
for p, t in found[:10]:
|
||||||
|
print(f" {p}: {t!r}")
|
||||||
|
return 1
|
||||||
|
print("OK: флагов не найдено")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Executable
+36
@@ -0,0 +1,36 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# check-pride.sh — проверка шаблонов GtS на ЛГБТ-символику (🏳️🌈, 🏳️⚧️ и т.п.)
|
||||||
|
# Запускать ПОСЛЕ обновления образа gotosocial (перед/после docker compose up -d).
|
||||||
|
# При обнаружении эмодзи в шаблонах — ненулевой код + пути файлов.
|
||||||
|
#
|
||||||
|
# Использование:
|
||||||
|
# ./scripts/check-pride.sh # проверить шаблоны в текущем контейнере gotosocial
|
||||||
|
# IMAGE=superseriousbusiness/gotosocial:0.23.0 ./scripts/check-pride.sh # проверить образ ДО запуска
|
||||||
|
|
||||||
|
set -u
|
||||||
|
DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
|
||||||
|
TMP="$(mktemp -d)"
|
||||||
|
trap 'rm -rf "$TMP"' EXIT
|
||||||
|
|
||||||
|
if [ -n "${IMAGE:-}" ]; then
|
||||||
|
echo "Проверка образа $IMAGE ..."
|
||||||
|
CID="$(docker create "$IMAGE" 2>/dev/null)" || { echo "ОШИБКА: не удалось создать контейнер из $IMAGE (образ не скачан?)"; exit 2; }
|
||||||
|
docker cp "$CID:/gotosocial/web/template" "$TMP/templates" >/dev/null 2>&1
|
||||||
|
docker rm "$CID" >/dev/null 2>&1
|
||||||
|
D="$TMP/templates"
|
||||||
|
else
|
||||||
|
echo "Проверка шаблонов в контейнере gotosocial ..."
|
||||||
|
docker cp gotosocial:/gotosocial/web/template "$TMP/templates" >/dev/null 2>&1
|
||||||
|
D="$TMP/templates"
|
||||||
|
fi
|
||||||
|
|
||||||
|
python3 "$DIR/check-pride.py" "$D"
|
||||||
|
rc=$?
|
||||||
|
|
||||||
|
if [ "$rc" -ne 0 ]; then
|
||||||
|
echo
|
||||||
|
echo "Найдены флаги — обновите /opt/gotosocial/web/template/page_footer.tmpl"
|
||||||
|
echo "и перезапустите: docker compose up -d gotosocial"
|
||||||
|
fi
|
||||||
|
exit "$rc"
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
{{- /*
|
||||||
|
// GoToSocial
|
||||||
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
||||||
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
|
//
|
||||||
|
// This program is free software: you can redistribute it and/or modify
|
||||||
|
// it under the terms of the GNU Affero General Public License as published by
|
||||||
|
// the Free Software Foundation, either version 3 of the License, or
|
||||||
|
// (at your option) any later version.
|
||||||
|
//
|
||||||
|
// This program is distributed in the hope that it will be useful,
|
||||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
// GNU Affero General Public License for more details.
|
||||||
|
//
|
||||||
|
// You should have received a copy of the GNU Affero General Public License
|
||||||
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/ -}}
|
||||||
|
|
||||||
|
{{- with . }}
|
||||||
|
<nav>
|
||||||
|
<ul class="nodot">
|
||||||
|
<li id="about">
|
||||||
|
<a
|
||||||
|
href="/about"
|
||||||
|
class="nounderline"
|
||||||
|
>
|
||||||
|
About {{ .instance.Title }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{- if .showAcctDir }}
|
||||||
|
<li id="directory">
|
||||||
|
<a
|
||||||
|
href="/directory"
|
||||||
|
class="nounderline"
|
||||||
|
>
|
||||||
|
Account Directory
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
<li id="version">
|
||||||
|
<a
|
||||||
|
href="https://codeberg.org/superseriousbusiness/gotosocial"
|
||||||
|
class="nounderline"
|
||||||
|
rel="nofollow noreferrer noopener"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
Source - GoToSocial {{ .instance.Version }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{- if .instance.ContactAccount }}
|
||||||
|
<li id="contact">
|
||||||
|
<a
|
||||||
|
href="/@{{- .instance.ContactAccount.Username -}}"
|
||||||
|
class="nounderline"
|
||||||
|
>
|
||||||
|
Contact account - {{ .instance.ContactAccount.Username }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
{{- if .instance.Email }}
|
||||||
|
<li id="email">
|
||||||
|
<a
|
||||||
|
href="mailto:{{- .instance.Email -}}"
|
||||||
|
class="nounderline"
|
||||||
|
rel="nofollow noreferrer noopener"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
Email - {{ .instance.Email }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
{{- end }}
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
{{- end }}
|
||||||
Reference in New Issue
Block a user