• Tuesday

    • Updated supercontest banner.
    • Updated vscode. Updated/pruned some extensions.
    • AWS EC2 options; did a little research on the difference between a Reserved Instance and a Savings Plan.
      • This article summarized it well: https://www.cloudzero.com/blog/savings-plans-vs-reserved-instances.
      • RI = “commitment to use an instance at a particular price over a specific period”
      • SP = “commitment to spend a particular dollar amount per hour over a specific period.
      • RI is simply committing to a single VM longterm. You just have to calibrate your usage. You lose efficiency if you’re overprovisioned or underutilized.
      • Savings plans are newer, and will basically deprecate Reserved Instances. They’re more flexible. They’re basically a longterm commitment for the on-demand allocation model, you just have to roughly know your $/hr usage.
    • Reserved instance comparison.
      • 36 months, pay upfront, nonconvertible, us-west-1 region (Northern California).
      • $157 for a t2.micro, same size as my current DO droplet. At $6/mo, that’s $216. So AWS RI is cheaper.
      • t2.small (double mem, 2GB) is $315 for the next 3yrs. Paid for this RI.
    • Remember that the RI is just an object, not an instance. You still must go over the Instances interface and launch your custom instance. If you have an instance running that matches the size/region/etc of your reserved instance, then it will be deducted.
    • Migrated supercontest to aws.
      • Launched the instance, as above. Remember: doubled mem to 2GB.
      • Upgraded to ubuntu 22 from 18.
      • Created keypair. Added to my desktop wsl2. Not to gitlab (yet) and not to laptop.
      • Created security group. Inbound ssh/http/https from all IPv4, outbound all.
      • Installed docker with snap.
      • Installed docker-compose manually: https://docs.docker.com/compose/install/linux/#install-the-plugin-manually
      • Remember the account on the EC2 RI is not bmahlstedt, it’s ubuntu.
      • Created new ssh-rsa kill and added the identityfile path to it in ~/.ssh/config (rather than bash techniques for ssh-add).
      • Cloned master/head.
      • Created 3 private files manually.
      • Created the docker group, added the ubuntu user to it, and chowned root:docker /var/run/docker.sock so that I could run docker commands without sudo.
      • Copied over the most recent backup and restored the postgres db.
      • App and db are up and running in EC2, reverse-proxied by my nginx infra and letsencrypt companion.
      • The jwilder nginx setup searches for the VIRTUAL_HOST param in the docker network, so your publicly reachable address must be specified there. Otherwise you’ll get 503s.
      • Everything is ready for the cutover. Just need to migrate the DNS service and domain registrar from GoDaddy/DigitalOcean to Route53. Will do next week, again providing enough time just in case there are issues.
  • Monday

    • Switched back to chrome. Brave has been continuously slower, failures to connect to gemini, cannot collect rewards across multiple devices, issues with cache/cookies (cannot open multiple accounts), can’t create custom iphone shortcut action, and diminishing BAT value.
      • Set default (on desktop/laptop/phone).
      • Exported/imported bookmarks.
      • Manually synced extensions.
      • chrome://flags doesn’t have the Side Panel disable setting in newer chrome versions (>=102). Leaving for now.
      • Dark theme.
      • Manually synced cards and updated.
      • Manually synced addresses and updated.
      • Modified a few passwords and cleaned, but not even close to fully. There will be some resets I’ll have to do for this later as needed, which is a healthy cycling anyway.
    • Pitch is a presentation platform. Create slide decks and collaborate. They have a ton of templates for funding rounds, strategy, branding, etc.
    • Canva is a brand platform. Create business cards, presentations, resumes, logos, posters, billboards, documents/stationary, etc. Templates, fonts, images, graphic designs. Like Pitch but for any type of content/media, not just presentations.
    • The cowboys are worth 8B, more than any other football team. It’s due to the huge fanbase, sponsorships, and media deals. Not talent on the field.
    • Finished Smile and Don’t Worry Darling. Both decent. I liked Smile better. For DWD, Felt like Olivia Wilde was trying to do for sexism the same thing the Jordan Peele already did for racism, but Get Out was much much better. Also hilariously ironic considering the DWD on-set drama happening in the background between Wilde herself + Harry Styles and Florence Pugh (assuming true, of course – I was not there).
    • Aquatic Capital Management was founded by Jonathan Graham who was at Citadel for >13 years.
    • Tons of work on the pitch deck.
    • Recruiters are insane nowadays. This happened today, and has happened once every 3-4 days for years (outside of the usual 10+ daily connection requests):
      • Within a period of an hour: (1) linkedin message -> (2) email -> (3) text -> (4) call.
      • Pick a single communication channel and stick with it. Allow proper time for response.
    • Friendsgiving invites went out.
  • Thursday

    • Seahorse emailed me to say that there was a bug in my wordpress migration last night and they fixed it. Nice, I checked it out – the posts are back. But the theme is still messed up. No colors, different menus, “proudly powered…” footer returned, etc. Clearly not a full backup/restore migration.
    • New fish arrived today. All natives behaved except the coral banded shrimp and rolland’s damselfish. The bicolor blenny seems to have a bit of ich. Hadn’t introduced any novelty over the past few weeks, perhaps just waste buildup and stress while I was gone for 2wks.
  • Wednesday

    • Chess cheating – magnus/hans.
      • Love the centipawn math analysis from a few days ago: https://www.youtube.com/watch?v=Q5nEFaRdwZY. Compares accuracy to rating. There’s a known trajectory as you get better at chess with experience (for normals, for prodigies, for all) of how your accuracy improves as your elo rating improves. Hans’ accuracy basically stayed the same from 2300-2700, which effectively means through those years he had an engine set to 2700 (on avg). Before that (<2018), he showed the continuous improvement of a human.
      • Full chess.com report (72pg, but the actual report without appendices is only 20pg): https://www.chess.com/blog/CHESScom/hans-niemann-report.
    • Sleep:
      • https://www.youtube.com/watch?v=q3nVp4Rhn74.
        • “We can force ourselves to stay awake but it’s much harder to force ourselves to fall asleep.”
        • “It’s very hard to control the mind with the mind…you need to look to some mechanism that involves the body.”
      • https://www.youtube.com/watch?v=WwrrKlII4XA.
        • THC blocks/reduces REM sleep (bad) and speeds sleep onset (good).
        • That’s why tolerance breaks = crazy dreams. Your brain is experiencing normal REM for the first time in a while.
    • Remember wordpress is php/mariadb.
    • Fixed the broken shelf in the kitchen and tightened all other hinge mount bolts.
    • This makes me happy: https://www.reuters.com/technology/eu-parliament-adopts-rules-common-charger-electronic-devices-2022-10-04/
      • Forced standardization to avoid predatory behavior and waste. Hope the US follows suit.
    • Elon proceeding with Twitter purchase: https://www.sec.gov/Archives/edgar/data/1418091/000110465922105787/tm2227435d1_ex99-s.htm
    • Cloud hosting: AWS vs DO.
      • AWS has a cool migration service; instead of building a server and running an app from scratch, you can install an AWS replication agent on an existing server and let AWS recreate in EC2.
      • You can’t delete an instance forcibly from your EC2 dashboard. Just terminate the instance, and AWS will remove it from your dash over the next couple minutes/hours as all associated resources are flushed. Same happens with volumes. The dash will show them for a bit, just wait.
      • My brian.mahlstedt@gmail.com root account was created in 2020, so its 12 months of free tier have expired already. I can use the southbaysupercontest account, but I intend to run both sbsc and this blog in EC2 and it’s probably easier to run in one place. I’ll pay the regular (it’s still cheaper than DO).
      • EC2 billing – the are many options.
        • General.
          • FreeTier is just the temporary first year, for certain services; not an allocation type.
          • All of these are per-second bills. You only pay for what you use.
        • 3 standard allocation types.
          • On Demand (default). If there is room in your region, you’ll get it – and then it’s yours (same as reserved). $0.0138/hr (~$10/mo) for t2.micro in us-west-1.
          • Reserved. You are guaranteed. Commit to a virtual server in a region for 1 or 3yrs. $0.007/hr (~$5/mo) for t2.micro in us-west-1 with 3yr commitment.
          • Spot. If there is room in your region, you’ll get it – but if other requests come in (on demand or reserved), you’ll be terminated. $0.0041/hr (~$3/mo) for t2.micro in us-west-1.
        • Other (less common).
          • Dedicated host. Physical server. It’s yours.
          • Savings Plans. Not exactly sure the difference between these and Reserved instances (RI).
      • I went over the free tier COMPUTE options yesterday, but there are a few more considerations:
        • Storage:
          • Free tier allows up to 30GB (General Purpose, EBS, SSD). After that, gp3 is $0.08/GB/month. To compare to my 25GB droplet, that’s $2/mo. But I’ll use a little less.
          • gp3 is the newer version of gp2. Higher perf. More IOPS, etc: https://aws.amazon.com/blogs/storage/migrate-your-amazon-ebs-volumes-from-gp2-to-gp3-and-save-up-to-20-on-costs/
        • Domain/routing.
          • Create an elastic IP so the EC2 instance doesn’t change IP over time.
          • I currently use GoDaddy as my domain registrar. Move over to AWS Route 53. Not sure how their annual prices for my domains compare, but I’ll check before transfer.
          • And then use Route 53 as DNS (if you use it as the domain registrar, this automatically happens, else you can do it separately).
          • Not sure about pricing (for just the DNS records and routing). It’s dependent on usage. Anywhere from 0-50 cents per month, I believe.
      • So overall: with compute+storage+routing, it will be about $6/mo on AWS. Same as DO, but many more services. And I can mess with cost savings and pricing models (switch to per-second usage, etc) so I think I can get it down lower. And I’ll get more exp with AWS instead of DO, which has less market share.
      • I’ll do this migration next monday, after sunday football day and before wednesday line/pick opening. Don’t want to do it today, just in case there are issues/delays. Giving myself 3 days is better, just in case.
    • bmahlstedt.com migration.
      • To practice before monday (and bc I need to do it anyway), I’ll do the above to migrate this blog from hosting on DO to AWS.
      • I don’t have a vanilla droplet running wordpress on DO, it’s a wordpress-specific DO instance.
      • Seahorse is a trusted AWS partner that specializes in migrating to AWS. First evaluated using their plugin to migrate to Lightsail (basically a bundled compute/storage/dns/etc solution for sites on aws, instead of manual mgmt with EC2).
      • There’s an alternative: “All-in-One WP Migration” plugin on WP. Exports a single file. Then you can import at the new location, customizing as you please. This is the from-scratch EC2 approach. I’m going to use the seahorse approach for lightsail experience.
      • Tried the seahorse wp plugin and was running into issues. It also had 1 review, whereas the from-scratch plugin had over 7k.
      • Used the plugin to export a single file of my whole site (~600MB, includes db). Then go to a fresh ec2 instance, install wordpress, then install the same plugin in wp, then import that same file you exported earlier. All on wp v6.0.2.
      • Used Amazon Linux instead of Ubuntu. Mostly just to learn about their distro with some first-hand exp. 64bit x86, t2.micro (1 vcpu 1GiB mem), new keypair, new network security (ssh all and http/s), 25GiB gp3 EBS SSD. Reserved instance, not spot. AZ us-east-1.
      • Connected successfully on my local vscode: ssh -i “bmahlstedt.com.pem” ec2-user@ec2-44-203-160-108.compute-1.amazonaws.com
      • There’s an upload limit of 512MB with the free extension. My wp blog is larger than that. To remove the limit costs $69/yr (lol) https://servmask.com/products/unlimited-extension
      • I’ll just leave bmahlstedt.com on digital ocean.
      • Undid everything, terminated the instance, etc.
      • Later came back and played a bit more with seahorse.
        • Successfully migrated to lightsail with a clone of this blog. Pretty cool/easy tool.
        • Launches to eu-west-1, creates IAM for you, all done. You don’t have to provide any AWS info. Free.
        • Runs for 36 hours for you to play with it, then taken down.
        • I noticed it did NOT copy over all my posts, so something happened with the db backup/restore.
        • It’s $110 for a single-use license to migrate once to AWS. I’ll skip.
          • The process is obviously just do the same steps, using your own IAM keys so your site clones to your lightsail.
      • Later came back and played a bit more with backups.
        • Remember I already have another plugin that does backups for my wp site, UpdraftPlus.
        • ~470MB of the ~600MB full site export was the 5 backups.
        • It backs up in two places.
          • (1) Remotely to gdrive. I reauthed and confirmed this worked.
          • (2) Locally, on the wp server (in the updraft folder).
        • You may configure how many backups it keeps (FIFO deletion). Cannot do zero, must do at least 1. This applies to local backups (stored on the server that’s hosting the wordpress site) as well as remote backups (gdrive in my case).
        • The site is actually only ~90MB but it was keeping 5 copies, hence the 470 above.
        • So now that my site is actually only ~200MB (one for the site, one for the single backup), I could use the all-in-one migration tool to setup wordpress on a vanilla EC2 instance and import over. But whatever. I’ll keep the blog as-is on DO for now. That’s enough migration investigation.
        • For comparison – the UpdraftPlus suite comes with a Migrator as well (obviously, it’s just a backup/restore task), and it’s $30 (compared to seahorse’s $110).
    • Supercontest.
      • Updated banner, posted lines, submitted my picks.
      • The app required TWO modifications since superbook changed the format of the lines on the weekly card. So silly.
        • (1) “PRO FOOTBALL – ” as prefix in the date row.
        • (2) “London, UK” as suffix in the time cell (where appropriate).
  • Tuesday

    • Looked up softball/dodgeball/kickball leagues in nyc. Sandlot sports has a bunch. I’ll sign up soon (back is still healing). Looks like they have open gym on mondays in nolita: https://sandlotsportsnyc.com/pickup-games#mondays
    • You can fill acrylic aquarium scrapes just like buffing any other plastic. Rub it out with sandpaper then polish.
    • Host analysis.
      • Obviously I can do everything at home on my desktop.
      • Stay on Digital Ocean.
        • Blog will remain there, but sbsc is the one in question. Currently $6/mo for a 1GB mem 1cpu 25GB disk ubuntu 18 droplet. If I go to 2GB mem (which is the limiting factor rn) it’s $12/mo.
        • Managed k8s is $12/mo.
      • AWS.
        • Free tier provides t2.micro (1cpu 1GiB mem) for a year for free and then a little under $4/mo after that (for a 3yr reserved instance).
        • EKS is a bit more expensive. A little under $75/mo for each cluster, and then you have to pay per usage as well.
      • Conclusion:
        • If continuing to host in the cloud, move from DO to EC2.
        • If self-hosting, run full k8s locally.
  • Monday

    • Back from Eurotrip (Lisbon, Florence, Rome, Munich (Oktoberfest), London – got to see Eric, Richard, Derek (and engagement!)) and unpacked/cleaned/mealprepped/etc.
    • Harvested dill, lavender, celery.
    • All aquarium life survived!
    • Planted next batch of hydroponics: eggplant, sunflower, hot lemon pepper, watercress, lemongrass, marigold, cilantro, bok choi.
    • When the dollar is strong, it’s great for retail/vacation/etc. It’s not great for international businesses; their overseas markets reduce revenue.
    • Biogen’s experimental drug lecanemab showed promising results last week (slowing decline) after phase 3 trials. Good news after the aducanumab stuff from last year. The assumption/method of both: beta-amyloid deposits in the brain are bad, so find a drug that can reduce them.
    • Looked at groundfloor – basically p2p lending for 10% returns, but backed by residential real estate (the second peer is a real estate developer, not another random investor).
    • (Seemingly) finalized Schwab fiasco. Cash balance is positive, “Balance Subject to Interest” and “Month to Date Interest Owed” under margin section are both 0.
    • RODI overview.
      • General.
        • Turn your tap to cold, not hot. Hot water has more impurities and can damage the RODI membranes more quickly.
        • Frequency of changing filters: totally depends on use case. How much water you push through your rodi system (how often you do water changes), how much impurity is present in your source (how dirty your tap water is), etc.
          • For my case (NY, and 15gal/2wk), annually is fine.
        • TDS = total dissolved solids.
        • TFC = thin film composite.
        • GAC = granular activated carbon. Little pieces of carbon (charcoal/coconut usually). Also called UDF, but not sure what that stands for.
        • Carbon filters are usually made from wood (charcoal) and coconut. “Activated” means it’s not just wood, using other sources like coconut/peat/nutshells/etc.
        • DI cartridges are made of two resins, containing (respectively) negatively and positively charged ions that extract the opposite from the water like a magnet.
      • Canisters/stages. In order: (mine is 7 stage)
        • Sediment. Usually a polypropylene filter. Basically a mechanical filter. Removes dirt/dust/sand/etc.
        • GAC. Removes “tastes” and “odors” – organic contaminants, hydrogen sulfide, chlorine, etc.
        • Carbon block. Same as the previous, but uses more coconut and is finer. It’s in a block shape, not granular.
        • RO membrane. Does your reverse osmosis. Removes TDS (arsenic, lead, fluoride, more). This is another polypropylene layer, but finer than the first.
        • DI cartridges (I have 3). Does your deionization. Removes mineral ions (sodium, calcium, iron, copper, chloride, more).
    • Mahlstedt LLC.
      • Remember LLCs are only legal entities. They must be classified as one of the other 4 tax entities:
        • Sole proprietorship.
        • Partnership.
        • S Corp.
        • C Corp.
      • Those generally go in order of size. Sole = 1, Partnership = a few, S = small/medium, C = large.
      • The first 3 are passthrough. C corps are not passthrough.
      • S corp can have max 100 stockholders.
      • If you do not file an ECE (entity classification election, form 8832), you default to a sole proprietorship. You have 75 days after business formation to do this (although can reclassify later).
      • FICA = Federal Insurance Contributions Act. Basically a payroll tax, federal income + social security and medical.
      • Descriptions.
        • Sole. The simplest. You don’t even need to register with the IRS; your SSN is your EIN.
        • Partnership is just like the simplicity of a sole proprietorship, but with multiple people. So you usually do the same tasks plus one more: create an operating agreement for the partnership.
        • S and C corps are the main ones for businesses of size.
          • C is the standard for large. If you’re public (or have >100 shareholders), must be C. It’s what you’re used to: as an employee, you pay tax on your wage. As an owner, you pay tax first on all profits (as the company) and then on your income (as an owner, personal return). This is double taxation.
          • S passes through; taxable income for the business passes through to the personal taxes of the owners. You still file a return for the business, but don’t owe tax on it. On your personal return, you pay taxes on the company profits, but then withdraw those profits (tax free) from the company. You get taxed for FICA on your owner salary, but then the other business profits are not subject to FICA. A little more admin for this, have to allocate stock, file for all payroll, etc.
      • Overall: since I don’t expect immediate profits from Mahlstedt LLC, I’m leaving it as sole proprietorship. Once I start making profit, switch to S Corp and avoid the 15.3% FICA tax.
    • Supercontest.
      • Missed the banner/lines/picks weekly update last wednesday because the fetch broke and I was in Europe, unable to fix. Basically wrote a migration to manually commit the lines, and another for the picks that Petty had collected in a gdoc.
      • https://gitlab.com/bmahlstedt/supercontest/-/issues/163
      • Tried to update the shortcut on my iphone to open the website in brave not chrome, but there’s no brave Action for opening a URL like there is for chrome. Brave only has the “open a new browser tab” action.
  • Wednesday

    • Schwab update: got another daily bump of interest (problem), called and they said it was expected. Because the trade took 2 days to settle (still insane), the sameday withdrawal put me on margin (for 2 days). It shouldn’t increase tomorrow, when I’ll check again. They’re putting a credit/waiver in process for the 2 days of interest.
      • For reference, in case this slips while I’m in Europe, and the margin/interest does a sneak accumulation in the background over a long period of time: the first person I talked to was a woman (didn’t catch name) at 877-870-7317 x70180, and the second person I talked to was Dan (no extension, was the next operator).
    • Absolutely loving the chess cheating scandal between Magnus/Niemann over the past 2 weeks.
      • From the Sinquefield withdrawal after Magnus’ first classical loss with white in >50 games to the JB generation resignation (where magnus went 10-4-1 including the intentional loss).
      • Really comes down to whether you believe Magnus as a person or not. The absence of public evidence is not an argument. There are many reasons (legal, mole, others) why remaining silent is the best option. I originally thought the most likely explanation was: The initial withdrawal+tweet (accusation) was an emotional overreaction, and then the world blew it up into a bigger deal that became increasingly embarrassing, and Magnus was soberly cornered and couldn’t really walk it down. But then he doubled down with the JB resignation, stating firmly that he believes his position strongly. So…should we? Compare the two characters. Magnus: world champion for a decade, known sportsmanship, never had a moral mishap like this before. Hans: known cheater, banned from online tournament sites, multiple times, has lied about extent of cheating before.
      • Today he gave his first interview after the round robin finished. He said he’d state more after the tournament.
    • Updated vscode, a bunch of drivers, and a bunch of windows patches.
      • Audio stopped working. Uninstalled the realtek driver, restarting the computer, fixed (without reinstalling any driver…?).
    • Edited some of the merge request settings in gitlab (require approval, tests must pass, etc).
      • Gitlab has a rebase button from the frontend, which can handle the conflict-less case – pretty great.
    • Apple wallet.
      • Tried to add my business credit card to apple wallet – the issuer (boa) doesn’t support it for this card yet.
      • Tried to add driver’s license too, since I updated to ios 16 – it’s not yet supported for NY, only for AZ and MD.
    • The user@host at the end of the public key stored on the server is effectively a comment. Anyone with the private key can ssh into that server. They don’t have to be the same user@host.
    • Supercontest.
      • CICD. Finished https://gitlab.com/bmahlstedt/supercontest/-/issues/161.
        • Installed tox in wsl.
        • Note that test-requirements is mixed with regular requirements for the final compilation. At installation, we only install the desired (by using -r with reqs and -c to constrain to compiled-reqs).
        • .gitlab-ci.yml -> makefile -> tox -> pylint/bandit/pytest
        • And remember “make test-js” exists and runs eslint and jasmine. Don’t think I ever got this passing though. Continuing to leave it off for now.
        • There was a conflict in flask-graphql and graphene on versions of graphql_core.
        • req-compile (Spencer’s tool) wasn’t able to resolve this (and looked unmaintained at this point), so I switched the resolver back over to the industry standard pip-tools.
        • Updated the reqs: https://gitlab.com/bmahlstedt/supercontest/-/commit/021c39e14444be5e50f34dbd7a61ff3dcaef5e96?view=parallel
          • Removed importlib-metadata and typed-ast and zipp.
          • Upgraded setuptools 50.3 -> 65.3 (undid later)
        • Delinted with ~moderate changes. No necessary changes to bandit or pytest, passed.
        • Removed the make requirement of test on update-reqs. You can pip-compile without testing anything. You can run tests without updating reqs. I want update to be manual, on my schedule.
        • The gitlab ci runners with metadata issue on python installation of my compiled reqs into the image. My tests and deploys work locally.
          • Image python37.
          • –use-deprecated=backtrack-on-build-failures and legacy-resolver did not work (in custom pip install command in tox).
          • Neither did apt install build-essential g++ python-dev, etc.
          • Nor upgrading pip and setuptools.
          • Nothing worked, so I switched from the python:37 image (debian) to the ubuntu:18.04 image and manually installed py37. That didn’t work either.
          • Aha! The issue is in jsmin itself, which runs use_2to3 in its setup, which was deprecated by setuptools in version 58! https://github.com/tikitu/jsmin/issues/33
          • Added that constraint to an input requirement, works now.
          • Well, explicitly added it to RIGHT BEFORE the env provisioning, which tox handles. If you pass it as a member of the compiled reqs, it tries to install your pinned setuptools version (alongside all other reqs) USING the new/bad version of setuptools, which still fails.
          • Sidenote – python images are debian (unless directly specifying slim or alpine).
        • After merge to master, massaged the deploy stage a bit as well.
          • Ansible doesn’t have a ubuntu/python image newer than 16/3. Reverted the 18/3 change. It’s just running ansible (no app components).
          • Didn’t finish. Unreachable by ssh, don’t want to autonomously manage the fragile key management and known hosts and ssh agents of client vs server and everything along with it. I have way more important things to work on. Will deploy manually for the time being.
        • Came back to this a bit later. Updated the privkey var in gitlab to the same ssh key I use in wsl, which I know is authorized. Also ran an ssh-agent and ssh-add in the docker build session, even though I’m passing the keyfile directly to the ansible call.
          • Full instructions on https://docs.gitlab.com/ee/ci/ssh_keys/
      • Updated league banner, committed league lines, submitted my picks.
      • Added a brand new admin view to change the status of a game.
        • https://gitlab.com/bmahlstedt/supercontest/-/issues/162
        • Super helpful when the live scoresheets are behind, which is often on sunday. I can lock a game with a view clicks from the internet anywhere, rather than sshing into the production server (often railed on mem/cpu) and doing it manually in psql.
      • Docker build efficiency.
        • https://gitlab.com/bmahlstedt/supercontest/-/issues/148
        • The prod dockerfile is already split into two stages. The first builds wheels for all deps from the list of compiled requirements. The second installs them and starts the app/db.
        • The build/install steps of the deps is what takes a couple minutes. This is not an inefficiency in docker steps, I need a proper python pkg cache. Won’t-do for now.