41 lines
No EOL
20 KiB
HTML
41 lines
No EOL
20 KiB
HTML
<!doctype html><html lang=en dir=auto><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=robots content="noindex, nofollow"><title>Posts | AlipourIm journeys</title>
|
||
<meta name=keywords content><meta name=description content="Posts - AlipourIm journeys"><meta name=author content="Iman Alipour"><link rel=canonical href=https://blog.alipour.eu/posts/><link crossorigin=anonymous href=/assets/css/stylesheet.31b150d909186c48d6dbbf653acc2489945fa9ac2c8f8cd3fe8448e89e40fccf.css integrity="sha256-MbFQ2QkYbEjW279lOswkiZRfqawsj4zT/oRI6J5A/M8=" rel="preload stylesheet" as=style><link rel=icon href=https://blog.alipour.eu/favicon.ico><link rel=icon type=image/png sizes=16x16 href=https://blog.alipour.eu/favicon-16x16.png><link rel=icon type=image/png sizes=32x32 href=https://blog.alipour.eu/favicon-32x32.png><link rel=apple-touch-icon href=https://blog.alipour.eu/apple-touch-icon.png><link rel=mask-icon href=https://blog.alipour.eu/safari-pinned-tab.svg><meta name=theme-color content="#2e2e33"><meta name=msapplication-TileColor content="#2e2e33"><link rel=alternate type=application/rss+xml href=https://blog.alipour.eu/posts/index.xml><link rel=alternate hreflang=en href=https://blog.alipour.eu/posts/><noscript><style>#theme-toggle,.top-link{display:none}</style><style>@media(prefers-color-scheme:dark){:root{--theme:rgb(29, 30, 32);--entry:rgb(46, 46, 51);--primary:rgb(218, 218, 219);--secondary:rgb(155, 156, 157);--tertiary:rgb(65, 66, 68);--content:rgb(196, 196, 197);--code-block-bg:rgb(46, 46, 51);--code-bg:rgb(55, 56, 62);--border:rgb(51, 51, 51)}.list{background:var(--theme)}.list:not(.dark)::-webkit-scrollbar-track{background:0 0}.list:not(.dark)::-webkit-scrollbar-thumb{border-color:var(--theme)}}</style></noscript><script>(function(){window.goatcounter={endpoint:"/count"};const e=document.createElement("script");e.async=!0,e.src="/js/count.js",document.head.appendChild(e)})()</script><script>(function(){const s="",t=new Intl.NumberFormat,o="visit",i="visits";function a(e){document.readyState==="complete"||document.readyState==="interactive"?setTimeout(e,0):document.addEventListener("DOMContentLoaded",e)}function r(){try{return window.goatcounter&&window.goatcounter.get_data?window.goatcounter.get_data().p:location.pathname}catch{return location.pathname}}async function e(e,t){try{const o=new URLSearchParams({t:String(Date.now())});t&&o.set("start",t);const a=`${s}/counter/${encodeURIComponent(e)}.json?${o}`,n=await fetch(a,{credentials:"omit"});if(n.status===404)return 0;if(!n.ok)throw 0;const r=await n.json(),i=Number(String(r.count).replace(/,/g,""));return Number.isFinite(i)?i:0}catch{return null}}const n=e=>e===null?"—":`${t.format(e)} ${e===1?o:i}`;a(async function(){const s=document.querySelector(".post-single");if(s){const t=s.querySelector(".post-header .post-meta, .post-header .entry-meta, .post-meta"),o=await e(r());if(t){let e=t.querySelector(".post-views");e||(e=document.createElement("span"),e.className="post-views",t.appendChild(e)),e.textContent=n(o??0)}}const i=document.querySelectorAll("article.post-entry");await Promise.all(Array.from(i).map(async t=>{const s=t.querySelector(".entry-footer, .post-meta"),o=t.querySelector("a.entry-link, h2 a, .entry-title a");if(!s||!o)return;try{const i=new URL(o.getAttribute("href"),location.origin);if(i.origin!==location.origin)return;let t=s.querySelector(".post-views");t||(t=document.createElement("span"),t.className="post-views",s.appendChild(t)),t.textContent=n(await e(i.pathname)??0)}catch{}}));const o=document.getElementById("gc_site_visitors_week");if(o){const n=await e("TOTAL","week");o.textContent=n===null?"—":t.format(n)}})})()</script></head><body class=list id=top><script>localStorage.getItem("pref-theme")==="dark"?document.body.classList.add("dark"):localStorage.getItem("pref-theme")==="light"?document.body.classList.remove("dark"):window.matchMedia("(prefers-color-scheme: dark)").matches&&document.body.classList.add("dark")</script><header class=header><nav class=nav><div class=logo><a href=https://blog.alipour.eu/ accesskey=h title="AlipourIm journeys (Alt + H)">AlipourIm journeys</a><div class=logo-switches><button id=theme-toggle accesskey=t title="(Alt + T)" aria-label="Toggle theme"><svg id="moon" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg><svg id="sun" width="24" height="18" viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg></button></div></div><ul id=menu><li><a href=https://blog.alipour.eu/posts/ title=Posts><span class=active>Posts</span></a></li><li><a href=https://blog.alipour.eu/phd_journey/ title=PhD_journey><span>PhD_journey</span></a></li><li><a href=https://blog.alipour.eu/about/ title=About><span>About</span></a></li></ul></nav></header><main class=main><header class=page-header><div class=breadcrumbs><a href=https://blog.alipour.eu/>Home</a></div><h1>Posts
|
||
<a href=/posts/index.xml title=RSS aria-label=RSS><svg viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" height="23"><path d="M4 11a9 9 0 019 9"/><path d="M4 4a16 16 0 0116 16"/><circle cx="5" cy="19" r="1"/></svg></a></h1></header><article class=post-entry><figure class=entry-cover><img loading=lazy src=https://blog.alipour.eu/images/inet/inet_animation_collage.jpg alt="Six looks of the INET LED logo"></figure><header class=entry-header><h2 class=entry-hint-parent>INET Logo That Breathes — From CAD to LEDs to a Calm Little Server</h2></header><div class=entry-content><p>I didn’t add a warning sign to the room. I taught the logo to breathe. ;-D
|
||
The Rotunde is a good room for bold ideas and yummy coffee. The door sighs shut and the outside world gives up on us. The only thing it’s not good at is ventilating itself. Forty minutes into a group meeting, or a sressful defence, and we all feel like sleeping and running back to our offices!
|
||
...</p></div><footer class=entry-footer><span title='2025-10-17 00:00:00 +0000 UTC'>October 17, 2025</span> · 17 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/inet_logo/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to INET Logo That Breathes — From CAD to LEDs to a Calm Little Server" href=https://blog.alipour.eu/posts/inet_logo/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Movie review: Scent of a Woman</h2></header><div class=entry-content><p>I’m not a big movie watcher. In fact, I don’t remember the last time I watched a whole movie in a single day. It’s not that I don’t enjoy it, it’s that I want to do this with at least another person. It feels much better to not be alone when watching a movie for me for some reason. Buuuut, I watched Scent of a Woman on Sunday, and after my therapist encouraged me to do so.
|
||
...</p></div><footer class=entry-footer><span title='2025-10-13 08:52:10 +0000 UTC'>October 13, 2025</span> · 5 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/scent_of_a_woman/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Movie review: Scent of a Woman" href=https://blog.alipour.eu/posts/scent_of_a_woman/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Hobbies</h2></header><div class=entry-content><p>When I started my PhD, I was told “get yourself a hobby!” many many times by both my advisor, and the director of the group I worked in. In fact, when being interviewed for the position, I was asked about my hobbies.
|
||
For some reason I think I have like the weirdest hobbies of all time. Like, you know, people binge series, go to clubs, bars, hang out, and so on. But I always had interests in things that when I talk about people get weirded out, or at least some of them do so. To be honest though, when I talk more about some of my hobbies, they do show enthusiasm, but it feels like there is a clear gap between us afterwards.
|
||
...</p></div><footer class=entry-footer><span title='2025-10-10 07:04:54 +0000 UTC'>October 10, 2025</span> · 12 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/hobbies/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Hobbies" href=https://blog.alipour.eu/posts/hobbies/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Relationships</h2></header><div class=entry-content><p>Notice: You’ll hear me ranting in this post, so buckle up, or just go to another fun post. I am very vulnerable right now and want to put out my story without naming anyone.
|
||
So… do you also think you’re a lover boy, kind, nice person? So do I! I think I’m actually really good at making friends with people. Like you know, you start introducing yourself, asking them some fun personal questions about hobbies or other stuff, and then you eventually start talking about other things.
|
||
...</p></div><footer class=entry-footer><span title='2025-10-05 08:03:31 +0000 UTC'>October 5, 2025</span> · 11 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/relationships/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Relationships" href=https://blog.alipour.eu/posts/relationships/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases</h2></header><div class=entry-content><p>How I containerized a Java Minecraft server with Geyser, hit a /var space wall, and locked the server to the latest stable release.</p></div><footer class=entry-footer><span title='2025-09-29 09:06:29 +0000 UTC'>September 29, 2025</span> · 3 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/minecraft_server/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Dockerizing my Minecraft Server + Geyser: from 'no space left' to stable releases" href=https://blog.alipour.eu/posts/minecraft_server/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Running my blog on Tor (.onion) and the Clearnet with Hugo + PaperMod</h2></header><div class=entry-content><p>TL;DR — The site is built once (Hugo project), published twice:
|
||
Onion: http://fjthpp2h3mj2rup25r3psmqamutnkbvxbpltlohdthw6fscgo3t6bpad.onion/ via Tor, no TLS/HSTS, bound to 127.0.0.1:3301. Clearnet: https://blog.alipourimjourneys.ir behind Cloudflare, Let’s Encrypt cert, Onion-Location header pointing to the onion mirror. 1) Tor hidden service (onion) basics I used Tor’s v3 onion services and mapped onion port 80 → my local web server on 127.0.0.1:3301.
|
||
Install & configure Tor (Debian/Ubuntu):
|
||
sudo apt update && sudo apt install -y tor sudoedit /etc/tor/torrc Add:
|
||
...</p></div><footer class=entry-footer><span title='2025-09-19 00:00:00 +0000 UTC'>September 19, 2025</span> · 6 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/tor_clearnet_blog/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Running my blog on Tor (.onion) and the Clearnet with Hugo + PaperMod" href=https://blog.alipour.eu/posts/tor_clearnet_blog/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Stealth Trojan VPN Behind Cloudflare Guide</h2></header><div class=entry-content><p>Introduction So you want a VPN that doesn’t scream “I am a VPN” to every censor and firewall out there?
|
||
Welcome to the world of Trojan over WebSocket + TLS behind Cloudflare.
|
||
This guide not only shows you how to set it up but also sprinkles in some debugging magic so you can figure out why things break (and they will break, trust me).
|
||
We’ll anonymise domains and secrets, so substitute with your own:
|
||
...</p></div><footer class=entry-footer><span title='2025-09-09 11:05:00 +0200 +0200'>September 9, 2025</span> · 4 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/vpn/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Stealth Trojan VPN Behind Cloudflare Guide" href=https://blog.alipour.eu/posts/vpn/></a></article><article class=post-entry><figure class=entry-cover><img loading=lazy src=https://blog.alipour.eu/images/hedgedoc-cover.png alt="HedgeDoc collaborative editing"></figure><header class=entry-header><h2 class=entry-hint-parent>Self-Hosting HedgeDoc with Docker + Nginx + Let's Encrypt</h2></header><div class=entry-content><p>HedgeDoc is an open-source collaborative Markdown editor. Think Google Docs for Markdown: multiple people can edit the same note in real-time, with support for diagrams, math, polls, and slide decks. In this post we’ll walk through setting up your own instance on a server, secured with HTTPS.
|
||
Prerequisites A Linux server with Docker and Docker Compose A domain name pointing to your server (e.g. notes.alipourimjourneys.ir) Nginx installed for reverse proxying Certbot for Let’s Encrypt certificates 1. Create the project directory mkdir ~/hedgedoc && cd ~/hedgedoc 2. Create .env POSTGRES_PASSWORD=ChangeThisStrongPassword HD_DOMAIN=notes.alipourimjourneys.ir Generate a strong password with:
|
||
...</p></div><footer class=entry-footer><span title='2025-08-29 00:00:00 +0000 UTC'>August 29, 2025</span> · 2 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/hedge_doc/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Self-Hosting HedgeDoc with Docker + Nginx + Let's Encrypt" href=https://blog.alipour.eu/posts/hedge_doc/></a></article><article class=post-entry><figure class=entry-cover><img loading=lazy src=https://blog.alipour.eu/images/matrix-cover.png alt="Matrix, Signal but distributed"></figure><header class=entry-header><h2 class=entry-hint-parent>Self-hosting Matrix + Element Call with LiveKit: from zero to working (and the [not so!!] fun debugging along the way)</h2></header><div class=entry-content><p>TL;DR: The call kept saying “waiting for media” because the browser never opened a WebSocket to LiveKit. The root cause was duplicate Access-Control-Allow-Origin headers on /sfu/get (CORS), which stopped the JWT response. Fixing CORS and ensuring the WS proxy worked (HTTP 101 in logs) solved it.
|
||
What I’m building A Matrix homeserver (Synapse) at matrix.example.com (replace with your domain). TURN/STUN (coTURN) for NAT traversal. Element Call backed by LiveKit, fronted by rtc.example.com. Nginx (host) as the single reverse proxy for everything. Cloudflare DNS (with rtc.* set to DNS-only, no orange cloud). UFW firewall opened for Matrix federation, TURN, and LiveKit media ports. I used Docker for Synapse, PostgreSQL, LiveKit and the JWT helper. I used host Nginx (not Nginx in Docker) to avoid port binding conflicts on 80/443/8448.
|
||
...</p></div><footer class=entry-footer><span title='2025-08-26 00:00:00 +0000 UTC'>August 26, 2025</span> · 8 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/matrix_setup/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Self-hosting Matrix + Element Call with LiveKit: from zero to working (and the [not so!!] fun debugging along the way)" href=https://blog.alipour.eu/posts/matrix_setup/></a></article><article class=post-entry><header class=entry-header><h2 class=entry-hint-parent>Hello World</h2></header><div class=entry-content><p>This is a test hello world post just to make sure everything works!
|
||
Downloads: Markdown · Signature (.asc) View OpenPGP signature -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEVaKl3oR5K6zGyu4/tYgoUOBMjSoFAmpkbukACgkQtYgoUOBM jSpEQQ//WGvzlIkJyaez/yiM50pAlVusmd8LsNXrAPj97ZjyAiY+8puTLs6Na2t7 SfwQP03lYHajkmNmH1Sq2vCVTnTWcWOc81AUW7o5fAUl47FT2CzqwaimpGCxUhCB IOvJT8CCXtLroLXqHk8bfLc8s6iGTQt0f2iV2D2TzPLHOEeh27JuWXu8FQX+uFYE B3ioZqc4wJyDFaGWO+ZLEOBXPMR837rztabWYhqOkCuKNlZ06zTF6e4O0ZQ4nNVC roZVMsh0voreT700bmzJmN5QJngzX0c/cmlMBXzsyQ8BDlmmAj92atR24a5AQ7vZ dSyHfXs/or3HlAWCDPfyZOMM9y0PVIuX+odMAUq13Ec2gIZvYa6NPAk0fnQrmjYJ NZ13gDdb0I7My0KLSCDpTTajOZIf9ExdM9Ogpp8wix1kZuxNdJ4/ya9PhkOh8wEc 62eMm1khV99Gljg+XbAG6A0KI7nO5TS464/JkU1+d/inWjXmSkocTep9p1H/M+nt 7jvNN/agYJh5HOuiA34zli8v2/GflACgFlE+AcGR7cb9CxicTuzs8K+kLzQBQSep oy8FiFCh8msbfmCmvKANkU3nO27NmHbNu9e40A/vxtPZtM0zJnngb/B+5rhDP4uT 6Q1OmbB4xs7jM+WX1X7pHI2XBDNlAGy8hi4rZnmXqhMe4rVZJVo= =kuAP -----END PGP SIGNATURE----- Verify locally:
|
||
curl -fSLO https://blog.alipour.eu/sources/posts/hello-world.md curl -fSLO https://blog.alipour.eu/sources/posts/hello-world.md.asc gpg --verify hello-world.md.asc hello-world.md</p></div><footer class=entry-footer><span title='2025-08-25 08:53:38 +0000 UTC'>August 25, 2025</span> · 1 min · Iman Alipour
|
||
<span class=post-meta-item><a href=https://blog.alipour.eu/posts/hello-world/#isso-thread class=isso-comments-link>Comments</a></span></footer><a class=entry-link aria-label="post link to Hello World" href=https://blog.alipour.eu/posts/hello-world/></a></article><footer class=page-footer><nav class=pagination><a class=prev href=https://blog.alipour.eu/posts/page/2/>« Prev </a></nav></footer></main><footer class=footer><span>© 2026 <a href=https://blog.alipour.eu/>AlipourIm journeys</a></span> ·
|
||
<span>Powered by
|
||
<a href=https://gohugo.io/ rel="noopener noreferrer" target=_blank>Hugo</a> &
|
||
<a href=https://github.com/adityatelange/hugo-PaperMod/ rel=noopener target=_blank>PaperMod</a></span></footer><a href=#top aria-label="go to top" title="Go to Top (Alt + G)" class=top-link id=top-link accesskey=g><svg viewBox="0 0 12 6" fill="currentcolor"><path d="M12 6H0l6-6z"/></svg>
|
||
</a><script src=/isso/js/count.min.js data-isso=/isso async></script><div class=site-meta-row style=display:flex;align-items:center;gap:.75rem;flex-wrap:wrap><a href=/index.xml rel=alternate type=application/rss+xml title=RSS class=rss-link style=display:inline-flex;align-items:center;gap:.35rem><svg viewBox="0 0 24 24" fill="none" stroke="currentcolor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4 11a9 9 0 019 9"/><path d="M4 4a16 16 0 0116 16"/><circle cx="5" cy="19" r="1"/></svg>
|
||
<span>RSS</span>
|
||
</a><span aria-hidden=true>·</span>
|
||
<span>Visitors this week: <span id=gc_site_visitors_week>—</span></span></div><script>let menu=document.getElementById("menu");menu&&(menu.scrollLeft=localStorage.getItem("menu-scroll-position"),menu.onscroll=function(){localStorage.setItem("menu-scroll-position",menu.scrollLeft)}),document.querySelectorAll('a[href^="#"]').forEach(e=>{e.addEventListener("click",function(e){e.preventDefault();var t=this.getAttribute("href").substr(1);window.matchMedia("(prefers-reduced-motion: reduce)").matches?document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView():document.querySelector(`[id='${decodeURIComponent(t)}']`).scrollIntoView({behavior:"smooth"}),t==="top"?history.replaceState(null,null," "):history.pushState(null,null,`#${t}`)})})</script><script>var mybutton=document.getElementById("top-link");window.onscroll=function(){document.body.scrollTop>800||document.documentElement.scrollTop>800?(mybutton.style.visibility="visible",mybutton.style.opacity="1"):(mybutton.style.visibility="hidden",mybutton.style.opacity="0")}</script><script>document.getElementById("theme-toggle").addEventListener("click",()=>{document.body.className.includes("dark")?(document.body.classList.remove("dark"),localStorage.setItem("pref-theme","light")):(document.body.classList.add("dark"),localStorage.setItem("pref-theme","dark"))})</script></body></html> |