From f7ca90571c57dbf0e88adae7588cd38670f49b91 Mon Sep 17 00:00:00 2001 From: Kantin Petit Date: Sat, 8 Aug 2026 17:00:41 +0200 Subject: [PATCH] chore: init pogoo-atlas deploy repo (site + api + db, isolated) --- .env.example | 2 + .gitattributes | 3 + .gitignore | 1 + README.md | 26 ++++++++ docker-compose.yml | 63 ++++++++++++++++++ site/Dockerfile | 5 ++ site/apple-touch-icon.png | Bin 0 -> 9430 bytes site/favicon-32.png | Bin 0 -> 1487 bytes site/favicon.ico | Bin 0 -> 4611 bytes site/index.html | 135 ++++++++++++++++++++++++++++++++++++++ site/nginx.conf | 11 ++++ 11 files changed, 246 insertions(+) create mode 100644 .env.example create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 site/Dockerfile create mode 100644 site/apple-touch-icon.png create mode 100644 site/favicon-32.png create mode 100644 site/favicon.ico create mode 100644 site/index.html create mode 100644 site/nginx.conf diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..1f3d473 --- /dev/null +++ b/.env.example @@ -0,0 +1,2 @@ +# In Portainer, set DB_PASSWORD as a stack environment variable (do NOT commit .env). +DB_PASSWORD=change-me-strong diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e2d7a31 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto eol=lf +*.png binary +*.ico binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c49bd7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.env diff --git a/README.md b/README.md new file mode 100644 index 0000000..5ba17b8 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +# pogoo-atlas — repo `git.pogoo.app/kpetit/pogoo-atlas` + +Self-contained deploy repo for **atlas.pogoo.app** (Pogoo · Atlas). Fully isolated: own frontend + API + Postgres. Portainer-git friendly. + +``` +pogoo-atlas/ +├── docker-compose.yml # web (./site) + api + db, all isolated +└── site/ # index.html, Dockerfile, nginx.conf, favicons (stone-blue accent) +``` + +## Deploy (Portainer-git, auto) +1. Push to Forgejo: `git.pogoo.app/kpetit/pogoo-atlas`. +2. Portainer → Stacks → Add → **Git repository** + - URL: `https://git.pogoo.app/kpetit/pogoo-atlas.git` + - Compose path: `docker-compose.yml` + - Env var: `DB_PASSWORD` (set in the stack, not committed) + - **Automatic updates + webhook: ON** +3. Forgejo repo → Settings → Webhooks → paste the Portainer webhook URL. + +## Prereqs +- Edge stack up, `edge` network exists. +- DNS: `atlas.pogoo.app` → server IP. + +## Notes +- `api` is a `traefik/whoami` placeholder — swap for the real Atlas backend. +- `db` (Postgres) stays on the private `atlas_net`, never on `edge`. Its data is this product's own. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..60cd0b1 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,63 @@ +# atlas.pogoo.app — full product stack, self-contained repo for Portainer-git auto-deploy. +# Fully ISOLATED: own frontend + own API + own DB. Nothing shared with other products. +name: pogoo-atlas + +services: + web: + build: + context: ./site + image: pogoo/atlas-web:latest + restart: unless-stopped + networks: [edge] + labels: + - "traefik.enable=true" + - "traefik.http.routers.atlas.rule=Host(`atlas.pogoo.app`)" + - "traefik.http.routers.atlas.entrypoints=websecure" + - "traefik.http.routers.atlas.tls.certresolver=le" + - "traefik.http.routers.atlas.middlewares=security-headers@file" + - "traefik.http.services.atlas.loadbalancer.server.port=80" + + api: + # Placeholder — swap traefik/whoami for the real Atlas backend image. + image: traefik/whoami:latest + restart: unless-stopped + environment: + - DATABASE_URL=postgres://atlas:${DB_PASSWORD}@db:5432/atlas + networks: [edge, atlas_net] + depends_on: + db: + condition: service_healthy + labels: + - "traefik.enable=true" + - "traefik.http.routers.atlas-api.rule=Host(`atlas.pogoo.app`) && PathPrefix(`/api`)" + - "traefik.http.routers.atlas-api.entrypoints=websecure" + - "traefik.http.routers.atlas-api.tls.certresolver=le" + - "traefik.http.routers.atlas-api.priority=100" + - "traefik.http.routers.atlas-api.middlewares=atlas-strip@docker,ratelimit-std@file" + - "traefik.http.middlewares.atlas-strip.stripprefix.prefixes=/api" + - "traefik.http.services.atlas-api.loadbalancer.server.port=80" + + db: + image: postgres:16-alpine + restart: unless-stopped + environment: + - POSTGRES_USER=atlas + - POSTGRES_PASSWORD=${DB_PASSWORD} + - POSTGRES_DB=atlas + volumes: + - atlas_pgdata:/var/lib/postgresql/data + networks: [atlas_net] # private — never on edge + healthcheck: + test: ["CMD-SHELL", "pg_isready -U atlas"] + interval: 10s + timeout: 5s + retries: 5 + +networks: + edge: + external: true + atlas_net: + driver: bridge + +volumes: + atlas_pgdata: diff --git a/site/Dockerfile b/site/Dockerfile new file mode 100644 index 0000000..b1f0076 --- /dev/null +++ b/site/Dockerfile @@ -0,0 +1,5 @@ +# Immutable static image for atlas.pogoo.app (product frontend). +FROM nginx:1.27-alpine +COPY nginx.conf /etc/nginx/conf.d/default.conf +COPY . /usr/share/nginx/html +HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost/ >/dev/null || exit 1 diff --git a/site/apple-touch-icon.png b/site/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfb8c2d2ec5a00955c17751f1afc7f93c73c0a7 GIT binary patch literal 9430 zcmY*Z3MskNZbIK77 zgz|#9H?4a-kkH;aZsOX*-nk7x@#Pz8aA!vcaS7xMKN{U3*^jQm8C;PNN&F$Ir7tRt zSfz(vRD!k^xrhhFElbWgd9^)p)S5l7AUm7MOXU@AM^oNEj_2qf#Vg)<&Fz{bd+^%{ z0i-qn$V@sc=~!8c@EE53g!Zvi?+G&UNAn>^f>e1nO%PFj0RcfZSG%3);~aB>FNUk` znZoh}$`{@LM>M75eGrPus@o#dd>4dr&f~wJeOS0vk zJc4iceXo&gQ>T!NC{Sy9yN>2?{t@t=xa>D}XL^|HsV17;`mx%%Wyl{Fl>QS0Cdu9P zXf$(#AWV^ThSuK%O}~TA?GIIDWM$_+U<>!I>fkg}MwQY0ZE0ya=m>kI#e$MBS(T*? zD_utp_WZcN7XTnfXiI=cqHf>E)lVBdghV?uY{S!Lo)}tN9S#}fW^76@Uz+C#K}P*- zLIBso)6ewa??PNfQD1~}$%7!t?Um1-&B$j-T6dman?>N~F5KNbFWJ0CRreAN1QOyw zyn%8Wh2z7t!Ywi)A~EOp^Q;%29jig6sCSwYyLk%7xxcduP9q_p?|nu9 zhr#uaROcRYujQ@4!yu}nHin_9*{J9$!p_yzXDy>Zd4;D)jn~AEd^<*fEvS#339P07 z)k3+8N=h2jOxxtpNuF81>Z!f=w!;o$0w4WKA*mo(Ll>lyQgRS2PJJF6UH*K5-KY)rYP*6p3YQH{fZzZ#fF0dg?)X(f)#hbSMzs#_d-SjOEt50Co7X{UTPQSlac8}}P49H62S=SCN z_0hMrwezevp5}rz@@qUMh%|9Kb#L?+YU6yb?zRULF}S{f4ydcEt6=}ol)8ZW?%#wJ zt7c8e-&RV;P=R6EBf@E<#%3;=IuMBd1Z;X?8o>%k(xw4~_l4t>(41_1f=X1_M=Y5N+xEwt5zeH<#6gXEOvcq=e0P&tyZofGO?ZQiGLdR19KK*& z&hc573~I1+LxG@2B(|>gnyNh0164imTpo=Up^3n8uHuxrA#wk2x7F-0>(9fx{%bE} zvgfV+&q=Zz05I%zheouu>|x+WPb)~ehS0+OJVRr*wOX5IAY1dhJ-|oaDx&s%z(x(U zpKYIlr6Zo*k+i!<-fssVY0(uTDq7<=>bZ#-auVI;yp~8{hNi@{8|$^NAtBns>mX0O zi%NZ*n3^0ZZ!%-@_Uwca&fHkC(TOylGVT0FG!{?N_E?AlJ6;Ztw!>M>2LWLzRgpP^ zZa>>CO(oW1Oh}>Rgvn$}?n(<@a7-wgF8L3wrtTOMLiI6$lXP4B<(C1X+%(C@e zxc&4DxpsPc4I%VarjlQ;TL%cbfJ6`DD|6~^UNq(%Sb{4`MZDb!${TBHT#^Fy!3-J2 zMr;$r0FgzxJK@f!#hF>a( z2$!hjGhoN%T-6}y6H8iDD*YJCvbQTc=z%VDIZ*I=ofTODQByLI#*%TwB(yXK3|wBx z9_>8sMGzjxhL;?Fq}!C)eGwIJgeS1|sxQDVV`y{AlB>VnwAL^L&Jv$(a&ZXVjeonE zYlz$BD^b~G4RdVLmXIWC-8rsz#y^otPmU8V-ydaN2t1OpKV4CddX_oBd@D81(Ei{D zstIGSg?1B)Z~eHHP5wd07@4;|t5DIRa?-WqHO>N=f4%&gE$~9DY$_l*al=iUCm`rn z;$)CUyY6b9qEjm(Bb7tnv;m5=)bo^d+A+ia=-xQN@|C3XxqR=)X~Aooak06H)7+?v z*i0+)XB%Qp`_F*)W(?RAk&Le^w3cr6qOPLNWFiWR^C>*OZ@6)J-;xgIL)VcQ@_C|T z(JydevyWh@p9j9R*fxN|iyNU7C8-!;8UVw^fk{GY{)aPgzTpKp9lE5>qCSEUaqjqN zXgDwYcS`A;5JwYhTJltitGW`|P$*TyCPJ2>)>JjYBxdGyCqF;` zn>+Vm80Loge1QZ^B3_Bp$);q0_oi$OQaqQrNXW~ailcG}d9WLX=Ar8B_KoWN`Y0W} z@Okjv)8+T}GTyJv5HfP2te&>?RV>4V8Gw~n3T7TI;12FY@~0irS?2}TN!t}VJzUO$ zkscRBX7b|xV*Q$WOYtSi&_|od?~E2r#5*_r(3;Uimx7*mFy<^W#S0x93%R?pL_cAM z(KLXt=nKnUwCm?h;2NjNSGGK#=;2MD zC{GtlEOk(W?B`@P!N4{qfCKhRiJ$`OWr85RNNbZ^)Ufrc-&REV-g7Hw`_B61`m99w z(!=R4p4Ta9;6;SKh3V^6N@_coVuKYkPdet=34D%MHFC|jP>KjE6^8+<)>Ba>B#Ku` zVZcvCT|Hu?tkKU@W+Ps}YCcb+pwGN_r=@Qc0Xe1Yd0*|w5bq@AHahWC&Fk-M{4{Kw zeY2j={lDLn`$aC1sWL}k0}}gClqO=dmgc6gbNJf=1@M3leWjQNk`YjEc`sW(lh3@G z;;_)5y~?zyIZ) z*4C`$-F_rw?Zb{b{Zsu2X%$f-gc8U`ebXW-hwM~MvIV|03eGFJJqa+phKL%0UYY1f z*^F(ZfymV+=XCM=%YeO%bw4}p1tM869nUUDqHp&@&x1x~bKZQZKS3uc0vBqEPnCAO z7kRtjCAvG2RW}h9(1)r;aG_G>!vs8P-S$GxIHL_v@jWGi5O;MGZL z)2)UFLtPuJl0{QeGE`?FU?2~_e^k0nsoq=zf{8irHVcsm%or{~irvYIr0_jy$-!oT zlEFFw!B#D7*3E46grdkW;olX|1g;`N#6mDt6F*gXPVg9?=RsxNo<#P?9apKX>r-4b z(RZG>0^e|adReqFCy+E74*p>!&u3x|d!&;4v{|Zbk{+dB?9i~2HK7XV=;VUuJQ=Qw zZ4rNOjL*SI@(TQD3<7NI-Rbt;6QqEW5}$U12rn-2HL5MnK+eV_KE?ADni2F2PyF;W zow+c>t!}rl>~Z!ZfjcIvy9%BOa)ls>BAGsP?ACD$d9Zzr%V3;s3$A8H&i| zX~NN*YR~iqk#=9^!T6nM?gg^v5R)XVOoJ~MLAEUCLFhEa;q#(e^Xs|%ZN#KQaqy&- z01Qfca3%4p1aoSKr-jG;MXv-w;4AGry1ad)QSexI>2r|NsDB*1gDgpc=m90Nm)#Z) zaY_sg$tuRiV2YL~Lv#|Pe9iy9q8EJoSK3*~{^a)6L$5D|c8aq8R{;5yy2a&*B-|3;}Nf*d$&3-W} zc7hbxY2Z1?ROTZV2u~$vq2^Vc__vylp2Awj|C8>z9y`5=Zi=&-Q+8nd(oU?#3o`-7 z@@bx6^ADQYCvB0|EGrX~SkdX=-uBZVK%<8o?`0N!ts&X5+4|DNLeQ(QPTc0Y_krRy zzKKiKTSl|bH}DwChks_m0M%=>x%|U^qzv#rbE6*xleEu0=eXsTECX#$A>cI=)KGuS zGBmOU_`ngrN5dT(sDd>-By4?W?!Bt%KYaUa!@rh!iCeQVa z&Eyq&B?8x)Jfb<)dT8j6Y;TG}Ee9luhXbgSn|-V`dqLUp#Nl-TuW23sRUeJPbPZ)z z-IpT)Z!93Eut!vPPGGaoWBLpXqegFI8S{&MB0;cB4$Q;;>71TZ?%iF zk#bP+hzt_-+e#C>cCqJ{`APd7c?TDtk|cX>;gu$Pa^z5*%nIIy`J@{S(&h~)I=LMm zh@}AVGiiKoK_}rhS^?q4TV)8r#nn^eeh%)s`LyFIc)4kM&;hAOtT!-6kAL4J+i(wYPC zM=TiPZNqoE)ZZCeXDk7-sKo5qW%oSN3r2NBCo9!go?jc8sc`TIhKr#%MPb*~*+5em zI+A0^bl|D%4(3*N<@b%VC+32Y#Kdb}64bl`&uh}-n$5=I99&sf#SMo-bP@O6wa5*X znVEURvoO9)tWQO#^8e_eZSr1sWmz1Z2m;f=5mb+{xVZ*4O!VmfL7cT!<4(*A>4PTs zuDLxLGzGUrPY&!P!Z1t))GDO6XowJG;#^33p$})~=AW?BT(-rd zIa8|CAiG-+jFmKOwJ@~C8=Q1Ev~4V(EZ@L&uUuNM4#>PMeNodA1Is&ZXA&0-6oj<| zU(YN(Qs#bSE2A%*0`0HJqbEsuZ2Z``f!p?`uy8=6o^5GDSVKT;3g?SaG3#S)h$S7C z??Ez__~Iw)n1m$d2HAF>0%W$Tus$%zUFJRtj&6;F zZH7HKem335cQNO%Zq(~R2xeT8Aq-ZpKy>a*^<%HNFbq#{nt5aJ2tx)@d*Jbt4@6~L zny2{mjhGlRCVRbF$OcP#-qKuu=!P9jNPwq^GiKCF-Z>cD*-rXtoR z{c2pE9LZ?rs=O1Fmlz^7PN{@De`aazix zLS$>gr3Y-ZUe^%g8AGOzp$@Z%tAHG7L2bt_f&a8+fF0Nu>|cMx>p9K3M{X2QWzJz5 z_iF`TgqA2Sxa~-Vx#2fb`)CWP2RVP*@2o#{p%#szDE&e24DSS*v?ysLXo>z(e1SLZ zmzsPC2OQWmyk_v1w{5wh#&$9fZWOxoljaw_&rKrpL(jTkHW!q3{j!@?_B^fDHGA?? z8lU^n-7rqs|38NZ$74N1swAcFY@7}(-GUEG7C0;EU*(TN1i~TfpOA*M++Qir)b1x5Ym#D4yZK}6O!Hj4xT}J#!Y%~G;HiZ2FI=SCg zcf_3`TSW=t&8U)rSyK9Ucg-O#e(C&i%IUK_E$B@SMK7+{xaq$wP^62DUNkauc6 zt%Ji9Z>y_mm3Ehgt{WRb-WI3td}iP=GAR?!^uTeY;Xvo4XP>R(5%O@2ClhnZ@ebn) z(oxC{h#TJWU&IxYbwsRoY&Qy=9|QZG*(jcXaZ?QqN{xFjRn8rF6;M$-sRsYWp`zS@ z$v(Dy#d)0EaN|4}ucNb=+_a6E6$fVL^tP^V2zOfOY`D(BTcT;jmyOa7(=j>cr~6-Y z4rgd5EfWO${z-W4pt@~FM-wL&hnp-z8V#;#O%)=_LEv*t%zvSHWN`ewQO$GB7rvwv z*k9@jbjpr(yN%0Z*B&LERk&HUMCTyLo!zs1%$|WcaP=xI@JPF-BBgBVl45;9pU?N( zG=9Q{9lDPp6GUBSxSjMlt(<3PJtckAg(ba_6bgqtxEUcP|5pn;`ai- z;CaKYW(_+Pwkl80m&FPJn$DDs>n0gAD6m0pNb3cEeyp;xMag5I<`tE=`IVuMRI~a+ zDpNc+6eI9^hjUxrPgK6iit%j?Bvjx!(rtKXXr@O>$ zsLEG6Y~WlmZ$lgFsmQ1*y1rTnff9L2Q1Gn0=|(I$wljR!ae-FL5?XDiE7 z_v3{m{!G|iqc^Mg_vQdsa(2oQn>VUViyhoSwlj+s@%w>&YTsq_UGrjPWJB%gDk~fDa`&7S=ks_xRbHD_C5tW;VmOUZw7?2uWD05ByT?=>!UGV*Nc6wrRW^09T z>8h|qEKAeKoHF6A#Jwubt1)O@Nb2&lJ#Esx+1H1Of>_w?0FV5}Lec>G-3+tCER^ft zhhF1va53*%A>mq`H3K|4{%XKL;}dxX4mv^FZ$}jJ!>s zSh0SQpxt)+UQ^h0D_#0z<;RazcXjvImCr9ItKYub(EB=8Ig@YHhE0*Y9$FvGMP00T zlx?GRu`3rh2qZAA<-uX zUd0$qoIjL_Uy>KVp%_ZhH-r`}zC);mR_G!i(L8o;F~!5cOXWTJn;a8j1mwN&!GG%k z?F=jUVQlqT)IJBhQDty8+;@#6(3uO^1UzBOs#T;-9p#gmz6oqLM zmf@VgmOtpbpyPpHs}qqAPv2)-S7K~W%djez=zx{MBOfiTuW^`gkw1WLKxrB?#|*tP z-0;wYw#di@7uaD0%TUe%J#$DG<_ZTTZP@*|`;dV1E+oaYIJ{vea={^y=>IVQX!0ec zZR-#uMEcJ!mwKPRPHDw2BseU7ibWYlv;!xC~0JGA)2DS4t9^gzI~7_?gI z6z;IAuqm*_f30VxlnH5&5+9MOn;2_;I|^Tk)t|3L&n-DX0UpOOyfM2#If76ZY8+8k zKdV~T5D}urq9iC^(l)jeQPH3F>T16(MYr6D;L=YDe&4=PBz&4Ppfo~*iwg&N z+a93ANfDn=8*)qzft?{ESG?7l=m>dH2bmN7JBAfWjQLm)txeS*0toHn2v!wXgVC^VdNSl_Q8 zOr&}_C(7@iWsO8pHeCDVMBp1q27S4M-QF}MPWCj_pH)un#P#0>{pQSSDcDSbkLjfh zOaX6#wYFi@9F$yq!Bm>;Isg<{G`(J{u}}RS_O~nF!mQzhIS=iqp%()s&ehW7Z6U#* zEopf8uMyC`c;_12lY#Cf`86!3ofZ1_BAF4Kf8!=yA!{WLbw6G7+H34d8OT{MOeq)f z@t_kAw6o3=OwC-2*iQ~ks!!$LZXzbq=C}0L3eJ#JlKS1Bo{q5{0|Aj*%eO~yT3Do) z#asuph6^jU=WD8yo%iaNOKi2>=CqwFj_!GAn542Qg>iA|0T)#DS=$;yPdEl{;uupr z{hXNpKbY-W(U4e)|M!QceZ>VKIeCydD>N&blEHL&ekIUI!8eHU?uc43=n648hHJN^ zN~Y4muIxE)V_{}?GCo^MGe(q_vHuT`v~^oJ9;<E8a zrf|kcoNv-)K(vv@5$)yne19MQ^JF+{a|4GzPb4b?;()HlIjnub9h6>Bhg|hbxNuXr zEwG#53y%D*#R6JpK#!4Gt>MEl`;Qs_!YJ%1oZ700-)rXo5=t_zqv7s%AvoUe13j%& z7gh~uW%I|MLylrJuDNlrgaF{35QpsBB_u?8q#6%4RL~e7En~}T=HHWJ3#p(mWJ8!X zy0kfcESv)4X{A;?fUu+_5U1qsy&16z zarAGr$1!qR>J$-Hu^5ZAP=G7WXqjv`}4OQ|SeX(|MHx;kEykhHfg4Oq`}=-nNy zh`tf+pQQYE$fsn%QlkyirR}%BHH4%syW@OJ2HnC5iJ$Ws=FlWqDeyt1Gx@amC7Ya? z`TkywbG}u78e5L9xDBcj01pip($5}YbJ}P%L2Jpria&nTC}{pJ`Inf?2PhERc)0u|TC@I`7VJyd-r>2=S= zr5~~kfnZ7<$(P`n0R_L-vPP)eNK(Q821Sz4z_;WT?UR>Z$5#(NS?c?0x)aU8d+RD9 zUwu|D7eK#`e6m&(FuBI6Q@<%B-2}sd4AQ%G+u`pgLEiO&9?kC!sn_1AyMqQI0_yI4 z_docYorr+O1op$S*Xp@nd1zDD1`k+C+!;l$K?BzJ;_-FDv^7PFpe z+zp4A>3DC1JYANiWWx)^Xt3i9{u*Ir9bgTFljhQkJQ%#Mf&Q79s%c{qrBDUy2tE3H z+h z5&zmBhzCtY&Yi&7J>RN*d#yX$s=^-BQJ(mvZRn}0+C8(PnpC=#qQUcd2!n;Tr8PJf zlhk(F>NA)Ue49-9O=*xjXmpGcPlr>d2>;KRScS2%@VzkZ`-9XiiAJ;(Y=gwB+{itD zYQPXn5;tH**L@XgBqVy54OLo{jB%ht3-8vyU-R~C-u!d4+)D`xQdXF?KB;pRq*5h| z8a-pj77pqEFnEYCyLHg?B71zhP<0Q~P8$y|zq>vcG#J8n?#cT_?HaC4UfoqCf=#Ycy0nu}VuMybmX{ni(L;@y23rwjhE;Kq zv$Aor{Dq#D%BeT~0`l_sQ#>wa4c6J^wkqUK(*U$LA8uG@X&lMP-C(P(S#gdhq;|i8 zj)`?Dwhe@p$6+AYHO-~;U+#~UBR8qy}|Brc~6_oUEBWO}HY z-minz0nVN~KCm`v?z%4gfI8{RG?HK9pW3EB3>%OP^if8JZN@)n$sZYbQ~vKdAT93K aATe+eXSfs>9(E6h7zP``%1j5Q7Bbg2a`v=z<6_>|7WHLR&O2O$iI)!n#m2w1|ZorlSI-r8NpJ zoP`N72GYR*whbsTAz_0WT*=_Zgv3MwL8F1r&wKaYW6qszXyaJc}Nsp@T-U4e93tN@^n^r0n!#0dsBVHkne zfrwmQAfi)2YFUAuJXUcb zd)JYJOg5%JdE9D!RY2EDysc-bfaG-&`}w{O@z+T%NLW4UsKl+qgWuTbi#)0rLr zM3~AM-<=aV0Hd{D>HGd79fTGUMU-$H^RQGr9S83m7+EKh-doILOX26);Wy8&>h1M1 z*=*SP!J!W2`NvGCEs;T%#l1uM{-PiVRsz8J2vf0uXs`&tc8)PZ$XQ!U7MHd}M_KE$ z071uN<`w0uGeT5YY>VvZ7#v?a_3@5#kj(-DF6KQ$mJM+j+_;2PLO|Hg3e+(hh?Z5o zUR&T&)8!Hf;r-^i86qcLA4)-Cxmf0h|MObZ?S!U_VY$RP#Nf5EtH`Fx{HT(E`5-0b zTt~fVe8uZT4SfPR2UH>n)`rix#34cgIZno+muN}w!~c0L+Gk!qQ*Br^MJlrK`W*@^ z%|GiPl9TDTwF#x7p>&S(DAzP|5uv9w;BaLPT!(t2Lwy=s`YHJi^eSvF(D zG4WxQVYJqEpd zUTeiJjuKV~A$x>WuQ@lnkzGH|vWyO$>^N3E1Wh-f&cTsmiPi-@u`yiBB39c^wm9{< zJe?JZq!SdBiWRft;Fffvtxc5+w~tTm+qETr%eq4W9>?5DFTujag2XRU$mKka8z$o2 z#&Oeooe{M3JY}r;!=inD72Nte!|S#23{7R2$=G~8k5ieQH;oQ915kkluoZDO28x3< zzekqyS(d@FSSHJkgWstDhbNaaJT9mA5B#JHrI!fkD!Z_H6)>(Q?nxCM{&8o3uCff4 zRT;r`*VmMX`M8vZA+LNrb6fYF8+-3YeE!c_f&X(YH(-uTRzMM@pnY0qK$!5gfV%k#1xF8A7@wBxD4J2I=k+hHjJ)iBZ6j?v5Ek z7@F(%eShwcyVl)*&hB&0TF+k31^^rY4*-FHzrqG2-~xceKN{PAwm%^N4F2^A3;$<- zAqD`2I{*NCp{+tr!a(xZORlC0*86+@(*Z>MHy>am&P}Fa6&KMBlFsI{xV1bn;0Nfg^#7d+0r~o|=>rp8D%b%RMeTW91mW?QE9ll}EN( z%NlZ-XKkh(4;1X|lu&~MR}O7%dU-X8Si9t@evzY_(&U{+59>pz8{dgN%)OE8BsMKP zNP1oZqsFFgr3x7yAvYq4(t9pXul$>TC;G!gKlP)v_GcDE zm~3tJ@9El0VlViXWlvXTs<%IE)*zYhkhB>h(kbIh$}TQ06cb>1To1~t#pqH{W3AHn z`-erX5@)M(N}Fps=reNViT8cy8IPHP@7oyen8{R1qKR|*sFg=*@%^#Tm7NzSr+N5! z%KJ032+4aCj->|0dUz5@Qx0voctx6o{vpWTzc`W8^@)^|97%_ynfasLqCfRgZ05YA zm0fqp@F0~+yzusK=@!7$)N$=)^|OcJO_^(*w2FH_tm-Pal6<6x1u>Uz$2&(LvFTT`&jE#6eU#SwnKV8Wc%AhzLG zDB%^^I0co6RwN9s*yJmiT&sGiJ_;^oTgye_nB_e~EEiwPqMa zQ`Czr#33*ji*IiTy19&M@0qRY|AiW$rlbw7QM7vhe*lv0ZedA0bt6!g4#VY>8#Yur=h0=@mdRaaK)Q{Rjk94rAjE!W^xBs3rl0S^V zE}Z)!kFz`$JjMbDmt|U=((Qym4ImGT=L=b$hAHf59B}G#s7zLU^`yr$=1PgbN2uZm&svF{YZWNLBK@wyiA3=Y~y$`r0o zOo;A!?rkws-bhLL9Nfq4$TKr}$l;Ewn+K|DsfsexRA9rD8<{;8B`zYHZ2YW=1bR$K zNl826xwBt|O2O0Toae6(bo9&OjCUi=(;30}phJ(a=qCweo@^0kMMfqa{^(Fy?PrNm zG1tfPa{?$1kUOurNCNalz6>t#wdosk!H>?PJ(xf0+x(@T15B^twyhv0J@EC_XKf=k zt?LqRcja{@q!;aeOt;I@+_m2Jv2!{jdtU{cD{km-T@AvYA>iVy7vBl2AASw>3Z>a; z7e_3@QN@FY;ml(`! zEiQ@aoMh-Z-;`^;|IFVU@IUe`S7~7wl9LgWehYmaXhw;iQaH|(oUKGl(}Yo}fOOaW z7J|^BuwZv~r*RW;l95_VOMAl8o;- zo!>L~6Yd%WTpvWH%dQM8)smN%sjjqK9OnqqsMophDTRf^`+PCR-h*%O$Bs_ryepI; zw)X-#SKCVsBR3`*W(@Jq@&O0GUEZUbI5}G}6`|6l+$7g7W7FZr&bk0`?PBqP{7Kiz zDb=+D2qXrMR#0| zO2)qG&mK2P6ubAEj;f$&u!owUIy8#g(h#}B_K>YP!OqA#)@E{jYnkR(WtBD=`+>8o z!1F2^(${Htq54M*f|YL*x2K0-(l6<3OGe^;A?R1_ul`P_NvieqD_JROX#dY)SfvYI z#kiZaFOdS7ABMPY3|~S`Mc_#3e77*Ey+n%K(swPP;CIR>Vn2W)CR*5ca&4HYqn^h` zQT5>gE6m`$u&~`Hc*<>sM3HH@g0AR8PO9ixtFgt3qW+-jD}q)~`M7LwiK2dNog7gR zXVDq6G~+=p{#4TUYMgbm^TEO)*Px$nhm|R8(A+1mW5DWog_0hYi-ViC@;#1h%`dl? zKyP=jR-GbNytsv{M+5)6Gh4q-w#cvYDc{=OgE58y^!g5IQ`_{~%4Y#-H!#spxXpIM zc24;GyEO!{no5FIXN-6Xt%>8%6E37&y&>a~dS9lS)r(Bg+hfhP-L{<;jHAWdSjuTt zaElGcd9QTXb0NH?^OA4#8Ps(FOg>)dr?r^NO9D*igmvHa!2)-weA`uD*PpPREA%#X zKLY^>*6C(rdC?`X=LNW_MWs8+8FOZM-C2ir9 zZNfGge(x{VEnaKy?a8ZQz`-y-#|~HJum54kO|>>2u&SyU-6dSuQI)F#b6`C&)$VPUX%{#STkB<~pRcawGMHpux1yGq@aY3y&%LcweUQJ3j7Q$UJ@>MuoqTF-o*_he5kF5Rg z!~^rSx&1F4B=7j$6O#R7jmCJ2k^X#ptR>3IJK0+uoLu<(TCp)k9j*-WfkHf3KdSp2 z8?p_#&J^zOB0EkpiHdS4qj(h9f_=l$eTPWJ$Mt+vG2^!m;K0XE>e=Ral^&pG*A(5N z(g{s=ij`??{fjWUDiWP_&(45R%!?*LYOg~gBSLE_yv z)YuRJEH3-~Eg;Bo#3j`z7S95IVIuEi{By1D z%ubDvdul!MSH)ka^O>o?3LFH!!cA7^JbNuk!_=m7c|$MZG`x}a#l<)vYiRw6J`zj& z=3(FAp-kS-YrdF%G80Pl?}yFQ2a>`3Vtgq{JR&TN z4B?1#(I6QwTi(!|3KlK%RbjjUSQzO&${Z>As>LZR@`$?WN+^tG<=y6-w0vu$9xOjB z^AsqUtQ9`{GD3DQS_wxO@-*a1&}F25TdIRwn)Mhbrd(g0!lNub@g^MB9w1FeNN1H1 zR~H5VKePHUTPdR?bazm8+qGxm&7r5OlsVmD;b;-v@D{h}KL>D$Kh|Vo+#Zh-LT(97 z@}{4^63{dh_NG}<=C8Q6_4aOZOyj7<&fsaTE#0b3Tpr$$kBiMZpU5zb+U7)Jjlr6; zIg$>~SqH43d=kPA59=P*m7tk2Kh;?6J?cq$#$GGR_x}7OF(>m zmuZ5#&MRKG*f;)|Euj&!Yj*olV;i{c;lDo^uo;W2d)NG)&><8;86=)Y|D$v^2tk%aeq6sfHcbJ;uG59g&*=iJ8 zUp+W63U!Is`b)Rd+mFJFQ=PE1rOZH1;ySkUgKRcIs!W22-PK#Cm6IZRN7vs7M-u!@ zT}Ri(&C59IpQ~yOk&H?sY#h`|$u3izkA;>TwV)x(70AALnhzJ-Zo3*1A5Sk^J6tF= z%{d_`n^>#<7g{vZlYbcB&39-8;0PVyyIQFV(#ts9I=35azv_bx(UDjbT3oIVo-k6f zIrS4fZ>}7$XpPq#9U&HM`sV+D>&-|Hm(s&7mn9{e1K{8KEiauJ+4Qfyg=QPu?@VuL zU#)rx!Xb!r#S+dw_Z#cGKk%LZ$<(YdN^ODc?fMIMD)g+oxV&0cvG86BEi-Ulz&o*? z&|quMTizsn&EO$4DP$mzMLcgGL$)`z7~s@kPugM&jlf;!bH9ZM!9#Bm{kxH8z4`F? zXj6Hqa2}%>=t2h|c_mb`el^tWJX?RY*1jB!IBKM7Sq}DGMvHDc{Bb literal 0 HcmV?d00001 diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..59c1da7 --- /dev/null +++ b/site/index.html @@ -0,0 +1,135 @@ + + + + + +Atlas — Know where everything is · by Pogoo + + + + + + + + + + + +
+
Pogoo · Atlas
+

Know where everything is.

+

Atlas draws a living map of your infrastructure and services — every node, its state, its owner — so nothing hides.

+ + +
+
atlas.pogoo.app/map
+
+ +
+

Production · 12 nodes

+
+
api-gateway
healthy · 24ms
+
auth
healthy · 11ms
+
workers
degraded · 210ms
+
postgres
healthy · 3ms
+
cache
healthy · 1ms
+
mailer
down · 0
+
cdn
healthy · 8ms
+
search
healthy · 30ms
+
+
+
+
+
+ +
+
What Atlas does
+

A map you can trust at a glance.

+
+
Auto-discovery

Point Atlas at your cloud and repos. It finds services and draws the graph — no manual diagrams.

+
Live state

Health, latency and ownership on every node. Green, amber, red — the way you already think.

+
Who owns what

Every service has a name attached. No more "whose is this?" at 3am.

+
Time travel

Scrub the timeline to see how the map looked before an incident.

+
+
+ +
+
+ +

Atlas is part of Pogoo — a house of good tools. Same spine, same craft, its own colour. See the whole house →

+
+
+ +
+ pogoo · atlas + atlas.pogoo.app — a Pogoo product +
+ + + + diff --git a/site/nginx.conf b/site/nginx.conf new file mode 100644 index 0000000..2034a45 --- /dev/null +++ b/site/nginx.conf @@ -0,0 +1,11 @@ +server { + listen 80; + server_name _; + root /usr/share/nginx/html; + index index.html; + location ~* \.(?:png|ico|svg|woff2?|css|js)$ { + expires 30d; + add_header Cache-Control "public, immutable"; + } + location / { try_files $uri $uri/ /index.html; } +}