Steg-för-steg guide för att koppla Bjerred Skylt till Firebase
Denna guide beskriver hur du kopplar Bjerred Skylt-projektet till Firebase för att lagra trivselregler och användarfeedback i realtid.
Projektnamn: skylt
Projekt-ID: skylt-e0c45
Console:
console.firebase.google.com/project/skylt-e0c45
Firebase Console - Din projektöversikt för "skylt"
Först måste du registrera en webbapp i ditt Firebase-projekt för att få konfigurationen.
Firebase Project Settings - Så här ser sidan ut
Scrolla ner på Project Settings-sidan! "Your apps" finns längst ner på sidan, under alla andra inställningar.
I "Your apps"-sektionen:
</>
(den tredje ikonen - ser ut som HTML-taggar)
Registrera din webbapp - Ge den ett namn och klicka "Register app"
Firebase Hosting behövs INTE när du redan har GitHub Pages! Firebase Hosting är bara ett alternativt sätt att publicera din webbplats.
Om du kryssade i det av misstag: Ingen fara! Du kan ignorera alla Hosting-relaterade steg. Det påverkar inte Firebase-databasen.
Efter registrering visas ett kodblock med din Firebase-konfiguration:
Här visas din Firebase-konfiguration - Kopiera värdena!
const firebaseConfig = {
apiKey: "AIzaSy...",
authDomain: "skylt-e0c45.firebaseapp.com",
projectId: "skylt-e0c45",
storageBucket: "skylt-e0c45.firebasestorage.app",
messagingSenderId: "123...",
appId: "1:123..."
};
Kopiera värdena för apiKey, messagingSenderId och
appId - du behöver dem i nästa steg (Steg 2).
Efter att du kopierat konfigurationen:
npm install firebase
firebase deploy
Eftersom du använder GitHub Pages för att hosta din webbplats behöver du bara Firebase för databasen (Firestore).
Klicka dig förbi alla Hosting-steg tills du kommer tillbaka till Firebase Console.
Om du behöver hitta konfigurationen igen:
firebaseConfig-objektOm du ser en sida som liknar bilden nedan är din webbapp färdigregistrerad. Grattis! Du befinner dig nu på Project Settings-sidan och kan se din app under "Your apps".
Din webbapp "Bjerreds_skylt" är nu registrerad i Firebase!
På denna sida ser du:
Om du följt guiden har jag redan sparat din konfiguration i filen
firebase-config.js i ditt projekt. Du behöver inte kopiera värdena igen!
Nästa steg: Nu ska vi aktivera Firestore Database - själva databasen där röster och förslag kommer lagras. Fortsätt till Steg 3!
Din Firebase-konfiguration har sparats i filen firebase-config.js:
const firebaseConfig = {
apiKey: "AIzaSyBbAX6EFxbW1VIcSYQ3Zqbr3v733sGMYD8",
authDomain: "skylt-e0c45.firebaseapp.com",
projectId: "skylt-e0c45",
storageBucket: "skylt-e0c45.firebasestorage.app",
messagingSenderId: "653653642598",
appId: "1:653653642598:web:29e332c87fed1cd9f34ca7"
};
Filen index.html har också uppdaterats för att ladda Firebase SDK.
Hoppa direkt till Steg 3!
Nu ska du aktivera själva databasen i Firebase Console. Utan detta steg kan inte appen spara några röster eller förslag!
Nu ser du dialogen "Create a database". Här ska du välja hur säkerhetsreglerna ska fungera från början:
Dialogen "Create a database" - Välj säkerhetsläge för din databas
Dialogen visar två alternativ för "Secure rules for Cloud Firestore":
Rekommendation: Välj "Start in production mode"
Vi kommer ändå att konfigurera egna Security Rules i Steg 5, så det spelar ingen stor roll vilket du väljer. Men "production mode" är säkrare som utgångspunkt.
Efter att du klickat "Next" kommer du till nästa dialog där du ska välja plats (location) för databasen. Ta en skärmdump och fortsätt följa guiden!
Om du hade problem med att välja plats, eller om du hamnade tillbaka på Overview-sidan, är det troligt att databasen ändå skapades! Så här kontrollerar du:
Firebase Console Overview - Din projektöversikt
Du är nu på: https://console.firebase.google.com/u/0/project/skylt-e0c45/overview
På denna sida ser du:
Gör så här för att kontrollera och eventuellt aktivera databasen:
Du kan också gå direkt till: https://console.firebase.google.com/u/0/project/skylt-e0c45/firestore
När du kommer till Firestore Database-sidan finns det två möjligheter:
| Om du ser... | Vad det betyder | Vad du ska göra |
|---|---|---|
| "Create database"-knapp | Databasen är INTE aktiverad ännu | Klicka "Create database" och följ stegen ovan |
| En tom databas med flikar "Data", "Rules", "Indexes" | Databasen ÄR aktiverad! 🎉 | Fortsätt till nästa steg (Security Rules) |
Om "Create database"-dialogen inte fungerar, prova att:
Efter att du valt säkerhetsläge kommer dialogen för att välja plats:
Välj geografisk plats för din Firestore-databas
Rekommenderat för Sverige:
europe-west1 (Belgien) - Närmast Sverige, bäst prestandaeurope-north1 (Finland) - Också bra alternativeurope-west1 i dropdown-listanEfter att du valt plats ser du en bekräftelse om Production Mode:
Bekräftelse av Production Mode-inställningar
När databasen skapats kommer du till Firestore Database-sidan med en tom databas:
Din Firestore Database är nu aktiverad och klar att användas!
Du befinner dig nu på: https://console.firebase.google.com/u/0/project/skylt-e0c45/firestore/databases/-default-/data
Vad du ser på skärmen:
Eftersom du valde "Production mode" är databasen låst som standard. Ingen kan läsa eller skriva till den ännu!
Nästa steg: Vi måste konfigurera Security Rules (Steg 5) för att låta appen läsa och skriva data.
Projektet använder följande collection-struktur som redan är förberedd i
script.js:
| Collection | Dokument-ID | Fält |
|---|---|---|
rules |
rule-1, rule-2, etc. |
textSv (string)textEn (string)icon (string)votes.up (number)votes.down (number)
|
suggestions |
Auto-genererat |
ruleId (string)userName (string)newText (string)timestamp (timestamp)
|
Öppna index.html och lägg till Firebase SDK före
din egen script-tagg (<script src="script.js">).
Lägg till följande rader precis före </body>-taggen:
<!-- =======================================================================
FIREBASE SDK
Lägg till dessa FÖRE script.js
======================================================================= -->
<!-- Firebase App (grundläggande - krävs alltid) -->
<script src="https://www.gstatic.com/firebasejs/10.7.0/firebase-app-compat.js"></script>
<!-- Firebase Firestore (för databas) -->
<script src="https://www.gstatic.com/firebasejs/10.7.0/firebase-firestore-compat.js"></script>
<!-- Firebase konfiguration och initialisering -->
<script>
// Firebase-konfiguration (hämtad från Firebase Console)
const firebaseConfig = {
apiKey: "DIN-API-KEY-HÄR",
authDomain: "skylt-e0c45.firebaseapp.com",
projectId: "skylt-e0c45",
storageBucket: "skylt-e0c45.appspot.com",
messagingSenderId: "DITT-SENDER-ID",
appId: "DITT-APP-ID"
};
// Initiera Firebase
firebase.initializeApp(firebaseConfig);
// Gör Firestore-databasen tillgänglig globalt
const db = firebase.firestore();
console.log("Firebase initierad!");
</script>
<!-- Din egen JavaScript-fil (EFTER Firebase) -->
<script src="script.js"></script>
Ersätt "DIN-API-KEY-HÄR" och de andra platsmarkörerna med
värdena du fick från Firebase Console i Steg 2.
Security Rules bestämmer vem som kan läsa och skriva till din databas. Just nu är databasen helt låst - ingen kan använda den!
Du befinner dig på: https://console.firebase.google.com/u/0/project/skylt-e0c45/firestore/databases/-default-/security/rules
Firebase Security Rules - Här konfigurerar du vem som får läsa och skriva till databasen
På Rules-sidan ser du:
allow read, write: if false;
(blockerar allt)Eftersom du valde "Production mode" innehåller reglerna troligen:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false; // ← Blockerar ALLT!
}
}
}
if false betyder att ingen får läsa eller skriva - databasen är helt stängd!
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Regler för "rules"-collection
// Alla kan läsa, alla kan uppdatera röster
match /rules/{ruleId} {
allow read: if true;
// Tillåt endast uppdatering av votes-fältet
allow update: if request.resource.data.diff(resource.data).affectedKeys()
.hasOnly(['votes']);
}
// Regler för "suggestions"-collection
// Alla kan läsa och skriva förslag
match /suggestions/{suggestionId} {
allow read: if true;
allow create: if request.resource.data.keys().hasAll(
['ruleId', 'userName', 'newText', 'timestamp']
);
}
}
}
Dessa regler tillåter vem som helst att rösta och skicka förslag. För en produktionsmiljö med högre säkerhetskrav, överväg att lägga till rate limiting eller autentisering.
Efter att du klickat "Publish" ser du att reglerna är aktiva:
Security Rules är nu publicerade och aktiva!
Dina nya regler är nu aktiva. Databasen är nu öppen för:
rules-collection
Om du testar att skriva till en collection som inte finns definierad i reglerna
(t.ex. test-collection) får du felet:
❌ FEL: FirebaseError: Missing or insufficient permissions.
De första reglerna vi skapade (i steg 5.3) tillät endast
rules och suggestions collections:
rules-collection → tillåtensuggestions-collection → tillåtentest-collection → INTE definierad = blockerad!För att kunna testa och utveckla fritt uppdaterade vi Security Rules till att tillåta alla collections:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Tillåt alla collections för test och utveckling
match /{document=**} {
allow read, write: if true;
}
}
}
Uppdaterade Security Rules som tillåter alla collections
Med dessa nya regler kan du:
Reglerna allow read, write: if true; är öppna för alla -
vem som helst kan läsa och skriva till din databas!
Innan du går live: Byt tillbaka till mer restriktiva regler som endast tillåter de collections din app behöver.
Du har slutfört alla nödvändiga steg:
firebase-config.jsindex.htmlDatabasen är nu redo att användas!
Öppna din app lokalt och testa:
index.html i webbläsaren (dubbelklicka på filen)
Firebase är initierad! Console visar "Firebase initierad! Projekt: skylt-e0c45"
Om du ser meddelandet "Firebase initierad! Projekt: skylt-e0c45"
i Console betyder det att:
firebase-config.js är korrektNu ska vi verifiera att appen faktiskt kan läsa och skriva till Firestore-databasen. Öppna Console (F12) och kör följande test:
Kopiera och klistra in denna kod i Console, tryck sedan Enter:
// TEST: Skriv testdata till Firestore
db.collection('test').doc('testdoc').set({
message: 'Hej från Bjerred Skylt!',
timestamp: new Date().toISOString()
}).then(() => {
console.log('✅ SUCCESS! Data skriven till Firestore!');
}).catch((error) => {
console.error('❌ FEL:', error);
});
Förväntat resultat: ✅ SUCCESS! Data skriven till Firestore!
Kopiera och klistra in denna kod i Console:
// TEST: Läs testdata från Firestore
db.collection('test').doc('testdoc').get().then((doc) => {
if (doc.exists) {
console.log('✅ SUCCESS! Data läst från Firestore:', doc.data());
} else {
console.log('❌ Dokumentet finns inte');
}
}).catch((error) => {
console.error('❌ FEL:', error);
});
Förväntat resultat: ✅ SUCCESS! Data läst från Firestore: {message: "Hej från Bjerred Skylt!", timestamp: "..."}
Grattis! Frontend och Backend är nu kopplade! Din app kan både läsa och skriva till Firestore-databasen.
Om du ser ❌ FEL: FirebaseError: Missing or insufficient permissions:
test-collectionrules-collection istället
För att feedback från användare ska sparas till Firebase behöver script.js
uppdateras. Funktionen submitFeedback() hanterar all feedback.
script.js har uppdaterats för att spara feedback till Firebase.
Följande ändringar gjordes i submitFeedback()-funktionen:
| Användaraktion | Collection i Firebase | Data som sparas |
|---|---|---|
| "Bra regel!" | feedback_good |
ruleId - Vilken regelruleText - RegeltextenuserName - Användarens namntimestamp - Tidsstämpel
|
| "Byt ut" | suggestions |
ruleId - Vilken regelruleText - Ursprunglig regeltextuserName - Användarens namnnewText - Föreslagen ny texttimestamp - Tidsstämpel
|
I submitFeedback()-funktionen lades följande Firebase-anrop till:
// Spara "Bra regel!"-feedback till Firebase
if (typeof db !== 'undefined') {
db.collection('feedback_good').add({
ruleId: currentRule.id,
ruleText: state.language === 'sv' ? currentRule.textSv : currentRule.textEn,
userName: userName,
timestamp: firebase.firestore.FieldValue.serverTimestamp()
});
}
// Spara "Byt ut"-förslag till Firebase
if (typeof db !== 'undefined') {
db.collection('suggestions').add({
ruleId: currentRule.id,
ruleText: state.language === 'sv' ? currentRule.textSv : currentRule.textEn,
userName: userName,
newText: newRuleText,
timestamp: firebase.firestore.FieldValue.serverTimestamp()
});
}
Gå till: https://console.firebase.google.com/u/0/project/skylt-e0c45/firestore/databases/-default-/data
Där hittar du:
feedback_good - Alla "Bra regel!"-klicksuggestions - Alla "Byt ut"-förslag med ny text
Efter att script.js uppdaterats måste du pusha ändringarna till GitHub
för att GitHub Pages-versionen ska få Firebase-sparning.
En ny fil admin.html har skapats för att visa all feedback som samlats in.
Admin-sidan hämtar och visar:
feedback_goodsuggestionsEn diskret länk (📋-ikon) har lagts till i nedre vänstra hörnet av huvudsidan, bredvid GitHub-länken.
Direkt länk: https://kentlundgren.github.io/Bjerred-skylt/admin.html
| Typ | Information som visas |
|---|---|
| "Bra regel!" | Användarnamn, regelnummer, regeltext, tidsstämpel |
| Ändringsförslag | Användarnamn, ursprunglig regel, föreslagen ny text, tidsstämpel |
Admin-sidan:
firebase-config.js)orderBy('timestamp', 'desc') - nyast förstAdmin-sidan är publik (vem som helst kan se den). Om du vill begränsa åtkomsten kan du senare lägga till Firebase Authentication.
Här ser vi admin-sidan med feedback som samlats in från besökare:
Bilden visar: Admin-sidan med statistik (antal "Bra regel!" och ändringsförslag), samt listan över all feedback med användarnamn, regeltext och tidsstämpel.
Nu när allt fungerar, låt oss förstå hur de olika delarna samarbetar:
┌─────────────────────────────────────────────────────────────────────┐
│ ANVÄNDAREN │
│ (besöker webbsidan) │
└─────────────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ FRONTEND (GitHub Pages) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────────────┐ │
│ │ index.html │ │ styles.css │ │ script.js │ │
│ │ (struktur) │ │ (utseende) │ │ (funktionalitet + Firebase) │ │
│ └─────────────┘ └─────────────┘ └─────────────────────────────┘ │
│ │ │
│ │ firebase.firestore() │
└───────────────────────────────────────────────│─────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────┐
│ BACKEND (Firebase) │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ Firestore Database │ │
│ │ ┌──────────────────┐ ┌──────────────────┐ │ │
│ │ │ feedback_good │ │ suggestions │ │ │
│ │ │ (Bra regel!) │ │ (Byt ut-förslag)│ │ │
│ │ └──────────────────┘ └──────────────────┘ │ │
│ └─────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
script.js fångar klicket och öppnar feedback-modalen.
submitFeedback() anropas.
db.collection('feedback_good').add({...}) skickar data över internet.
.then()-callback körs och visar "✅ Firebase: ..." i console.
admin.html kör loadAllFeedback() automatiskt.
db.collection('feedback_good').orderBy('timestamp', 'desc').get()
Traditionellt behöver man en backend-server (t.ex. Node.js, Python) för att hantera databaser. Firebase är en "Backend-as-a-Service" (BaaS) som eliminerar detta:
Efter testning vill du kanske ta bort all testdata och börja om från början.
Att nollställa databasen tar bort ALL data permanent. Detta kan inte ångras!
Admin-sidan (admin.html) har en "🗑️ Nollställ"-knapp längst ner.
Klicka på den och bekräfta för att ta bort all feedback.
feedback_good)suggestions, test)Öppna Developer Tools (F12) på din sida och kör:
// Ta bort alla dokument i 'feedback_good'
db.collection('feedback_good').get().then(snapshot => {
snapshot.forEach(doc => {
doc.ref.delete();
});
console.log('✅ feedback_good tömd!');
});
// Ta bort alla dokument i 'suggestions'
db.collection('suggestions').get().then(snapshot => {
snapshot.forEach(doc => {
doc.ref.delete();
});
console.log('✅ suggestions tömd!');
});
Firestore har ingen "DELETE ALL"-funktion. Istället måste man:
.get() returnerar alla dokument i en collection.forEach() går igenom varje dokument.delete() tar bort ett dokument i tagetOBS: Om du har väldigt många dokument (tusentals) bör du använda "batch delete" eller Firebase CLI för bättre prestanda.
Nu ska vi lägga till trivselreglerna i databasen. Du kan göra detta manuellt i Firebase Console eller köra ett skript.
rules som Collection IDrule-1Öppna webbläsarens utvecklarverktyg (F12) på din sida och kör följande i Console-fliken:
// Kör detta EN GÅNG för att lägga till alla regler i Firestore
async function initializeRulesInFirestore() {
const rules = [
{
id: 'rule-1',
textSv: 'Bastun är en plats för avkoppling, tala dämpat och njut av stillheten.',
textEn: 'The sauna is a place for relaxation; keep your voice down and enjoy the tranquility.',
icon: 'volume-2',
votes: { up: 0, down: 0 }
},
{
id: 'rule-2',
textSv: 'Badkläder är inte tillåtna i bastun.',
textEn: 'Swimwear is not allowed in the sauna.',
icon: 'droplets',
votes: { up: 0, down: 0 }
},
// ... lägg till resten av reglerna
];
for (const rule of rules) {
await db.collection('rules').doc(rule.id).set({
textSv: rule.textSv,
textEn: rule.textEn,
icon: rule.icon,
votes: rule.votes
});
console.log(`Tillagd: ${rule.id}`);
}
console.log('Alla regler tillagda!');
}
// Kör funktionen
initializeRulesInFirestore();
| Problem | Lösning |
|---|---|
| "firebase is not defined" |
Firebase SDK-skripten måste komma före din kod.
Kontrollera ordningen i <script>-taggarna.
|
| "Permission denied" | Security Rules blockerar åtkomst. Kontrollera att du publicerat reglerna i Steg 5. |
| "Invalid API key" | Dubbelkolla att du kopierat rätt API-nyckel från Firebase Console. |
| Data sparas inte |
Öppna Console (F12) och leta efter felmeddelanden.
Kontrollera att db är definierad.
|