Kör Penpot, alternativet till Figma med öppen källkod, med Podman utan root

Penpot på Debian 13, design- och prototypverktyget med öppen källkod där ett helt team ritar, bygger prototyper och lämnar över till utvecklarna i webbläsaren, i rootless Podman med PostgreSQL och Valkey under en egen användare bakom Caddy, stängt för registrering och med telemetrin avstängd.

Testad på Penpot 2.18.3 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 här sätter du upp

Penpot är ett verktyg för design och prototyper som körs i webbläsaren, ungefär som Figma. Designerna ritar skärmar med komponenter, delade bibliotek, design tokens och flex- och grid-layouter, kopplar ihop dem till klickbara prototyper och kommenterar dem, flera personer samtidigt i samma fil. Utvecklarna öppnar samma fil för att läsa av mått, färger och den genererade CSS- och HTML-koden, och exporterar bilder. Layouterna fungerar som flexbox och grid i CSS, så det designerna ritar ligger nära det utvecklarna bygger.

Penpot görs av Kaleidos, ett bolag vars team arbetar från Madrid, och är öppen källkod under Mozilla Public License 2.0. Versionen du kör själv har alla designfunktioner och ingen gräns för användare, team eller filer. Den 14 oktober 2026 var Penpots egen molntjänst gratis med upp till 8 medlemmar per team, 10 GB lagring och 7 dagars versionshistorik. Unlimited, för 7 dollar per redaktör och månad och aldrig mer än 175 dollar i månaden, ger obegränsad teamstorlek, 25 GB och 30 dagar. Enterprise, för 25 dollar per medlem och månad, ger obegränsad lagring, 90 dagar, enkel inloggning (SSO), val av region för driften och listor över tillåtna IP-adresser. Penpot säljer också en egen server för 50 000 dollar om året. När du kör Penpot själv begränsas lagring och historik bara av din server, och inloggning via din egen tjänst för enkel inloggning (OpenID Connect eller LDAP) finns inbyggd.

Här körs Penpot från sina officiella avbilder som en pod under en egen användare som heter penpot: frontend, backend, exportören som skapar PNG-, SVG- och PDF-filer, PostgreSQL för data och Valkey för uppdateringarna i realtid mellan användarna. Framför sitter Caddy från Podman-guiden.

Varje steg nedan har körts på en nyinstallerad Melonslab VC-P Alloy (2 vCPU, 8 GB) med Debian 13:

  • Penpot 2.18.3 startade från början, och det första kontot skapades via en SSH-tunnel innan Caddy sattes upp. Med registreringen stängd svarade registreringsformuläret "The registration is currently disabled."
  • Ett andra konto skapades från kommandoraden, bjöds in till ett team med e-post och gick med via länken. Inbjudningar, återställning av lösenord och aviseringar om kommentarer kom fram till en testbrevlåda på servern.
  • Ett delat bibliotek fick två komponenter med flex-layout, en färg och design tokens. En annan fil använde komponenterna, och när en token ändrades i biblioteket visade filen "There are updates in shared libraries" och fick den nya färgen.
  • En prototyp gick från en board till en annan vid ett klick i visningsläget. Två personer i samma fil såg varandras markörer och ändringar direkt, och en kommentarstråd fick ett svar.
  • Fliken Inspect visade layouten som CSS och koden som HTML. En board exporterades som PNG, SVG och PDF via exportören, och en fil gick ut och in igen som .penpot-fil. En .fig-fil avvisades.
  • Ett insticksprogram installerades från sin adress och byggde ett bibliotek och en sida i den öppna filen.
  • Med telemetrin avstängd visade en avlyssning av serverns trafik inga anslutningar till Penpot, bara uppslagningarna mot Google Fonts som steg 14 beskriver.
  • En uppdatering från 2.17.2 till 2.18.3 körde sina databasmigreringar av sig själv. Hela instansen raderades och återställdes från en säkerhetskopia under en ny användare, och allt startade igen av sig självt efter en omstart av servern.

Podden använde omkring 1,45 GB minne i vila, varav 1,2 GB för backendens Java-process, och omkring 1,75 GB med tre personer som redigerade och en export som pågick. Avbilderna tar 4,2 GB disk. Det lämnar gott om utrymme i paketet Alloy.

Innan du börjar

Du behöver:

  • en server uppsatt som i Podman-guiden, med Caddy igång;
  • en A-post och en AAAA-post för design.example.com som pekar på din server;
  • för inbjudningar ett e-postkonto hos din e-postleverantör som får skicka via SMTP.

Exemplen använder design.example.com för Penpot, 203.0.113.10 för serverns IPv4-adress och example.com för era e-postadresser. Byt ut dem genomgående.

1. Skapa användaren

Som root:

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

Allt fram till steg 6 körs som penpot.

2. Skapa hemligheterna

openssl rand -base64 64 | tr -d '\n' | podman secret create penpot-secret-key -
openssl rand -hex 24 | tr -d '\n' | podman secret create penpot-db-password -

Den första är Penpots hemliga nyckel, 512 slumpade bitar som Penpot tar fram nycklarna för inloggningar och inbjudningslänkar ur. Byts den ut loggas alla ut och skickade inbjudningar slutar fungera, så steg 15 sparar en kopia. Den andra är databaslösenordet. Båda lagras av Podman, inte i filerna nedan.

3. Definiera podden

mkdir -p ~/.config/containers/systemd
cd ~/.config/containers/systemd

Skapa penpot.pod:

[Pod]
PodName=penpot
# Only Caddy, on this server, can reach Penpot: the port is not open to the internet.
PublishPort=127.0.0.1:8120:8080

[Install]
WantedBy=default.target

Skapa penpot-db.container:

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

[Service]
Restart=always

Skapa penpot-valkey.container:

[Container]
ContainerName=penpot-valkey
Image=docker.io/valkey/valkey:8.1
Pod=penpot.pod
Exec=valkey-server --maxmemory 128mb --maxmemory-policy volatile-lfu --save ""
HealthCmd=valkey-cli ping
HealthInterval=10s
Notify=healthy
AutoUpdate=registry

[Service]
Restart=always

Skapa penpot-backend.container:

[Unit]
Requires=penpot-db.service penpot-valkey.service
After=penpot-db.service penpot-valkey.service

[Container]
ContainerName=penpot-backend
Image=docker.io/penpotapp/backend:2.18
Pod=penpot.pod
Volume=penpot-assets:/opt/data/assets
EnvironmentFile=%h/penpot.env
Environment=PENPOT_DATABASE_URI=postgresql://127.0.0.1/penpot PENPOT_DATABASE_USERNAME=penpot
Environment=PENPOT_REDIS_URI=redis://127.0.0.1/0
Environment=PENPOT_OBJECTS_STORAGE_BACKEND=fs PENPOT_OBJECTS_STORAGE_FS_DIRECTORY=/opt/data/assets
Environment=PENPOT_TELEMETRY_ENABLED=false
Secret=penpot-secret-key,type=env,target=PENPOT_SECRET_KEY
Secret=penpot-db-password,type=env,target=PENPOT_DATABASE_PASSWORD
AutoUpdate=registry

[Service]
Restart=always

Skapa penpot-exporter.container:

[Unit]
Requires=penpot-valkey.service
After=penpot-valkey.service

[Container]
ContainerName=penpot-exporter
Image=docker.io/penpotapp/exporter:2.18
Pod=penpot.pod
EnvironmentFile=%h/penpot.env
Environment=PENPOT_INTERNAL_URI=http://127.0.0.1:8080 PENPOT_REDIS_URI=redis://127.0.0.1/0
Secret=penpot-secret-key,type=env,target=PENPOT_SECRET_KEY
AutoUpdate=registry

[Service]
Restart=always

Och penpot-frontend.container:

[Unit]
Requires=penpot-backend.service
After=penpot-backend.service

[Container]
ContainerName=penpot-frontend
Image=docker.io/penpotapp/frontend:2.18
Pod=penpot.pod
Volume=penpot-assets:/opt/data/assets
EnvironmentFile=%h/penpot.env
Environment=PENPOT_BACKEND_URI=http://127.0.0.1:6060 PENPOT_EXPORTER_URI=http://127.0.0.1:6061
AutoUpdate=registry

[Service]
Restart=always

Inställningarna som Penpots tre containrar delar ligger i en fil, ~/penpot.env. Än så länge är den inställd för det första kontot, som du skapar i steg 4 innan någon annan kan nå Penpot:

PENPOT_PUBLIC_URI=http://localhost:8120
PENPOT_FLAGS=enable-registration disable-email-verification enable-login-with-password disable-onboarding disable-telemetry

Vad inställningarna gör:

  • Containrarna delar poddens nätverk och hittar varandra på 127.0.0.1: backend på port 6060, exportören på 6061 och frontend på 8080. Frontend levererar appen och skickar /api vidare till backend och exporter till exportören.
  • Exportören är en Chromium utan fönster som öppnar frontend på PENPOT_INTERNAL_URI och gör om boards till PNG, SVG och PDF. Det är den största avbilden, omkring 2 GB.
  • Uppladdade bilder, typsnitt och miniatyrer hamnar i volymen penpot-assets, som backend skriver och frontend levererar. Själva designen ligger i PostgreSQL.
  • PENPOT_TELEMETRY_ENABLED=false håller telemetrin avstängd. Penpots egen Docker Compose-fil slår på den; steg 14 har detaljerna.
  • Valkey skickar bara uppdateringar i realtid mellan användarna och sparar inget på disk.
  • Taggarna 2.18 följer felrättningarna i Penpot 2.18, som podman auto-update installerar. Steg 16 tar upp bytet till nästa version. PostgreSQL ligger kvar på 17; Penpot stöder 13 och senare, och dess egen Compose-fil använder 15.

Penpots Compose-fil för 2.18 startar också en administrationskonsol och en MCP-server, som låter AI-assistenter redigera design. Båda är valfria och kräver egna flaggor; den här guiden hoppar över dem.

Starta den:

systemctl --user daemon-reload
systemctl --user start penpot-pod
systemctl --user enable --now podman-auto-update.timer

Vid första starten laddas omkring 4 GB avbilder ner, och backend behöver en halv minut för att sätta upp sin databas. Den är klar när det här skriver ut OK:

curl -s http://127.0.0.1:8120/readyz; echo

4. Skapa det första kontot

Penpot har inget standardkonto: den som registrerar sig först kommer in. Skapa därför ditt konto nu, medan Penpot bara kan nås från servern. Öppna en tunnel från din egen dator:

ssh -L 8120:127.0.0.1:8120 root@203.0.113.10

Öppna http://localhost:8120/#/auth/register i webbläsaren. Fyll i Full name, Work email och Password (minst 8 tecken, varav ett specialtecken), lämna Send me product updates omarkerad och välj Create an account. Penpot öppnar översikten med ditt konto och ett eget team som heter Personal Projects. Stäng tunneln när du är klar.

Det finns ett skäl att lämna rutan omarkerad: har någon på servern markerat den skickar Penpot personens e-postadress till telemetry.penpot.app med några timmars mellanrum, även med telemetrin avstängd. Rutan finns bara i registreringsformuläret, som stängs i nästa steg.

5. Stäng registreringen

Ge nu ~/penpot.env dess riktiga adress och de flaggor som ska gälla framåt:

PENPOT_PUBLIC_URI=https://design.example.com
PENPOT_FLAGS=disable-registration enable-login-with-password enable-email-verification disable-demo-users disable-onboarding disable-telemetry enable-prepl-server
systemctl --user restart penpot-pod

PENPOT_PUBLIC_URI är adressen som Penpot använder i sina länkar och e-postmeddelanden, och den som appen i webbläsaren skickar sina anrop till. Den var http://localhost:8120 för tunneln. Varje flagga slår på eller av en funktion:

  • disable-registration tar bort registreringen. Formuläret på /#/auth/register svarar "The registration is currently disabled." och inloggningssidan saknar länk dit. Nya personer får ett konto av dig (steg 8).
  • enable-login-with-password låter användarna logga in med e-postadress och lösenord. Det är standard, men står kvar så att raden visar hur man loggar in. Använder ni enkel inloggning stänger disable-login-with-password av formuläret.
  • enable-email-verification gör att en ny e-postadress måste bekräftas via en länk innan den används. Även det är standard.
  • disable-demo-users håller borta länken Create demo account, som skapar tillfälliga konton som raderar sig själva efter 7 dagar. Den är avstängd som standard; flaggan gör det säkert.
  • disable-onboarding hoppar över frågorna som varje ny användare annars får först, om vad de ska använda Penpot till och vilket verktyg de kommer från.
  • disable-telemetry är flaggversionen av PENPOT_TELEMETRY_ENABLED=false.
  • enable-prepl-server låter kommandoradsverktyget i backend skapa konton (steg 8). Den lyssnar på port 6063 och bara inne i podden.

Inloggningen ligger kvar på säkra kakor, vilket är standard. Penpots Compose-fil stänger av dem med disable-secure-session-cookies för att fungera över vanlig HTTP; bakom Caddy behövs det inte. Flaggorna läses bara när containrarna startar, och därför slutar varje ändring med en omstart.

6. Sätt Caddy framför

Gå tillbaka till root med exit, byt till machinectl shell caddy@ och lägg till det här blocket sist i ~/Caddyfile:

design.example.com {
    reverse_proxy 127.0.0.1:8120
}

Starta om Caddy med systemctl --user restart caddy, öppna https://design.example.com och logga in med kontot från steg 4. Penpot håller öppna anslutningar till varje användare för redigering i realtid; Caddy skickar dem vidare utan extra inställningar.

7. E-post

Penpot skickar e-post för inbjudningar till team, återställning av lösenord, bekräftelse av en ändrad e-postadress och aviseringar om kommentarer. Utan e-post:

  • visar en inbjudan "Invitation sent successfully", men ingen får den, och inget skrivs i loggen. Knappen Copy link bredvid inbjudan på fliken Invitations ger dig länken, så att du kan skicka den på annat sätt;
  • säger Forgot password? "Password recovery link sent to your inbox." och inget kommer fram;
  • får ingen veta något om kommentarer och svar.

Inloggning och allt annat fungerar.

Skicka via din e-postleverantör. Som penpot sparar du SMTP-lösenordet som en hemlighet:

printf %s 'the-smtp-password' | podman secret create penpot-smtp-password -

Lägg till de här raderna i penpot-backend.container, ovanför AutoUpdate=registry, med din egen server, ditt konto och din avsändaradress:

Environment=PENPOT_SMTP_HOST=smtp.example.com PENPOT_SMTP_PORT=587 PENPOT_SMTP_TLS=true
Environment=PENPOT_SMTP_USERNAME=design@example.com
Environment="PENPOT_SMTP_DEFAULT_FROM=Penpot <design@example.com>" PENPOT_SMTP_DEFAULT_REPLY_TO=design@example.com
Secret=penpot-smtp-password,type=env,target=PENPOT_SMTP_PASSWORD

Lägg till enable-smtp sist på raden PENPOT_FLAGS i ~/penpot.env och starta om:

systemctl --user daemon-reload
systemctl --user restart penpot-pod

Port 587 med PENPOT_SMTP_TLS=true använder STARTTLS. För port 465, som använder TLS från början, sätter du PENPOT_SMTP_PORT=465, PENPOT_SMTP_TLS=false och PENPOT_SMTP_SSL=true. Vi testade inbjudningar, återställning av lösenord och aviseringar om kommentarer mot en testbrevlåda på servern, med användarnamn och lösenord; att skicka via en riktig leverantör har vi inte testat.

8. Team och nya medlemmar

Allt i Penpot hör till ett team: projekt, filer, delade bibliotek och typsnitt. Varje användare har också ett eget team, Personal Projects. Skapa teamet ni ska arbeta i från teammenyn högst upp till vänster, med Create new team.

Med registreringen stängd behöver en ny person ett konto innan du bjuder in den. Som penpot:

podman exec -it penpot-backend python3 manage.py create-profile

Kommandot frågar efter Email, Fullname och Password, i den ordningen, och skriver ut Created: med adressen. Det kontrollerar varken att e-postadressen ser ut som en eller lösenordsreglerna från registreringsformuläret, så skriv noga och välj ett starkt lösenord. Ge personen lösenordet på annat sätt; det går att byta under Your account > Password.

Bjud sedan in personen: öppna ⋮ bredvid teamets namn högst upp till vänster, välj Invitations och sedan Invite people, skriv adressen och tryck Enter, välj en roll och välj Send invitation:

  • Viewer kan öppna filer och kommentera, men inte ändra något;
  • Editor kan skapa och ändra projekt och filer;
  • Admin kan dessutom bjuda in och ta bort medlemmar.

Personen öppnar länken i e-postmeddelandet, loggar in och ser "Joined the team successfully". Ordningen spelar roll: när vi skickade inbjudan innan kontot fanns öppnade inloggningen via länken personens eget Personal Projects i stället för teamet. Det löste sig när inbjudan skickades igen efter create-profile.

Penpot kan också lämna inloggningen till en tjänst för enkel inloggning, till exempel authentik eller Keycloak, via OpenID Connect, eller till LDAP, med enable-login-with-oidc eller enable-login-with-ldap och de tillhörande inställningarna i Penpots konfigurationsguide. Vi har inte testat det här. Körs inloggningstjänsten på samma server når Penpot den bara med en av lösningarna i steg 8 i Podman-guiden.

9. Ett delat bibliotek, komponenter och tokens

Ett litet upplägg som fungerar för ett team: en fil rymmer designsystemet, och alla andra filer använder det.

  1. Välj + New file i ett projekt. Filen öppnas; dubbelklicka på namnet högst upp till vänster och döp den till Brand library.
  2. Rita en knapp: en board (B) med en text (T) i. Markera boarden och tryck Skift+A för att ge den flex-layout, så att den växer med texten; Ctrl+Skift+A ger den grid-layout i stället. Utfyllnad och avstånd finns under Layout på fliken Design.
  3. Tryck Ctrl+K (Cmd+K på Mac) med boarden markerad för att göra den till en komponent. Den får då en romb som ikon i lagerlistan.
  4. Öppna fliken Tokens och välj + bredvid Color. Döp din token till color.brand med ett värde som #1F7A4D. Markera knappen och klicka på din token för att använda den som fyllning. Gör likadant för avstånd och hörnradie om du vill.
  5. Öppna huvudmenyn (⋮ bredvid filnamnet), välj File > Add as Shared Library och bekräfta.

I vilken annan fil som helst i teamet öppnar du fliken Assets, väljer Add library och lägger till Brand library med + bredvid. Dess komponenter syns sedan under Assets, klara att dra in på en board.

När du ändrar något i biblioteket, till exempel värdet på en token under Edit token (högerklicka på din token), visar filerna som använder det "There are updates in shared libraries" nästa gång de öppnas. Update hämtar in ändringen. Låt filen vara öppen några sekunder efteråt: Penpot sparar ändringar i bakgrunden, och när vi stängde webbläsaren direkt försvann uppdateringen.

Tokens följer W3C:s format för design tokens. Tools längst ner på fliken Tokens importerar och exporterar dem som JSON, vilket Penpots migreringsguide använder för tokens från Tokens Studio; det har vi inte testat.

10. Prototyper, kommentarer och samarbete

Prototyp. Öppna fliken Prototype, markera något, till exempel knappen, och dra pilen som dyker upp till en annan board. Det skapar en interaktion: vid klick, gå till den boarden. Uppspelningsknappen högst upp till höger öppnar prototypen i en ny flik, där ett klick på knappen leder till den andra boarden.

Kommentarer. Tryck C, eller välj pratbubblan högst upp till höger, och klicka där kommentaren hör hemma. Andra svarar i samma tråd, och med e-post uppsatt får den som nämns eller får svar ett e-postmeddelande. Under Your account > Notifications väljer var och en vad de vill få veta.

Redigering i realtid. Alla som har filen öppen ser de andras avatarer högst upp till höger, deras markörer med namn och varje ändring när den görs. Penpot sparar också versioner: File > Version history, och Pin this version för att behålla en version för gott. Automatiskt sparade versioner behålls inte som standard när du kör Penpot själv; fästa versioner gör det.

11. Inspektera, exportera och importera

Inspektera. Utvecklarna markerar något och öppnar fliken Inspect. Den visar mått, färger, typsnitt och flex-inställningarna så som de blir i CSS, och menyn högst upp på fliken byter till Code, med CSS och HTML för det markerade.

Exportera. Markera en board och välj + bredvid Export längst ner på fliken Design. Välj PNG, JPG, WEBP, SVG eller PDF och en skala, och välj Export 1 element. Exportören skapar filen och webbläsaren laddar ner den; en board på 1280 × 800 tog omkring fem sekunder. File > Export boards as PDF samlar alla boards i en PDF.

Filer. File > Download Penpot file (.penpot) sparar en hel fil, med dess delade bibliotek om du väljer Export shared libraries. För att läsa in en öppnar du projektets meny (⋮ högst upp till höger i projektet) och väljer Import Penpot files.

Från Figma. Penpot kan inte öppna .fig-filer. Importen tar bara emot .penpot och .zip; när vi provade en fil med Figmas .fig-huvud svarade den "Something went wrong while processing this file." Penpots migreringsguide hänvisar till insticksprogrammet Penpot Exporter, som körs i Figma och sparar filer, komponenter, auto layout och variabler i Penpots format. Det kunde vi inte testa utan ett Figma-konto. Enskilda bilder går alltid att flytta över som SVG eller PNG.

12. Insticksprogram

Insticksprogram, plugins, lägger till verktyg i redigeraren, till exempel ikonsamlingar, diagram eller innehållsgeneratorer. Öppna pluginhanteraren med pusselbiten i verktygsfältet, eller Ctrl+Alt+P, klistra in adressen till ett programs manifest.json och välj Install. Penpot visar vad programmet vill göra, till exempel "Read and modify the content of files that users have access to.", och installerar det när du väljer Allow. Open startar det sedan i den öppna filen. Plugins List leder till Penpots katalog.

Ett insticksprogram körs i webbläsaren hos den som använder det och laddas från programmets egen adress, inte från din server. Det kan se och göra det som det bad om, med den personens konto. Installera bara program du litar på. Vi testade med ett litet eget program som byggde ett bibliotek och en sida med pluginets API.

13. Språk

Penpot finns inte på svenska. Språklistan under Your account > Settings > Language har engelska, spanska och ett trettiotal översättningar från användarna, bland annat norska (bokmål), men inte svenska eller danska, trots att översättare har påbörjat en svensk version. Med Auto (browser) och en svensk webbläsare visas Penpot på engelska.

14. Externa anslutningar och telemetri

Med inställningarna från steg 3 och 5 avlyssnade vi serverns DNS-uppslagningar och utgående anslutningar medan Penpot startade, medan vi arbetade, exporterade och importerade filer och mallar, och efter en omstart. Penpot själv kontaktade inget utanför, med ett undantag: Google Fonts.

  • Google Fonts. Typsnittslistan innehåller Googles typsnitt. När någon använder ett sådant frågar webbläsaren din server, och frontend hämtar typsnittet från fonts.googleapis.com och fonts.gstatic.com. Besökarens webbläsare kontaktar aldrig Google; det gör din server. Vid starten slår frontend också upp raw.githubusercontent.com för en gammal väg till mallar, utan att ansluta dit.
  • Mallar. Biblioteken och mallarna i översikten finns i backendens avbild; att lägga till en anslöt inte till något.
  • Telemetri. Avstängd här. Penpots Compose-fil sätter PENPOT_TELEMETRY_ENABLED: "true". Då skickar backend en rapport till telemetry.penpot.app klockan 00.30, 03.30 och därefter var tredje timme, i UTC, samt 23.30. Enligt koden i Penpot 2.18.3 innehåller rapporten ett id för din instans, versionen, din publika adress, antalet team, projekt, filer, användare, typsnitt och kommentarer, e-postdomänerna för alla era användare, inloggningssätten som används, minnessiffror för Java och anonyma användningshändelser. Behåll både PENPOT_TELEMETRY_ENABLED=false och disable-telemetry för att hålla den avstängd.
  • Nyhetsbrev. Skilt från telemetrin skickar Penpot adresserna för användare som markerat Send me product updates i registreringsformuläret till samma adress, även med telemetrin avstängd. Med registreringen stängd ser ingen rutan.

Vill du stänga av Google Fonts och mallarna också lägger du till enable-air-gapped-conf i PENPOT_FLAGS. Ladda i stället upp era egna typsnitt under Fonts i översikten. Insticksprogram ni installerar, och länkar i prototyper, laddas från sina egna adresser i användarens webbläsare.

15. Säkerhetskopiera

Som penpot:

umask 077
mkdir -p ~/backup
podman exec penpot-db pg_dump -U penpot penpot > ~/backup/penpot-db.sql
podman volume export penpot-assets > ~/backup/penpot-assets.tar
podman secret inspect --showsecret --format '{{.SecretData}}' penpot-secret-key > ~/backup/secret-key.txt

Databasen rymmer alla konton, team, filer, kommentarer och versioner; volymen rymmer uppladdade bilder, typsnitt och miniatyrer; den hemliga nyckeln håller inloggningar och inbjudningslänkar giltiga. Dumpen körs medan Penpot fortsätter att fungera. Kopiera ~/backup till en annan maskin, till exempel med restic, och förvara den säkert.

Filerna ligger kvar på serverns disk i penpot-assets. Vill du hellre ha dem i S3-lagring, till exempel Garage, sätter du PENPOT_OBJECTS_STORAGE_BACKEND=s3 med bucket, adress och nycklar enligt Penpots konfigurationsguide. Det har vi inte testat.

För att återställa, som penpot, med säkerhetskopian i ~/backup:

systemctl --user start penpot-db
systemctl --user stop penpot-backend penpot-exporter penpot-frontend
podman volume exists penpot-assets && podman volume rm penpot-assets
podman volume create --opt o=uid=1001,gid=1001 penpot-assets
podman volume import penpot-assets ~/backup/penpot-assets.tar
podman exec penpot-db dropdb -U penpot penpot
podman exec penpot-db createdb -U penpot penpot
podman exec -i penpot-db psql -q -U penpot -d penpot < ~/backup/penpot-db.sql > /dev/null
systemctl --user start penpot-backend penpot-exporter penpot-frontend

När databasen startar startar hela podden, så andra raden stoppar resten innan data byts ut. uid=1001 är användaren som backend körs som inne i sin container; utan den ägs den nya volymen av root, och exporter misslyckas med unable-to-upload-resource i exportörens logg.

På en ny server följer du steg 1 till 6, men skapar den hemliga nyckeln från säkerhetskopian i stället för en ny i steg 2, och använder ~/penpot.env från steg 5 direkt. Återställ sedan som ovan:

tr -d '\n' < ~/backup/secret-key.txt | podman secret create penpot-secret-key -

Vi återställde så till en ny penpot-användare med tomma volymer: filer, kommentarer, bilder och konton fanns kvar, och de som var inloggade förblev inloggade.

16. Uppdatera

podman auto-update letar en gång om dagen efter nya avbilder och startar om podden när någon har ändrats. Med taggarna 2.18 gäller det Penpots felrättningar, och även PostgreSQL 17 och Valkey 8.1. För att uppdatera direkt:

podman auto-update

En ny version av Penpot, som 2.19, får en ny tagg. Läs versionsinformationen, säkerhetskopiera som i steg 15, byt sedan taggen i Penpots tre filer och starta om:

cd ~/.config/containers/systemd
sed -i 's/:2\.18$/:2.19/' penpot-backend.container penpot-frontend.container penpot-exporter.container
systemctl --user daemon-reload
systemctl --user restart penpot-pod
podman image prune -a -f

Backend migrerar databasen själv när den startar. Vår uppdatering från 2.17.2 till 2.18.3 tog två minuter, mest nedladdning, och podman logs penpot-backend listade de två migreringar som kördes. podman image prune -a tar bort avbilderna som ingen container använder längre, här den gamla versionens, omkring 3 GB.

Felsökning

Registreringssidan i tunneln laddar och laddar. PENPOT_PUBLIC_URI är redan den publika adressen, så appen skickar sina anrop till https://design.example.com, som inte svarar än. Sätt den till http://localhost:8120 som i steg 3 och starta om podden.

En inbjuden person loggar in men kommer inte med i teamet. Kontot fanns inte när inbjudan skickades. Skicka inbjudan igen från fliken Invitations.

Exporter slutar fungera efter en återställning, och exportörens logg säger unable-to-upload-resource. Volymen penpot-assets ägs av root. Skapa om den med --opt o=uid=1001,gid=1001 som i steg 15.

En flagga får ingen effekt. Flaggorna läses när containrarna startar. Starta om podden med systemctl --user restart penpot-pod och ladda om sidan.

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