23 ms·
Docker, Django, Traefik, and IntercoolerJS: My go-to stack for building a SaaS
- ssijak 6y agoGoto stack for building SaaS is the one you know the best.
- nickthemagicman 6y agoI tried Django but I liked Laravel better. Because I knew it better. Exactly.
- andybak 6y agoFair enough. But Laravel is apparently cut from similar cloth so you'd be in agreement with the general philosophy here?
- nickthemagicman 6y agoFor sure as far as MVC frameworks go. Those are two of the best. I enjoyed Django when I worked on it. It was enjoyable to work in and had a lot of power. It was clearly a great framework. Also tons of big sites use it. And if a boss somewhere said they wanted the team to use it at some point in the future I would be totally happy about that decision.You cannot go wrong using django in the least as far as I'm concerned.
- Normal_gaussian 6y agoYup. Build it, ship it, and spend the majority of the dev time writing integrations that aren't really made any easier by any particular framework.
- systemvoltage 6y agoYou’ve just dismissed the entire article and it’s details by adding nothing useful to discussion. By your logic, let’s all dismiss HN - the best knowledge is what you already have.
- ssijak 6y agoI did not dismiss the article, I've read it. I just replied to the pretty strong statement that his choice is a "go-to" stack for building SaaS.
- systemvoltage 6y agoI’m sure you have. I think we want to discuss the details or something to bite on than a knee jerk reaction. I kind of agree with you - build with whatever tools you have. But, we also want to be curious and open minded of other tools that exist. Sorry for my harsh reply.
- lukevp 6y agoI think you misunderstood the intent. Constantly optimizing your toolset instead of building a startup with what you already know is a very common form of bike shedding and is one of the hardest things for some developer-founders to get past.
- ms4720 6y agoThe goal of a startup is to build things quickly, so actually being able to build things quickly is important. If you know a set of tools well you can work quicker than using a perhaps better set of tools that you do not know well. That is an important point to make to people like me who like playing with new toys
- ramraj07 6y agoI build things quite fast with flask and bootstrap, perhaps now with fastapi. If I have spare time I'd rather spend the time validating ideas or tech in new domains rather than learning more new tech that's just similar to this.
- chiefalchemist 6y agoI don't see it that way. After multiple comments in one direction it was healthy to have someone say, "Wait a minute. Let's not forgot why we're here and what we're here to do."
- tcbasche 6y agoYeah good luck getting something to market quickly if you aren’t in any way familiar with any of those technologies
- deleted 6y ago[deleted]
- rvz 6y agoWhat's the cost of something like this? IMO this looks a bit too complex and time consuming to manage. Why not something like Heroku?
- simplecto 6y agoA dedicated server at hetzner is about 30-35 dollars / month. That will get you a ryzen5/64 gigs/512 RAID-1 NVME on linux. Heroku at that spec really starts to hit the wallet. More than engouh for a lot of applications. Hell, I ran a E-commerce company with 20MM USD/year in sales on a dedicated server from 2005-2013. Most things are plain vanilla and rock stable. I can go from new server to running my first services is less than an hour. Ansible or cloud-init go a long way to turning my pets into cattle, so to speak. I spend nearly no time "managing it" -- I have grafana dashboards and Hetzner monitoring the critical things. Happy to share more.
- dinkleberg 6y agoAre you based in the US? I see Hetzner mentioned often due to their great value, but given their EU location I’d imagine the latency isn’t ideal. I’m curious what your experience is. When I’m looking for a cheap dedi box I use OVH or one of their related companies since they have Canada DCs which are closer. Obviously if you are in the EU, Hetzner and scaleway are a great option.
- simplecto 6y ago>75% of my visitors and users are in the US. The latency is simply not an issue. And surprisingly many in Malaysia. I run my blog and some small SaaS utils. I've never had a complaint ever about speed, responsiveness, or latency. I thought it was because I eschewed bloated front-end frameworks. ;-)
- andrewzah 6y agoI'm from the US and my personal website has been hosted through hetzner for 3+ years. From the US, I typically got around 120-130ms ping before I put it behind cloudflare. It wasn't really an issue.
- jayfk 6y agoI’ve built an Open Source Django starter template which uses a sinilar stack. It implements the full payment flow, basically ready to be deployed: https://getlaunchr.com/ https://getlaunchr.com/ It’s fairly new, all feedback greatly appreciated.
- sails 6y agoHey, just came across this, it is nice and easy to use. My comparison was with Laravel spark, which seems like a similar way to get all the obvious things running, but I'd prefer to use python. Have you found much traction with this? It is very neat and seems easy to use. The thing I like from spark for B2B products is the Team type roles & team billing (looks like spark is getting an overhaul) https://spark.laravel.com/ https://spark.laravel.com/
- SahAssar 6y agoWhy use zerotier if you are already using ssh keys? It wouldn't add any security, and in this setup the servers all have public IP's, right?
- simplecto 6y agoGood question. I ship logs and metrics back to my home server that runs grafana and loki. I also run some proxies to machines in other places.
- zmmmmm 6y agoThe way I see it, there's a level of complexity above which SSH becomes too painful to administer. So now what? Well, unless you find something inbetween you are up for setting up a full VPN and managing the complexity and security of that. And if your network needs are quite fluid, that itself is going to be a pain. Zerotier to me looks like that "something inbetween". But I'd be interested in Sam's comments.
- simplecto 6y agoExactly -- it is that "something in between" The nice thing with zero-tier is that it is literally two commands to get your network up and connected. hide your eyes if curl|bash makes you cringe... curl https://install.zerotier.com|bash https://install.zerotier.com|bash Then zerotier-cli join <your_network> Go into the Zerotier web admin, check the box, and boom, that machine is on the network, securely. Now I can spin up a bunch of containers for exploration/testing/or non-essential like grafana, prometheus, various exporters, metabase, etc. I try to keep traefik clean and only serving secure traffic to "live" and customer-facing things on 80/443.
- zmmmmm 6y agoHe says "docker, just plain docker" but in reality uses docker-compose - in my view a significant addition. However it aligns well with my own sentiments - for anything below large scale complexity or scalability needs, docker-compose hits a beautiful simplicity vs power tradeoff.
- simplecto 6y agoI disagree, docker-compose is just a wrapper around docker. It is in fact just a python package. The daemon itself is just plain docker.
- zmmmmm 6y agoWell, I guess it's subjective - but if you didn't have docker-compose I would have a whole lot more questions about how you are managing all the running services, storing configuration, defining networks, monitoring health of containers, defining volumes, port mappings etc etc. It may be "just a python package" but so is Django and docker is "just a go package" :-)
- simplecto 6y agoMan, you just put another 5 things on my list to write up! thank you
- ethbr0 6y agoAlso, does this becoming accepted bother anyone else? "curl -s https://get.docker.com https://get.docker.com | sudo bash"
- t0astbread 6y agoYou can also just ignore that and get Docker from your package manager. At least on Debian it's in the official APT repositories and Docker.com hosts one as well.
- 6y ago
- andrewzah 6y agoCan anyone answer why python is a choice anymore instead of i.e. golang for saas applications like this? I previously worked heavily with ruby and I cannot imagine building beyond >1000 LoC in interpreted, dynamically typed languages. Aside from developer familiarity which trumps all other points. It's also significantly easier to dockerize a generated binary from golang or rust, etc. Some of my worst docker headaches have been from trying to debug something like mayan-edbms, which uses python and celery workers. I just don't get it unless you specifically need some libraries that no other language has.
- Nextgrid 6y agoWhat's the Django/Rails equivalent in Go? The value from Python isn't Python itself (though it might be easier to write in - trading off reliability for ease of use compared to a compiled language) but the ecosystem. Fully-featured frameworks such as Django, Rails, etc give you lots of functionality out of the box which is very valuable especially at the early stages of the project where performance isn't a concern yet.
- andrewzah 6y ago"(though it might be easier to write in - trading off reliability for ease of use compared to a compiled language)" I find the "ease" is overstated compared to time spent debugging issues in production, but that is a separate discussion. See my comment in the sister thread about the django/rails equivalent.
- rufius 6y agoHonestly, frameworks like Rails or Django are an anti-pattern for Golang. The standard library makes it very easy to build web services and there’s a couple or popular packages for making routes and dealing with HTTP requests/responses simple. There’s projects like Micro that try to do a little more batteries included but I wouldn’t consider them to be pervasive in the way Django or Rails are. Beyond that, it’s just app logic and the typical Golang boiler plate. Source: I’ve built a few big Golang services for a couple companies.
- jorl17 6y agoI like the simplicity of the asynchronous tasks. The author mentions it's just a sleep and he isn't kidding: https://github.com/simplecto/screenshots/blob/master/src/shots/management/commands/screenshot_worker.py https://github.com/simplecto/screenshots/blob/master/src/sho... Of course, this only really works when you're not worried about multiple workers for the same "queue", etc. Still, simplicity is key -- don't build for scale just because you think you might be there in X years. I like your style!
- simplecto 6y agoThanks for the kind words. I should update the part about the queues. I started using this pattern for SKIP LOCKED and it works well for multiple workers (search engine crawlers). https://www.2ndquadrant.com/en/blog/what-is-select-skip-locked-for-in-postgresql-9-5/ https://www.2ndquadrant.com/en/blog/what-is-select-skip-lock... And implemented in Django: https://docs.djangoproject.com/en/3.1/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update https://docs.djangoproject.com/en/3.1/ref/models/querysets/#...
- jorl17 6y agoI instantly thought of something similar when I looked at your code. I like the simplicity! I used to combine RabbitMQ and Celery for async tasks. Mostly because it's what I learned to do since it was already in use at my first job. But Celery is such a pain -- or, at least, it was at that job. So many configuration options, different places where they were stored in different versions[1]. Weird errors. Poor documentation (at least at the time?)... I just started going for something simpler: rq and rq-scheduler with redis. For most of my use cases it's more than enough. I've got to say that your approach has gotten me thinking of maybe simplifying everything even more. We'll see where I end up. In about 4 weeks I'll have to introduce asynchronous tasks in our current project, and though I was thinking of going the rq-way, your article has given me food for thought. Other than that, your backend stack is mostly like what we use for our projects. We also use plain old docker + docker-compose, with the small difference that we have a somewhat hacked-together system I built with bash several years ago to extend docker-compose's functionality a bit and make every component somewhat more reusable between projects and easier to fine-tune on a "per-environment" (development, staging, production, etc) basis. We also use nginx, but your article has convinced me to look into alternatives. Once again, thank you for your articles, they're a joy to read and think about! [1] To be fair, that job had several aging Django codebases and I know most of them are still stuck with Python 2 and outdated Celery and django-channels versions. I constantly kept pushing for us to get rid of technical debt, but we never got to it...it's part of the reason why me and a mate left it for our own endeavors together.
- oftenwrong 6y agoDoes this setup support blue-green deploys?
- simplecto 6y agoNo. It seems quite complicated at such a small scale to do that.
- oftenwrong 6y agoMaybe I am using the wrong terminology, but I am interested in whether this provides for zero-downtime deploys with health/readiness checks and rollbacks. This enables safe and non-disruptive deploys. It is a common feature of many software platforms.
- simplecto 6y agoNo. You can do that much easier in docker swarm. In my case I just take the 5-10 second downtime in between container restarts.
- t0astbread 6y agoGreat writeup! I think it's useful to talk more about complete stacks instead of focusing on individual parts without mentioning the "glue" between them so I really like these kinds of posts. Just two questions: 1. If you're not going for scalability why Postgres and not SQLite? 2. What does your monitoring look like? I've read something about Grafana and Hetzner dashboards in the comments but what exactly do you use and where do you run that? Also, do you have anything for intrusion detection specifically? (I'd be extremely paranoid about that.)
- spiffytech 6y agoI love SQLite, but it really doesn't have a great answer to HA/failover. If you enable WAL mode, even NFS is off the table.
- t0astbread 6y agoRight, but in this case that's not a thing anyways since there's only one server.
- IgorPartola 6y agoThe main reason for me is that Postgres can be backed up while online, and I can scale up to multiple servers if I suddenly need to. Not so much with SQLite where if a small project suddenly hit the front page of whatever I would suddenly need to get really creative.
- t0astbread 6y agoI'm not sure how well the architecture described in the article lends itself to horizontal scaling since everything assumes it's on the same machine (I think?). Granted, if you build for horizontal scaling I agree, a client/server database is the way to go. As for backups, SQLite also supports backups while another process is using the database.
- g5becks 6y ago
- BluSyn 6y agoRegarding ZeroTier, these days I recommend using tailscale [1] instead. Much simpler setup, easier to understand, and likely more secure since it's just built on top of Wireguard (vs. layers of custom protocols). You do trade-off some of the more advanced features, but those are hardly used for this use-case anyway. [1] https://tailscale.com https://tailscale.com
- 0x426577617265 6y agoIs that sql docker exposed to the Internet or is there another network other than ‘web’ ?
- ketzu 6y agoAs they are using traefik as a reverse proxy, the container is likely not exposed to the internet directly, as long as traefik is there, as it manages all incoming connections.
- simplecto 6y agoNo, the Postgresql container is exposed only on the VPN interface (Zerotier). The only exposed containers are (usually) Traefik (80, 443). There is a docker network where traefik talks to all containers handling HTTP traffic. Other containers run in their own separate docker networks.
- atomicbeanie 6y agoIt’s about the data. Not the code.
- bovermyer 6y agoVery nice writeup. Not at all the stack I go with, but that's fine, we're different people with different priorities and tastes.
- mherrmann 6y agoI don't get why people use Docker for "small SaaS apps" where "scale is not an issue". You can run everything without Docker to remove an extra level of indirection. I've been doing that exact thing with a very similar Django stack for years. Not once have I missed Docker. On the other hand, I have taken over SaaS projects where the (unnecessary) usage of Docker made it more expensive to host, decidedly more difficult to debug and maintain, and tests were slow, making me less productive. As the reason for using Docker, the author writes "The benefits of matching your development environment to your production one cannot be overstated". Again in my personal experience, this simply isn't an issue. Just use the same Python version and a roughly similar PostgreSQL version in development and production, and you're good to go. In short, I feel OP would be better off without Docker. Once you know the rest of the stack well enough, you can set it up in dev and prod in such a way that you can trust that what works in dev will also work on prod. I've been doing this without problems for years.
- leetrout 6y agoDocker on Mac and Windows is so slow when used for a development environment but there are enough differences that it makes it worth using. It’s more portable than VMs (vagrant and such) and if you’re using your CI pipeline to build an image then deployment is a snap. I much prefer building a Docker image and pushing it somewhere compared to tarballs of the repo or repo access. I would rather build rpms or debs than just push the repo around. Container tooling makes that kind of stuff nice in my opinion.
- mherrmann 6y agoYou agree that Docker is "so slow" and point to its benefits for preventing differences between dev and prod. But you don't mention what those differences are. What are they? I also don't see why you'd use a CI pipeline for simple projects where you are typically the only developer. Run tests locally, if everything is fine push to prod. I use git with a small script to roll out to production. When I execute the script on the server, it stops all services, pulls the latest code from Git, applies Django migrations, and starts everything up again. I use desk [1] to make this as simple as a single `release` command in my local shell. [1]: https://github.com/jamesob/desk https://github.com/jamesob/desk
- wilsonfiifi 6y agoOr you could just use Dokku [0]? I don't mean to criticise the author's stack but if you just really want to focus on your application and spend less time figuring/learning about deployment then just adopt the 12 factor [1] approach and use Dokku with Fabric[2] for you server setup. I have a sample fabfile [3] I use for my initial server setup that I can easily modify to suit different project needs. Ultimately, it comes down to personal preferences but Dokku being installable on your development machine (via virtualbox) you've got a very similar environment to production. [0] https://github.com/dokku/dokku [1] https://12factor.net/ [2] http://www.fabfile.org/ [3] https://github.com/johnwilson/django-wagtail-template/blob/master/fabfile.py
- e12e 6y agoYou probably want your references without leading spaces, just add another line feed to get them on separate lines and avoid the "code block" that doesn't parse links: [0] https://github.com/dokku/dokku https://github.com/dokku/dokku [1] https://12factor.net/ https://12factor.net/ [2] http://www.fabfile.org/ http://www.fabfile.org/ [3] https://github.com/johnwilson/django-wagtail-template/blob/master/fabfile.py https://github.com/johnwilson/django-wagtail-template/blob/m...
- simplecto 6y agoOP here: I already tried the Dokku way of things, and it was not to my taste. I like being a bit closer to the native docker commands if/when things go sideways. Dokku is an abstraction I don't want.
- derkoe 6y agoIntercoolerJS / htmx looks like a really cool solution for server-side rendered HTML with client-side interactivity. All the hype is currently with https://hotwire.dev/ https://hotwire.dev/ but htmx has more features, seems more solid and even supports older browsers like IE11.
- deleted 6y ago[deleted]
- danjac 6y agoThe libraries cover a similar ground, but there are some fundamental differences. With Turbo, by default all your links/forms will use XHR to fetch new pages which do a full body swap (unless you want to use frames/streams or opt out entirely), whereas with htmx you have to be specific which links/forms and targets you want - there is an hx-boost attribute that does something similar but it lacks a corresponding data-turbo-permanent attribute (at least in the current production version) when you want to exempt certain elements. Both are valid approaches but it depends on what suits your requirements better.
- recursivedoubts 6y agohtmx supports the `hx-preserve` attribute since v1.1: https://htmx.org/attributes/hx-preserve/ https://htmx.org/attributes/hx-preserve/
- danjac 6y agoGood to know! Didn't see it in the attribute reference list.
- recursivedoubts 6y agosorry about that, i have updated the docs
- derkoe 6y agoI did a server-side version of the TododMVC app with both. I think Hotwire (Turbo and Stimulus) and htmx have exactly the same goal. I found htmx easier to understand and handle. Here are the two implementations (backend is in Quarkus/Java): - https://github.com/derkoe/quarkus-hotwire-todos https://github.com/derkoe/quarkus-hotwire-todos - https://github.com/derkoe/quarkus-htmx-todos https://github.com/derkoe/quarkus-htmx-todos
- TekMol 6y agoIs there a benefit of running Postgres and Django in different containers? By putting them in the same container, things could be a good bit simpler. And I don't see any downside here.
- pbar 6y agoSingle responsibility - that same container is gonna get shipped to prod/etc. I would hope the database isn’t in the container there!
- TekMol 6y agoI would think the database data does not live in the database container but is mounted into it? If you update you database version, you do not ship the database data to production either.
- sofixa 6y ago> s there a benefit of running Postgres and Django in different containers You can use the official optimised containers ( especially for complex things like Postgres that's great) > By putting them in the same container, things could be a good bit simpler. And I don't see any downside here The downsides are that you get fat containers that are impossible to scale independently ( one day you might want two Django containers, or to set up a replica PgSQL for load balancing, HA, etc.)
- TekMol 6y agoThe premise of TFA is that "scale is not an issue".
- avaika 6y agoDocker monitors only main process. If side process fails docker will do nothing about it. Means if you want to put multiple apps inside single container you have to add some manager guy to keep an eye on all the processes (e.g. supervisord). Plus in case with separate containers the layers cache is reused better.
- fredsted 6y agoI really like the authors philosophy. Too many developers use a bunch of tools, and you get the impression that it's just for the sake of tooling, or because that's how you're expected to do things. You can keep scaling a single server and deploying via simple git hooks for years until you need a more fancy setup. Especially for side projects, you want to use the minimum amount of tooling that gets out of your way so you can focus on building a great product. To me, a weekend spent doing auxiliary or unessential stuff like configuring Kubernetes or whatever feels really fatiguing and demotivating when you don't have a lot of time to work on the project otherwise.
- manmal 6y agoUsing tools and services is the easiest way to profit off the work of other people (stand on the shoulders of giants), and choosing the right tools for your use case can save you SO MUCH work. With side projects, maybe there is a certain thing I want to get out of it - eg I want to focus on design more. With the myriad of tools out there, I can then choose something that makes development less involved, and lets me focus on design. Or vice versa - if I only care about the dev side, I can import eg tailwind or buy a web components lib and call it a day.
- simplecto 6y agoOP here, thanks! It is fun to learn, but it sucks to yak-shave [1] all the time. The simplicity of the stack lets me walk away for days (or years) at a time, come back, and easily ship changes. No need to remember esoteric commands, configs, or get bitten by strange infrastructure upgrades. I'm lazy, and I'm just looking for ways to be lazier. :-)
- wiredfool 6y agoDid you mean to expose your postgres port to the world? Adding the port declaration to the docker file exposes it to other containers on the same network/machine, adding it in docker-compose exposes it to the world.
- 6y ago
- stepbeek 6y agoCurious about the choice to self-host everything here. Why not deploy a django app to heroku? Or the new digital ocean app platform?
- simplecto 6y agoIf I have the competency and like it, then why not? Also consider this is in the context of personal projects and small operations where scale is not the issue. I get way more bang for the buck in terms of compute, storage, and memory with self-hosted/dedicated.
- 11235813213455 6y agomine would be: - nodejs + (p)react - ovh for hosting - pm2 for simply running the server - postgresql - gitlab for ci and project management
- domano 6y agoDocker, traefik and debian auto-update alone allow me to run all my side projects on a single semi-beefy machine i pay <20€/mo for. I like to try new JS technologies and those alone sometimes need different node versions - i would hate to spend time on these issues. My deployment is 2 lines: DOCKER_HOST=ssh://user@mydomain.com docker-compose up Did not have to touch it for years
- domano 6y agoExcept for the traefik v2 upgrade, forgot to mention that. But aside from that no work whatsoever.
- simplecto 6y agohah. Same here. Upgrading traefik is one of my more popular posts: https://www.simplecto.com/migrate-from-traefik-1-x-to-2-x/ https://www.simplecto.com/migrate-from-traefik-1-x-to-2-x/
- pjfin123 6y agoHow do you do the auto updates?
- sgt 6y agoLots of discussion around Docker here. I use some glue shell scripts to deploy Docker containers to prod as I think Kubernetes is overkill. I have however been considering podman and starting the containers from systemd which would be a very small leap. Is this a good solution for small prod setups? Would like to hear experiences.
- zie1ony 6y agoHow do you do websockets?
- simplecto 6y agoTraefik handle websockets just fine. You just need to make sure Traefik can talk to all the backend services on the right ports.
- tarjei_huse 6y agoNice writeup. What I find lacking in this post is tips on how to best configure systemd to run docker/podman containers and/or docker-compose. Any tips on that would be great!
- simplecto 6y agoThank you! At no point do I have to touch systemd, unless you want to change the default behavior of the docker daemon (which I dont). You can simply apt-get install docker-compose. I am not familiar with other distributions. I suppose you could also pip install docker-compose as well. Fortunately most of my systems remain in the default state. All the magic happens in docker/docker-compose.
- hankchinaski 6y agothe issue I had with this setup is that without a systemd or any daemon you might need to firefight and manually restart your containers each time there is an issue
- sofixa 6y agoYou can tell docker or docker-compose to always/on failure/unless stopped restart your containers.
- arrty88 6y agoi like traefik, but i also like HAProxy. Works well with LetsEncrypt https://serversforhackers.com/c/letsencrypt-with-haproxy https://serversforhackers.com/c/letsencrypt-with-haproxy
- martinald 6y agoI'm not convinced this is a great approach. Firstly, while dedicated servers are extremely good value (by my calculations they can be 100x cheaper for performance heavy workloads), for most SaaS they're not worth it due to operational requirements. I would, however, definitely look at them for cases where performance matters and the savings are really substanial, which for an early stage SaaS product, they aren't. I'd recommend using Heroku level solutions over more complex stacks to start with. For most use cases it works great, scales easily and the provider takes care of loads of underlying stuff. This won't work when you have a lot of developers and many apps and services to run, but it's premature optimisation to do anything more than that at the start and often in my experience ends up causing downtime due to overly complex infrastructure. You don't even need to use Docker to start with. Next, I definitely would not recommend hosting Postgres yourself at an early stage. Use a hosted provider for this! It's worth paying slightly more for someone else to manage one level of backups, the underlying OS and version patching for you! I have seen so many data loss incidents that wouldn't have happened on managed DB services. In one case it basically killed the business overnight. Even worse, it is hard to scale if you get hit with a load of traffic unexpectedly. You will not be able to provision VMs, configure read replicas etc quickly enough if you suddenly get hit with a load of users from some news article or blog. If it is hosted you have autoscale which will handle this for you. Finally - I would recommend using "CI/CD" from the start (I find it odd that maintaing CI is too much of a hassle, but running dedicated servers isn't!). Many reasons for this, but one is that you will be able to do small edits even from your phone (I'm not proposing big changes). Small copy changes for example - these can be really urgent but you may not have your laptop to hand. If you can edit source file and commit to SCM and have it build for you, it can get save your arse more than you'd think.
- igammarays 6y agoI feel like an idiot reading these kinds of posts. If this is a “simple” stack, then I’ll be jiggered. Why do you need a “control plane” like ZeroTier? What problem does it solve? Certainly not a problem I've ever had. And I have a real SaaS business which people pay real money for. I've been developing enterprise SaaS for 10 years. My go to stack for small projects where scale is not an issue is Laravel, Laravel Forge for deployment, Vue or jQuery for interactivity, SQLite for database, Redis for cache/queue and...that’s it. No Docker (because Laravel has a super simple dev environment setup with Valet), not a single YAML configuration file to be found anywhere, and this kind of setup on a single $20 DigitalOcean server can literally serve 100k users without a hitch. How many apps have more than 100k users?
- mixmastamyk 6y agoThe explosion in stack choices means no one can know them all. Also, even simple apps can have one or two areas where things get a bit complicated. "Simple" is relative and inadvertently implies things the author is familiar with. I'd guess sqlite (for example) is fine for very simple apps with one user at a time, but that bar is pretty low. Yaml itself is not an issue, and intercooler/htmx is simpler than your JS picks. shrug
- akho 6y agoThe ‘projects’ section on the website has 3 projects. I wonder how widely the author uses this stack. ‘Personal SaaS’ is a weird category.