Private npm registry proxy powered by Verdaccio, deployed on Railway.
Registry URL: https://packages.ever.co (private access only — authentication required)
All requests are authenticated — only users with a valid auth token can install or publish packages. Public (unauthenticated) access is disabled by default.
Upstream packages are proxied and cached from the official npmjs registry.
- Create a new project in Railway named Verdaccio
- Add a new service and set Source Repo (GitHub) to
https://github.com/ever-co/packages-registry - Attach a volume (50 GB) mounted at
/verdaccio/storage - Configure a custom domain:
packages.ever.co(Port4873) - Enable Cloudflare proxy for the custom domain
- Deploy — Railway auto-builds the Dockerfile
Railway assigns
$PORTautomatically. The entrypoint handles it.
Add the following variables in Railway → Service → Variables:
| Variable | Value | Description |
|---|---|---|
LISTEN_PORT |
4873 |
Verdaccio listen port |
PORT |
4873 |
Railway required port |
VERDACCIO_PORT |
${{registry.PORT}} |
Railway service reference |
VERDACCIO_STORAGE |
/verdaccio/storage |
Persistent storage path |
After the first deploy, registration is open so you can create your admin user:
npm adduser --registry https://<your-railway-url>This prompts for a username, password, and email.
Once your user is created, disable self-registration to prevent unauthorized access:
- Edit
config.yaml— changemax_usersfrom1000to-1:
auth:
htpasswd:
file: /verdaccio/storage/htpasswd
max_users: -1- Commit and push — Railway redeploys automatically
- Registration is now locked. Only existing users can authenticate.
If serving behind Cloudflare (e.g. packages.ever.co), you must disable features that interfere with Verdaccio's web UI:
- Go to your domain in the Cloudflare Dashboard
- Navigate to Speed → Optimization → Content Optimization
- Disable Rocket Loader — it rewrites
<script>tags and breaks Verdaccio's SPA - Optionally, create a Page Rule for
packages.ever.co/*:- Rocket Loader: Off
- Cache Level: Bypass (let Verdaccio handle its own caching)
Without these changes, the web UI will load blank with 404 errors on static assets (
/-/static/vendors.*.js).
Add the registry and auth token to your ~/.npmrc:
registry=https://packages.ever.co/
//packages.ever.co/:_authToken=<your-token>
Store the auth token as a GitHub Secret (VERDACCIO_TOKEN), then configure in workflows:
- name: Configure npm registry
run: |
echo "//packages.ever.co/:_authToken=${{ secrets.VERDACCIO_TOKEN }}" >> ~/.npmrc
echo "registry=https://packages.ever.co/" >> ~/.npmrcyarn config set registry https://packages.ever.co/All Verdaccio settings are managed through config.yaml. Changes take effect on the next deploy.
| Setting | Description |
|---|---|
auth.htpasswd.max_users |
Set to -1 to disable registration, or a positive number to allow it |
packages.**.access |
$authenticated requires login, $all allows anonymous access |
uplinks.npmjs.url |
Upstream registry to proxy (default: npmjs) |
security.api.jwt.sign.expiresIn |
Token expiration (default: 60 days) |
Client (yarn/npm) → Cloudflare → Ever Registry (Verdaccio) → npmjs (upstream)
↓
Railway Volume
/verdaccio/storage/
├── data/ (cached packages)
└── htpasswd (user credentials)
This project is licensed under the MIT.
- Website: https://ever.co
- Email: ever@ever.co