OpenJobs uses a microservices architecture with 5 containers:
- Core (port 8080) - API, Dashboard, Scheduler
- Plugin: Arbetsförmedlingen (port 8081)
- Plugin: EURES (port 8082)
- Plugin: Remotive (port 8083)
- Plugin: RemoteOK (port 8084)
Service Name: openjobs (or app-openjobs)
# Supabase Connection
SUPABASE_URL=https://supabase.froste.eu
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
# Microservices Mode (CRITICAL!)
USE_HTTP_PLUGINS=true
# Plugin Container URLs (use Easypanel internal network names)
PLUGIN_ARBETSFORMEDLINGEN_URL=http://plugin-arbetsformedlingen:8081
PLUGIN_EURES_URL=http://plugin-eures:8082
PLUGIN_REMOTIVE_URL=http://plugin-remotive:8083
PLUGIN_REMOTEOK_URL=http://plugin-remoteok:8084
# Port
PORT=8080- USE_HTTP_PLUGINS=true - This tells the core to call plugin containers instead of running connectors locally
- Plugin URLs - Use Easypanel's internal Docker network names (not external URLs)
- The format is:
http://<easypanel-service-name>:<port>
All plugin containers need the same Supabase credentials:
SUPABASE_URL=https://supabase.froste.eu
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
PORT=8081SUPABASE_URL=https://supabase.froste.eu
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
PORT=8082
ADZUNA_APP_ID=your-adzuna-id
ADZUNA_APP_KEY=your-adzuna-keySUPABASE_URL=https://supabase.froste.eu
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
PORT=8083SUPABASE_URL=https://supabase.froste.eu
SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyAgCiAgICAicm9sZSI6ICJhbm9uIiwKICAgICJpc3MiOiAic3VwYWJhc2UtZGVtbyIsCiAgICAiaWF0IjogMTY0MTc2OTIwMCwKICAgICJleHAiOiAxNzk5NTM1NjAwCn0.dc_X5iR_VP_qT0zsiyj_I_OZ2T9FtRU2BBNWN8Bu4GE
PORT=8084Make sure your Easypanel services are named correctly so the internal network URLs work:
| Service | Expected Name | Port |
|---|---|---|
| Core | openjobs or app-openjobs |
8080 |
| Arbetsförmedlingen | plugin-arbetsformedlingen |
8081 |
| EURES | plugin-eures |
8082 |
| Remotive | plugin-remotive |
8083 |
| RemoteOK | plugin-remoteok |
8084 |
If your service names are different, update the PLUGIN_*_URL variables accordingly.
- Go to Easypanel dashboard
- Click on each service
- Look at the service name (usually shown in the URL or header)
- Use that exact name in the
PLUGIN_*_URLvariables
Example:
- If RemoteOK service is named
remoteok-plugininstead ofplugin-remoteok - Set:
PLUGIN_REMOTEOK_URL=http://remoteok-plugin:8084
From the core container:
# Test each plugin health endpoint
curl http://plugin-arbetsformedlingen:8081/health
curl http://plugin-eures:8082/health
curl http://plugin-remotive:8083/health
curl http://plugin-remoteok:8084/healthExpected response:
{
"status": "healthy",
"plugin": "RemoteOK Connector",
"plugin_id": "remoteok",
"version": "1.0.0"
}curl -X POST https://app-openjobs.katsu6.easypanel.host/sync/manualLook for:
🔌 Using HTTP plugin containers (microservices mode)
✅ Arbetsförmedlingen HTTP sync completed
✅ EURES HTTP sync completed
✅ Remotive HTTP sync completed
✅ RemoteOK HTTP sync completed
Error: failed to connect to plugin
Solutions:
- Check service names match exactly
- Verify all containers are running
- Check they're on the same Docker network
- Try using container IDs instead:
http://<container-id>:8081
Issue: Connectors running twice
Solution: Verify USE_HTTP_PLUGINS=true is set in core container
Issue: Only Arbetsförmedlingen and EURES show in logs
Solution:
- Check plugin containers are running
- Verify
PLUGIN_REMOTEOK_URLandPLUGIN_REMOTIVE_URLare set - Check plugin health endpoints respond
- Look at plugin container logs for errors
In Easypanel:
- Go to service
- Click "Environment" tab
- Verify all variables are set
Or from container:
docker exec <container-name> env | grep PLUGIN- Core container has
USE_HTTP_PLUGINS=true - Core container has all 4
PLUGIN_*_URLvariables - All 5 containers have
SUPABASE_URLandSUPABASE_ANON_KEY - All plugin containers are running
- Service names match the URLs in core container
- Manual sync test works
- Dashboard shows all 4 plugins in sync history
After correct setup, dashboard sync history should show:
Plugin Time Fetched Inserted Duplicates
Arbetsförmedlingen 02:45 18/10 20 0 20
EURES 02:45 18/10 10 0 10
Remotive 02:45 18/10 0 0 0 (SSL issue)
RemoteOK 02:45 18/10 50 30 20
Each plugin appears once per sync cycle, no duplicates!