mirror of
https://gitverse.ru/kpa39l/gotosocial.git
synced 2026-09-29 18:05:09 +00:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4f126cdfae | |||
| c8d490d1c6 |
@@ -1,6 +1,6 @@
|
||||
# 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: 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
|
||||
(инструкция по метрикам GtS получена от пользователя 2026-09-06)
|
||||
- [ ] Логи в 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, по решению пользователя)
|
||||
|
||||
- Мониторинг бэкапов (метрики в Prometheus + дашборд Grafana)
|
||||
|
||||
@@ -64,6 +64,19 @@ services:
|
||||
- ./.cache:/gotosocial/.cache
|
||||
# Конфиг для справки (read-only; рабочий конфиг — env выше)
|
||||
- ./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:
|
||||
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