sqlinsight-pro/docs/community.md
Søren Eggert Lundsteen Olsen ce49866d2b
Some checks are pending
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
CI / Build og unit tests (push) Successful in 1m0s
deploy community / deploy (push) Successful in 0s
deploy hub / deploy (push) Successful in 23s
CI / MSI-installer (push) Successful in 36s
Forum: one SEOSoft forum at forum.seosoft.dk, SQLInsight Pro as a category
The forum is shared by SEOSoft's products, so SQLInsight Pro becomes the
top-level category "sqlinsight" with the existing categories beneath it.

- render.py/install.sh: default hostname forum.seosoft.dk
- configure.py: forum-wide settings ("SEOSoft Forum") kept apart from the
  SQLInsight Pro category tree; subcategories found via /site.json; the
  welcome topic is pinned in the category, not on the shared front page
- Community site: ForumCategory option. The front page lists only that
  category's topics (c/<slug>/l/latest.json); forum links go to the
  category, topic links stay at the forum root
- Web: default ForumUrl https://forum.seosoft.dk/c/sqlinsight. The old
  forum.sqlinsight.seosoft.dk stays as a redirect for installed versions

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 10:34:29 +02:00

107 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Community-websted og forum
SQLInsight Pro har to offentlige websteder. Begge drives af SEOSoft:
| Websted | Adresse | Hvad |
|---|---|---|
| Community-webstedet | `https://sqlinsight.seosoft.dk` | Forside, funktioner, download af signerede udgivelser, dokumentation, SQL Server-versioner og supportdatoer, regler og supportaftaler. Projektet `src/SQLInsight.Community`. |
| Forummet | `https://forum.seosoft.dk/c/sqlinsight` | SEOSofts fælles Discourse-forum på dansk. SQLInsight Pro er kategorien `sqlinsight` med underkategorier: spørgsmål og svar (med løste svar), installation og drift, performance, regler, idéer og annonceringer. |
Alle navne peger på SEOSofts offentlige IP. Reverse proxyen dér terminerer TLS og sender videre til appserverens DMZ-adresse (`HOST_BIND`), på hver sin port:
| Navn | Container | Port (secret) | Deploy |
|---|---|---|---|
| `hub.sqlinsight.seosoft.dk` | `sqlinsight-hub` | `HOST_PORT` | `deploy-hub.yml`, ved push |
| `sqlinsight.seosoft.dk` | `sqlinsight-community` | `COMMUNITY_PORT` | `deploy-community.yml`, ved push |
| `forum.seosoft.dk` | `app` (Discourse, fælles for SEOSofts produkter) | `FORUM_PORT` | `deploy-forum.yml`, kun manuelt |
| `forum.sqlinsight.seosoft.dk` | – | – | 301-redirect til `forum.seosoft.dk` (`/` → `/c/sqlinsight`). Ældre installationer linker hertil |
Proxyen skal sende `Host`, `X-Forwarded-For` og `X-Forwarded-Proto: https`. For forummet skal den også tillade WebSockets og lange forespørgsler (Discourse bruger long polling på `/message-bus/`, så timeout skal være mindst 60 sekunder).
## Forummet (Discourse)
Forummet er fælles for SEOSofts produkter. Hvert produkt har sin egen hovedkategori; SQLInsight Pro har `sqlinsight`. Webstedet sætter `ForumCategory: sqlinsight`, så forsiden kun viser SQLInsight-emner.
Discourse installeres med den officielle `discourse_docker`-launcher, som er den eneste måde, Discourse understøtter. Workflowet `deploy-forum.yml` kører launcheren på appserveren i en helper-container, med `/var/discourse` og docker.sock fra værten. `deploy/forum/app.yml` er en skabelon, som `render.py` udfylder fra secrets. Intet hemmeligt ligger i repoet.
1. **Krav:** Discourse bruger 2-4 GB RAM og 20 GB disk under `/var/discourse` på appserveren.
2. **Mail:** Discourse kan ikke fungere uden SMTP. Tilmelding, notifikationer og nulstilling af adgangskode sker på mail. Opret en postkasse til forummet, og sørg for SPF og DKIM for afsenderdomænet.
3. **Secrets** i repoet (*Indstillinger → Actions → Secrets*):
| Secret | Eksempel | |
|---|---|---|
| `HOST_BIND`, `KNOWN_PROXY` | (findes allerede til hubben) | DMZ-adresse og reverse proxyens adresse |
| `FORUM_PORT` | `8082` | Valgfri. Porten på appserverens DMZ-adresse, som reverse proxyen sender forummet til |
| `FORUM_ADMIN_EMAIL` | din adresse | Bliver administrator ved tilmelding |
| `FORUM_SMTP_ADDRESS`, `FORUM_SMTP_USER`, `FORUM_SMTP_PASSWORD` | | Mailserver (STARTTLS) |
| `FORUM_SMTP_PORT` | `587` | Valgfri |
| `FORUM_NOTIFICATION_EMAIL` | `forum@seosoft.dk` | Valgfri, ellers `FORUM_SMTP_USER` |
| `FORUM_WORKERS`, `FORUM_DB_SHARED_BUFFERS` | `4`, `512MB` | Valgfri: ca. 2 pr. CPU-kerne og 25 % af den RAM, Discourse må bruge |
4. **Reverse proxy:** Peg `forum.seosoft.dk` på `http://HOST_BIND:FORUM_PORT`. Hostnavnet kan ændres med `FORUM_HOSTNAME`.
5. **Installation:** Kør *Actions → deploy forum → Run workflow*. Første gang tager det 10-15 minutter. Det samme workflow bruges, når `app.yml` eller secrets ændres. Selve Discourse opdateres fra */admin/upgrade*.
6. **Administrator:** Åbn forummet, og opret en bruger med `FORUM_ADMIN_EMAIL`. Den bliver administrator.
7. **Opsætning som kode:** Lav en midlertidig API-nøgle på appserveren:
```
docker exec app su discourse -c 'cd /var/www/discourse && RAILS_ENV=production bundle exec rake api_key:create_master[forum-setup]'
```
Kør derefter:
```
DISCOURSE_URL=https://forum.seosoft.dk DISCOURSE_API_KEY=... \
CONTACT_EMAIL=support@... python3 deploy/forum/configure.py
```
`configure.py` gør følgende:
- sætter forummets titel ("SEOSoft Forum"), beskrivelser, dansk sprog, tags og løste svar (pluginnet `solved` følger med Discourse);
- opretter hovedkategorien *SQLInsight Pro* (`sqlinsight`) og underkategorierne med beskrivelser. Kun medarbejdere kan oprette emner i *Annonceringer*. Andre produkters kategorier røres ikke;
- opretter et velkomstemne og fastgør det i SQLInsight Pro (ikke på hele forummets forside);
- skjuler Discourses engelske standardemne.
Scriptet kan køres igen. Det ændrer kun det, der afviger. Slet API-nøglen bagefter under *Admin → API*.
Uden Forgejo: Eksportér de samme værdier (`FORUM_BIND` i stedet for `HOST_BIND`), og kør `sudo -E deploy/forum/install.sh` på serveren.
**Drift:**
- Opdatering: via */admin/upgrade*. Discourses basisimage opdateres ved at køre `deploy-forum.yml` igen.
- Backup: Discourse tager dagligt backup til `/var/discourse/shared/standalone/backups`. Slå upload til S3 eller kopiering væk fra serveren til under *Admin → Backups*.
- Logge: `./launcher logs app`.
**Forslag til moderation:**
- Lad SEOSoft-medarbejdere have rollen *moderator*.
- Markér det bedste svar som løsning, så svaret kan findes igen.
- Kunder med supportaftale skal bruge mail- eller telefonsupport til sager med kundedata. Forummet er offentligt.
## Community-webstedet
Webstedet er en lille ASP.NET Core-applikation uden database. Det viser:
- **Udgivelser:** Kun udgivelser fra det signerede opdateringsfeed med en gyldig SEOSoft-signatur vises. Webstedet viser altså præcis det, agenterne ville installere, med SHA-256 for hver fil.
- **SQL Server-versioner:** Seneste CU'er og supportstatus, fra den nyeste signerede regelpakke i feedet.
- **Dokumentation:** Filerne i `docs/`, bygget ind i programmet. Links mellem dokumenterne bliver til sider, og links til andre filer i repositoriet går til Forgejo. HTML i Markdown vises ikke.
- **Forum:** De seneste emner fra forummets offentlige `/latest.json`. Hvis forummet er nede, virker webstedet stadig.
`deploy-community.yml` bygger og starter webstedet ved hvert push til `main`, der ændrer kode, dokumentation eller regler. Det bruger disse secrets:
- `HOST_BIND` (findes allerede);
- `COMMUNITY_PORT`: valgfri, standard `8081`;
- `COMMUNITY_CONTACT`: adressen til henvendelser om supportaftaler.
Peg `sqlinsight.seosoft.dk` på `http://HOST_BIND:COMMUNITY_PORT` i reverse proxyen.
Webstedet læser hubbens feed-mappe (`/opt/sqlinsight-hub/data/feed`) direkte og skrivebeskyttet. Download-links går til `https://hub.sqlinsight.seosoft.dk/updates/`. Dermed afhænger webstedet ikke af, at appserveren kan nå sin egen offentlige adresse. Forumemnerne på forsiden hentes derimod fra forummets offentlige adresse. Kan appserveren ikke nå den, vises forsiden bare uden emner.
| Indstilling (`SQLInsight:Community:…`) | Standard | Betydning |
|---|---|---|
| `Feed` | (ingen) | Det signerede opdateringsfeed: en mappe eller en https-adresse. Uden feed vises ingen udgivelser, og versionssiden bruger den indbyggede regelpakke. |
| `DownloadUrl` | `Feed` | Offentlig adresse til download-links, når `Feed` er en mappe eller en intern adresse. |
| `ForumUrl` | (ingen) | Forummets adresse. Bruges til links, `/forum` og de seneste emner. |
| `SourceUrl` | Forgejo-repositoriet | Link til kildekoden og til filer, som dokumentationen henviser til. |
| `ContactEmail` | `salg@example.com` | Adressen på supportsiden. Skal sættes. |
| `TrustedKeys:<id>` | (ingen) | Offentlige nøgler ud over de indbyggede. Brug samme værdi som for agenterne. |
| `CacheFor` | `00:10:00` | Hvor længe feed og forumemner caches. |
Webstedet sender strenge sikkerhedsheadere (CSP uden inline-scripts og -styles, `X-Frame-Options: DENY`). Det har ingen login og gemmer ingen data om besøgende.
Uden Docker: `dotnet publish src/SQLInsight.Community -c Release`. Kør det derefter som en Windows-tjeneste eller en systemd-tjeneste bag IIS, nginx eller Caddy.