Alternativ till Calendly på egen server: Easy!Appointments och Rallly jämförda

Easy!Appointments och Rallly på samma server med Debian 13, testade med två anställda i Stockholm, ett möte på 30 och ett på 60 minuter, bokningar från New York över bytet till vintertid, mejl med kalenderfiler, CalDAV, Jitsi-länkar, webhooks, svenska och radering av en kunds uppgifter, bredvid det Calendly erbjuder. Och varför Cal.com inte är med.

Testad på Easy!Appointments 1.6.0 och Rallly 4.15.4 på Debian 13 (trixie) på en server hos Melonslab Uppdaterad 14 oktober 2026

Rekommenderad server för guiden

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy · 2 vCPU · 8 GB Minne · 60 GB Lagring

Månadsvis, ingen bindningstid 7 dagars öppet köp

100 kr/mån

Beställ nu
På den här sidan

Det korta svaret

Vill du ha en bokningssida som Calendlys, där kunder väljer en ledig tid hos någon av dina anställda, ska du välja Easy!Appointments. Den fick alla tider rätt över bytet till vintertid, synkade med våra CalDAV-kalendrar, lade en Jitsi-länk och en kalenderfil i varje mejl, pratar svenska med kunderna och använde omkring 150 MB. Men den har ingen buffert mellan möten, inga påminnelser via mejl, inga möten med flera värdar och ett gränssnitt som känns gammalt.

Välj Rallly bara för den andra halvan av Calendly: att hitta en tid som passar en grupp, som Calendlys mötesomröstningar. Det gjorde den bra, på svenska och över tidszoner, men den är ingen bokningssida, och på egen server har den inget API, inga webhooks och ingen kalendersynk.

Cal.com är inte en av de två: den 14 oktober 2026 publicerar ingen en underhållen avbild av den att köra själv.

Cal.com och Cal.diy i oktober 2026

Cal.com är det mest kända alternativet till Calendly med öppen källkod, och det många letar efter först. Det här hittade vi den 14 oktober 2026:

  • Cal.com har flyttat sin öppna kod till en version för communityn som heter Cal.diy, under MIT-licensen, utan team, organisationer, arbetsflöden, statistik och single sign-on. Det gamla calcom/cal.com på GitHub leder nu till calcom/cal.diy, som fortfarande får ändringar; den senaste vi såg var från den 26 september 2026.
  • Den senaste versionen är v6.2.0, från den 1 mars 2026, och den senaste avbilden är calcom/cal.com:v6.2.0, publicerad den 2 mars 2026. calcom/cal.diy på Docker Hub har inga avbilder alls. Projektets eget bygge av avbilden misslyckades de tre senaste gångerna det kördes, mellan den 20 och 26 september 2026.
  • Ett ärende som heter "Docker Image Missing" har varit öppet på GitHub sedan den 24 april 2026. I september berättade en användare att det tog omkring 36 minuter och 6,5 GB minne att bygga avbilden från källkoden i stället.
  • Cal.diys README säger att den rekommenderas "strictly … for personal, non-production use", och att du för "commercial and enterprise-ready scheduling infrastructure" ska använda Cal.com, antingen hos företaget eller som "on-prem enterprise access" via deras säljare.

En avbild som inte har fått säkerhetsuppdateringar på sju månader vill vi inte lägga en bokningssida för kunder på, så vi testade inte Cal.com här. Kommer det en avbild av Cal.diy tittar vi igen.

Det här testade vi

Vi installerade båda på samma nya Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13, under var sin användare, bakom samma Caddy. Vi har inga guider för någon av dem än, så vi körde projektens officiella avbilder på samma sätt som i våra guider: Quadlet-enheter, databasen i samma pod, lösenord som Podman-hemligheter och Caddy framför. Så körde vi Easy!Appointments och Så körde vi Rallly visar filerna.

Sedan satte vi upp samma företag i båda, Exempel AB:

  • två anställda: Anna Lind, som jobbar måndag till fredag 9–17, och Erik Lund, måndag till torsdag 10–16, båda med lunch 12–13, svensk tid;
  • ett Intro call på 30 minuter och en Consultation på 60 minuter, med fyra timmars framförhållning;
  • en kalender var för dem i Radicale, en CalDAV-server på samma maskin, med en tandläkartid i Annas;
  • mejl till en lokal testserver för e-post.

Kunder bokade från webbläsare utan fönster, inställda på New York-, Los Angeles- och svensk tid, på datum på båda sidor om den 25 oktober 2026, när Sverige går över till vintertid, och den 1 november 2026, när USA gör det. De bokade om, avbokade och raderade sina egna uppgifter. Vi bäddade in bokningssidan på en enkel HTML-sida, bytte båda till svenska, startade om servern, mätte minnet i vila och under användning, och gjorde en säkerhetskopia av båda som vi sedan återställde.

Calendly testade vi inte. Vi skapade inget konto. Det sidan säger om Calendly kommer från Calendlys egna sidor, som vi länkar till där vi använder dem och läste den 14 oktober 2026.

Siffrorna

Easy!Appointments 1.6.0Rallly 4.15.4
Vad det ärEn bokningssida: kunden bokar en tid hos en personOmröstningar: deltagarna röstar på tider, du väljer en
Containrar2: Easy!Appointments med Apache och PHP 8.2, MariaDB 11.82: Rallly på Node.js, PostgreSQL 18
Minne i vila efter omstart145 MB (MariaDB 128, appen 17)305 MB (Rallly 300, PostgreSQL 5)
Minne som mest under användning208 MB761 MB
Avbilder på disk0,97 GB1,34 GB
Data efter testet171 MB, nästan allt MariaDB:s egna filer69 MB
Från useradd till en sida som svarar58 sekunder68 sekunder
Rätt tider över bytet till vintertidjaja
Buffert mellan mötennejinte aktuellt
Framförhållningja, en inställning för alltinte aktuellt
Kalenderfil i mejlenjaja, när du väljer den slutliga tiden
Påminnelser via mejlnejnej
Round robin"Any provider": den som har mest ledig tid den dagennej
CalDAV-synkja, åt båda hållennej
Webhooks och APIja, gratisinte på egen server
Bädda in på din webbplatsja, med en ändrad header i Caddynej
Svenskabokningssidan, mejl till kunder, gränssnittet för personalenallt
Användareobegränsaten gratis, fler kräver licens
LicensGPL 3.0AGPL 3.0, plus en betald licens för fler användare

Minnet är summan av varje apps containrar, mätt med podman stats fem minuter efter en omstart. Toppen är det högsta värdet medan vi i tre minuter skickade omkring sex anrop i sekunden till Easy!Appointments, mest för att hämta lediga tider, och fyra i sekunden till Rallly, mest för att öppna en omröstning. Tiderna är hur lång tid kommandona tog att köra, mest nedladdning av avbilder, inte den tid du behöver för att läsa och skriva dem.

Installation

Easy!Appointments är en container med Apache och PHP och en MariaDB-databas. Avbilden görs av projektets upphovsman. Två saker förvånade oss:

  • Den första besökaren får en installationssida som skapar administratörskontot. Easy!Appointments har också ett kommando för det, som vi körde innan Caddy var på plats, men det skapar administratören administrator med lösenordet administrator, plus en exempelutförare, en exempelkund och en exempeltjänst. Vi bytte ut administratören via API:et innan sidan gick ut på nätet och raderade exemplen.
  • Avbilden kommer med Xdebug, ett felsökningsverktyg för PHP, påslaget. Vi stängde av det med XDEBUG_MODE=off.

Rallly är en Node.js-container och en PostgreSQL-databas. Projektets egen installation använder ett skript som också kör Traefik och Garage, för HTTPS och fillagring; bakom Caddy behövde vi inget av dem. Rallly har inga lösenord från början: du loggar in med en sexsiffrig kod som skickas med mejl, så utan fungerande e-post kommer ingen in. Vem som helst med en mejladress kan skapa ett konto om du inte begränsar det; med ALLOWED_EMAILS=*@example.com svarade Rallly "This email address is not allowed" till alla andra.

Bokningssidor, arbetstider och regler

I Easy!Appointments är en mötestyp en tjänst med en längd, och varje anställd är en utförare med ett schema för veckan, raster och undantag som helgdagar. Kunden väljer tjänst, utförare eller Any Provider, dag och tid, fyller i namn, mejl och telefonnummer, och bekräftar. Sidan är enkel.

  • Framförhållningen är en inställning för hela webbplatsen, i minuter. Med 240 minuter var den tidigaste tiden samma dag 14:00 när klockan var 9:45.
  • Hur långt fram man kan boka är också en inställning, 90 dagar från början.
  • Buffert finns inte: två möten kan ligga direkt efter varandra. Det närmaste är slot interval, som bara glesar ut starttiderna som erbjuds.
  • Raster fungerade: ingen kunde boka Anna eller Erik mellan 12 och 13.

Rallly har ingen bokningssida. Du skapar en omröstning med några möjliga tider och delar en länk, deltagarna röstar ja, om det behövs eller nej, och du väljer den slutliga tiden. Arbetstider, framförhållning och buffert finns inte där.

Tidszoner och sommartid

Det är här bokningsverktyg oftast gör fel, så vi kontrollerade det noga. Sverige gick över till vintertid den 25 oktober 2026 och USA den 1 november, så under en vecka låg New York fem timmar efter Stockholm i stället för sex.

Easy!Appointments visade en webbläsare i New York dess egen tid, med en lista för att byta tidszon. Den 20 oktober visades Annas 9:00 som 03:00, den 26 oktober som 04:00 och den 2 november som 03:00 igen. Mary i New York bokade Erik klockan 05:00 den 26 oktober, och det hamnade i hans kalender klockan 10:00, med 09:00 UTC i kalenderfilen, vilket är rätt. Hennes mejl visade 05:00 och Eriks 10:00. Det enda felet: sammanfattningen och mejlen skriver zonerna med deras vintertidsavstånd, "New_York (-5:00)" och "Stockholm (+1:00)", även i oktober, när de ligger fyra timmar efter och två före. Själva tiderna var rätt.

Rallly visade varje deltagare omröstningen i deras egen tidszon: Annas 12:00 den 23 oktober var 6:00 AM i New York och 3:00 AM i Los Angeles, och den 26 oktober 7:00 AM och 4:00 AM. Mejlet till Mary när Anna valde tiden sa "7:00 – 8:00 AM EDT", och kalenderfilen 11:00 UTC. Allt rätt.

Mejl, kalenderfiler och påminnelser

Easy!Appointments mejlade kunden, utföraren och administratören vid varje bokning, ändring och avbokning. Mejlen om bokningar och ändringar hade en kalenderfil, invitation.ics, med rätt tid, Jitsi-länken och en länk för att boka om eller avboka. Mejlen om avbokning hade ingen kalenderfil, så en kund som lagt in mötet i sin kalender måste ta bort det själv. Påminnelser via mejl finns inte: kalenderfilen har två påminnelser, men som larm som kundens kalenderapp ska visa, inte mejl som Easy!Appointments skickar.

Rallly mejlade Anna varje gång någon röstade, tackade varje deltagare, och när hon valde tiden fick alla "Date booked for Planning meeting" med invite.ics. Påminnelser finns inte här heller.

Ingen av dem skickar sms.

Boka om och avboka

Varje mejl från Easy!Appointments har en länk där kunden kan välja en annan tid eller avboka. Mary flyttade sitt möte från 05:00 till 08:00 New York-tid; utföraren och administratören fick mejl, mötet flyttades i Eriks CalDAV-kalender och webhooken anropades. John avbokade med en anledning, och mötet försvann ur Annas kalender. En avbokad bokning raderas, den sparas inte som avbokad.

I Rallly kan deltagarna ändra eller ta bort sina röster från samma webbläsare, via menyn bredvid sitt namn. När du har valt den slutliga tiden går inget att ändra: mötet kan inte flyttas eller ställas in från Rallly.

Team och round robin

Easy!Appointments har utförare, sekreterare som bokar åt utförare, och administratörer, utan gräns för antalet användare. Any Provider på bokningssidan visar de lediga tiderna för alla som erbjuder tjänsten, och ger bokningen till den utförare som har mest ledig tid den dagen. Det är lastfördelning, inte en strikt turordning. Ett möte med flera anställda samtidigt går inte; en tjänst kan däremot ta flera kunder på samma tid, för gruppass.

Rallly är gratis för en användare. När Erik loggade in fick han ett eget utrymme och en banner: "Du har överskridit gränserna för din licens. Vänligen uppgradera." Det fungerade ändå, eftersom Rallly enligt sin licenssida bygger på hederssystem, men från och med då såg Anna samma banner. Anna kunde inte bjuda in honom till sitt utrymme: "No seats available".

Kalendersynk

Easy!Appointments synkar med Google Kalender eller en CalDAV-kalender, som varje utförare väljer under Calendar > Enable Sync. Nya bokningar hamnade i Annas och Eriks kalendrar i Radicale, ändringar flyttade dem och avbokningar tog bort dem. Annas tandläkartid lästes in som upptagen: hennes 10:00–11:30 den 20 oktober erbjöds inte längre. Easy!Appointments läser kalendern när någon väljer Synchronize, eller när kommandot sync körs; våra filer kör det var 15:e minut.

Två saker att känna till:

  • Easy!Appointments vägrar CalDAV-adresser som pekar på servern själv eller ett privat nät: "Could not establish server connection." Det finns ett undantag, för en server som heter baikal via vanlig HTTP, som utvecklarna använder när de testar; vi använde det namnet för att nå Radicale på samma maskin. Det den räknar med är en kalender på en annan server, på dess vanliga https-adress. Det testade vi inte.
  • Lösenordet till CalDAV sparas i klartext i databasen. Använd ett applösenord om din kalender har sådana.

Google Kalender kräver ett projekt i Google Cloud med dess nycklar i inställningarna. Kalendrar i Microsoft 365 och Outlook har ingen inbyggd synk; CalDAV är vägen om din leverantör erbjuder det. Vi testade varken Google eller Microsoft.

Rallly på egen server har inga kalenderkopplingar. Knappen Add to calendar och kalenderfilen i mejlet är det som får in mötet i en kalender.

Videolänkar

Easy!Appointments har en Jitsi-inställning under Settings > Integrations. När den var på fick varje bokning ett eget rum, som https://meet.jit.si/9422f4eb5d1830c0, i mejlet, kalenderfilen och webhooken. Adressen meet.jit.si står i koden; vill du använda din egen Jitsi-server skriver du i stället en fast rumsadress under varje tjänsts Location. Med synk mot Google Kalender kan den också skapa länkar till Google Meet. Zoom och Teams finns inte.

I Rallly skriver du videolänken under omröstningens Location, och den följer med i det sista mejlet och kalenderfilen. Ralllys tjänst på nätet kan skapa länkar till Zoom, Teams, Google Meet och Webex; på vår server hittade vi inget sådant val.

Webhooks och API

Easy!Appointments har båda, gratis. En webhook för nya, ändrade och raderade bokningar, kunder och annat skickade JSON till vår testmottagare inom en sekund, med en fast token i en header vi valde, inte en signatur. Tiderna i den, "start_datetime":"2026-10-26 10:00:00", är utförarens lokala tid utan tidszon. REST-API:et, med en API-nyckel eller en administratörs lösenord, listade bokningar och lediga tider; det beskrivs i en OpenAPI-fil i projektet.

Rallly har API och webhooks i sin Pro-plan på nätet, men koden slår bara på dem när den inte körs på egen server. På vår server svarade sidorna för dem 404.

Bädda in på din webbplats

Easy!Appointments skickar X-Frame-Options: SAMEORIGIN, så en <iframe> på en annan webbplats förblir tom. När vi tog bort headern i Caddy och i stället angav vår sida i en frame-ancestors-regel visade en enkel HTML-sida på ett annat namn i samma domän bokningssidan, och en bokning gjord i den gick igenom. Kakorna är SameSite=Lax, så på en webbplats med en annan domän räknar vi med att bokningen misslyckas; det testade vi inte. En vanlig länk till bokningssidan fungerar alltid.

Rallly tillåter inte att bäddas in, med frame-ancestors 'none'. Länka till omröstningen i stället.

Svenska

Easy!Appointments visade bokningssidan på svenska för en webbläsare inställd på svenska, från "Välj tjänst och utförare" till "Din bokning är sparad", och Karin fick sitt mejl på svenska: "Din tid är nu bokad". Några ord stod kvar på engelska: "Booked" och "Reschedule / Cancel Appointment" i mejlet, och "Powered By" längst ned. Personalen väljer Svenska under sitt konto och får då gränssnittet och sina egna mejl på svenska, som "En ny bokning har lagts till i ditt schema". Namnen på dina tjänster står som du skriver dem.

Rallly följde också webbläsaren: Karin såg "Svarsalternativ", "Ja", "Om det behövs" och "Nej", och fick "Tack för att du svarade på Planning meeting" och "Datum bokat för Planning meeting". Varje mejl gick ut på språket hos den som fick det.

Radera en kunds uppgifter

Enligt GDPR kan en kund be dig radera det du har om dem.

  • Easy!Appointments har en inställning, Delete Personal Information, som lägger en röd knapp för radering på kundens sida för ombokning. När Mary använde den togs hennes kunduppgifter och bokning bort ur databasen, utan mejl och utan webhook. Men mötet låg kvar i Eriks CalDAV-kalender, med hennes namn, mejladress och telefonnummer i beskrivningen, så ta bort det där för hand. Du kan också radera en kund under Customers, och kommandot cleanup raderar kunduppgifter som är äldre än ett antal dagar du anger under Legal Contents.
  • Rallly lät Mary ta bort sin egen röst, och då försvann hennes rad. Raderar du en hel omröstning markeras den bara som raderad; Rallly tar bort sådana efter sju dagar, men bara om något anropar dess adress för städning, vilket dokumentationen för egen server inte nämner. Våra filer ordnar det. Även då låg det slutliga mötet och namn och mejladresser för alla inbjudna kvar i databasen. Att ta bort dem krävde SQL.

Resurser

Båda är små på en server med 8 GB. Easy!Appointments låg runt 150 MB, mest MariaDB, och nådde bara 208 MB under användning. Rallly använde omkring 300 MB i vila och växte till 761 MB när fyra personer i sekunden öppnade en omröstning; tre minuter senare låg den kvar på omkring 700 MB.

Uppdateringar och säkerhetskopior

Easy!Appointments kommer med en eller två versioner om året; 1.6.0 kom den 27 maj 2026, och 1.6.1 fanns som beta. Avbilden byggs en gång per version på PHP 8.2 och byggs inte om däremellan, så systemuppdateringar kommer bara med nya versioner. Vi låste versionen och uppdaterar genom att byta tagg; nya versioner uppdaterar databasen med kommandot migrate. Rallly kommer med en ny version varannan vecka eller oftare; taggen 4.15 får rättningarna via podman auto-update, och databasen uppdateras av sig själv när containern startar.

Varje säkerhetskopia är en dump av databasen: 31 kB för Easy!Appointments och 104 kB för Rallly i vårt test. Vi återställde båda i tomma volymer, och bokningar, omröstningar och röster kom tillbaka. Båda startade av sig själva efter en omstart, och alla förblev inloggade.

Så körde vi Easy!Appointments

Projektets Docker-avbild hämtar sina inställningar från miljövariabler och skriver in dem i en PHP-fil när den startar. Därför går den sönder av ett lösenord som innehåller '; de nedan gör aldrig det. Som root:

useradd -m -s /bin/bash easyappointments
loginctl enable-linger easyappointments
machinectl shell easyappointments@

Som easyappointments skapar du hemligheterna:

openssl rand -hex 24 | tr -d '\n' | podman secret create easyappointments-db-password -
printf %s 'your-smtp-password' | podman secret create easyappointments-smtp-password -

I ~/.config/containers/systemd, easyappointments.pod:

[Pod]
PodName=easyappointments
PublishPort=127.0.0.1:8151:80

[Install]
WantedBy=default.target

easyappointments-db.container:

[Container]
ContainerName=easyappointments-db
Image=docker.io/library/mariadb:11.8
Pod=easyappointments.pod
Volume=easyappointments-db:/var/lib/mysql
Environment=MARIADB_DATABASE=easyappointments MARIADB_USER=easyappointments MARIADB_RANDOM_ROOT_PASSWORD=1 MARIADB_AUTO_UPGRADE=1
Secret=easyappointments-db-password,type=env,target=MARIADB_PASSWORD
HealthCmd=healthcheck.sh --connect --innodb_initialized
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

easyappointments-app.container:

[Unit]
Requires=easyappointments-db.service
After=easyappointments-db.service

[Container]
ContainerName=easyappointments-app
Image=docker.io/alextselegidis/easyappointments:1.6.0
Pod=easyappointments.pod
Volume=easyappointments-storage:/var/www/html/storage
Environment=BASE_URL=https://book.example.com LANGUAGE=english DEBUG_MODE=FALSE XDEBUG_MODE=off
Environment=DB_HOST=127.0.0.1 DB_NAME=easyappointments DB_USERNAME=easyappointments
Environment=MAIL_PROTOCOL=smtp MAIL_SMTP_HOST=smtp.example.com MAIL_SMTP_PORT=587 MAIL_SMTP_CRYPTO=tls MAIL_SMTP_AUTH=TRUE
Environment=MAIL_SMTP_USER=book@example.com MAIL_FROM_ADDRESS=book@example.com MAIL_FROM_NAME=Bookings MAIL_REPLY_TO_ADDRESS=book@example.com
Secret=easyappointments-db-password,type=env,target=DB_PASSWORD
Secret=easyappointments-smtp-password,type=env,target=MAIL_SMTP_PASS

[Service]
Restart=always

Volymen för lagring håller sessionerna, så att alla förblir inloggade efter en omstart. I vårt test gick mejlen till en lokal testserver för e-post i stället för en leverantör; vi skickade inte via en riktig. För testet av CalDAV med Radicale på samma server lade vi också till AddHost=baikal:host-gateway i podfilen, som Kalendersynk förklarar.

I ~/.config/systemd/user läser easyappointments-sync.service in utförarnas kalendrar och städar:

[Unit]
Description=Easy!Appointments calendar sync and cleanup

[Service]
Type=oneshot
ExecStart=podman exec -u www-data easyappointments-app php index.php console sync
ExecStart=podman exec -u www-data easyappointments-app php index.php console cleanup

Och easyappointments-sync.timer:

[Timer]
OnCalendar=*:0/15
Persistent=true

[Install]
WantedBy=timers.target

Starta allt och installera databasen. console install tömmer databasen först, så kör det bara en gång:

systemctl --user daemon-reload
systemctl --user start easyappointments-pod
systemctl --user enable --now podman-auto-update.timer easyappointments-sync.timer
podman exec -u www-data easyappointments-app php index.php console install

Det skapar administratören administrator med lösenordet administrator. Byt ut båda via API:et innan sidan är ute på nätet, med dina egna uppgifter och ett långt lösenord:

curl -s -u administrator:administrator -X PUT -H 'Content-Type: application/json' \
  http://127.0.0.1:8151/index.php/api/v1/admins/1 \
  -d '{"firstName":"Anna","lastName":"Andersson","email":"anna@example.com","phone":"+46700000000","timezone":"Europe/Stockholm","language":"swedish","settings":{"username":"anna","password":"a-long-password-of-your-own","notifications":true,"calendarView":"default"}}'

Blocket i Caddys ~/Caddyfile. De två header-raderna behövs bara för att bädda in bokningssidan på www.example.com:

book.example.com {
    reverse_proxy 127.0.0.1:8151 {
        header_down -X-Frame-Options
    }
    header Content-Security-Policy "frame-ancestors 'self' https://www.example.com"
}

Logga sedan in på https://book.example.com/index.php/login, radera exempelutföraren Jane Doe, exempelkunden James Doe och exempeltjänsten under Users, Customers och Services, och ange företagets namn, tidszon och första veckodag under Settings.

För en säkerhetskopia kör du podman exec easyappointments-db sh -c 'mariadb-dump -u easyappointments -p"$MARIADB_PASSWORD" --single-transaction easyappointments' > easyappointments.sql. Allt finns i databasen. För att återställa stoppar du podden, tar bort volymen easyappointments-db, startar bara easyappointments-db, läser in dumpen med podman exec -i easyappointments-db sh -c 'mariadb -u easyappointments -p"$MARIADB_PASSWORD" easyappointments' < easyappointments.sql och startar podden. För att uppdatera byter du 1.6.0 i Image=, startar om easyappointments-app och kör podman exec -u www-data easyappointments-app php index.php console migrate.

Så körde vi Rallly

Ralllys egen installation är ett skript med Docker Compose. Vi körde avbilden lukevella/rallly direkt, med inställningarna den dokumenterar. Utan fillagring går det inte att ladda upp en profilbild eller en logotyp för utrymmet; inget annat vi testade behövde den. Som root skapar du användaren rallly på samma sätt som easyappointments ovan. Som rallly skapar du hemligheterna:

pw=$(openssl rand -hex 24)
printf %s "$pw" | podman secret create rallly-db-password -
printf 'postgres://rallly:%s@127.0.0.1:5432/rallly' "$pw" | podman secret create rallly-database-url -
unset pw
openssl rand -hex 32 | tr -d '\n' | podman secret create rallly-secret -
openssl rand -hex 32 | tr -d '\n' | podman secret create rallly-cron-secret -
printf %s 'your-smtp-password' | podman secret create rallly-smtp-password -

I ~/.config/containers/systemd, rallly.pod:

[Pod]
PodName=rallly
PublishPort=127.0.0.1:8153:3000

[Install]
WantedBy=default.target

rallly-db.container:

[Container]
ContainerName=rallly-db
Image=docker.io/library/postgres:18-alpine
Pod=rallly.pod
Volume=rallly-db:/var/lib/postgresql
Environment=POSTGRES_USER=rallly POSTGRES_DB=rallly
Secret=rallly-db-password,type=env,target=POSTGRES_PASSWORD
HealthCmd=pg_isready -U rallly
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

rallly-app.container:

[Unit]
Requires=rallly-db.service
After=rallly-db.service

[Container]
ContainerName=rallly-app
Image=docker.io/lukevella/rallly:4.15
Pod=rallly.pod
Environment=NEXT_PUBLIC_BASE_URL=https://poll.example.com
Environment=SUPPORT_EMAIL=anna@example.com INITIAL_ADMIN_EMAIL=anna@example.com
Environment=SMTP_HOST=smtp.example.com SMTP_PORT=587 SMTP_SECURE=false SMTP_USER=poll@example.com NOREPLY_EMAIL=poll@example.com
Environment=ALLOWED_EMAILS=*@example.com NPM_CONFIG_UPDATE_NOTIFIER=false
Secret=rallly-database-url,type=env,target=DATABASE_URL
Secret=rallly-secret,type=env,target=SECRET_PASSWORD
Secret=rallly-cron-secret,type=env,target=CRON_SECRET
Secret=rallly-smtp-password,type=env,target=SMTP_PWD
AutoUpdate=registry

[Service]
Restart=always
TimeoutStartSec=600
  • ALLOWED_EMAILS begränsar vem som kan skapa konto och logga in. Den som röstar behöver inget konto.
  • INITIAL_ADMIN_EMAIL låter den personen göra sig själv till administratör på /control-panel.
  • NPM_CONFIG_UPDATE_NOTIFIER=false hindrar containern från att fråga npm efter uppdateringar varje gång den startar.
  • CRON_SECRET skyddar Ralllys adress för städning, som timern nedan anropar.

I vårt test gick mejlen till en lokal testserver för e-post; vi skickade inte via en riktig leverantör. I ~/.config/systemd/user tar rallly-housekeeping.service bort raderade omröstningar efter sju dagar, och konton som ska raderas:

[Unit]
Description=Rallly housekeeping

[Service]
Type=oneshot
ExecStart=podman exec rallly-app sh -c 'curl -fsS -H "Authorization: Bearer $$CRON_SECRET" http://rallly:3000/api/house-keeping/remove-deleted-polls'
ExecStart=podman exec rallly-app sh -c 'curl -fsS -H "Authorization: Bearer $$CRON_SECRET" http://rallly:3000/api/house-keeping/remove-deleted-users'

Och rallly-housekeeping.timer:

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Starta med systemctl --user daemon-reload, systemctl --user start rallly-pod och systemctl --user enable --now podman-auto-update.timer rallly-housekeeping.timer. Blocket i Caddys ~/Caddyfile:

poll.example.com {
    reverse_proxy 127.0.0.1:8153
}

Öppna https://poll.example.com, skriv din mejladress och koden du får, och fyll i namn, tidszon och företag. För en säkerhetskopia kör du podman exec rallly-db pg_dump -U rallly rallly > rallly.sql. För att återställa stoppar du podden, tar bort volymen rallly-db, startar bara rallly-db, läser in dumpen med podman exec -i rallly-db psql -q -U rallly rallly < rallly.sql och startar podden.

Licens och kostnad

Vi läste licenstexterna och prissidorna den 14 oktober 2026.

  • Easy!Appointments har öppen källkod under GPL 3.0, görs av Alex Tselegidis och är gratis, utan betald version och utan gräns för antalet användare. Webbplatsen säljer tjänster runt den, som installation, drift, utveckling och supportavtal, utan publika priser.
  • Rallly görs av Luke Vella och publiceras under AGPL 3.0. Utöver det säger licenssidan att den är "always free for personal use" för en användare, och säljer en licens för fler användare på egen server: 49 US-dollar för upp till 5 användare, 299 för upp till 50 som ett "Limited Time Offer" (annars 499), och från 999 för fler, en engångssumma som gäller hela Rallly 4. Den bygger på "an honor system for user limits". Ralllys tjänst på nätet är gratis för upp till 3 öppna omröstningar, och Pro kostar 6 US-dollar per användare och månad vid årsbetalning, med API och webhooks.

Calendly i dag

Det här kommer från Calendlys egna sidor, lästa den 14 oktober 2026, inte från våra tester.

  • Pris. Prissidan listar Free, Standard för 10 US-dollar och Teams för 16 US-dollar per användare och månad, där årsbetalning sparar "up to 20%", och Enterprise från 15 000 dollar om året. Free har en mötestyp och en kopplad kalender.
  • Det som kostar extra. På den sidan finns round robin och routing forms i Teams, medan betalning via Stripe och PayPal, arbetsflöden med påminnelser och webhooks börjar i Standard. Mötesomröstningar finns i alla planer.
  • Kalendrar. Google, Microsoft 365, Outlook.com och Exchange. Calendly tar inte emot nya kopplingar till iCloud sedan den 20 augusti 2024, och vi hittade inget allmänt stöd för CalDAV.
  • Video. Zoom, Google Meet, Microsoft Teams, Webex och GoTo Meeting, eller en egen fast länk.
  • Språk. Bokningssidor och aviseringar finns på engelska, franska, spanska, tyska, nederländska, brasiliansk portugisiska, italienska och ukrainska. Svenska finns inte med.
  • Dina uppgifter. "Calendly stores user and invitee data in U.S.-based data centers", enligt sidan om datalagring, och överföringar från EU bygger på standardavtalsklausuler. Ägare och administratörer kan radera en kunds uppgifter via mejladressen i alla planer; API:et för det finns i Enterprise.
  • Köra själv. Vi hittade ingen version av Calendly att köra på egen server.

Det här ger du upp jämfört med Calendly

På din egen server stannar bokningar och kunduppgifter i Sverige, kunderna får sidor och mejl på svenska, och kostnaden är servern i stället för ett pris per person. Men var ärlig mot dig själv om vad du lämnar:

  • Google- och Microsoft-kalendrar. Calendly kopplar dem med ett klick. Easy!Appointments behöver ett projekt i Google Cloud för Google och har inget för Microsoft 365 utom CalDAV, som Microsoft inte erbjuder. Rallly har ingen kalendersynk på egen server.
  • Betalning. Calendly tar betalt via Stripe eller PayPal när någon bokar. Easy!Appointments visar ett pris men tar inte betalt; Rallly har inga priser alls.
  • Routing forms och möten för team. Calendly ställer frågor först och skickar besökaren till rätt person, och bokar möten med flera värdar. Easy!Appointments har "Any Provider" och inget mer.
  • Påminnelser. Calendlys arbetsflöden skickar påminnelser via mejl och sms. Ingen av de två skickar någon påminnelse.
  • Utseende och buffert. Easy!Appointments bokningssida är enkel och känns gammal, och den har ingen buffert mellan möten.
  • Driften. Uppdateringar, säkerhetskopior, e-post och servern är ditt ansvar, och Easy!Appointments avbild får systemuppdateringar bara med varje ny version.

Vilken ska du välja

En bokningssida för kunder: Easy!Appointments. Den klarar anställda, arbetstider, raster, framförhållning, tidszoner, CalDAV, Jitsi-länkar, webhooks och svenska mejl till kunderna gratis, på omkring 150 MB, utan gräns för antalet användare. Svagheterna är ingen buffert, inga påminnelser, inga möten med flera värdar, en avbokning som lämnar mötet kvar i kundens kalender, CalDAV-lösenord i klartext, att den vägrar en kalender på samma server, en avbild som byggs en gång per version, och ett daterat utseende. Vi har ingen guide för den än: filerna i Så körde vi Easy!Appointments är det vi körde, ovanpå Podman-guiden. En VC-P Alloy kör den med gott om utrymme över, bredvid andra appar.

Hitta en tid för en grupp: Rallly. För ett styrelsemöte, en workshop eller en middag går det snabbt för alla, ingen behöver konto för att rösta, och tidszoner och svenska blir rätt. Svagheterna är att den inte är en bokningssida, saknar API, webhooks och kalendersynk på egen server, kräver en betald licens för en andra användare, behöver fungerande e-post för att logga in, åtminstone tills var och en har skapat ett lösenord, och sparar de inbjudnas uppgifter i databasen efter att du raderat en omröstning. Filerna finns i Så körde vi Rallly. En VC-P Alloy kör den med gott om utrymme över.

Båda samtidigt använde under 1 GB även när de låg som högst, så en VC-P Alloy kör dem bredvid varandra, som vår gjorde.

Cal.com: vänta. Tills Cal.diy publicerar avbilder igen och håller dem uppdaterade rekommenderar vi inte att du kör den för kunder.

Kör det på din egen server

SSD RAID 1 · ECC DDR4 · 10 Gbit

VC-P Alloy

100 kr/mån

vCPU
2
Minne
8 GB
Lagring
60 GB
Trafik
10 TB
Performance
SSD · RAID 1
  • Full root-åtkomst
  • Nativt /64 IPv6
  • RAID-skyddad lagring
  • Malmö, Sverige
  • Månadsvis, ingen bindningstid
  • 7 dagars öppet köp
Alla guider