happy Docker & Self-Hosted Deployment

GitHub

Mobile and Web client for Codex and Claude Code, with realtime voice, encryption and fully featured

23,294 stars TypeScript TypeScript 1 file ยท ~9,803 tokens #claude-code#claude-desktop#claude-mobile#codex#codex-cli#hacktoberfest
1. Pull Image (DOCKERHUB) docker pull slopus/happy:latest
2. Docker Run (1-Click Launch) docker run -d --name happy -p 3005:3005 --restart always slopus/happy:latest
3. Podman Run podman run -d --name happy -p 3005:3005 --restart always slopus/happy:latest
4. Skopeo Inspect (Zero-Pull Manifest) skopeo inspect docker://docker.io/slopus/happy:latest
5. ORAS Pull (OCI Artifact) oras pull slopus/happy:latest
Dockerfile
# Standalone happy-server: single container, no external dependencies
# Uses PGlite (embedded Postgres), local filesystem storage, no Redis

# Stage 1: install dependencies
FROM node:20 AS deps

RUN apt-get update && apt-get install -y python3 make g++ build-essential && rm -rf /var/lib/apt/lists/*
RUN corepack enable && corepack prepare [email protected] --activate

WORKDIR /repo

COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc ./
COPY scripts ./scripts
COPY patches ./patches

RUN mkdir -p packages/happy-app packages/happy-server packages/happy-cli packages/happy-agent packages/happy-wire

COPY packages/happy-app/package.json packages/happy-app/
COPY packages/happy-server/package.json packages/happy-server/
COPY packages/happy-cli/package.json packages/happy-cli/
COPY packages/happy-agent/package.json packages/happy-agent/
COPY packages/happy-wire/package.json packages/happy-wire/

# Workspace postinstall requirements
COPY packages/happy-app/patches packages/happy-app/patches
COPY packages/happy-server/prisma packages/happy-server/prisma
COPY packages/happy-cli/scripts packages/happy-cli/scripts
COPY packages/happy-cli/tools packages/happy-cli/tools

RUN SKIP_HAPPY_WIRE_BUILD=1 pnpm install --frozen-lockfile

# Stage 2: copy source and type-check
FROM deps AS builder

COPY packages/happy-wire ./packages/happy-wire
COPY packages/happy-server ./packages/happy-server

RUN pnpm --filter @slopus/happy-wire --fail-if-no-match build
RUN pnpm --filter happy-server --fail-if-no-match build

# Stage 3: runtime
FROM node:20-slim AS runner

WORKDIR /repo

RUN apt-get update && apt-get install -y ffmpeg curl && rm -rf /var/lib/apt/lists/*

ENV NODE_ENV=production
ENV DATA_DIR=/data
ENV PGLITE_DIR=/data/pglite

COPY --from=builder /repo/node_modules /repo/node_modules
COPY --from=builder /repo/packages/happy-wire /repo/packages/happy-wire
COPY --from=builder /repo/packages/happy-server /repo/packages/happy-server

VOLUME /data
EXPOSE 3005

WORKDIR /repo/packages/happy-server

CMD ["sh", "-c", "../../node_modules/.bin/tsx sources/standalone.ts migrate && exec ../../node_modules/.bin/tsx sources/standalone.ts serve"]