Huh this is a real paradigm shift! I'm eager to see how it is embraced by the community. Thanks Chris!
@LukasRotermund11 ай бұрын
Working with Go, I have become very accustomed to this convenient deployment method. I can't wait to do the same in PHP now ❤️ Thanks for the quick overview.
@fideloper11 ай бұрын
Same, love that especially!
@DaviMartins9911 ай бұрын
This thing is absolutely INSANE. Awesome content, Chris!
@fideloper11 ай бұрын
it's really cool, right? Thanks for the kind words!
@Protoscribe11 ай бұрын
Outside of the scope of the video for a second - @ 02:04 - I literally wet myself laughing. You've got a new subscriber... Onto the scope of the video. I have not PHP'd in over a decade because of Node and Go, except for the odd Laravel project that I would take over, and this certainly makes me want to check out PHP again because when I am not doing some fancy Kubernetes and Edge work, I use Caddy as my go to server because the API is stellar and you can set servers up on the fly with a couple API calls.
@fideloper11 ай бұрын
It turns out everyone *loves* being told to F off!
@oszi705811 ай бұрын
I'm at a point where i think performance for 99.9% of apps and sites created is not that important considering the 20 monthly users and a crushed dev dream xD
@fideloper11 ай бұрын
no users no problems!
@freemium809211 ай бұрын
Tutorial how to get 20 monthly users pleaseeee
@LukeCreates6 ай бұрын
Used to work on pretty low RPS projects… until I didn’t. And now I couldn’t be more thankful that these servers exist.
@ViniciusBecker0111 ай бұрын
Wow, that's crazy... Thank you, Chris! Will try it soon!
@akunbeben11 ай бұрын
I've watched this video 4 times today, I love it!
@fideloper11 ай бұрын
sorry for flipping you off so much
@jit-r5b10 ай бұрын
Your last chapter reminded me of people, and perhaps me the most, spending hours upon winning two milliseconds in context of nginx vs caddy, when a relationship query is taking 500ms 🤣🤣
@tomasprochazka61989 ай бұрын
Don't forget the folks who always struggle with the auto-cert with Nginx.
@giandomenicodisalvatore718711 ай бұрын
Frankenphp approach is very promising (and I ❤ 103 early hints). I would like to hear your thoughts about its mercure-based realtime module and laravel queues/jobs implementation using frankenphp Thank you for your Outstanding content! 🏆
@fideloper11 ай бұрын
thanks!! I haven’t used mercure yet but I’m excited to try it out as well
@travisthomson163711 ай бұрын
Thank you for bringing me up to speed on this. Was wondering what it was!
@fideloper11 ай бұрын
you’re welcome!
11 ай бұрын
Really interesting, thanks for the overview. I'm excited to try this soon!
@fideloper11 ай бұрын
thanks? I really like it so far, I need to play with it to feel out its rough edges (if any)
@JayTheKing11111 ай бұрын
It's worth noting that your connection is still private regardless of the warning from the browser. The reason the browser complains is because it can't resolve the root CA for which signed the certificate since its self signed locally.
@mohamed-haj11 ай бұрын
Great episode as always!
@fideloper11 ай бұрын
thank you, really appreciate it!
@seeds_of_growth-yi5gx10 ай бұрын
I think putting it architecturally side by side with nginx + fpm could provide clarity, thanks for sharing, cheers!
@WarshipSub3 ай бұрын
PHP does not need revolutionize. PHP is life as it is.
@spamman88811 ай бұрын
How does it handle things like the storage directory? Should you just assume that you'll need to plug it into an s3 driver?
@giandomenicodisalvatore718711 ай бұрын
I was thinking about it too, maybe it behaves just like vanilla php? 🤔
@fideloper11 ай бұрын
Great question - I’m pretty sure you’ll need to define a directory on your file system but is NOT in the code base storage directory (or, use s3!)
@Ruhigengeist11 ай бұрын
When running from embedded mode, it unpacks to a /tmp dir at startup, so storage will work as normal by default. But it does mean uploaded files would be lost on redeploy because it would use a new temp dir. Make sure to change the storage dir to somewhere else on the system so it stays persisted across deploys. Or yeah, use S3 if that's an option for you.
@labkitadev11 ай бұрын
@@Ruhigengeistfor storage i think use minio is the best option if you use docker
@tmanley198511 ай бұрын
I can't decide if I love this or really love this.
@fideloper11 ай бұрын
we love to love
@JupiterBarrera11 ай бұрын
Awesome stuff, I'll check it out
@fideloper11 ай бұрын
def am curious to try it in prod myself and to see how it goes!
@Z4KIUS11 ай бұрын
I love the contained executable, it can be useful when making things for less technical people, you can't expect them to install docker or PHP on metal
@fideloper11 ай бұрын
yeah, good point
@MaulikParmar21011 ай бұрын
The project comes with build system, caddy has it, there can be single binary for entire php app. It's just not popular option and has a bit of learning curve on how caddy build and modules works. People prefer php with more of fpm approach abd are used to it. The project aims towards having full fledged application server which has alot more responsibilities than a typical sertup.
@paulobitfranca8 ай бұрын
Hi. I'm trying to run the frankphp in a different port. Is it possible to specify a port different from default (80) on run it? Thanks
@fideloper8 ай бұрын
unsure! did you figure that out? (in their docs?)
@paulobitfranca8 ай бұрын
@@fideloper I didn't find anything. I forgot to mention... I'm talking about the standalone binary, not about the docker version
@underflowexception9 ай бұрын
How would the Laravel task scheduler be setup ? Will it leverage the existing binary or will you need to install PHP on the host machine and setup a cronjob?
@fideloper8 ай бұрын
you can use the existing binary to run any command
@razvangrigore3229 ай бұрын
Crazy. I was just about to use Nginx Unit with PHP inside one container and now I see this.
@fideloper9 ай бұрын
it’s worth experimenting to see which you like better! Since Franken uses caddy, i think you get more configuration (it’s a full web server, i think Unit has less features)
@kruhlyk_ua3 ай бұрын
Thanks for video! Could you make some performance tests? How much FrankenPHP is strong for huge loading?
@PhiloDev11 ай бұрын
This is going to make life so much easier 😄
@fideloper11 ай бұрын
totally could! trying it out soon in prod to see what rough edges i hit if any
@PhiloDev11 ай бұрын
@@fideloper time for PHP on the edge haha. Would be great for Livewire, actually have a project where I needed to launch more instances across the world because of the latency you get with Livewire calls.
@robertcoster564411 ай бұрын
Interesting. Like to see what the cybersecurity guys make of it before I'd use in production.
@hookenz2 күн бұрын
The problem with nginx is you have to use it with php-fpm which because of that interface is actually slower than FrankenPHP. However, Nginx released something called "Nginx Unit" which can run PHP natively with one binary just like FrankenPHP. Nginx Unit is not Nginx. It's a completely different codebase to what we all know as Nginx. You should have a look. I think it's good. Performance is much better than nginx + php fpm but also, it has it's downsides.
@cowgod7711 ай бұрын
Sounds interesting. My main question is, if you're already using Docker to package your app, what's the benefit of packaging it into a binary? Your docker image is still going to be prepackaged and ready to run, even if you've just built it traditionally using php-fpm and a dockerfile that installs composer prerequisites etc. If you are already packaging your app in a container for deployment, what would be the advantage of switching to this?
@Ffaarg711 ай бұрын
Static images seem to be faster - up to 30% - as we saw with Laravel Herd. So I would probably just use the docker image that contains the static build and not extract it. But you may want a more optimised smaller docker image I.e. a different base images and non of the dev C dependencies. Then you could extract it out and create a new docker image for production.
@DanielAbernathy11 ай бұрын
I'd be curious to learn what steps are required to secure a web server when you're running the standalone executable. Any different than a typical PHP deployment?
@fideloper11 ай бұрын
Yeah, I don’t think there’s anything too magical there - same stuff as usual! In theory you can edit the Caddyfile config for things like blocking access to dotfiles
@santiagoale623211 ай бұрын
I love this! Gonna follow this expecting the Octane support
@Ruhigengeist11 ай бұрын
Octane support is already out!
@santiagoale623211 ай бұрын
@@Ruhigengeist Yep! saw it on LinkedIn the moment it was posted 😍
@fideloper11 ай бұрын
gotta try octane out still myself 🤣, excited for it!
@patricknelson11 ай бұрын
6:08 - I don’t copy .env files at all into docker images. At minimum probably best to inject into actual environment variables and reference somehow via getenv() (that’s just low level, your particular framework may vary), especially if they contain any secrets. This just avoids them sitting around in container images. In deployed environments, those env vars are injected via some other means (e.g. in Kubernetes via secrets or via secret manager in GCP, etc). In your local dev or insecure test environments, you can easily stub out those env vars via env_file in docker-compose for example.
@fideloper11 ай бұрын
Agree, that's how Fly.io works too (where I work) - the .env file is actually removed (by default, you can add it in if you really want it) when creating a Docker image (technically a full VM image) to deploy.
@patricknelson11 ай бұрын
7:53 - Great use case for multi-stage builds 😅 Sorry for all the comments,but I was wondering about that when I saw that this resulted in a binary. Like… whole app in a single binary? Sick. Very “go” too, lol. But yeah, do your build in one image, then in the next stage (image) you copy that over from the previous stage and you get a WAY smaller resulting image out of that single Dockerfile.
@ejunker11 ай бұрын
The binary is 168M and includes Caddy, PHP, and your application code. I don't think it would be much smaller than if you just packaged your application as a Docker container using the dunglas/frankenphp base image.
@bruceingalls796411 ай бұрын
Is this recommended for production? It sounds like FrankenPHP does not support *Virtual Hosts* on a shared host. Another apparent downside, is if your Laravel app has additional services, such as email or cron jobs or queues. Does one maintain a database outside the docker image?
@fideloper11 ай бұрын
Lots to unpack there! The basic answer there is: there’s a way to handle all of that. If you’re hosting in a server where you need to define virtual hosts, this might not be a thing you need (although still possible either through caddy config you can set - see their docs - or by adding nginx or apache in front of the binary made here. Cron and all that can be handled just, you can run any artisan command with the binary created. you’d run CRON or something that would call the binary to run the scheduler or whatever. You wouldn’t run a database in the same container image as the thr application binary (or container image) generated. It can run elsewhere (on whatever server hosts the app or wherever fine databases are sold).
@jozsab111 ай бұрын
never had deployment issues for PHP. at least I learned some people struggle with this. Nice to know there is a complicated method that encapsulates the previously existing "complicated" method.
@TheHronarАй бұрын
I don't have deployment issues either however I do think that this will make a lot of lives easier for the non dev-ops peeps. It encapsulates everything you need at the version you need it in a single file. All you need is a base OS and nothing more. This takes away a lot of the "Well, It works on my machine" issues since presumably it will be built with the same dependancies that were used during development.
@JohnnyBigodes11 ай бұрын
I am used to deploy my built images and use these as multi purpose containers for the Scheduler and or Queue. Does this also work here?
@fideloper11 ай бұрын
yep, essentially the same concept! You use the same binary to run the web server or commands line “artisan queue:listen”
@JohnnyBigodes11 ай бұрын
@@fideloper Nice... Thank you for the answer
@smtkumar00710 ай бұрын
i wanted to ship a mysql server as well , does it bundle that as well?
@fideloper10 ай бұрын
this isn’t a whole server, nope! Think is this as just rubbing your app code, no database or anything else
@sean_reyes3 ай бұрын
Storage? Where will it store uploaded files?
@DanielGamboaStewart11 ай бұрын
This looks insane… if you have any sort of app that is moderately complex we should test the $&@T out of it and see if it’s faster, concurrent requests and page loads on dinámica content etc etc… would love to see a deep dive on server deployment
@patricknelson11 ай бұрын
“Worker mode” reminds me _a lot_ of OpenSwoole. This feels potentially more stable and easier to implement though. Wonder how they’d benchmark against each other.
@Ruhigengeist11 ай бұрын
Correct, it's similar. In fact, Laravel Octane support is merged today so you can use FrankenPHP instead of Swoole today.
@ROX211 ай бұрын
@@Ruhigengeist realy ? what bi-directional websocket protocol replacement in frankenphp ? swoole has coroutines, bi-derectional websocket and work much faster than another "GO" implementation.
@MaulikParmar21011 ай бұрын
@ROX2 mercure is set to use other protocols than SSE but it's still esrly days and alot of work has been put into this. Did spoke to kevin when we had this leaking memory problem and it's alot more about stability and production ready fleet rather than getting features out. You'll see it evolving over time. This is tip of the icerberg what the ecosystem can do. More people working on it the merrier it gets.
@tannercampbell11 ай бұрын
great overview!
@fideloper11 ай бұрын
thanks!!!
@seeds_of_growth-yi5gx10 ай бұрын
how does it compare with preloading, JIT...etc ?
@seeds_of_growth-yi5gx10 ай бұрын
how do u deal with pecl extensions? that are not listed in the bash file ?
@tomasprochazka61989 ай бұрын
You can set up the mentioned envs. With it, you can specify a minimal list of your extensions. Notice, that they use static-php-cli to build the static PHP. FrankenPHP, as its name suggests, is just tailored of various components.
@svenst11 ай бұрын
Mhhh… but what I’m not fully getting is, .. what if I have already a reverse proxy running? Eg Traefik or Caddy. Would I have then two reverse proxies?
@fideloper11 ай бұрын
In this case, yep! Which is fine, it's not rare to have like cloudfront/cloudflare -> load balancer -> [multiple web servers running nginx + php-fpm or whatever]
@svenst11 ай бұрын
@@fideloper ok, fair enough. Thx for pointing that out 👍 (I was just confused by having 2x caddy. But seems as if caddy in this scenario is used as a 1to1 replacement for nginx)
@abdmaster11 ай бұрын
Really awesome stuff... Btw few questions: 1. Does env still work? 2. How file storage works in this binary state, can it read storage files? 3. Blade view compiled files, where will they be stored?
@Ruhigengeist11 ай бұрын
When you run the app, it unpacks the embedded app to a /tmp directory and it serves the app from there. This means compiled blade templates will live in there by default. If you have uploads or whatever that you need to persist, then you'll need to point that to some other directory otherwise they'll be lost on redeploy. Yes env works. I assume you mean .env? You can use `--envfile` when running frankenphp I think (the caddy run command lets you do that, I'm not sure if the frankenphp CLI allows that implicitly as well, but it might). Or you can define the env before running the binary using whatever system methods at your disposal (docker env, or systemd env, whatever).
@fideloper11 ай бұрын
env still works! You’ll need to set storage paths to a “real” path on your server disk drive (or use s3 or similar). Blade files get written to a temp location still I think!
@MaulikParmar21011 ай бұрын
1. Env is passed as is. 2. It's an application server, you're still using php binary for day to day operations so it can do whatever php can do. 3. Depends on your config, default package is opinionated and has defailt paths. No need to touch cache files if you're following best practices of framework or package itself.
@Ruhigengeist11 ай бұрын
@@MaulikParmar210 I think you misunderstood their question. They were asking in context of the PHP app (code files) being embedded in the binary at build time, and what effect that has on code that tries to write to files after the fact (because "the files are in the binary and not on disk so what happens?") And I explained above, the answer is the embedded files are unpacked to /tmp first before running the app.
@MaulikParmar21011 ай бұрын
@@Ruhigengeist that's default behaviour, it can be changed as per container config for custom images. Thus depends on your config. Does it make clear what an opinionated way is?
@renebakx11 ай бұрын
I'am eager to test the build mode, and then run the packaged app binary in a distroless container as a production environment. Going to be fun to figure out how to run other processes like cronjob triggered artisan commanda in the same container or packaged app.
@fideloper11 ай бұрын
you might just want to run the container they provide instead of building the binary but both should work!
@nchomey11 ай бұрын
I think a fairly typical use case is to have nginx in front of various web applications/vhosts. Does frankenphp have any support for this, or just for a single application?
@fideloper11 ай бұрын
It's Caddy in front of it, which is a "real" server, and you can configure it on top of what show in the video. You can also put Nginx in front of all of it if you want. How I show building it is more suitable for single apps.
@tomasprochazka61989 ай бұрын
It's typical for some. But Go can be exposed to the world directly, as it has prod-ready server in stdlib. Caddy uses that, with sane defaults for timeouts etc. But in theory, you can wrap the servers with how many reverse proxies you want. But with Caddy you don't have to not worry about exposing it directly.
@agustingomez717211 күн бұрын
so i need caddy too right or it comes with caddy?
@fideloper9 күн бұрын
comes with caddy!
@CaimAstraea10 ай бұрын
What about logging and other stuff when you build the binary ?
@fideloper10 ай бұрын
they get spit out through the processes stdout, which you can direct to a file or ship to whatever logging mechanism you want (this is standard for non-php things, php was always the weirdo for really only having a file-based option)
@fer-ri11 ай бұрын
just found out about it and looks promising 👍
@fideloper11 ай бұрын
yea, really neat! I hope to ship this to production in my next project.
@patricknelson11 ай бұрын
11:36 - re: Are you referring to the good ole’ Nginx + PHP-FPM combination?
@fideloper11 ай бұрын
comparing caddy vs nginx there, but with PHP apps, FPM of course matters since it's Yet Another Thing™ running. I guess in this case FPM is more comparable to the Franken SAPI (which the Franken Caddy module sends requests to. If I understand it correctly 😂).
@johnRivs11 ай бұрын
How would things like interacting with the filesystem work here?
@fideloper11 ай бұрын
see other comments, there’s some great answers to it. short answer : they’re in /tmp or similar. set the app to write elsewhere or use s3!
@AmitErandole11 ай бұрын
Can we see some benchmark tests on a real world application please? Is it really a 3.5x boost? And what about requests per second?
@Ruhigengeist11 ай бұрын
It's ~4x faster than roadrunner & swoole for just the application startup (i.e. just serving the default Laravel homepage). A real world app will not be any faster because only the startup is being cut down, not the actual userland time (this doesn't make PHP execution faster for example). And it obviously can't speed up DB IO etc which is usually your application's biggest bottleneck.
@aurawindsurfing11 ай бұрын
I don’t buy this. I move all complexity to my local machine, need to run docker, compile binary etc only to remove it from production server. Are we saving money on production servers? Whats the point? I understand it possible. I understand its new and cool but is it worth it?
@fideloper11 ай бұрын
I did say you don’t *need* Docker. The ideal is to build it in a CI pipeline and ship the resulting executable to production.
@aurawindsurfing11 ай бұрын
I missed that. But I still need docker for local dev. Docker is ok just trying to figure it out.
@lamonteplays11 ай бұрын
how easy is this to use with ssl? manual and automatic systems like letsencrypt?
@fideloper11 ай бұрын
caddy (via certbot) attempts to setup ssl for you! you can tell it not to if you’d like, but in theory you can configure caddy however you like
@mihaes717210 ай бұрын
How the process / the php app is kept alive or restart if chashes? Thanks
@fideloper10 ай бұрын
depends how you deploy it but in general it’s setup to handle that
@NFM-nb7dlАй бұрын
pls more content about it
@uttula7 ай бұрын
I remember yhe good old times when it was considered bloated if the executable exceeded a few megabytes in size :) oh how the turntables have been turning ;D
@fideloper6 ай бұрын
definitely not my favorite part of it. Interestingly golang can pretty easily get large too!
@gevurahs10 ай бұрын
But I mean. Docker already is something you use to be able to deploy things in an easier way. If I have a dockerized application I can deploy it to any cloud environment like aws, azure etc with docker integration. I don't see the point
@InMemoryOfNeo11 ай бұрын
2:03 no problem buddy
@AbhinavKulshreshtha7 ай бұрын
Franken php to bundle backend, and deno (hopefully bun too) to bundle and deploy frontend. Maybe someone can come up with installer script for windows, shipping products is going to be smooth as f in future.
@aftabnaveed11 ай бұрын
That middle finger 😲😲🫨
@fideloper11 ай бұрын
my favorite accident (who counts like that?!)
@noeldacosta76213 ай бұрын
I mean, ok. This was a useful intro to what's possible but this definitely doesn't count as a "how-to". I'm also not sure you're right about Caddy being slower than Nginx.
@science_trip11 ай бұрын
so we are stopping to use apache or nginx that they are written with champion in performance languages such as C and C++ and we are using a server written in go? And do you name it as evolution?
@fideloper11 ай бұрын
revolution, not evolution. we’re marching in the streets over here. do you hear the people sing, singing the sing of angry men 🎶
@Ruhigengeist11 ай бұрын
The biggest problem with C is memory safety. The amount of bugs and vulnerabilities that happen in C programs is extremely high. For example, remember heartbleed? With Go, that entire class of problem is impossible. The performance difference for the webserver usecase is pretty small. And Caddy has way more modern features, including TLS cert automation, HTTP/3, modern and secure defaults, etc.
@science_trip11 ай бұрын
@@Ruhigengeist did you ever try to hack any C software? I m curious because e lot of people around are talking about safety without knowing what they say. Do you know also memory leaks happed very easy to all modern technologies that they are advertising us like SPAs with all this moden frameworks that they try to "protect" us from mutation? They all fail because the safe code is not about language, but it's about education!
@tomasprochazka61989 ай бұрын
If you care about the performance that much, maybe don't use PHP. This is about a convenience, while the perf penalty is minimal.
@science_trip9 ай бұрын
@@tomasprochazka6198 in this case I prefer C# or even C++. PHP is a good choice to build normal web apps. And to tell the truth the most important is the database queries and the infrastructure. milliseconds don't matter. the real problem is on what kind of hardware you are using to host the application. this makes the difference but the most KZbinrs don't know it
@PhillipMwaniki11 ай бұрын
It's quite beautiful and stunning. Though, the process itself is tedious and error-prone.
@fideloper11 ай бұрын
It keeps improving tho, so I’m really hopeful!
@axMf3qTI11 ай бұрын
Okay… so why not just use Go en leave PHP behind? All these steps vs go build.
@fideloper11 ай бұрын
Larave is 🐐 (that's coming from someone who programs in Go, Node, Python, and of course PHP). Feature velocity in Laravel is insane.
@Mohamed.Shosha.9 ай бұрын
Is it best than swoole ?
@FilipePetter6 ай бұрын
nothing is best or worst... its a very shallow way of thinking... you should ask, best for X or Y
@dadlord68910 ай бұрын
When I am looking at any web stuff I can't believe that it is a binary code. It is super slow and absolutely religious by it's nature. While it is for the most part just an implementation of a prefab concept with a declarative language + some language that is targeting simple projects (getting problematic later). And overall everything web purposed is very similar to a game engine scope. I would expect true revolution for web with something like web-engine with specific IDE and editor. Game engine is an example of how you have an environment that is ready for all sorts of typical stuff and solutions for them in one place. And you don't have to remake everything if you just want to replace a physical engine or rendering pipeline. In few words: to have an actual architecture and not just bunch of unrelated stuff glued together hoping for the best. But I am quite delusional about web as I don't like browser and websites in the first place.
@djanthony666211 ай бұрын
Wow
@fmkoba11 ай бұрын
omg Chris, I think you solved a problem that’s been blocking me for the past few months
@fideloper11 ай бұрын
I have no idea how but I’m glad I did 😂
@Bob-tx7hv10 ай бұрын
finally even PHP can suffer from a complex zero downtime deployment - thanks to single binaries.
@fideloper10 ай бұрын
ohhh interesting, what’s the complexity? what’s different from other deployment methods?
@MarkConstable11 ай бұрын
"you don't need to run docker"... whew, otherwise it would be DOA for me.
@iabhitech25 күн бұрын
We will not be able to fix the bug by just opening the file on linux production server😂😂
@fideloper21 күн бұрын
immutable deployments sound great! stable! (basically what we get with containers right now anyway) 😂 but I hear ya, it’s so nice to ssh and patch a thing
@flipperiflop11 ай бұрын
Great video, just wished there was less of those "I'm not sure" moments
@fideloper11 ай бұрын
When it comes to C code, it's "I'm not sure" all the way down. (To be fair to me, some cases are just in the name of making the video not super long. But I also am *NOT* digging into that thread pooling code 😂).
@john589111 ай бұрын
Its like nodejs 😮
@fideloper11 ай бұрын
first of all how dare you 😂
@greendsnow11 ай бұрын
I want to learn PHP, but there's so many other useful frameworks like Supabase, Appwrite and Pocketbase, I can't find a reason. Sorry.
@fideloper11 ай бұрын
Do whatever works best for you! I do think a full-stack (backend) framework is worth learning over pure frontend + functions tho - you'll learn a ton of stuff important to a full career.
@kirayamato612811 ай бұрын
this server is still amateur. Would like to use on a personal project but in real world I'd still choose apache or nginx
@Ruhigengeist11 ай бұрын
Caddy is an 8 year old project. It's older than kubernetes. I wouldn't call that "amateur". Lots of very big companies use it in production.
@webmaster260011 ай бұрын
as long as {} and ; exist in PHP. I'm not going back.
@fideloper11 ай бұрын
I, too, love Python
@Gemorroj211 ай бұрын
like roadrunner. the f*king docker is terrible
@fideloper11 ай бұрын
😂 that’s how i feel about PHP’s official docker images