Kontakt os

For nylig, efter at have implementeret en webapp på en dedikeret server, indså vi, at diskpladsen ville blive en fremtidig flaskehals for applikationens drift.
Det ville kræve eksponentielt mere plads i takt med appens brug, da den med tiden ville blive brugt mange steder samtidigt, samtidig med at den kommunikerede med en central server, der uploadede hundredvis af megabyte aktiver.
Vi besluttede at flytte lagringen væk fra vores dedikerede server til Amazon AWS S3 for at øge applikationens skalerbarhed.
Lige til, kunne man sige på dette tidspunkt. Bare ændre nogle indstillinger i Paperclip for at bruge S3.
Problemet var, at appen allerede var i produktion, så ændringen krævede, at vi flyttede alle eksisterende aktiver til S3 for at undgå datatab (selvfølgelig!).
Under vores research fandt vi en nem løsning til at migrere alle aktiverne til S3. Løsningen, man finder overalt på internettet, er ret selvforklarende; send blot den mappe, hvor dine aktiver er gemt, til S3 (den velkendte public/system mappe)!
Dette ville fungere i en situation, hvor url for Paperclip-konfigurationen tidligere var defineret. Det standard schema , som Paperclip bruger, ender i en fil med en placering som:
For at undgå at spilde tid på at finde ud af, hvor /000/000/ kom fra, forklaringen på alle de indledende 0'er, og for at skabe en fleksibel løsning, besluttede vi at lave vores egen strategi.
Først skal vi kunne skifte konfigurationen på Paperclip til at bruge S3 efter migrering, og til at bruge vores server under migrering (vi skal hente vedhæftningsfilerne).
Lad os se en typisk model med vedhæftninger:
undefined
For at forberede modellen til at blive migreret til S3-tjenesten skal vi tilføje en switch, der nemt kan aktiveres.
Lad os oprette en s3_migrate.yml fil med noget konfiguration:
undefined
Fra linje 1 til 4 er den normale konfiguration for Paperclip S3-lagring, i linje 5 tilføjede vi kontakten for at aktivere S3.
Hvis den ikke er aktiveret, skal applikationen levere aktiverne fra den lokale server. Dernæst ændrer vi vores modeldefinition for at afspejle disse ændringer.
undefined
I dette kodestykke gemmer vi Paperclip-indstillingerne i en hash (PAPERCLIP_STORAGE_OPTIONS) og indlæser filen, der indeholder migreringsindstillingerne. Vi fletter S3-indstillingerne, hvis 'activated' er sand.
Indtil videre har vi forberedt vores model til at skifte til S3, når migreringsprocessen er afsluttet.
For at migrere vores aktiver til S3 skal vi bruge en brugerdefineret opgave til at udføre handlingen. Her er kodestykket, der er ansvarligt for det.
Opret en fil med navnet paperclip_migrate.rake og læg den i lib/tasks -mappen, og indsæt koden ovenfor.
Kør opgaven:
undefined
**Efter at have afsluttet migreringen skal vi opdatere vores s3_migrate.yml og aktivere S3-lageret.**
Du skal blot ændre linjen activated til true. Genstart webserveren, og så er du færdig!
Bemærk 1: Stiindstillingen i s3_migrate.yml skal være lig med den i linje 44 i opgaven. Tilpas dette til dit scenarie.
Note 2: Efter at have gennemført migreringen og sikret, at vores aktiver er blevet migreret til S3, kan du slette de filer, der stadig er gemt i public/system.
Lad os gentage vores krav til dette problem og validere hver enkelt af dem.
Når vi tilføjer muligheden for at specificere klassen og objekterne dynamisk, kan man udføre opgaven med de modeller, der ønskes, eksempel:
undefined
Fuldført!
I vores opgave, efter at vi har kontrolleret, at der er mindst et objekt i vores database, kan vi forespørge det for at hente alle de definerede stilarter:
Det vil returnere, hvad vi forventer:
Fuldført!
Vi bruger en rake-opgave til at udføre migreringen, så den kan udføres uden at påvirke brugen af applikationen i produktionsmiljøet.
Fuldført!
I vores s3_migrate.yml vi definerer banen for aktiver for at bruge Rails.env variabel, så aktiverne gemmes i henhold til det miljø, som applikationen kører.
Fuldført!
Vi har kun brug for en enkelt genstart til webserveren! Så vi kan sige, at kravet var...
Fuldført!
Og det handler om alt hvad du behøver at vide for at migrere Paperclip-aktiver fra en lokal server til Amazon S3.


Har erfaring med backend-systemer til internettet ved hjælp af avancerede teknologier. Fuld stak-udvikler og produktproducent. Rubin/Rails, NodeJS, ElectronJS.
People who read this post, also found these interesting: