From bfe63de0c3a616cd487ef0de55cf803812effc8e Mon Sep 17 00:00:00 2001 From: msnie Date: Wed, 12 Mar 2025 14:23:04 +0100 Subject: [PATCH] immich --- immich/.env | 2 +- immich/docker-compose.yml | 26 ++++----- pangolin/config/config | 50 ++++++++++++++++ pangolin/config/config.yml | 50 ++++++++++++++++ .../db/backups/db_2025-2-6_7-48-34.sqlite | 0 .../db/backups/db_2025-2-6_7-48-52.sqlite | Bin 0 -> 217088 bytes .../db/backups/db_2025-2-6_7-49-30.sqlite | Bin 0 -> 217088 bytes pangolin/config/db/db.sqlite | Bin 0 -> 217088 bytes pangolin/config/key | 1 + pangolin/docker-compose.yml | 54 ++++++++++++++++++ pangolin/pangolin | 1 + 11 files changed, 170 insertions(+), 14 deletions(-) create mode 100644 pangolin/config/config create mode 100644 pangolin/config/config.yml create mode 100644 pangolin/config/db/backups/db_2025-2-6_7-48-34.sqlite create mode 100644 pangolin/config/db/backups/db_2025-2-6_7-48-52.sqlite create mode 100644 pangolin/config/db/backups/db_2025-2-6_7-49-30.sqlite create mode 100644 pangolin/config/db/db.sqlite create mode 100644 pangolin/config/key create mode 100644 pangolin/docker-compose.yml create mode 160000 pangolin/pangolin diff --git a/immich/.env b/immich/.env index e9e1448..c6c2613 100644 --- a/immich/.env +++ b/immich/.env @@ -128,4 +128,4 @@ DB_DATABASE_NAME=immich # # Examples: http://localhost:3001, http://immich-api.example.com, etc # #################################################################################### -# IMMICH_API_URL_EXTERNAL=https://imm.knast.cc \ No newline at end of file +IMMICH_API_URL_EXTERNAL=https://imm.knast.cc \ No newline at end of file diff --git a/immich/docker-compose.yml b/immich/docker-compose.yml index 54548aa..6034bc4 100644 --- a/immich/docker-compose.yml +++ b/immich/docker-compose.yml @@ -30,7 +30,7 @@ version: "3.8" # depends_on: # - redis # - database - # restart: always + # restart: unless-stopped # immich-machine-learning: # networks: @@ -46,7 +46,7 @@ version: "3.8" # - /srv/immich/model-cache:/cache # env_file: # - .env - # restart: always + # restart: unless-stopped # redis: # networks: @@ -57,7 +57,7 @@ version: "3.8" # # image: docker.io/redis:6.2-alpine@sha256:e3b17ba9479deec4b7d1eeec1548a253acc5374d68d3b27937fcfe4df8d18c7e # # healthcheck: # # test: redis-cli ping || exit 1 - # restart: always + # restart: unless-stopped # database: # networks: @@ -77,7 +77,7 @@ version: "3.8" # # start_interval: 30s # # start_period: 5m # command: ["postgres", "-c" ,"shared_preload_libraries=vectors.so", "-c", 'search_path="$$user", public, vectors', "-c", "logging_collector=on", "-c", "max_wal_size=2GB", "-c", "shared_buffers=512MB", "-c", "wal_compression=on"] - # restart: always + # restart: unless-stopped # volumes: # model-cache: @@ -98,7 +98,7 @@ services: - redis - database # - typesense - restart: always + restart: unless-stopped immich-microservices: networks: @@ -114,7 +114,7 @@ services: - redis - database # - typesense - restart: always + restart: unless-stopped immich-machine-learning: networks: @@ -126,7 +126,7 @@ services: - /srv/immich/model-cache:/cache env_file: - .env - restart: always + restart: unless-stopped immich-web: networks: @@ -136,11 +136,11 @@ services: entrypoint: ["/bin/sh", "./entrypoint.sh"] env_file: - .env - restart: always + restart: unless-stopped labels: - traefik.enable=true - "traefik.http.routers.imm.entrypoints=websecure" - - "traefik.http.routers.imm.rule=Host(`imm.$DOMAIN_NAME`)" + - "traefik.http.routers.imm.rule=Host(`imm.knast.cc`)" - "traefik.http.routers.imm.tls.certresolver=letsencr" # - "traefik.http.services.imm.loadbalancer.server.port=32400" @@ -156,14 +156,14 @@ services: # driver: none # volumes: # - /srv/immich/tsdata:/data - # restart: always + # restart: unless-stopped redis: container_name: immich_redis image: redis:6.2 networks: - traefik - restart: always + restart: unless-stopped database: networks: @@ -179,7 +179,7 @@ services: PG_DATA: /var/lib/postgresql/data volumes: - /srv/immich/pgdata:/var/lib/postgresql/data - restart: always + restart: unless-stopped immich-proxy: networks: @@ -196,7 +196,7 @@ services: driver: none depends_on: - immich-server - restart: always + restart: unless-stopped # OFFICIAL diff --git a/pangolin/config/config b/pangolin/config/config new file mode 100644 index 0000000..bd87068 --- /dev/null +++ b/pangolin/config/config @@ -0,0 +1,50 @@ +# To see all available options, please visit the docs: +# https://docs.fossorial.io/Pangolin/Configuration/config + +app: + dashboard_url: "http://localhost:3002" + log_level: "info" + save_logs: false + +domains: + domain1: + base_domain: "example.com" + cert_resolver: "letsencrypt" + +server: + external_port: 3000 + internal_port: 3001 + next_port: 3002 + internal_hostname: "pangolin" + session_cookie_name: "p_session_token" + resource_access_token_param: "p_token" + resource_session_request_param: "p_session_request" + +traefik: + http_entrypoint: "web" + https_entrypoint: "websecure" + +gerbil: + start_port: 51820 + base_endpoint: "localhost" + block_size: 24 + site_block_size: 30 + subnet_group: 100.89.137.0/20 + use_subdomain: true + +rate_limits: + global: + window_minutes: 1 + max_requests: 100 + +users: + server_admin: + email: "admin@example.com" + password: "Password123!" + +flags: + require_email_verification: false + disable_signup_without_invite: true + disable_user_create_org: true + allow_raw_resources: true + allow_base_domain_resources: true \ No newline at end of file diff --git a/pangolin/config/config.yml b/pangolin/config/config.yml new file mode 100644 index 0000000..d7b70a6 --- /dev/null +++ b/pangolin/config/config.yml @@ -0,0 +1,50 @@ +# To see all available options, please visit the docs: +# https://docs.fossorial.io/Pangolin/Configuration/config + +app: + dashboard_url: "http://localhost:3002" + log_level: "info" + save_logs: false + +domains: + domain1: + base_domain: "example.com" + cert_resolver: "letsencrypt" + +server: + external_port: 3000 + internal_port: 3001 + next_port: 3002 + internal_hostname: "pangolin" + session_cookie_name: "p_session_token" + resource_access_token_param: "p_token" + resource_session_request_param: "p_session_request" + +traefik: + http_entrypoint: "web" + https_entrypoint: "websecure" + +gerbil: + start_port: 51820 + base_endpoint: "localhost" + block_size: 24 + site_block_size: 30 + subnet_group: 100.89.137.0/20 + use_subdomain: true + +rate_limits: + global: + window_minutes: 1 + max_requests: 100 + +users: + server_admin: + email: "admin@example.com" + password: "Password123!" + +flags: + require_email_verification: false + disable_signup_without_invite: true + disable_user_create_org: true + allow_raw_resources: true + allow_base_domain_resources: true diff --git a/pangolin/config/db/backups/db_2025-2-6_7-48-34.sqlite b/pangolin/config/db/backups/db_2025-2-6_7-48-34.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/pangolin/config/db/backups/db_2025-2-6_7-48-52.sqlite b/pangolin/config/db/backups/db_2025-2-6_7-48-52.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..beba12086f1a1af104315ff94f3afcb421666e3a GIT binary patch literal 217088 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 literal 0 HcmV?d00001 diff --git a/pangolin/config/db/backups/db_2025-2-6_7-49-30.sqlite b/pangolin/config/db/backups/db_2025-2-6_7-49-30.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..5757e5c3aa55f1d5cf159bf3ae220e28d7291e24 GIT binary patch literal 217088 zcmeI5ZEPFKdB?dXB}$Y?`c0;NI-k~-&k|3TC0f>kIF8RAgjXh0AG9}~qu zATVrw(;xh+o4$suYxYBMT{pTM4qX218%?w}82>SAGZ6n}{AckW$NJm*+rA(9R_i-0 zpJ`RX^DVjNzNWXEkAz+k-U|f-Z?mQw*^Y3cyIa^Q8qz|UXhc`5T9Hf{71!mdkz6J{ zn-OQzHzzV;!BtZbdn2s{)u@b@3ZkqSWQl0vbZ&eyotqbLXXeH9-0akNmfk;^$#6BWcT8}(_K$iB)MD=4YFont=|!nTBFU|e z6XC?rkns6eJwVgNBGL6(^$t;N#a*J4{(xOAOwdxT7lw_qanp9GTTrznr;S@~58sHp z!RFY2uugTLdQT8#$)Fan4esu~-U!UthHR9HIbl{T5xuC%6~?e8ENVnDNNHE*GnMmN zj>?$P?5bVai%#YV`9~2b7~H#bAJGY~d-=35-Amqc5H||as!lXt@7u|{>Rrbj_+C3%19&}v z38@EAHIghecN4CQN5hGZ4q<(O<76(xzK?lAttJM_>NgqCo~Ni4boqU z=BE)eOZhB6It^(?*UE}@sl}@ID$j&Wb*FNdiuc5J@+YQnKE+<+>yuNyt`4XxzsihS(-*S#7H=C=8Uk_ z$w`&v71_|u*ETO7Q)r^$*DkZ~a`$5fS^e(DCwZ_1^PW_$(xl?I;QFnl`xDTSh%&8e{#!`8Ym|!1Y@f_FDXim2a=N8C(bp%;b0F5bu9Le}qRGOSEZnkg;c+eV>&d2YqO()jNOGpul4Jd7_ENLgBfj7}OVZAp z?FC6EqkMh!QMjloi}KQ>q)1Dowm#64!&rK5Vpd#~$~tjv75bZ-6Y0)I>C2j3K4o2m zKO5wlt<{fUU2DjE%DQM;PYU70 z@UXC6<@3$wOPc)Vn`M$;k(V^?-@2ddh)0w2eof9ZgV8U!B+g`VET?duFzO3vgXNKN179#9ByO@zd7Vnrj(wn&tIS~XP%`mr#qtbRfzvp zfd0c52!H?xfB*=900@8p2!H?xfB*=9z`-GKTWAWbN1IZM3yaqmQo|`JCB1ZY=xXuW zwQIve*M?pix>8ykym~El<=VB>@QVvqO45rjT^$@OzIeTq8Y;e2B*RxrSBite7p3=e z{~4ir3Gx36(0}*>0T2KI5C8!X009sH0T2KI5C8!XID`a(!9Xi}|9_zUtw8+8@gK(j zDgO8Iuf_i~{&xI#;-85x#b@F-;{)-|cx&wEv3Fzt9Q)hYS7YzQ{wVg_vHLMOHXnN> z_EJoYMWX)`{kQ1fMZX$-C;GclBl<@4W6_@IvG!lK|3~|G+yA=#k7@V#0s#;J0T2KI z5C8!X009sH0f)fxflx9KV4rfBaz0IV>T)O*2vjTV!%g&Kg#6>bxoVko^oIt_wr;6@ z>Jn>SB4y%jeyWej&0nN;-*EDUP`}xY>$8pe$t07Sy`-H_#wL10LxI2&Q3(A_aN=rz zx+g?GC%r@ryXV)J>F1`H9;Yv|8v5bKx|&nZvkAFsre%eFA|Y{s4dRwtpP`I(htBaq zD4RL@Ny7N~5dAPV{fG%G;d%-(Ggqt*bVy0E~cVu9M*+?^0{qN-nQfH z_AYqiW6y?qOm;I=T`r1thPq4z>w_<)cU0 z9cGV~B+evepQhw^jJc%O{f1|<)04v3sYXo??sYZa`8)EmGV^SxH23gUZIxR+ygwELh6BSsMITKbzBXFSo>w)OM z#D5akqVd>w;(rrA6MZ@U5Al5a|Hi%%|MPfDbUOZS^xN^N=yL2Y;$M#aBDNX5*#7m{ zN8A5B`m6Yj=)18$iOt6UAogFe#h4NO%jny&ld)uUJ^rup7uvrY`$GJ4vF|xyjtdX~ z0T2KI5C8!X009sH0T9?Tf#boX;C)&!a4MJ*yr(txu;6k>aDcb84{S`R_p`>{BN~%m zVq)(pjfwkC2K#v*u7kh+0u!2D)SeS06TuEJMx*FOvBVHK{UxbyhnBAbe< z!g@yVJR86*wjL2&hy~BF0jwtk-SJ?z;CeuC-l0H`%Qgx9oFjEV9uS#gt|9n&ylb0~ zpYfmDem`$|_E@lo(_#lxE_pT@?BWuBS0|fl?ZLn^tXO+4aE29Yj|EQKxAKk>ZNW~C zk!o>@HMC4fiyf?JnT{4u9t}Qkbz`39PcR~`2Li`g$IkPBW30K^nf-u(3e4_IL7aJ< z*S%u4q7Kj~8^mSic6O83&DxmA>td0b$_!bntuia(2_%X6*fcA^vWF{=*jtfB*=900@8p2!H?xfB*=900@A< zuQ`EJLa4L5)%?qhDY7Q5ROq9zqPk*!{{N?e_)mY$6~y#G00ck)1V8`;KmY_l00ck) z1V8`;yaXb_PWw>+d;g#Qr+@eY0T2KI5C8!X009sH0T2KI5C8!XIK%|Z-~WF<5P$y= zD+$#=00ck)1V8`;KmY_l00ck)1VG?JN1$DxpZ_OovXP~Ka#A-O;cB8WvPErQiWwQ=M1 zzOk!{)|YxEo4a0q}85me1+JapE$k5>65PtuE zKTM52K>!3m00ck)1V8`;KmY_l00cnbU=hIi|6thzvjG7R009sH0T2KI5C8!X009sH zf&C!B{{BDy{@;F(MV}x50w4eaAOHd&00JNY0w4eaAaHO9;QjxDV++g#1V8`;KmY_l z00ck)1V8`;KmY{xivZsL-!HQ07X&~61V8`;KmY_l00ck)1V8`;4h{jl|9^07fti2+ z2!H?xfB*=900@8p2!H?xfWUqc!1;f_$f92m009sH0T2KI5C8!X009sH0T4Ji1n~R+ z2geqe2?&4y2!H?xfB*=900@8p2!H?x>=yyN|G!^k(Ju&q00@8p2!H?xfB*=900@8p z2pk*&IR76UTVN(200JNY0w4eaAOHd&00JNY0wAzo1n~R+`$ZQ0f&d7B00@8p2!H?x zfB*=900@ADxGqnPnt=|!nT zBFW6j=EVGv5RjD;S<~;9WrO6Us-g07-c~wYED~LxRqqfbpYjoQY;~LnCx(WE&%f%i zz3V=oyH5K1g6k&JC#2fwj6O$fI|jq!qE=9~C8v#BZV%tcdW)BRVm-JLx{66JEdYX<_<>?2{;V4&p{ZTGff>>oz;NMZL}4 zp6CT^4d68$6H?PrHIghecN4BX$C?u_cQguD<_q~0dp*8*G@R(@5Y`7ccP3)r$Gl{j z$V$7euxS)pinL-mv!iDuxzQI7C(fM{w$9lDjjA*gDr`9G>S*1dRz>~L?vN_+e*CQB zMN0>wjl5*JVjnapoC$dQHpMLFTn%<%H2K$bA2{BR4!*@(~I-&W) zXppx`G_j1B>BVRH(P^q@bggt&mlLddukuXDRCg+Osd!IpC%jZ$%$?Zw&df^{58PPa5C`uc=<4#e8;>Ev#e zD0GKsZvX6Js|U`u%3h}8CE7H(@oG4nxPD#Ox?w_Q`{37zCNIiGiEVX8IB{QTi)Vxa zU!Ci2t%bDhPVNP&@rJ$On%-y=P^1&}fxMTL@VJ)w^<+~x(b*|%Bso)S$+3Pkd#Ty$ z5kEdTOOokFZc^^GbwSd}C|_TF6fUaDqP#RIDbf>oZ(4^I)P|KSEy3EUD=LX2D6?jWnx8p6`x3lI#!dG+k@R ze9F3LT2Bh$#PG1NUgh)6=S!OW=9^`bUy+wI?%%qf?1)E`^L|avGlS7Dxg^eHa^vX< zcPgfnr(etT;8>RssN6a;e=za#P&JLr2-er3d?-kq^rwxr^nWpZE~NpIPJu{fV)_EH%E5Gqdlys8^^1s zcPI<^p0;9j1GtEJd$$#tw$8J37*E?>?TYJ%b1czdG_#%!=4$z9W4Z0?KiccI2YfJw zUWf4?%KgNrx3K+=T`3qzww?|&&ky~^GtG&a{zf^_wwoRNwTD@@O6Y=;;wY zCwuZsu39Eea^Zze|IEVc%(SA>dt3qJ&hQ`PQKQ24bUsIGbZ&9B}^wZt^L?X=gu3P5e*|z1h84KHr&-mNMYHV7k z7DWyo_qL+(*3ur!ZCW>2tK&w;a(PKMc6gZhq;L+N;>+mP36GoGDb3c=E+-lQwKE{! ze!7z2<3?(Y@>J zXJ9=nR?B7gIg`oEHnz(!iLTQ(&g=!s|Cq^|EtJ*b9doO&o94Q%);FtLA(suKvWsRF zO*Pb_>h}g8ty;V9c?QEK%LCHcLS-7Q*xti5yHVC}x(??S6;>ftD&_mu-r}LKyiw*n zt#!Y1_-K!E=}f$RKdu<4>)7!VZ}^&G7QU_qJBKfQuZf9+3=9aHtDZ1( z>}1E0BY4g~?40`A>CraH?!vA?zIINh4f3rQy**pn*vrVSc(ij?B#Gbue;Us$7Rtnsv?XHb){owiTqZr65ogmkCo*Eek`~0?NUK#CFBL>t zF~}0p#Od7lWI8u5-pABgd@hrW4GLxMZvs3hYZerpRy-y>$TGfigeW$x#t`tOr ztQnr0R*12z(xF%d>!hM;Mr~lv?Q}AlB9*7zE!ZtYVfwkIJDM3w&rQsVhE^r+!N#U? znekg$u12qWx=AsY8O!7{*^$hQ=v3&1ZH=a~;@tEo!=|XBR5WB&5vgo6Gm)XPqNEq4 z5{V?YQr+Q1A|bq$=HPYNAUc2P@j~Y^6FIwdW7{2YRa;^=)iG6M(+G7HWKA}*YKb_2 z89qf?p@O=$mFmK6a=&I6y}F>EXf8cOS*AWQcA0G$ylDN zlqAC%msJ|~D}J+3m9nhV=1W>)vk<5XXbSphoHA_Tg(Qq zuc>L0%sqB+8J!rSQZ1Jw$@S7X9;};Prq3{sQ5D_%@%%QwF{P&G$hHHxUB(?YRh?+Q zUP9I?G7Z^u%}9-7#p=YXG!s&N=?osGrxP0e=bIDhP9Y#GC9hsYyptCiEy)H2ce%LOkPE;G5XOQ!bTQdpyilJ#_HMfUo5gSaUX zy{O3*mK>bm@%oVMf$p61D9#y4ZoJSHPIPq%Tip(q8J2CB^8BK^o)4G%GjhAl_Kf7J z^J-&(_PT~?2%0`kE9}xg>Y~k>gtu=dWO3$H?i^!|?`@1d7f$r_2wS%uSUGFO;=r83 zxq4_$-NV7rklJY#d~)zy6Y&DHD;{-y3j{*{nCR{n9-MGMrukyXG4jjJ8_96u>{;Q# zByYkp#S~4y_RoGVVOwm%WhLK))hIYECv!sG<*Ef)pITLDnsO?4xqw)c@PcE)Jte$4 zhkjh4U)Qk{Xzrx4$0&3*HId|IS5KImxXH2KxN?sL9tUGy_SIX_YGfKx=FJ>aHd>$> znU$atQk+*$q!&)^DiBO5B0mtGl#MZW}ZujU#&u7ZE6K*eN!Vea8&a}K8 zn__+Q;#m_(<8-Fzq8AB^EDw^Ma*#88o%Xw<@;GAK@|(K6;mpk!4aM$iu&Z^pZiL4b zPLU+u|F0eHaRmY(00JNY0w4eaAOHd&00JNY0*93V&i{wivd{|zKmY_l00ck)1V8`; zKmY_l00e3TaQ?5cz!eC900@8p2!H?xfB*=900@8p2pm=d5vJJD!>S$h0s#;J0T2KI z5C8!X009sH0T2KI5MTuG{y+Qx1V8`;KmY_l00ck)1V8`;KmY^|KLMQo55J9}Aqao~ z2!H?xfB*=900@8p2!H?x;QS9C009sH0T2KI5C8!X009sH0T2Lz!%qO`|HE%%Xb1uz z00JNY0w4eaAOHd&00JNY0yzJ}2S5M>KmY_l00ck)1V8`;KmY_l;P4Z`-~T`SHim{E z00JNY0w4eaAOHd&00JNY0w93*|KS5500JNY0w4eaAOHd&00JNY0w8es3E=#H_-zag zK>!3m00ck)1V8`;KmY_l00clF8om)|4?PIPei$8X`*Pcz)~~dDI-F_xX82@NDfFP} z90-8`2!O!;5?DVy5KasX2i&BdxZ$AR1)N5T|qFlj+>NcsnyMW~XMw?A*k}CEALtkz&;#rL<8HWyK&%M04sR z$@E}zVs1bP$V!Q<>37SrLGn`7P_}$Da+BTyHFuJ^&D``Tix@=}sgY<=*nZhCzP;{b`MH-06H*`_z)MXPyuDHx!)#aWig2C# zTMWECGa zM+?8lWqi8yoPIu>7#3-9-=d_Gc9~wnE8UOv&epoe<#QXpId$K|AAOHd&00JNY0w4eaAOHd&00JOz z5D2jIzYu>TK>y(j1V8`;KmY_l00ck)1V8`;KmY_lV9x~ByM;*K!1`26p!G(pTr3W1 z%Z6;M4Hj3|h9vfjh#w;nBMxUL&rUI|?M>>EwAHW>d2Ycml4Rs84ipTzpx``dmH`F86& zEuU#s!gDRT=Dw!4n-7Iv5#9?018=jY>)DQQqPttzEE>{$nP@~;t6Gsv8Wq>&iIH3; zJ(Ce<(l^F4V!>5Y5PKu71=XmGl?tM)7-W%X;#6*IBAuHPZ)fJj^z6*!SeD*Dk;%@8 z*-836J3fAa-emXUzSCV#mL<7d5Dl_wcbu!ub??jjvVO_yWJt;}DuQ zvpB1^F5ByQSv5Pv#`^N}tio<$+Ump$hzWNY)5Gn}iLvfRvF1|SL}Y0iT^A$a#Hmxl zW+x|AmX~EiH(%Sld`zKR2E@4CEh{&pJWK}u==OW?-<;YD|c5(N(8eox1CAvuJKEX(oQiZOqH0-5|=8s`+mr>8?>KF0p+w+oZ6LBgv_j=0sngFvo#d>$*K?<`5% zZ?@+pos9DJ)koo?sw~Kh6Otk=lG^$}PYyTJv*R=3f>hRtYpc-T+?+^vHcDUC?D8q= zBK+AP*KBQ?Yi1rybn8dRtC=M=9l$I&N!#rM?p;GI@_aY$kz{{pyXjg(=2O;1(^^sp zCx(ZGwJM))K3~%0H{UFi{Ia~LasSr+WQRPOob_vRmKltG$t7_*lN(EqyHhcpJpEdt z2gkaEK;_oaBTo}#=iVt*9-o!I@D9Gi>1 z5_>Tw#v;-GiT+#k@1kFez7zf3s1bc5`mtzF^ho=!+W({dd+mSS{>QX?e1QN6fB*=9 z00@8p2!H?xfPh2b=s+kL2(V8%Ogf(?J8?0T3IwVZ_TeV_F+%?F-(0m!I{HHcW?Q#Z zKXHLIFOf3wHb2qF0jsn|{QE6>=&ia>gM-OZI?zhv<+U>OA==ivrkiUG{#)g>wZU~w%!ipcsm=)?7^}9{qLvdi34cpTuV3e-Qhx*h0*R{$=#-*zs60x)%S}_zUgdi+wTvx!CueFvkT5 zfB*=900@8p2!H?xfB*>Wn!wRuQt&=47&sA33EtBhdsuL>BRIfY+6Oi!)caXu?-7m3 zFEFw9l*Yt;$AkU657)t8e}M_jE^5ySl8NAu;PaTE_hfLG%Ilv6^soxoQQUcaaGp)Y zRbf3Nc%BX57F&-9&c%Xf*Z|fOg6?>*TW~!fIO|ZL$7P#@e#Viy9}kF3G1n0MJl?fM z$j|uCZM~m2J$)qD!)dXDDVIDO4R&z}zpIl?wf11(8CI-47dXX=wZ{S{?OSt=0C=LtYC5nK>y(j1V8`;KmY_l00ck)1V8`;KmY_l z;5VGW2_e+k-D>`2#uQnVmMiqpSW#UzKmY%;K>TOF;R<5@<+h2cCSsgQ8@4I|6Y+r zzaRhtAOHd&00JNY0w4eaAOHd&uzv{P{r~-A3(N!rKmY_l00ck)1V8`;KmY_l00j1m z0M7q=MHc;n00@8p2!H?xfB*=900@8p2!O!;A%Nfi-#@m%Oh5nxKmY_l00ck)1V8`; zKmY_lV6O<^{r|lpi+(`>1V8`;KmY_l00ck)1V8`;Kw$q6!1;gw*a9;F0T2KI5C8!X z009sH0T2KI5CDO_B7ooj-z&1{7X&~61V8`;KmY_l00ck)1V8`;_74HP|G$51fti2+ z2!H?xfB*=900@8p2!H?xfWTf6!1;f#$f92m009sH0T2KI5C8!X009sH0T9?f1lak% zBk*=0-WLCQ?6+b+jIPD{+xy#o5cziNJ1w7SRl;*Ex#qs6Z#BIgdgah1;XT^)i-Ev; zwj-SA?iMzShBRL$8qw9NRwR=~#dUdNB$r9gWW<^Djq!|FaMcvV-biafH7aAJf+#Bn zStOb`l^dH#=jO!b6U`jYUXF1)Gbg5JXC}w8bdD35?2MS5q~EjS;}__}?3ub}=dLHq zl3Xr`23a*c_fdsDF6m1?HDt9S(_Yg?O_}$1 z22d|-X*8J?XQxIPYDE>Lq9Ln_NM)m$@eGv}CA}z>NFXLj_AB-i`m z;l!CU!sZ!!piz}(LWK=yT^+6))T*c-+8t6Q-jAPEylCk_w2_xASL}lZg);$f-=>(w zoU6eO&9`f7!C4Pi6)j2GrjmMKRQkIjINc= z>T-fr?^T`&nd(mE4i)c-ZRfX4;e3j{#@8xsd=s(J;}DuQ(=V&GF5ByQSv5Pv#`^N} ztio<$+Ump$hzWNY)5Gn}iLvfRG3`>@L}Y0iT^A$a#HmxlW+x|AmX~EiH(%Sld`zK< zhF`nP?(DF(Pn>3u)$eY6aspfF?n&h;%@uwtrQagBHvvtP)8W=|qN_{TP&p#9DjQjq zPQbZ{ctJUGla*cEJ+1~=q*96QLuksa+a(gERH1t=8uoQnmFm1)yiM-=RF!4jAj*`g z`EMcVu2Cv3vAsCkU9gTL$*Gp+L|>mU$AMV;J)PXG5{2&Y%thFXGt>s$W6+zwe^9X9B!s($7jR^sjL&%4xqoeIg##cl)kLl|VPjwJg-+fCORGM}<8n%0s+I59jdtX27Z^ZAk{ zzxigF-hOD>7incP@<+?|T)X*{!d>-ec~qQ77G{ZDd}*e5${UDUUhpY@o+IZ4~iYw2a%jh5Z3do6HB z)b?4Tpg;TwSyHpAky)h){h>j}TwB(2EN$!NG0ItMSryAdmU?!)FtL4(a;d<@vcfXo z7U{|o-RZIQWsBVBEKWP|F5oU!-p!F+@n{b#>c;Wv=^e@fzN@WR-2g6P-rj9RrmXWU z9mdmkN4w(s;T%ge7|pC_gSlEh+E{M;`j7Uy?ExQ*q1R#jhjKsh=`C!%V@C=`lC38L z&2vK^eWp1v-QOq&+IF*pzxFW8mYfa*Habp*6Foh`=VVWQ$yLk5NiMw5>7QA6otaiN zdXFoB+!_9ZJZe#eB4N_ar~J+A!LETp*QyG z9ggkK-?lXxd0c}t&BpoD{AtPq%f>1_3i7uCbggzNZn12w#!6yT&}dvUg|OPKNukk` z_${U~``)rFP$AzU*p)k40qT}hXKvo!O)=}=)!@-acwCPjBgqG)XZe$g-%EIc(OGZw zt}RBg-dwXD-}<@7&QjTyr-076j;$WMeCVTB=gmW&=?tugg=)F%K4&tS*~WGmCed~J z#+ki9`5!Y`v-z@Gykl+^cG6te)%s?2E98=4RCds;qN#>jRQ=xIqgAW-Jm5a&9>iGcxOW5p9@j-Bi{as!3m00ck)1V8`;KmY_l z00cnb$r6aL;SN99F)rP65C8!X009sH0T2KI5C8!X0D&h<0O$WF%NwJC z00@8p2!H?xfB*=900@8p2!O!TAb|7#)1ZzqK>!3m00ck)1V8`;KmY_l00cnb$r6Y* zy&q^11_H6yTRs{-+VsoN51YPq=+A_K=xE!WXtedKv>IPE0_*qAg%h2f!skW|X}(Mh zNn0d_ZvE&T$z{?r8F40kV>}}kENMaPjkH>Yu~I>l6@x4iO`OV&O{8;k;_b|wn4X=P z9Lv(%CoDN=dL-Gbdh6sDhRx}%w!>Dloa(a@^IJ=o33TxRT6maEb0o^DdiWo~A2ne0er zT68M(!j?vpS#fr1lwng;Q7Rg;s)$rJni8k>pzG z3=h_gF4Je2$Eb>K{&;?i-3QG=7@OXX5_CR;ec@*c2 zB-dZ)3Maa{gw1Y;%QVY2OnH9MUC)Qh{TaF4W@|=r)p@nCKzm)oGz3kbrWJPRA9c}Y zO~TtZ6S6pSDz}d@$M@E6J{L~(^az``9auSQ#p1x6!kKz#PTj-7(U9716?}5=TodsE zv@0HUeG3Fa|Cs3R79JdPK&JU($T9NEjqAy9;`C|Z!31x@GQ}iKzxL05FJW73!eu4j zgw-fGEhlqA-Q}tUS)W`{Xqs{=cesF9lkkFL!d)f2I){E-p%wdc#^Z z4~bBTrvb;}F2vTht8Vw`MbBr-wi9kIX2K5^bP-v6&1?r{YIAOHd&00JNY z0w4eaAOHd&00IY<0M7ph)w0kF1V8`;KmY_l00ck)1V8`;KmY`41aSVZvA`7wfB*=9 z00@8p2!H?xfB*=90000@8p2!H?xfB*=900@8p2;lq= z9{>Rm009sH0T2KI5C8!X009sHfrC!~=l_FmV`vBhAOHd&00JNY0w4eaAOHd&00KDw z!v{bB1V8`;KmY_l00ck)1V8`;K;YmLz~BEr_%?=yAOHd&00JNY0w4eaAOHd&00JO@ z_y6GoAOHd&00JNY0w4eaAOHd&00JOz@Co4jfADP#4M6||KmY_l00ck)1V8`;KmY_l zAR4|NXb(LI#C{YVZTm{woz}0md^((I`d0XOQz`VI=?n;g00@A<-V#_lIS@_^3dqmS^Rhf_%HOZhCdY$0%NG_9}$%r%Q8{-+VP*-0Ndn2v3xF8y2)ext0V-xAz zoOnAkCuS#S#O&<&_yyXEtde5YAf>cX5M{+6i$rtkBgyn&b7FQt2*^r_tm=2mvO)4v z)lhjkUpH_*RVNz$)J3XXhp-mp_f&PF<;k)nm-AIczFQ?sFl6a7n;m;~HY1K@M>C%g z3w2Ek;$+qoQw0mWlR|Pmdm)_Y=nyu4o5N!_vG0@@5fhnIEn{VWLK`N< zT;^sbm&uM~rY$$=El_hOncK`xjk1VQRFN8q1{ITyX2vsAR+RLjR3enSw_DvD-`gz{ z>V@8dQ@NwQBgyrTybwG60%y6sVn=foIJa$cL>e5yKyeB$Jq9Br?q`!S}SWtk{i#RH!T!&ER^OcmdB=b z`9i>eS^JsF|%D)47ARfw{a4_bBR|X?erL6te(vHF&h}dtAn+OV7#Y!-?TxVPl#b z$k}wbU#_rYcjtkR&=@6Xm@C(XJ;nIvb2|pOqT99U3*T;DD|OHq?7UA zU+sleBT2mfzqcnF^bP_b00JNY0w4eaAOHd&00JNY0{ejgJO2yuHv;q@zCZv3KmY_l z00ck)1V8`;KmY_l00eeTV69t-^bM>{wgg(Qx5~xhptfYl#_C{kWpzkmzliuTvMMcC z%H(2ET|Osii>h)-E}gq~J$3EeGJUx`eC2|1{nCZX_0+klbZO{rYDt|cj(=h$H*+<8 zV`yPy<=o)Zo!6DyulJ2yy85biZ%WcC*}I>GIW=hK4T=T}i#c{{FuZ|L*|(hc6HS0T2KI5C8!X009sH0T2KI z5CDOLK;USwZ|jo?^Zfr_ApYJ#P!KwR00@8p2!H?xfB*=900@8p2!Ozcp1|?oKx^GE z9+ZUtog literal 0 HcmV?d00001 diff --git a/pangolin/config/key b/pangolin/config/key new file mode 100644 index 0000000..b5ff9d5 --- /dev/null +++ b/pangolin/config/key @@ -0,0 +1 @@ ++AFwMsyZ1Wg/UYXZKkkV0K771bwl6950dcFAL23Js0s= \ No newline at end of file diff --git a/pangolin/docker-compose.yml b/pangolin/docker-compose.yml new file mode 100644 index 0000000..59d4240 --- /dev/null +++ b/pangolin/docker-compose.yml @@ -0,0 +1,54 @@ +name: pangolin +services: + pangolin: + image: fosrl/pangolin:latest + container_name: pangolin + restart: unless-stopped + volumes: + - ./config:/app/config + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3001/api/v1/"] + interval: "3s" + timeout: "3s" + retries: 5 + + gerbil: + image: fosrl/gerbil:latest + container_name: gerbil + restart: unless-stopped + depends_on: + pangolin: + condition: service_healthy + command: + - --reachableAt=http://gerbil:3003 + - --generateAndSaveKeyTo=/var/config/key + - --remoteConfig=http://pangolin:3001/api/v1/gerbil/get-config + - --reportBandwidthTo=http://pangolin:3001/api/v1/gerbil/receive-bandwidth + volumes: + - ./config:/var/config + cap_add: + - NET_ADMIN + - SYS_MODULE + ports: + - 51820:51820/udp + - 443:443 # Port for traefik because of the network_mode + - 80:80 # Port for traefik because of the network_mode + + traefik: + image: traefik:v3.3.3 + container_name: traefik + restart: unless-stopped + network_mode: service:gerbil # Ports appear on the gerbil service + depends_on: + pangolin: + condition: service_healthy + command: + - --configFile=/etc/traefik/traefik_config.yml + volumes: + - ./config/traefik:/etc/traefik:ro # Volume to store the Traefik configuration + - ./config/letsencrypt:/letsencrypt # Volume to store the Let's Encrypt certificates + +networks: + default: + driver: bridge + name: pangolin \ No newline at end of file diff --git a/pangolin/pangolin b/pangolin/pangolin new file mode 160000 index 0000000..eb73da8 --- /dev/null +++ b/pangolin/pangolin @@ -0,0 +1 @@ +Subproject commit eb73da8aa08d7d14ef4ab40cdd6b0a34880d390d