GitLab CI integration
Automate deployments and server management with Alpacon in GitLab CI/CD pipelines using the official Docker container.
Quick start
1. Generate API token
In your AlpacaX workspace settings:
- Go to Settings → API Tokens
 - Click “Create Token”
 - Add allowed commands for your deployment needs
 - Copy the generated token
 
2. Add CI/CD variables
Add these variables to your GitLab project (Settings → CI/CD → Variables):
ALPACON_WORKSPACE_URL: Your workspace URL (e.g.,https://your-workspace.us1.alpacon.io)ALPACON_API_TOKEN: Your API token (mark as Masked and Protected)
3. Create .gitlab-ci.yml
IMPORTANT: The alpacax/alpacon-cli image has ENTRYPOINT ["alpacon"] set, so you must override it with entrypoint: [""] in GitLab CI.
stages:
  - deploy
 
deploy:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon websh -r prod-server "docker ps"
  only:
    - main
Usage examples
Deploy with docker-compose.yml
deploy-compose:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
    - alpacon websh -r prod-server "docker compose -f /tmp/app-compose.yml up -d"
    - alpacon websh -r prod-server "docker ps"
  only:
    - main
Deploy with environment file
Note: When uploading multiple files to a directory, you need to create the directory first and set proper permissions:
deploy-with-env:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    # Create directory with proper permissions
    - alpacon websh -r prod-server "mkdir -p /tmp/myapp && chown $USER:$USER /tmp/myapp"
    # Upload files
    - alpacon cp docker-compose.yml prod-server:/tmp/myapp/
    - alpacon cp .env prod-server:/tmp/myapp/
    # Deploy
    - alpacon websh -r prod-server "docker compose -f /tmp/myapp/docker-compose.yml up -d"
    - alpacon websh -r prod-server "docker ps"
  only:
    - main
Deploy with image tag
deploy-tagged:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon websh -r prod-server "docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD"
    - alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
    - alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" prod-server "docker compose -f /tmp/app-compose.yml up -d"
  only:
    - main
Multi-environment deployment
deploy-staging:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon cp docker-compose.yml staging-server:/tmp/app-compose.yml
    - alpacon websh -r staging-server "docker compose -f /tmp/app-compose.yml up -d"
  only:
    - develop
  environment:
    name: staging
 
deploy-production:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
    - alpacon websh -r prod-server "docker compose -f /tmp/app-compose.yml up -d"
  only:
    - main
  environment:
    name: production
  when: manual
Complete CI/CD pipeline
stages:
  - build
  - deploy
 
build-image:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
    - docker build -t $DOCKER_USERNAME/myapp:$CI_COMMIT_SHORT_SHA .
    - docker push $DOCKER_USERNAME/myapp:$CI_COMMIT_SHORT_SHA
  only:
    - main
 
deploy:
  stage: deploy
  image:
    name: alpacax/alpacon-cli:latest
    entrypoint: [""]
  script:
    - alpacon login $ALPACON_WORKSPACE_URL -t $ALPACON_API_TOKEN
    - alpacon websh -r --env="DOCKER_USERNAME=$DOCKER_USERNAME" --env="DOCKER_PASSWORD=$DOCKER_PASSWORD" prod-server "docker login -u \$DOCKER_USERNAME -p \$DOCKER_PASSWORD"
    - alpacon cp docker-compose.yml prod-server:/tmp/app-compose.yml
    - alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" --env="DOCKER_USERNAME=$DOCKER_USERNAME" prod-server "docker compose -f /tmp/app-compose.yml pull"
    - alpacon websh -r --env="IMAGE_TAG=$CI_COMMIT_SHORT_SHA" --env="DOCKER_USERNAME=$DOCKER_USERNAME" prod-server "docker compose -f /tmp/app-compose.yml up -d"
    - alpacon websh -r prod-server "docker ps"
  only:
    - main
  needs:
    - build-image
Troubleshooting
Entrypoint error
Symptom: Error: unknown command "sh" for "alpacon"
Solution:
You forgot to add entrypoint: [""] to the image configuration. Use:
image:
  name: alpacax/alpacon-cli:latest
  entrypoint: [""]
Permission denied
Symptom: permission denied when running Docker commands
Solution:
Add -r flag to run as root: alpacon websh -r server-name "docker ps"
File not found after upload
Symptom: File uploaded successfully but not found when executing commands
Solution: The directory may not exist or you don’t have permissions. Create the directory with proper ownership:
- alpacon websh -r server "mkdir -p /path/to/dir && chown username:username /path/to/dir"
- alpacon cp file.txt server:/path/to/dir/