@@ -22,11 +22,16 @@ msg_ok "Installed Dependencies"
2222NODE_VERSION=" 22" setup_nodejs
2323fetch_and_deploy_gh_release " pangolin" " fosrl/pangolin" " tarball"
2424fetch_and_deploy_gh_release " gerbil" " fosrl/gerbil" " singlefile" " latest" " /usr/bin" " gerbil_linux_amd64"
25+ fetch_and_deploy_gh_release " traefik" " traefik/traefik" " prebuild" " latest" " /usr/bin" " traefik_v*_linux_amd64.tar.gz"
26+
27+ read -rp " ${TAB3} Enter your Pangolin URL (ex: https://pangolin.example.com): " pango_url
28+ read -rp " ${TAB3} Enter your email address: " pango_email
2529
2630msg_info " Setup Pangolin"
2731IP_ADDR=$( hostname -I | awk ' {print $1}' )
2832SECRET_KEY=$( openssl rand -base64 48 | tr -dc ' A-Za-z0-9' | head -c 32)
2933cd /opt/pangolin
34+ mkdir -p /opt/pangolin/config/{traefik,db,letsencrypt,logs}
3035$STD npm ci
3136$STD npm run set:sqlite
3237$STD npm run set:oss
@@ -46,30 +51,129 @@ mkdir -p /var/config
4651
4752cat << EOF >/opt/pangolin/config/config.yml
4853app:
49- dashboard_url: http://$IP_ADDR :3002
50- log_level: debug
54+ dashboard_url: "$pango_url "
5155
5256domains:
5357 domain1:
54- base_domain: example.com
58+ base_domain: "$pango_url "
59+ cert_resolver: "letsencrypt"
5560
5661server:
57- secret: $SECRET_KEY
62+ secret: " $SECRET_KEY "
5863
5964gerbil:
60- base_endpoint: example.com
61-
62- orgs:
63- block_size: 24
64- subnet_group: 100.90.137.0/20
65+ base_endpoint: "$pango_url "
6566
6667flags:
6768 require_email_verification: false
68- disable_signup_without_invite: true
69- disable_user_create_org: true
70- allow_raw_resources: true
71- enable_integration_api: true
72- enable_clients: true
69+ disable_signup_without_invite: false
70+ disable_user_create_org: false
71+ EOF
72+
73+ cat << EOF >/opt/pangolin/config/traefik/traefik_config.yml
74+ api:
75+ insecure: true
76+ dashboard: true
77+
78+ providers:
79+ http:
80+ endpoint: "http://$IP_ADDR :3001/api/v1/traefik-config"
81+ pollInterval: "5s"
82+ file:
83+ filename: "/opt/pangolin/config/traefik/dynamic_config.yml"
84+
85+ experimental:
86+ plugins:
87+ badger:
88+ moduleName: "github.com/fosrl/badger"
89+ version: "v1.2.0"
90+
91+ log:
92+ level: "INFO"
93+ format: "common"
94+
95+ certificatesResolvers:
96+ letsencrypt:
97+ acme:
98+ httpChallenge:
99+ entryPoint: web
100+ email: $pango_email
101+ storage: "/opt/pangolin/config/letsencrypt/acme.json"
102+ caServer: "https://acme-v02.api.letsencrypt.org/directory"
103+
104+ entryPoints:
105+ web:
106+ address: ":80"
107+ websecure:
108+ address: ":443"
109+ transport:
110+ respondingTimeouts:
111+ readTimeout: "30m"
112+ http:
113+ tls:
114+ certResolver: "letsencrypt"
115+
116+ serversTransport:
117+ insecureSkipVerify: true
118+
119+ ping:
120+ entryPoint: "web"
121+ EOF
122+
123+ cat << EOF >/opt/pangolin/config/traefik/dynamic_config.yml
124+ http:
125+ middlewares:
126+ redirect-to-https:
127+ redirectScheme:
128+ scheme: https
129+
130+ routers:
131+ # HTTP to HTTPS redirect router
132+ main-app-router-redirect:
133+ rule: "Host(\` $pango_url \` )"
134+ service: next-service
135+ entryPoints:
136+ - web
137+ middlewares:
138+ - redirect-to-https
139+
140+ # Next.js router (handles everything except API and WebSocket paths)
141+ next-router:
142+ rule: "Host(\` $pango_url \` ) && !PathPrefix(\` /api/v1\` )"
143+ service: next-service
144+ entryPoints:
145+ - websecure
146+ tls:
147+ certResolver: letsencrypt
148+
149+ # API router (handles /api/v1 paths)
150+ api-router:
151+ rule: "Host(\` $pango_url \` ) && PathPrefix(\` /api/v1\` )"
152+ service: api-service
153+ entryPoints:
154+ - websecure
155+ tls:
156+ certResolver: letsencrypt
157+
158+ # WebSocket router
159+ ws-router:
160+ rule: "Host(\` $pango_url \` )"
161+ service: api-service
162+ entryPoints:
163+ - websecure
164+ tls:
165+ certResolver: letsencrypt
166+
167+ services:
168+ next-service:
169+ loadBalancer:
170+ servers:
171+ - url: "http://$IP_ADDR :3002"
172+
173+ api-service:
174+ loadBalancer:
175+ servers:
176+ - url: "http://$IP_ADDR :3000"
73177EOF
74178$STD npm run db:sqlite:generate
75179$STD npm run db:sqlite:push
@@ -122,6 +226,21 @@ RestartSec=10
122226WantedBy=multi-user.target
123227EOF
124228systemctl enable -q --now gerbil
229+
230+ cat << 'EOF ' >/etc/systemd/system/traefik.service
231+ [Unit]
232+ Description=Traefik is an open-source Edge Router that makes publishing your services a fun and easy experience
233+
234+ [Service]
235+ Type=notify
236+ ExecStart=/usr/bin/traefik --configFile=/opt/pangolin/config/traefik/traefik_config.yml
237+ Restart=on-failure
238+ ExecReload=/bin/kill -USR1 \$MAINPID
239+
240+ [Install]
241+ WantedBy=multi-user.target
242+ EOF
243+ systemctl enable -q --now traefik
125244msg_ok " Created Services"
126245
127246motd_ssh
0 commit comments