Woodpecker
Overview
This image runs Woodpecker CI, the simple yet powerful open source continuous integration and delivery engine. You define pipelines as plain YAML in a .woodpecker.yml file in your repository. Each step runs in an isolated container, so builds are reproducible and easy to reason about.
Woodpecker has no standalone user database of its own. It authenticates users by OAuth against a Git forge. To make this image a self-contained appliance, it bundles the Gitea self-hosted Git service on the same instance and pre-wires the OAuth handshake between Gitea and Woodpecker.
The result is a complete source control and CI/CD pair. You push code to the bundled Gitea, add a pipeline file and enable the repository in Woodpecker. Your build then runs on a local Woodpecker agent using the Docker backend.
What you get:
- The Woodpecker server and agent and the Gitea binary, installed under
/usr/local/bin. - Every application port bound to the loopback interface. nginx publishes the Woodpecker web interface on port 80 and the bundled Gitea on port 3000.
- A dedicated, independently resizable EBS data volume at
/var/lib/woodpecker. It holds the Woodpecker store and the Gitea database and git repositories. - An administrator password generated on the first boot of every deployed instance, so two instances launched from the same Amazon Machine Image never share a password. It is written to
/root/woodpecker-credentials.txtwith mode 0600, so only the root user can read it. - First-boot setup that rotates the Gitea server secrets and the Woodpecker agent secret. It also recreates the OAuth application against the instance's own public address and wires the OAuth callback URL to that address.
Prerequisites
Before you deploy this image, make sure you have:
- An Amazon Web Services account where you can launch EC2 instances.
- IAM permissions to launch instances, create security groups and subscribe to AWS Marketplace products.
- An EC2 key pair in the target Region for SSH access to the instance.
- A VPC and subnet in the target Region, with a security group that allows inbound port 22 from your management network, port 80 for the Woodpecker web interface and port 3000 for the bundled Gitea forge.
- The AWS CLI (version 2) installed locally, if you plan to deploy from the command line.
Launch the Instance from the AWS Marketplace
Sign in to the AWS Management Console, open the EC2 service and choose Launch instance. Under Application and OS Images, choose AWS Marketplace AMIs and search for Woodpecker CI. Select the SecureAnyCloud listing, choose Select, then choose Continue on the subscription summary.
Pick an instance type of t3.small or larger. Choose your EC2 key pair under Key pair (login). Under Network settings, select your VPC and subnet. Create or select a security group that opens port 22 from your management network, port 80 for Woodpecker and port 3000 for the bundled Gitea. Leave the root volume at the default size or larger.
Choose Launch instance. First-boot initialisation takes a short time after the instance state becomes Running and the status checks pass. During this time the image rotates secrets and wires the OAuth callback to the instance address.
Launch the Instance from the AWS CLI
This command launches an instance from the SecureAnyCloud Woodpecker CI Marketplace AMI into an existing subnet and security group. Replace <ami-id> with the AMI ID shown on the Marketplace listing. Replace <key-name> with your EC2 key pair name and <subnet-id> with your subnet ID. Replace <security-group-id> with a security group that opens ports 22, 80 and 3000 as described above.
aws ec2 run-instances \
--image-id <ami-id> \
--instance-type t3.small \
--key-name <key-name> \
--subnet-id <subnet-id> \
--security-group-ids <security-group-id> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=woodpecker}]'When the instance reaches the Running state and its status checks pass, note its public IP address or DNS name. You can find it in the EC2 console or with aws ec2 describe-instances.
Connect to Your Instance
Connect over SSH with your key pair. This image is Ubuntu 24.04, and the SSH login user is ubuntu.
ssh -i <key-name>.pem ubuntu@<public-ip>Retrieve the Administrator Password
The administrator login is unique to your instance. The image generated it on first boot. Read it as root:
sudo cat /root/woodpecker-credentials.txtThe file lists the Woodpecker URL, the bundled Gitea URL, the administrator user (gitadmin) and the generated password. The same administrator signs in to both Gitea and Woodpecker. Store the password somewhere safe.
Confirm the Services Are Running
Over SSH, confirm that the four services are active and that the public ports are listening:
sudo systemctl is-active gitea woodpecker-server woodpecker-agent nginx
sudo ss -tlnp | grep -E ':(80|3000) 'All four services should report active, with nginx listening on port 80 for Woodpecker and port 3000 for Gitea. The Woodpecker health endpoint is open and answers on the loopback through nginx:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1/healthzA 200 or 204 confirms the Woodpecker server is healthy.
Sign In to Woodpecker
The Woodpecker web interface is served on port 80 by nginx. In a browser, go to:
http://<instance-public-ip>/Choose Login. Woodpecker authenticates through the bundled Gitea, so you are redirected to the Gitea sign-in page on port 3000. Sign in as gitadmin with the password from the credentials file. Then choose Authorize Application on the OAuth consent screen. You return to Woodpecker, signed in.
The OAuth application, its client credentials and the callback URL are all configured for you. You do not need to create anything in Gitea by hand.
Add a Repository and Run a Pipeline
Push a repository to the bundled Gitea, or create one in the Gitea web interface on port 3000. Add a .woodpecker.yml file to it. A minimal pipeline looks like this:
when: - event: [push, manual] steps: - name: build image: alpine commands: - echo "Building on Woodpecker CI" - uname -aIn Woodpecker, choose Add repository, then choose Enable next to your repository. Enabling the repository registers a webhook in Gitea, so every push triggers a pipeline. Push a commit, and the Woodpecker agent runs the pipeline in containers using the Docker backend.
The repository, its commits, the .woodpecker.yml pipeline file and the CI status for each commit are all visible in the bundled Gitea on port 3000.
The Data Volume
The Woodpecker store and the Gitea database and git repositories live on a dedicated EBS volume mounted at /var/lib/woodpecker. This keeps the application data off the operating system disk and lets you resize or snapshot it independently. Confirm the mount with:
df -h /var/lib/woodpeckerTo grow the store, expand the EBS volume in the AWS console. Then grow the filesystem on the instance with sudo resize2fs on the underlying device.
Point Woodpecker at an External Forge
To use your own GitHub, Gitea, Forgejo or GitLab instead of the bundled Gitea, register an OAuth application in your forge and edit the Woodpecker server environment file. The server configuration lives at /etc/woodpecker/server.env:
sudo cat /etc/woodpecker/server.envCreate an OAuth application in your external forge with the authorization callback URL http://<instance-public-ip>/authorize. Then set the forge driver, forge URL and the OAuth client ID and secret in /etc/woodpecker/server.env. For an external Gitea or Forgejo, the keys are WOODPECKER_GITEA=true, WOODPECKER_GITEA_URL, WOODPECKER_GITEA_CLIENT and WOODPECKER_GITEA_SECRET. For GitHub, use the WOODPECKER_GITHUB keys. For GitLab, use the WOODPECKER_GITLAB keys. The Woodpecker documentation describes them. Restart the server to apply the change:
sudo systemctl restart woodpecker-serverIf you no longer need the bundled Gitea, stop and disable it with sudo systemctl disable --now gitea. Leave it enabled if you still want a local forge alongside your external one.
Enable HTTPS
nginx serves the Woodpecker and Gitea interfaces over plain HTTP on ports 80 and 3000. For production workloads, place them behind TLS.
Obtain a certificate for your domain. For example, use a managed certificate on an Application Load Balancer in front of the instance, or install Certbot on the instance. Then configure nginx to listen on 443 with your certificate. Proxy to the Woodpecker and Gitea backends exactly as the bundled site does for HTTP.
When you move to HTTPS, update WOODPECKER_HOST and the Gitea ROOT_URL to the https:// URL. Update the OAuth application's callback URL to match. Restrict the security group so the ports are reachable only from the networks that use the service.
Backup and Maintenance
Back up the appliance by snapshotting the /var/lib/woodpecker EBS volume. The snapshot captures the Woodpecker store and the Gitea database and git repositories.
Apply operating system security updates with sudo apt-get update && sudo apt-get upgrade, and reboot when a new kernel is installed. All four services start automatically on boot. The image re-wires the OAuth callback and forge URLs to the current public address on each boot.
Support
SecureAnyCloud publishes and supports this image. Support covers deployment, pointing Woodpecker at an external forge, pipeline authoring, agent scaling, TLS termination and upgrades. Contact SecureAnyCloud through the support channel listed on the AWS Marketplace listing.
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on AWS
Launch Woodpecker CI on AWS with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com