# 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.sqlinsight.seosoft.dk` | Discourse på dansk: spørgsmål og svar (med løste svar), installation og drift, performance, regler, idéer og annonceringer. | Alle tre navne (også `hub.sqlinsight.seosoft.dk`) 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.sqlinsight.seosoft.dk` | `app` (Discourse) | `FORUM_PORT` | `deploy-forum.yml`, kun manuelt | 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) 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` | Port på DMZ-adressen | | `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.sqlinsight.seosoft.dk` på `http://HOST_BIND:FORUM_PORT`. 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.sqlinsight.seosoft.dk DISCOURSE_API_KEY=... \ CONTACT_EMAIL=support@... python3 deploy/forum/configure.py ``` `configure.py` gør følgende: - sætter titel, beskrivelser, dansk sprog, tags og løste svar (pluginnet `solved` følger med Discourse); - opretter kategorierne med beskrivelser. Kun medarbejdere kan skrive i *Annonceringer*; - opretter og fastgør et velkomstemne; - 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 kræver tre secrets: - `HOST_BIND` (findes allerede); - `COMMUNITY_PORT`, fx `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:` | (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.