Skip to content

Commit 28986f4

Browse files
chore(web): Bake PostHog token into build
1 parent 41a6eb4 commit 28986f4

File tree

10 files changed

+22
-31
lines changed

10 files changed

+22
-31
lines changed

.env.development

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ SOURCEBOT_PUBLIC_KEY_PATH=${PWD}/public.pem
2929

3030
# PostHog
3131
# POSTHOG_PAPIK=""
32-
# NEXT_PUBLIC_POSTHOG_PAPIK=""
3332

3433
# Sentry
3534
# SENTRY_BACKEND_DSN=""

.github/workflows/_gcp-deploy.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@ jobs:
5555
${{ env.IMAGE_PATH }}:latest
5656
build-args: |
5757
NEXT_PUBLIC_SOURCEBOT_VERSION=${{ github.ref_name }}
58-
NEXT_PUBLIC_POSTHOG_PAPIK=${{ vars.NEXT_PUBLIC_POSTHOG_PAPIK }}
5958
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT }}
6059
NEXT_PUBLIC_SENTRY_ENVIRONMENT=${{ vars.NEXT_PUBLIC_SENTRY_ENVIRONMENT }}
6160
NEXT_PUBLIC_SENTRY_WEBAPP_DSN=${{ vars.NEXT_PUBLIC_SENTRY_WEBAPP_DSN }}

.github/workflows/ghcr-publish.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ jobs:
7777
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true,annotation.org.opencontainers.image.description=Blazingly fast code search
7878
build-args: |
7979
NEXT_PUBLIC_SOURCEBOT_VERSION=${{ github.ref_name }}
80-
NEXT_PUBLIC_POSTHOG_PAPIK=${{ vars.NEXT_PUBLIC_POSTHOG_PAPIK }}
8180
8281
- name: Export digest
8382
run: |

Dockerfile

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99
# @see: https://docs.docker.com/build/building/variables/#scoping
1010

1111
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
12-
# PAPIK = Project API Key
13-
# Note that this key does not need to be kept secret, so it's not
14-
# necessary to use Docker build secrets here.
15-
# @see: https://posthog.com/tutorials/api-capture-events#authenticating-with-the-project-api-key
16-
ARG NEXT_PUBLIC_POSTHOG_PAPIK
1712
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
1813
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
1914
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
@@ -58,8 +53,6 @@ ENV SKIP_ENV_VALIDATION=1
5853
# -----------
5954
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
6055
ENV NEXT_PUBLIC_SOURCEBOT_VERSION=$NEXT_PUBLIC_SOURCEBOT_VERSION
61-
ARG NEXT_PUBLIC_POSTHOG_PAPIK
62-
ENV NEXT_PUBLIC_POSTHOG_PAPIK=$NEXT_PUBLIC_POSTHOG_PAPIK
6356
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
6457
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
6558
ARG NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT
@@ -155,8 +148,6 @@ FROM node-alpine AS runner
155148
# -----------
156149
ARG NEXT_PUBLIC_SOURCEBOT_VERSION
157150
ENV NEXT_PUBLIC_SOURCEBOT_VERSION=$NEXT_PUBLIC_SOURCEBOT_VERSION
158-
ARG NEXT_PUBLIC_POSTHOG_PAPIK
159-
ENV NEXT_PUBLIC_POSTHOG_PAPIK=$NEXT_PUBLIC_POSTHOG_PAPIK
160151
ARG NEXT_PUBLIC_SENTRY_ENVIRONMENT
161152
ENV NEXT_PUBLIC_SENTRY_ENVIRONMENT=$NEXT_PUBLIC_SENTRY_ENVIRONMENT
162153
ARG NEXT_PUBLIC_SENTRY_WEBAPP_DSN
@@ -179,6 +170,11 @@ ENV DATA_CACHE_DIR=$DATA_DIR/.sourcebot
179170
ENV DATABASE_DATA_DIR=$DATA_CACHE_DIR/db
180171
ENV REDIS_DATA_DIR=$DATA_CACHE_DIR/redis
181172
ENV SOURCEBOT_PUBLIC_KEY_PATH=/app/public.pem
173+
# PAPIK = Project API Key
174+
# Note that this key does not need to be kept secret, so it's not
175+
# necessary to use Docker build secrets here.
176+
# @see: https://posthog.com/tutorials/api-capture-events#authenticating-with-the-project-api-key
177+
ENV POSTHOG_PAPIK=phc_lLPuFFi5LH6c94eFJcqvYVFwiJffVcV6HD8U4a1OnRW
182178

183179
# Valid values are: debug, info, warn, error
184180
ENV SOURCEBOT_LOG_LEVEL=info

entrypoint.sh

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,6 @@ fi
6666

6767
echo -e "\e[34m[Info] Sourcebot version: $NEXT_PUBLIC_SOURCEBOT_VERSION\e[0m"
6868

69-
# If we don't have a PostHog key, then we need to disable telemetry.
70-
if [ -z "$NEXT_PUBLIC_POSTHOG_PAPIK" ]; then
71-
echo -e "\e[33m[Warning] NEXT_PUBLIC_POSTHOG_PAPIK was not set. Setting SOURCEBOT_TELEMETRY_DISABLED.\e[0m"
72-
export SOURCEBOT_TELEMETRY_DISABLED=true
73-
fi
74-
7569
if [ -n "$SOURCEBOT_TELEMETRY_DISABLED" ]; then
7670
# Validate that SOURCEBOT_TELEMETRY_DISABLED is either "true" or "false"
7771
if [ "$SOURCEBOT_TELEMETRY_DISABLED" != "true" ] && [ "$SOURCEBOT_TELEMETRY_DISABLED" != "false" ]; then
@@ -159,7 +153,7 @@ if [ ! -f "$FIRST_RUN_FILE" ]; then
159153
# (if telemetry is enabled)
160154
if [ "$SOURCEBOT_TELEMETRY_DISABLED" = "false" ]; then
161155
if ! ( curl -L --output /dev/null --silent --fail --header "Content-Type: application/json" -d '{
162-
"api_key": "'"$NEXT_PUBLIC_POSTHOG_PAPIK"'",
156+
"api_key": "'"$POSTHOG_PAPIK"'",
163157
"event": "install",
164158
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
165159
"properties": {
@@ -179,7 +173,7 @@ else
179173

180174
if [ "$SOURCEBOT_TELEMETRY_DISABLED" = "false" ]; then
181175
if ! ( curl -L --output /dev/null --silent --fail --header "Content-Type: application/json" -d '{
182-
"api_key": "'"$NEXT_PUBLIC_POSTHOG_PAPIK"'",
176+
"api_key": "'"$POSTHOG_PAPIK"'",
183177
"event": "upgrade",
184178
"distinct_id": "'"$SOURCEBOT_INSTALL_ID"'",
185179
"properties": {

packages/backend/src/posthog.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ import { PosthogEvent, PosthogEventMap } from './posthogEvents.js';
55

66
let posthog: PostHog | undefined = undefined;
77

8-
if (clientEnv.NEXT_PUBLIC_POSTHOG_PAPIK) {
8+
if (env.POSTHOG_PAPIK) {
99
posthog = new PostHog(
10-
clientEnv.NEXT_PUBLIC_POSTHOG_PAPIK,
10+
env.POSTHOG_PAPIK,
1111
{
1212
host: "https://us.i.posthog.com",
1313
}

packages/shared/src/env.client.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ export const env = createEnv({
77
client: {
88
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: z.enum(SOURCEBOT_CLOUD_ENVIRONMENT).optional(),
99
NEXT_PUBLIC_SOURCEBOT_VERSION: z.string().default("unknown"),
10-
NEXT_PUBLIC_POSTHOG_PAPIK: z.string().optional(),
1110
NEXT_PUBLIC_SENTRY_BACKEND_DSN: z.string().optional(),
1211
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().optional(),
1312
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: z.string().optional(),
@@ -16,7 +15,6 @@ export const env = createEnv({
1615
runtimeEnvStrict: {
1716
NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT: process.env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT,
1817
NEXT_PUBLIC_SOURCEBOT_VERSION: process.env.NEXT_PUBLIC_SOURCEBOT_VERSION,
19-
NEXT_PUBLIC_POSTHOG_PAPIK: process.env.NEXT_PUBLIC_POSTHOG_PAPIK,
2018
NEXT_PUBLIC_SENTRY_BACKEND_DSN: process.env.NEXT_PUBLIC_SENTRY_BACKEND_DSN,
2119
NEXT_PUBLIC_SENTRY_ENVIRONMENT: process.env.NEXT_PUBLIC_SENTRY_ENVIRONMENT,
2220
NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY: process.env.NEXT_PUBLIC_LANGFUSE_PUBLIC_KEY,

packages/shared/src/env.server.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export const env = createEnv({
120120
CONFIG_MAX_REPOS_NO_TOKEN: numberSchema.default(Number.MAX_SAFE_INTEGER),
121121
NODE_ENV: z.enum(["development", "test", "production"]),
122122
SOURCEBOT_TELEMETRY_DISABLED: booleanSchema.default('false'),
123+
POSTHOG_PAPIK: z.string(),
123124

124125
// Database variables
125126
// Either DATABASE_URL or DATABASE_HOST, DATABASE_USERNAME, DATABASE_PASSWORD, and DATABASE_NAME must be set.

packages/web/src/app/layout.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,12 @@ export default function RootLayout({
3737
<Toaster />
3838
<SessionProvider>
3939
<PlanProvider entitlements={getEntitlements()}>
40-
<PostHogProvider disabled={env.SOURCEBOT_TELEMETRY_DISABLED === "true"}>
40+
<PostHogProvider
41+
isDisabled={env.SOURCEBOT_TELEMETRY_DISABLED === "true"}
42+
// @note: the posthog api key doesn't need to be kept secret,
43+
// so we are safe to send it to the client.
44+
posthogApiKey={env.POSTHOG_PAPIK}
45+
>
4146
<ThemeProvider
4247
attribute="class"
4348
defaultTheme="system"

packages/web/src/app/posthogProvider.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,16 @@ function PostHogPageView() {
3232

3333
interface PostHogProviderProps {
3434
children: React.ReactNode
35-
disabled: boolean
35+
isDisabled: boolean
36+
posthogApiKey: string
3637
}
3738

38-
export function PostHogProvider({ children, disabled }: PostHogProviderProps) {
39+
export function PostHogProvider({ children, isDisabled, posthogApiKey }: PostHogProviderProps) {
3940
const { data: session } = useSession();
4041

4142
useEffect(() => {
42-
if (!disabled && env.NEXT_PUBLIC_POSTHOG_PAPIK) {
43-
console.debug(`PostHog telemetry enabled. Cloud environment: ${env.NEXT_PUBLIC_SOURCEBOT_CLOUD_ENVIRONMENT}`);
44-
posthog.init(env.NEXT_PUBLIC_POSTHOG_PAPIK, {
43+
if (!isDisabled) {
44+
posthog.init(posthogApiKey, {
4545
// @see next.config.mjs for path rewrites to the "/ingest" route.
4646
api_host: "/ingest",
4747
person_profiles: 'identified_only',
@@ -66,7 +66,7 @@ export function PostHogProvider({ children, disabled }: PostHogProviderProps) {
6666
} else {
6767
console.debug("PostHog telemetry disabled");
6868
}
69-
}, [disabled]);
69+
}, [isDisabled, posthogApiKey]);
7070

7171
useEffect(() => {
7272
if (!session) {

0 commit comments

Comments
 (0)