Initial open-source release (MIT): image2api AI gateway

Full Go backend + Vue 3 frontend, OpenAI-compatible API, multi-provider
account pools, billing/admin, Docker one-command deploy with auto HTTPS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-25 22:59:04 +08:00
co-authored by Claude Opus 4.8
commit 606caaf047
142 changed files with 33648 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import tailwindcss from '@tailwindcss/vite'
// Dev server proxies backend routes to the Go backend (default :6666) so the
// frontend can use relative paths exactly like the old static UI did. Override
// the target with VITE_BACKEND when the backend runs elsewhere.
const backend = process.env.VITE_BACKEND || 'http://127.0.0.1:6666'
// Vite's underlying http-proxy doesn't add X-Forwarded-For / X-Real-IP by
// default, so the backend just sees the proxy's loopback address as the
// caller and stamps every login as 127.0.0.1. This hook forwards the real
// socket peer instead. (Only useful when the dev server is reachable from
// another device on the LAN — same-machine browsing is genuinely 127.0.0.1.)
function forwardClientIp(proxy) {
proxy.on('proxyReq', (proxyReq, req) => {
const ip = (req.socket && req.socket.remoteAddress) || ''
if (!ip) return
const existing = req.headers['x-forwarded-for']
proxyReq.setHeader('x-forwarded-for', existing ? `${existing}, ${ip}` : ip)
if (!req.headers['x-real-ip']) proxyReq.setHeader('x-real-ip', ip)
})
}
export default defineConfig({
plugins: [vue(), tailwindcss()],
server: {
port: 5173,
proxy: {
// Only the admin API is proxied — bare /admin/* is an SPA route now
// (the admin shell), handled client-side by vue-router.
'/admin/api': { target: backend, changeOrigin: true, configure: forwardClientIp },
'/health': { target: backend, changeOrigin: true, configure: forwardClientIp },
// Generated artifacts are served from /images.
'/images': { target: backend, changeOrigin: true, configure: forwardClientIp },
'/v1': { target: backend, changeOrigin: true, configure: forwardClientIp },
},
},
})