_Your own self-hosted zero trust tunnel._
@@ -30,6 +28,12 @@ _Your own self-hosted zero trust tunnel._
Contact Us
+
+[](https://hub.docker.com/r/fosrl/pangolin)
+
+[](https://discord.gg/HCJR8Xhme4)
+[](https://www.youtube.com/@fossorial-app)
+
Pangolin is a self-hosted tunneled reverse proxy server with identity and access control, designed to securely expose private resources on distributed networks. Acting as a central hub, it connects isolated networks — even those behind restrictive firewalls — through encrypted tunnels, enabling easy access to remote services without opening ports.
diff --git a/package.json b/package.json
index b8ea5fab..c199f7c4 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,8 @@
"db:sqlite:generate": "drizzle-kit generate --config=./drizzle.sqlite.config.ts",
"db:pg:push": "npx tsx server/db/pg/migrate.ts",
"db:sqlite:push": "npx tsx server/db/sqlite/migrate.ts",
- "db:studio": "drizzle-kit studio",
+ "db:sqlite:studio": "drizzle-kit studio --config=./drizzle.sqlite.config.ts",
+ "db:pg:studio": "drizzle-kit studio --config=./drizzle.pg.config.ts",
"db:clear-migrations": "rm -rf server/migrations",
"build:sqlite": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs",
"build:pg": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs",
diff --git a/server/routers/gerbil/peers.ts b/server/routers/gerbil/peers.ts
index 2f339fe4..4bc9ce7f 100644
--- a/server/routers/gerbil/peers.ts
+++ b/server/routers/gerbil/peers.ts
@@ -24,7 +24,7 @@ export async function addPeer(exitNodeId: number, peer: {
}
});
- logger.info('Peer added successfully:', response.data.status);
+ logger.info('Peer added successfully:', { peer: response.data.status });
return response.data;
} catch (error) {
if (axios.isAxiosError(error)) {
diff --git a/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx b/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx
index b42bc9ee..a6740b3c 100644
--- a/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx
+++ b/src/app/[orgId]/settings/resources/[resourceId]/ResourceInfoBox.tsx
@@ -31,7 +31,7 @@ export default function ResourceInfoBox({}: ResourceInfoBoxType) {
Resource Information
-
+
{resource.http ? (
<>
diff --git a/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx b/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx
index d2bfee4b..c9419865 100644
--- a/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx
+++ b/src/app/[orgId]/settings/resources/[resourceId]/proxy/page.tsx
@@ -60,7 +60,8 @@ import {
SettingsSectionDescription,
SettingsSectionBody,
SettingsSectionFooter,
- SettingsSectionForm
+ SettingsSectionForm,
+ SettingsSectionGrid
} from "@app/components/Settings";
import { SwitchInput } from "@app/components/SwitchInput";
import { useRouter } from "next/navigation";
@@ -73,6 +74,7 @@ import {
CollapsibleTrigger
} from "@app/components/ui/collapsible";
import { ContainersSelector } from "@app/components/ContainersSelector";
+import { FaDocker } from "react-icons/fa";
const addTargetSchema = z.object({
ip: z.string().refine(isTargetValid),
@@ -559,115 +561,6 @@ export default function ReverseProxyTargets(props: {
return (
- {resource.http && (
-
-
-
- HTTPS & TLS Settings
-
-
- Configure TLS settings for your resource
-
-
-
-
-
-
-
-
-
-
-
-
- )}
-
@@ -775,8 +668,7 @@ export default function ReverseProxyTargets(props: {
-
- {site && site.type == 'newt' && (
+ {site && site.type == "newt" && (
)}
+
)}
/>
@@ -891,59 +784,175 @@ export default function ReverseProxyTargets(props: {
{resource.http && (
-
-
-
- Additional Proxy Settings
-
-
- Configure how your resource handles proxy settings
-
-
-
-
-
-
-
-
-
-
-
-
+ className="space-y-4"
+ id="tls-settings-form"
+ >
+ (
+
+
+ {
+ field.onChange(
+ val
+ );
+ }}
+ />
+
+
+ )}
+ />
+
+
+
+
+
+
+
+ (
+
+
+ TLS Server Name
+ (SNI)
+
+
+
+
+
+ The TLS Server
+ Name to use for
+ SNI. Leave empty
+ to use the
+ default.
+
+
+
+ )}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Additional Proxy Settings
+
+
+ Configure how your resource handles proxy
+ settings
+
+
+
+
+
+
+ (
+
+
+ Custom Host Header
+
+
+
+
+
+ The host header to set
+ when proxying requests.
+ Leave empty to use the
+ default.
+
+
+
+ )}
+ />
+