fix: runtipi dashboard logs project name

This commit is contained in:
Nicolas Meienberger 2024-05-31 08:59:53 +02:00
parent 02a83e1b5f
commit 78225c3186
9 changed files with 39 additions and 23 deletions

View File

@ -12,7 +12,6 @@
!**/build.js
!next.config.mjs
!sentry.*.config.ts
!instrumentation.ts
!public/**
!src/**
!tests/**

View File

@ -104,3 +104,10 @@ jobs:
tag: nightly
rm: true
files: cli/runtipi-cli-*
e2e-tests:
needs: [update-release]
uses: './.github/workflows/e2e.yml'
secrets: inherit
with:
version: ${{ needs.create-tag.outputs.tagname }}

View File

@ -46,8 +46,6 @@ COPY ./next.config.mjs ./next.config.mjs
# Sentry
COPY ./sentry.client.config.ts ./sentry.client.config.ts
COPY ./sentry.edge.config.ts ./sentry.edge.config.ts
COPY ./sentry.server.config.ts ./sentry.server.config.ts
COPY ./start.dev.sh ./start.sh

View File

@ -27,17 +27,32 @@ export const socketEventSchema = z.union([
error: z.string().optional(),
}),
}),
z.object({
type: z.literal('app-logs-init'),
event: z.literal('initLogs'),
data: z.object({
appId: z.string(),
maxLines: z.number().optional(),
}),
}),
z.object({
type: z.literal('app-logs'),
event: z.union([z.literal('newLogs'), z.literal('viewLogs'), z.literal('stopLogs')]),
event: z.union([z.literal('newLogs'), z.literal('stopLogs')]),
data: z.object({
appId: z.string(),
lines: z.array(z.string()).optional(),
}),
}),
z.object({
type: z.literal('runtipi-logs-init'),
event: z.literal('initLogs'),
data: z.object({
maxLines: z.number().optional(),
}),
}),
z.object({
type: z.literal('runtipi-logs'),
event: z.union([z.literal('newLogs'), z.literal('viewLogs'), z.literal('stopLogs')]),
event: z.union([z.literal('newLogs'), z.literal('stopLogs')]),
data: z.object({
lines: z.array(z.string()).optional(),
}),

View File

@ -55,7 +55,7 @@ const getBaseComposeArgsApp = async (appId: string) => {
const getBaseComposeArgsTipi = async () => {
const args: string[] = [`--env-file ${path.join(DATA_DIR, '.env')}`];
args.push(`--project-name tipi`);
args.push(`--project-name runtipi`);
const composeFile = path.join(DATA_DIR, 'docker-compose.yml');
args.push(`-f ${composeFile}`);
@ -89,20 +89,22 @@ export const compose = async (appId: string, command: string) => {
};
export const handleViewRuntipiLogsEvent = async (socket: Socket, event: SocketEvent) => {
const parsedEvent = socketEventSchema.safeParse(event);
const { success, data } = socketEventSchema.safeParse(event);
if (!parsedEvent.success) {
if (!success) {
logger.error('Invalid viewLogs event data:', event);
return;
}
if (parsedEvent.data.type !== 'runtipi-logs' && parsedEvent.data.event !== 'viewLogs') {
if (data.type !== 'runtipi-logs-init') {
return;
}
const { maxLines } = data.data;
const args = await getBaseComposeArgsTipi();
args.push('logs --follow -n 25');
args.push(`logs --follow -n ${maxLines || 25}`);
const logsCommand = `docker-compose ${args.join(' ')}`;
@ -114,7 +116,6 @@ export const handleViewRuntipiLogsEvent = async (socket: Socket, event: SocketEv
socket.on('runtipi-logs', (data) => {
if (data.event === 'stopLogs') {
console.log('Stopping logs');
logs.kill('SIGINT');
}
});
@ -146,18 +147,14 @@ export const handleViewAppLogsEvent = async (socket: Socket, event: SocketEvent)
return;
}
if (parsedEvent.data.type !== 'app-logs') {
if (parsedEvent.data.type !== 'app-logs-init') {
return;
}
if (parsedEvent.data.event !== 'viewLogs') {
return;
}
const { appId } = parsedEvent.data.data;
const { appId, maxLines } = parsedEvent.data.data;
const args = await getBaseComposeArgsApp(appId);
args.push('logs --follow -n 25');
args.push(`logs --follow -n ${maxLines || 25}`);
const logsCommand = `docker-compose ${args.join(' ')}`;

View File

@ -10,8 +10,8 @@ class SocketManager {
const io = new Server(5001, { cors: { origin: '*' }, path: '/worker/socket.io' });
io.on('connection', async (socket) => {
socket.on('app-logs', (event) => handleViewAppLogsEvent(socket, event));
socket.on('runtipi-logs', (event) => handleViewRuntipiLogsEvent(socket, event));
socket.on('app-logs-init', (event) => handleViewAppLogsEvent(socket, event));
socket.on('runtipi-logs-init', (event) => handleViewRuntipiLogsEvent(socket, event));
socket.on('disconnect', () => {});
});

View File

@ -12,7 +12,7 @@ export const AppLogs = ({ appId }: { appId: string }) => {
useSocket({
selector: { type: 'app-logs', event: 'newLogs', data: { property: 'appId', value: appId } },
onCleanup: () => setLogs([]),
emitOnConnect: { type: 'app-logs', event: 'viewLogs', data: { appId } },
emitOnConnect: { type: 'app-logs-init', event: 'initLogs', data: { appId, maxLines } },
emitOnDisconnect: { type: 'app-logs', event: 'stopLogs', data: { appId } },
onEvent: (_, data) => {
setLogs((prevLogs) => {

View File

@ -12,7 +12,7 @@ export const LogsContainer = () => {
useSocket({
selector: { type: 'runtipi-logs', event: 'newLogs' },
onCleanup: () => setLogs([]),
emitOnConnect: { type: 'runtipi-logs', event: 'viewLogs', data: {} },
emitOnConnect: { type: 'runtipi-logs-init', event: 'initLogs', data: { maxLines } },
emitOnDisconnect: { type: 'runtipi-logs', event: 'stopLogs', data: {} },
onEvent: (_, data) => {
setLogs((prevLogs) => {

View File

@ -37,7 +37,7 @@ describe('useSocket', () => {
});
it('should emit on connect if emitOnConnect is provided', () => {
const emitOnConnect = { type: 'runtipi-logs', event: 'viewLogs', data: {} } as const;
const emitOnConnect = { type: 'runtipi-logs', event: 'stopLogs', data: {} } as const;
renderHook(() => useSocket({ selector: { type: 'runtipi-logs' }, emitOnConnect }));
expect(mockSocket.on).toHaveBeenCalledWith('connect', expect.any(Function));