# Hvis du vil skrive Fællesrum selv

Denne opskrift beskriver en selvstændig udgave af Fællesrum. Giv den til en kodeagent eller brug den som teknisk arbejdsgrundlag. Vælg selv sprog, biblioteker og design. Opskriften er en funktionsbeskrivelse, ikke en udgivelse af Fællesrums private kildekode eller en kompatibilitetsgaranti.

## Formål og afgrænsning

Et lille kontor har en fælles mappe på godkendte Linux-, macOS- og Windows-computere. Filer åbnes i almindelige programmer og ligger lokalt, også uden netforbindelse. En selvhostet Linux-server samordner ændringerne. Brugeren skal kunne se forbindelsesstatus, seneste synkronisering og fejl i et lokalt dashboard.

Byg først en pålidelig synkronisering. Deling, modtagelse, godkendelse og websitebygning kan tilføjes som adskilte moduler med egne rettigheder. En valgfri komponent må ikke gøre den fælles mappe utilgængelig.

## Filmodel og serverdata

- Serveren opbevarer de delte bytes, et indeks med sti, størrelse, hash og monoton generation samt registrerede computere og deres rettigheder. Et transaktionssikkert indeks kan være SQLite.
- Hver computer opbevarer en privat identitet, et token, serveradresse, lokal mappesti og den generation og de filhashes, den sidst har afstemt. Tokenet må ikke ligge i den synkroniserede mappe.
- Gem filer under en særskilt serverdatamappe. Hold publicerede delinger, modtagne filer, metadata, konfiguration og log adskilt. Dokumentér præcis, hvilke mapper der skal sikkerhedskopieres samlet.
- Normalisér stier konsekvent på alle platforme. Afvis absolutte stier, `..`, symbolske links ud af roden og platformsspecifikke specialnavne. Håndtér Unicode, bogstavkasse og filer, der er låst af et program, uden at skrive uden for den valgte mappe.
- Behandl mapper og pakkemapper som hierarkier. Et `.pages`-dokument kan være en mappe, som skal synkroniseres samlet uden at eksponere ufærdige dele.

## Synkronisering

Klienten registrerer stabile lokale ændringer, uploader dem over HTTPS og henter serverens ændringer siden seneste generation. Skriv modtagne filer til en midlertidig fil, verificér hash og flyt dem atomisk på plads. Store filer bør kunne overføres i afgrænsede dele og fortsættes efter afbrudt forbindelse.

En upload angiver hash eller generation for den udgave, brugeren redigerede. Serveren accepterer ændringen, når den stadig er aktuel. Hvis en anden computer allerede har gemt samme sti, afviser serveren overskrivningen. Klienten beholder sin lokale udgave under et nyt konfliktfilnavn, henter den gældende fil til den oprindelige sti og uploader konfliktkopien som en ny fil. Begge udgaver skal kunne læses. En fil, der stadig er låst, bliver på computeren og forsøges igen senere.

En sletning er også en ændring med forudsætning om seneste kendte udgave. Log hvem og hvornår. Bevar en serverbackup; synkronisering er ikke versionshistorik eller backup. Klienten må aldrig slette egne usynkroniserede ændringer uden en tydelig beslutning fra brugeren.

## Adgang og lokal brugerflade

En ny computer anmoder om adgang med navn og identitet. Administratoren godkender den i serverens administration eller giver en engangskode. Serveren udsteder et separat token pr. computer og opbevarer kun en sikker afledning af tokenet. Alle private ruter kræver godkendelse. En administrator kan stoppe computerens adgang med det samme; gamle administratorsessioner lukkes.

Det lokale dashboard skal have faste, genfindelige adresser, vise serveradresse og port, forbindelsesstatus, version og log og give adgang til opsætning. Det skal tydeligt vise, når et link fører til serverens fælles administration. Rettigheder styrer, hvilke applikationer og filer der overhovedet vises.

Kun computere med særskilt website- eller administratorrettighed modtager `Websites/`. Serveren filtrerer både ændringslisten og direkte filhentning. Når rettigheden fjernes, stopper serveren nye bytes; klienten fjerner sin lokale websitekopi ved næste kontakt. En offline computer kan ikke ryddes med det samme. Data, som allerede er kopieret uden for Fællesrum, kan ikke trækkes tilbage.

En særskilt handling kan sende en rydningsordre til én tilbagekaldt computer. Den skal kræve en ekstra bekræftelse, være bundet til computerens godkendte mappesti, afvise symbolske links ud af roden og kvittere med resultatet. Ordren må aldrig blive en synkroniseret sletning hos de andre. Vis "afventer kontakt", indtil klienten faktisk svarer.

## Deling, modtagelse og godkendelse

Administratoren vælger en synkroniseret mappe, gennemser det indhold som bliver synligt, og opretter et eksternt downloadlink. Linket viser undermapper som kort, billedforhåndsvisning, enkeltfiler og samlet ZIP. Senere ændringer i mappen bliver synlige på samme link. Linket kan lukkes straks. En valgfri firecifret PIN giver kun en enkel ekstra barriere; hemmelige eller særligt følsomme data kræver en stærkere løsning.

Et modtagelink tillader upload til en bestemt mappes `Indsendt/` uden ret til at læse, overskrive eller liste øvrige filer. Nye navnekollisioner løses uden overskrivning. Sæt grænser for antal filer, filstørrelse, samlet størrelse, hyppighed og diskforbrug. Modtagne filer synkroniseres til de godkendte computere. De bliver ikke automatisk offentlige via et downloadlink.

Et godkendelseslink er knyttet til en bestemt dokumentgeneration og hash. Modtageren kan godkende eller kommentere. Gem svar, selvangivet navn og tidspunkt. Når dokumentet ændres, kræves en ny vurdering. Beskriv ikke dette som en juridisk underskrift, da modtagerens navn ikke er verificeret.

## Websites som valgfri applikation

Under `Websites/<site-id>/` ligger kilden til hvert site. En mappe kan repræsentere en side; systemmapper rummer model, design og navigation. Websiteberettigede computere kan bidrage gennem deres lokale filer og åbne en editor på serveren. Editorens ændringer skrives gennem det samme filindeks, så de når de øvrige berettigede computere.

Byg et statisk site fra et stabilt snapshot. Vis byggefejl uden at erstatte den senest fungerende forhåndsvisning. Hold privat forhåndsvisning, administrationsruter og offentlige statiske filer adskilt. Serveren kan bruge en udskiftelig renderer som Ele Pages. Publicér først til en standardadresse, dernæst eventuelt til et eget domæne efter DNS-kontrol og HTTPS-opsætning. Et redigeret domæne i en synkroniseret fil må ikke alene aktivere Nginx.

## Installation, opdatering og drift

Udgiv versionsstyrede pakker til de understøttede klientplatforme og Linux-serveren. Dokumentér installation, opstart ved login, serverens systemtjeneste, HTTPS-proxy og nødvendige porte. Klienten skal kunne vise sin version og serverens version. Opdateringsmetadata bør signeres; klienten kontrollerer signatur, filstørrelse og hash før installation. Brug gerne en reserveadresse til manifest og pakker. En opdatering skal kunne fejle uden at ødelægge den fungerende installation.

Tag en konsistent backup af serverens filer, indeks, publiceringer og konfiguration fra samme tidspunkt. Beskriv geninstallation af den tilsvarende programversion på en ren Linux-server. Afprøv selve genskabelsen på en isoleret server. Klienternes lokale filer er ekstra kopier, men de erstatter ikke metadata om computere, rettigheder, links og historik.

## Acceptprøver

- To godkendte computere får samme filbytes og hash efter oprettelse, redigering, omdøbning og sletning. En tredje computer kan arbejde offline og indhente ændringer senere.
- To samtidige redigeringer af samme sti efterlader begge filudgaver intakte. En sletning baseret på en forældet generation må ikke slette en nyere udgave.
- En ikke-godkendt computer får ingen private filer. En computer uden website-rettighed får ingen `Websites/`-stier gennem liste eller direkte download; ved tab af rettighed forsøger dens klient at rydde den lokale kopi.
- Tilbagekaldelse stopper adgang straks. En rydningsordre til én computer påvirker ikke serverens eller andre computeres filer og markeres først gennemført efter kvittering.
- Et lukket delings-, modtage- eller godkendelseslink virker ikke længere. En ekstern upload kan kun lande i `Indsendt/` og kan ikke liste den fælles mappe.
- En godkendelse gælder kun den dokumentgeneration, som modtageren fik vist. En ny generation viser behov for ny godkendelse.
- En mislykket websitebygning bevarer sidste fungerende visning. Et offentligt site serverer kun de færdige statiske filer, ikke kilder eller servermetadata.
- En ren server kan genskabes fra én konsistent backup og den dokumenterede programversion. Filer, rettigheder og linkstatus kontrolleres mod backupgrundlaget.

Den offentlige Fællesrum-udgave beskrives på https://faellesrum.dags.dk/. Denne opskrift er et grundlag for en ny implementering og giver ikke adgang til Fællesrums private kildekode.
